Deep Learning を実装する

http://deeplearning.net/tutorial/


    松尾研 修士1年 飯塚修平"
    @Deep Learning 輪講会
目次
•  Deep Learning とは"
  –  機械学習について"
  –  従来の NN とのちがい"
  –  Deep Learning のブレイクスルー"
•  dA (Denoising Autoencoders) をうごかす"
  –    数理モデルの解説"
  –    Python で実装する前準備"
  –    コードレビュー"
  –    実行結果"
•  RBM (Restricted Boltzmann Machines) をうごかす"
  –  数理モデルの解説"
  –  実行結果"
•  まとめ
DEEP LEARNING とは
Deep Learning とは
•  入力信号からより抽象的な概念を学ぶ・特徴を抽出する
   機械学習の手法の集合です

   "
“ニューラルネットとどう違うの?”!
•  ニューラルネットを多層にしたんです

   "
“従来のニューラルネットワークと何が違うの?”!
•  ひとつひとつのレイヤー間でパラメタの調整(すなわち
   学習)を行うところが特徴なんです
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
メージ
                                    そこで Deep Learning
                       RBM                                   RBM          RBM




                                                        DBM
     •  入力データから得た隠れ層をまた入力データにして・・・を
ricted 繰り返す"
        Boltzmann Machine (RBM)をたくさん繋げたものが
     •  一層ずつ確定させていく
pDeep Learning http://www.slideshare.net/kazoo04/deep-learning-15097274
  Boltzmann Machines (DBM)
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
dA をうごかす

(Denoising Autoencoder)
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
                              d
H (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
Python で実装する前準備




•  Theno を入れましょう"
  –  導関数を解析的に導出してくれる(自動微分という)"
     •  近似的に微分係数を算出する数値微分とは異なる"
     •  導関数を導関数として扱える!"
  –  GPU に計算を行わせることも可能"
  –  $ sudo pip install Theano"
>>> # 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)
Getting Started

   Deep Learning"
   http://deeplearning.net/tutorial/gettingstarted.html	
   	
   サンプルコードがあります" 今回はこれをもとに説明します




$ git clone git://github.com/lisa-lab/DeepLearningTutorials.git
擬似コード
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)
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’)
つまり
•  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)"
   "
   意外と簡単!"
使用するデータ	
  
MNIST手書き文字認識	
  
Tutorial からダウンロードしたプログラムを実行"
Corruption Rate = [0, 0.3, 0.5] に対応するフィルタ(重み行列 W)の例


    o%                  3o%                 5o%
ちなみに:Corruption の方法にもいろいろある

  Denoising Auto-Encoders: Benchmarks
                              Larochelle et al., 2009




                                                   30
RBM をうごかす

(Restricted Boltzmann Machines)
RBM


        •  制約付きボルツマンモデル"
                –  制約: 可視層ノード同士、隠れ層ノード同士の接続を許さない"
                →計算の簡略化
        •  最尤推定によって学習を行う




Restricted	
  Boltzmann	
  Machines	
  (RBM)	
  –	
  deeplearning.net	
  http://deeplearning.net/tutorial/rbm.html	
  
Restricted	
  Boltzmann	
  Machine	
  の導出に至る自分用まとめ	
  http://dl.dropbox.com/u/2048288/RestrictedBoltzmannMachine.pdf
可視ノード集合 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       h

v, 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
ただし 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 は
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 という手法を用いる。
Tutorial からダウンロードしたプログラムを実行"
手書き文字データから抽出したフィルタ(重み行列 W)の例
まとめ




•  Deep Learning は多層のニューラルネットワーク"
  –  Autoencoder をつかったものと RBM をつかったものがある"


•  深イイはつくれる!"
  –  特に、Autoencoder の実装はシンプルでわかりやすい"
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

Deep Learning を実装する

  • 1.
    Deep Learning を実装する
 http://deeplearning.net/tutorial/ 松尾研 修士1年 飯塚修平" @Deep Learning 輪講会
  • 2.
    目次 •  Deep Learningとは" –  機械学習について" –  従来の NN とのちがい" –  Deep Learning のブレイクスルー" •  dA (Denoising Autoencoders) をうごかす" –  数理モデルの解説" –  Python で実装する前準備" –  コードレビュー" –  実行結果" •  RBM (Restricted Boltzmann Machines) をうごかす" –  数理モデルの解説" –  実行結果" •  まとめ
  • 3.
  • 4.
    Deep Learning とは • 入力信号からより抽象的な概念を学ぶ・特徴を抽出する 機械学習の手法の集合です
 " “ニューラルネットとどう違うの?”! •  ニューラルネットを多層にしたんです
 " “従来のニューラルネットワークと何が違うの?”! •  ひとつひとつのレイヤー間でパラメタの調整(すなわち 学習)を行うところが特徴なんです
  • 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.
    メージ そこで Deep Learning RBM RBM RBM DBM •  入力データから得た隠れ層をまた入力データにして・・・を ricted 繰り返す" Boltzmann Machine (RBM)をたくさん繋げたものが •  一層ずつ確定させていく pDeep Learning http://www.slideshare.net/kazoo04/deep-learning-15097274 Boltzmann Machines (DBM)
  • 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.
  • 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 d H (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.
    Python で実装する前準備 •  Thenoを入れましょう" –  導関数を解析的に導出してくれる(自動微分という)" •  近似的に微分係数を算出する数値微分とは異なる" •  導関数を導関数として扱える!" –  GPU に計算を行わせることも可能" –  $ sudo pip install Theano"
  • 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.
    Getting Started Deep Learning" http://deeplearning.net/tutorial/gettingstarted.html サンプルコードがあります" 今回はこれをもとに説明します $ git clone git://github.com/lisa-lab/DeepLearningTutorials.git
  • 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.
    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.
    つまり •  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.
  • 17.
    Tutorial からダウンロードしたプログラムを実行" Corruption Rate= [0, 0.3, 0.5] に対応するフィルタ(重み行列 W)の例 o% 3o% 5o%
  • 18.
    ちなみに:Corruption の方法にもいろいろある Denoising Auto-Encoders: Benchmarks Larochelle et al., 2009 30
  • 19.
  • 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.
    可視ノード集合 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 h v, 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.
    ただし 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.
    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.
  • 25.
    まとめ •  Deep Learningは多層のニューラルネットワーク" –  Autoencoder をつかったものと RBM をつかったものがある" •  深イイはつくれる!" –  特に、Autoencoder の実装はシンプルでわかりやすい"
  • 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