Deep Learning を実装する

74,964 views

Published on

Deep Learning 輪講会@東京大学松尾研究室での講義資料

Published in: Technology
1 Comment
154 Likes
Statistics
Notes
No Downloads
Views
Total views
74,964
On SlideShare
0
From Embeds
0
Number of Embeds
20,292
Actions
Shares
0
Downloads
903
Comments
1
Likes
154
Embeds 0
No embeds

No notes for slide

Deep Learning を実装する

  1. 1. Deep Learning を実装する
http://deeplearning.net/tutorial/ 松尾研 修士1年 飯塚修平" @Deep Learning 輪講会
  2. 2. 目次•  Deep Learning とは" –  機械学習について" –  従来の NN とのちがい" –  Deep Learning のブレイクスルー"•  dA (Denoising Autoencoders) をうごかす" –  数理モデルの解説" –  Python で実装する前準備" –  コードレビュー" –  実行結果"•  RBM (Restricted Boltzmann Machines) をうごかす" –  数理モデルの解説" –  実行結果"•  まとめ
  3. 3. DEEP LEARNING とは
  4. 4. Deep Learning とは•  入力信号からより抽象的な概念を学ぶ・特徴を抽出する 機械学習の手法の集合です
 "“ニューラルネットとどう違うの?”!•  ニューラルネットを多層にしたんです
 "“従来のニューラルネットワークと何が違うの?”!•  ひとつひとつのレイヤー間でパラメタの調整(すなわち 学習)を行うところが特徴なんです
  5. 5. NN 従来のニューラルネットワーク •  層の数が多いほど表現力が高くなるが、パラメータの更 新が難しくなる (Vanishing Gradient Problem)" •  しかも局所解・過学習に陥りやすい" •  しかも遅いPythonと Deep  Learningで 手書き文字認識 http://www.slideshare.net/mokemokechicken/pythondeep-learning"名古屋工業大学岩田彰研究室 ニューラルネット入門 http://www-ailab.elcom.nitech.ac.jp/lecture/neuro/bp4.html
  6. 6. メージ そこで Deep Learning RBM RBM RBM DBM •  入力データから得た隠れ層をまた入力データにして・・・をricted 繰り返す" Boltzmann Machine (RBM)をたくさん繋げたものが •  一層ずつ確定させていくpDeep Learning http://www.slideshare.net/kazoo04/deep-learning-15097274 Boltzmann Machines (DBM)
  7. 7. Autoencoder•  層に相当するモジュール" y = f (x), z = g(y), ||x z||2•                    となるように学習" min –  すなわち、入力と出力の誤差が最小になるようパラメタを調整する" –  すると、入力 x を適切な表現 y に写像する autoencoder が得られる" input encode decode output representation 層 x f y g z error
  8. 8. dA をうごかす
