Successfully reported this slideshow.                          Upcoming SlideShare
×

# Deep Learning を実装する

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

• Full Name
Comment goes here.

Are you sure you want to Yes No • Be the first to comment

### Deep Learning を実装する

1. 1. Deep Learning を実装する http://deeplearning.net/tutorial/ 松尾研 修士１年 飯塚修平" @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

### Be the first to comment

• #### shingoinou

Jun. 24, 2015
• #### akihitoohsato

Jul. 14, 2015
• #### hiromixxsano

Jul. 15, 2015
• #### satoshoetsu

Jul. 18, 2015
• #### kuniokiyokota

Jul. 27, 2015
• #### ShinichiroMurakami

Oct. 15, 2015
• #### YumaMatsuoka

Oct. 17, 2015
• #### oigawa

Dec. 9, 2015
• #### tomoharusato54

Dec. 9, 2015
• #### letusfly85

Jan. 31, 2016
• #### kit-masa

Feb. 11, 2016
• #### 6uclz1

Mar. 10, 2016
• #### HajimeTodo

May. 15, 2016
• #### yumios

Aug. 1, 2016
• #### ssuser263131

Aug. 31, 2016
• #### hayatomatsuura5

Oct. 26, 2016
• #### TakuyaHashimoto3

Dec. 3, 2016
• #### yasuiyuto

Mar. 8, 2017
• #### TakahiroOhori1

Jun. 13, 2019
• #### HirokiN1

May. 12, 2021

Total views

80,248

On Slideshare

0

From embeds

0

Number of embeds

22,857

910

Shares

0