(Denoising Autoencoder)
  9. 9. Denoising Autoencoder •  下記の式で表されるエンコーダ、デコーダ、誤差を使う" •  s はシグモイド関数" •  重み W, W’ とバイアス b, b’ を学習する" •  Tied Weights: W^T = W’ とすることもある" encoder y = s(Wx + b), z = s(W x + b ) y = s(Wx + b), z = s(W x + b ) s(Wx + b), d = s(W x + b ) decoder z dH (x, z) =error LH (x, z) =zk + [xk logxk ) log(1xk ) zk )] [xk log (1 zk + (1 log(1 zk )]k log zk + (1k=1 k ) log(1 k=1 k )] x z input encode decode output representation x f y g z
  10. 10. Python で実装する前準備•  Theno を入れましょう" –  導関数を解析的に導出してくれる(自動微分という)" •  近似的に微分係数を算出する数値微分とは異なる" •  導関数を導関数として扱える!" –  GPU に計算を行わせることも可能" –  $ sudo pip install Theano"
  11. 11. >>> # Theano のかんたんな使い方 >>> # まず、ふつうの演算 ... >>> import theano >>> import theano.tensor as T >>> x = T.dscalar(“x”) # x という名前のスカラー変数 >>> y = x**2 + 4*x # 式を表現 >>> f = theano.function([x], y) # 関数の生成。[]で囲まれた変数が関数の引数となる >>> f(0) array(0.0) >>> f(1) array(5.0) >>> >>> # 次に、自動微分をさせてみる ... >>> z = T.grad(y, x) # y を微分した式を z として表現 >>> f_prime = theano.function([x], z) >>> f_prime(0) array(4.0) >>> f_prime(1) array(6.0)
  12. 12. Getting Started Deep Learning" http://deeplearning.net/tutorial/gettingstarted.html サンプルコードがあります" 今回はこれをもとに説明します$ git clone git://github.com/lisa-lab/DeepLearningTutorials.git
  13. 13. 擬似コードclass dA (object): def __init__(self, input, n_visible, n_hidden): self.input = input # 入力データ self.n_visible = n_visible # 可視層ノード数 self.n_hidden = n_hidden # 隠れ層ノード数 self.vbias = Array(size=n_visible) # b: 可視層のバイアス self.hbias = Array(size=n_hidden) # b’: 隠れ層のバイアス self.W = Matrix(size=(n_visible, n_hidden)) # 重み行列 W def get_corrupted_input(self, input, corruption_level): # より一般的な特徴を学習させるため、あえてノイズを加える return Randomize(input, corruption_level) def get_hidden_values(self, input): # encode に相当 return T.nnet.sigmoid(T.dot(input, self.W) + self.vbias) def get_reconstructed_input(self, hidden): # decode に相当 return T.nnet.sigmoid(T.dot(hidden, self.W.T) + self.hbias)
  14. 14. def get_cost_updates(self, corruption_level, learning_rate): tilde_x = self.get_corrupted_input(self.x, corruption_level) y = encode(tilde_x) z = decode(y) L = - T.sum(self.x * T.log(z) + (1 - self.x) * T.log(1 - z),axis=1) cost = T.mean(L) update(vbias, hbias, W) #パラメタの更新 return (cost, [vbias, hbias, W]) if __name__ == __main__: # 損傷率 0%, 30%, 50% の autoencoder for c_rate in [0., 0.3, 0.5]: da = dA(T.matrix(‘x’), 784, 500) cost, updates = da.get_cost_updates(c_rate, 0.1) train_da = theano.function(..., train_dataset, updates, cost) img = PIL.Image.fromarray(da)) img.save(‘hoge’+c_rate+‘.png’)
  15. 15. つまり•  dA" - 入力データ "input " " " "←与える" - ノード数 " "n_visible, n_hidden "←与える(経験と勘と試行錯誤)" - バイアス " "vbias, hbias" " "←パラメタ" - 重み行列 " "W " " " " "←パラメタ" + ノイズ追加 "get_corrupted_input(input, corruption_level)" + エンコード "get_hidden_values(input)" + デコード " "get_reconstructed_input(hidden)" + パラメタ更新 "get_cost_updates(corruption_level, learning_rate)" " 意外と簡単!"
  16. 16. 使用するデータ  MNIST手書き文字認識  
  17. 17. Tutorial からダウンロードしたプログラムを実行"Corruption Rate = [0, 0.3, 0.5] に対応するフィルタ(重み行列 W)の例 o% 3o% 5o%
  18. 18. ちなみに:Corruption の方法にもいろいろある Denoising Auto-Encoders: Benchmarks Larochelle et al., 2009 30
  19. 19. RBM をうごかす
(Restricted Boltzmann Machines)
  20. 20. RBM •  制約付きボルツマンモデル" –  制約: 可視層ノード同士、隠れ層ノード同士の接続を許さない" →計算の簡略化 •  最尤推定によって学習を行うRestricted  Boltzmann  Machines  (RBM)  –  deeplearning.net  http://deeplearning.net/tutorial/rbm.html  Restricted  Boltzmann  Machine  の導出に至る自分用まとめ  http://dl.dropbox.com/u/2048288/RestrictedBoltzmannMachine.pdf
  21. 21. 可視ノード集合 v( vi 0, 1) と隠れノード集合 h( hi 0, 1) からなる系がその状態をとる確率 p(v, h) はエネルギー関数 E(v, h) と分散関数を用いて以下のように定義される(c.f. カノニカル分布)。 E(v,h) e p(v, h) = (1) Z エネルギー関数 : E(x) = bT v cT h vT Wh (2) 分配関数 : Z = e E(v,h) (3) v hv, h, W は可視層のバイアス、隠れ層のバイアス、重み行列と呼ばれるパラメタである。この系の尤度は、以下のように定義される。 尤度 J log p(v, h) q = log eE(v,h) q log Z (4) h hただし f (v) q = v f (v)q(v), すなわち q は観測データの確率分布 q(v)の期待値である。尤度 J を任意のパラメタ について最大化するため、導関数を求める。 J 1 E 1 E
  22. 22. ただし f (v) q = v f (v)q(v), すなわち q は観測データの確率分布 q(v)の期待値である。尤度 J を任意のパラメタ について最大化するため、導関数を求める。 J 1 E 1 E = E e E q + e E (5) he h Z v hここで、条件付き確率の定義 p(h|v) = より、 E(v,h) Pe E(v,h) h e J E E = p(h|v)q(v) + p(v, h) (6) v h v h E E = p(h|v)q(v) + p(h,v) (7)また、条件付き確率を計算して下記を得る(ここで厳密解を求められることが「制限付き」の特徴)。 p(h|v) = s(Wv + b ) (8) p(v|h) = s(Wh + b) (9)ただし、s(x) はシグモイド関数である。以上より、RBM は
  23. 23. p(h|v) = s(Wv + b ) (8) p(v|h) = s(Wh + b) (9)ただし、s(x) はシグモイド関数である。以上より、RBM は • encoder: 式 (8) • decoder: 式 (9) • error: J(式 (4)) • 更新式: 式 (7)という対応付けを行うことで、Autoencoder の実装のひとつと捉えることが出来る。しかし、式 (7) の第 2 項を求めることは困難であることが多いため、Contrastive Divergence という手法を用いる。
  24. 24. Tutorial からダウンロードしたプログラムを実行"手書き文字データから抽出したフィルタ(重み行列 W)の例
  25. 25. まとめ•  Deep Learning は多層のニューラルネットワーク" –  Autoencoder をつかったものと RBM をつかったものがある"•  深イイはつくれる!" –  特に、Autoencoder の実装はシンプルでわかりやすい"
  26. 26. References•  Yoshua Bengio, Aaron Courville, and Pascal Vincent. Representation Learning: A Review and New Perspectives."•  Yoshua Bengio. Learning Deep Architectures for AI. "•  Pascal Vincent, Hugo Larochelle, Isabelle Lajoie, Yoshua Bengio, Pierre- Antoine Manzagol. Stacked Denoising Autoencoders: Learning Useful Representations in a Deep Network with a Local Denoising Criterion"•  Deeplearning.net http://deeplearning.net/"•  Pythonと Deep Learningで 手書き文字認識
 http://www.slideshare.net/mokemokechicken/pythondeep-learning"•  名古屋工業大学岩田彰研究室 ニューラルネット入門
 http://www-ailab.elcom.nitech.ac.jp/lecture/neuro/bp4.html"•  Deep Learning -株式会社ウサギィ 五木田 和也
 http://www.slideshare.net/kazoo04/deep-learning-15097274"•  Restricted Boltzmann Machineの学習手法についての簡単なまとめ
 http://mglab.blogspot.jp/2012/08/restricted-boltzmann-machine.html

×