Deep learning入門
-
Upload
magoroku-yamamoto -
Category
Technology
-
view
1.273 -
download
0
Transcript of Deep learning入門
Deep Learning 入門
Logistic Regression Multilayer perceptron
Convolutional Network
@magoroku15
2015/12/18 1
Deep Learning
• 1990年代に死んだと思われていたNNが2012年以降、Deep Learningとして復活
• 各分野のコンベンションで優勝
– 画像認識
– 音声認識
– 化合物の活性予測
• 主要学会で話題に
– ICML(機械学習)、ACL(自然言語)、CVPR(画像処理)
– 2015はHotChips(アーキテクチャ)でもチュートリアル
2015/12/18 2
DNNによる音声認識の誤答率
hotchips2015 2015/12/18 3
ビジネスでも
• MS、Googleが音声認識をDNNで置き換え
• Googleが買った企業 – DNNresearch Inc
• ブームの火付け役トロント大Hinton教授が創立
– DeepMind Technologies: • レトロゲームのルールを学習するDQN(Deep Q-Network)を開発
• BaiduはStanfordのAndrew Ng准教授をリクルート – 顔認識のエラー率:Microsoftは3.67%、Facebookは1.63%、
Googleは0.37%に対してBaiduは0.15%
• クラウド上にPaaS等も登場
2015/12/18 4
機械学習
ニューラルネット
誤解も
• 機械学習、ニューラルネット、ディープニューラルネット、ディープラーニング違いは?
• 世の中が騒いでいるのは
–ディープニューラルネット =ディープラーニング
–機械学習の他の分野にブレークスルーは無い
ディープニューラルネット =ディープラーニング
2015/12/18 5
一躍、自動運転の基本技術に
• 同一のアルゴリズム+タグ付けで、多種のモノを認識(学習)
• 認識できない物!は
1. 車から画像を回収して
2. サーバで学習・タグ付して
3. 車の学習データを更新
• 計算量は非対称
2015/12/18 6
画像認識での成果
• ImageNet large-scale visual recognition challenge (ILSVRC) 2012
– 1000種類の物体画像識別のコンベンション
– トロント大(Hinton教授)が圧勝
– エラー率が一気に10%以上向上
• ILSVRC2014のimage例
http://www.image-net.org/challenges/LSVRC/2014/index#introduction 2015/12/18 7
DLアルゴリズム入門
• Web,書籍による解析主には次の2種類 – 数学を背景にした原理・アルゴリズムを説明するもの
• 大学教養レベルの数学+αの知識が必要 • 式変形のすべてを理解するのは(数か月では)厳しい
– 利用分野、今後の期待を説明するもの • 表層的に説明に留まり、どの事業ドメインの使えるかわからない 例)音声・画像認識で大きな成果⇒他は?何に使えるの?
• ここでは、DLの入門として以下を試みる – 手書き文字認識(MNIST)を例題に基本アルゴリズムを理解 – 数学的な説明を資料内ですべて完結(できる範囲で) – 最初は、単純な1層のNNを対象 - Logistic Regression – 続いて、2層のNN - Multilayer perceptron – 最後に、物体認識で使われるConvolutio Neural Network
2015/12/18 8
Deep Learningのレイヤ
caffe
pylearn2
theano
Digits
Chainer
DNN Feedforward Neural Network, Stochastic Gradient Descent,
Backpropagation, Autoencoder, Convolutional Neural Network, Reccurrent Neural Network, Boltzmann machine
数学的背景 大学教養レベルの微積分、行列、ベイズ理論
教科書:“Pattern Recognition and Machine Learning” (パターン認識と機械学習 - ベイズ理論による統計的予測)
Pycaffe
MATLAB
PFI UCB Univ. of Montreal
Nvidia C++
Torch7
Lua
アルゴリズム
フレームワーク
Amazon ML
Azure ML
Google Prediction API
クラウド
EC2 with GPU
Deep Learning非対応
Tensor flow
2015/12/18 9
Deep Learning Tutorials
• Université de Montréal - Lisa Labが以下で公開
[email protected]:lisa-lab/DeepLearningTutorials.git
http://deeplearning.net/tutorial
• 古典的なNN,DNNからCNNまで各種論理・技法を解説 – Python + theanoで記述
– 各種学習アルゴリズム • 教師あり3種、教師なし4種、その他5種
• 教師あり3種を題材に説明 1. Logistic Regression - using Theano for something
2. Multilayer perceptron - introduction to layers
3. Deep Convolutional Network - a simplified version of LeNet5
2015/12/18 10
教師付き学習の例題
1. Logistic Regression - using Theano for something
– 1段:単純パーセプトロン、確率的勾配降下法
2. Multilayer perceptron - introduction to layers
– 2段:線形分離問題、誤差逆伝達法
3. Deep Convolutional Network - a simplified version of LeNet5
– 多段:汎化性向上のための畳み込み
• すべて同じ数字認識(MNIST)問題を扱う
• 高速化の各種実装もあわせて理解する – 繰り返し処理を行列積(sgemm)演算で置き換え
• refBLAS,OpenBlas, ATLAS, cuBLAS(NVIDIA)
– CNNの畳み込み演算はストライド転送+演算 • cuDNN(NVIDIA)
2015/12/18 11
教師付き学習(MNIST )と誤答率
• 入門用向けの例題 1. Logistic Regression - using Theano for something simple 1950年代
2. Multilayer perceptron - introduction to layers 1980年代
3. Deep Convolutional Network - a simplified version of LeNet5 2010年代*
http://d.hatena.ne.jp/uhiaha888/20130803/1375513648
0
2
4
6
8
10
12
14
1
40
79
118
157
196
235
274
313
352
391
430
469
508
547
586
625
664
703
742
781
820
859
898
937
976
Logistic Regression
Multilayer perceptron
Deep Conventional Network
minibatch
誤答率
1.7%
0.91%
7.5%
多層(deep)化で
誤答率が大幅に下がる
*1979年に福島邦彦氏が発表したネオコグニトロンの再発明
Deep Learning Tutorials の例題で実測
2015/12/18 12
数字認識(MNIST)
• 28x28ピクセル,256諧調の手書き数字
• 60000枚の学習サンプル
• 1000枚のテストサンプル
28 x 28 ピクセル
256諧調
2015/12/18 13
学習と推定
学習:
大量のトレーニングデータを学習器に入力し、推定用のパラメタを得る
推定:
新規のデータにパラメタを適用して文字の確率を推定
トレーニングデータ
学習器
パラメタ
パラメタ
0.05 ’0’である確率
0.40 ‘1’である確率 0.05 0.05 0.15 0.05 0.05 0.15 0.05 0.05 ’9’である確率
IN
OUT IN OUT
学習 推定
2015/12/18 14
推定の仕組み
• 画像認識の学習の理解に先立って、推定の仕組みを理解する
• 推定は推定対象画像とパラメタとの演算に帰結するので、深いDNNでも最終段の仕組みは同じ
• 違いは以下
– 学習・推定データの空間を歪めて、分離を良くする
– 学習推定の対象をデータの「部分」とする
– 学習パラメタを「ボカス」
2015/12/18 15
パラメタW,bを用いた推定
1行784列
2個の「画像」を重ねる 各「点」を掛け算て足すと
Wの明るい点とxの黒い点が重なると加点 Wの暗い点とxの黒い点が重なると減点
𝑊 𝑥 + 𝑏 = 確率
784行1列 10行784列 10行1列 10行1列
0.05 入力画像が’0’である確率
0.40 0.05 0.05 0.15 0.05 0.05 0.15 0.05 0.05 入力画像が’9’である確率
2015/12/18 16
パラメタの𝑊意味 – 数値
2015/12/18 17
赤を踏んだら減点 黒を踏んだら加点
2015/12/18 18
仕組み 784次元 10次元
0.05 ’0’である確率
0.40 0.05 0.05 0.15 0.05 0.05 0.15 0.05 0.05 ’9’である確率
28ピクセル
• 784次元から10次元への写像・次元圧縮 2015/12/18
28枚
19
写像・次元圧縮 - 行列の積
• N行M列 と M行L列 の積は N行L列
784行1列 10行784列 10行1列
• 784次元から10次元への写像・次元圧縮 2015/12/18 20
行列の積
• N行M列 と M行L列 の積は N行L列
• 2行2列 と 2行2列 の積は2行2列 𝑎 𝑏𝑐 𝑑
x 𝑒 𝑓𝑔 ℎ
=𝑎𝑒 + 𝑏𝑔 𝑎𝑓 + 𝑏ℎ𝑐𝑒 + 𝑑𝑔 𝑐𝑓 + 𝑑ℎ
• 2行3列 と 3行2列 の積は2行2列
𝑎1 𝑎2 𝑎3𝑏1 𝑏2 𝑏3
x
𝑐1 𝑑1𝑐2 𝑑2𝑐3 𝑑3
=𝑎1𝑐1 + 𝑎2𝑐2 + 𝑎3𝑐3 𝑎1𝑑1 + 𝑎2𝑑2 + 𝑎3𝑑3𝑏1𝑐1 + 𝑏2𝑐2 + 𝑏3𝑐3 𝑏1𝑑1 + 𝑏2𝑑2 + 𝑏3𝑑3
• 2行3列 と 3行1列 の積は2行1列
𝑎1 𝑎2 𝑎3𝑏1 𝑏2 𝑏3
x
𝑐1𝑐2𝑐3=𝑎1𝑐1 + 𝑎2𝑐2 + 𝑎3𝑐3𝑏1𝑐1 + 𝑏2𝑐2 + 𝑏3𝑐3
2015/12/18 21
忘れてしまったあなたのために追加
パラメタの𝑊意味
Wの明るい点とxの黒い点が重なり、かつ、 Wの暗い点とxの黒い点が重ならない
⇒大きな値 ⇒’1’の可能性が高い
W x
Wの明るい点とxの黒い点が重なりが少な ⇒小さな値
⇒’9’の可能性は低い
Wに含まれる‘1’の学習データとxを掛け算
Wに含まれる‘1’の学習データとxを掛け算
2015/12/18 22
LOGISTIC REGRESSION 単純パーセプトロン
2015/12/18 23
Logistic Regression
• 入門用向けの例題 1. Logistic Regression - using Theano for something simple 1950年代
2. Multilayer perceptron - introduction to layers 1980年代
3. Deep Convolutional Network - a simplified version of LeNet5 2010年代*
http://d.hatena.ne.jp/uhiaha888/20130803/1375513648
0
2
4
6
8
10
12
14
1
40
79
118
157
196
235
274
313
352
391
430
469
508
547
586
625
664
703
742
781
820
859
898
937
976
Logistic Regression
Multilayer perceptron
Deep Conventional Network
minibatch
誤答率
1.7% 0.91%
7.5%
*1979年に福島邦彦氏が発表したネオコグニトロンの再発明
2015/12/18 24
最初はこれ 1960年代
単純パーセプトロン
• 1層のネットワーク、単純パーセプトロンをLogistic Regressionで解く過程を追う
• 以下の順で説明する
–モデル Model
–損失関数 Loss Function
–アルゴリズム
• 確率的勾配降下法 DGD:Stochastic Gradient Descent
2015/12/18 25
モデル
𝑊は重み付けの行列、𝑏はバイアスのベクトル
𝑥は入力ベクトル(トレーニングデータ)
𝑖, 𝑗はクラス(‘0’~’9’の10種を表す)
𝑃 𝑦 = 𝑖 𝑥,𝑊, 𝑏 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥𝑖 𝑊𝑥 + 𝑏 =𝑒𝑊𝑖𝑥+𝑏𝑖
𝑒𝑊𝑗𝑥+𝑏𝑗𝑗
入力したベクトル𝑥がクラス𝑖になる確率が
最大となるようなW,bを求める
𝑦𝑝𝑟𝑒𝑑 = 𝑎𝑟𝑔𝑚𝑎𝑥𝑖𝑃(𝑌 = 𝑖|𝑥,𝑊, 𝑏)
2015/12/18 26
モデル-確率の表現
𝑊は重み付けの行列(2次元配列)
𝑏はバイアスのベクトル(配列)
𝑃 𝑦 = 𝑖 𝑥,𝑊, 𝑏 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥𝑖 𝑊𝑥 + 𝑏 =𝑒𝑊𝑖𝑥+𝑏𝑖
𝑒𝑊𝑗𝑥+𝑏𝑗𝑗
入力したベクトル𝑥がクラス𝑖に含まれる確率が最大となるW,bを求める
𝑦𝑝𝑟𝑒𝑑 = 𝑎𝑟𝑔𝑚𝑎𝑥𝑖𝑃(𝑌 = 𝑖|𝑥,𝑊, 𝑏)
ベイズの定理での表記𝑃(𝑌│𝑋)は、 事象Xが起きた前提で事象Yが起こる確率の事 ⇒ベクトル𝑥、重み付けW、バイアスbの時に
クラスiがyとなる確率
2015/12/18 27
モデル-softmax
𝑊は重み付けの行列(2次元配列)
𝑏はバイアスのベクトル(配列)
𝑃 𝑦 = 𝑖 𝑥,𝑊, 𝑏 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥𝑖 𝑊𝑥 + 𝑏 =𝑒𝑊𝑖𝑥+𝑏𝑖
𝑒𝑊𝑗𝑥+𝑏𝑗𝑗
入力したベクトル𝑥がクラス𝑖に含まれる確率が最大となるW,bを求める
𝑦𝑝𝑟𝑒𝑑 = 𝑎𝑟𝑔𝑚𝑎𝑥𝑖𝑃(𝑌 = 𝑖|𝑥,𝑊, 𝑏)
softmax関数は、sigmoid関数の多変量版
多変量ロジスティック回帰や多クラスのフィードフォアワード型のニューラルネットの活性化関数として利用される.
2015/12/18 28
モデル-sigmoid
𝑊は重み付けの行列(2次元配列)
𝑏はバイアスのベクトル(縦配列)
𝑃 𝑦 = 𝑖 𝑥,𝑊, 𝑏 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥𝑖 𝑊𝑥 + 𝑏 =𝑒𝑊𝑖𝑥+𝑏𝑖
𝑒𝑊𝑗𝑥+𝑏𝑗𝑗
入力したベクトル𝑥がクラス𝑖に含まれる確率が最大となるW,bを求める
𝑦𝑝𝑟𝑒𝑑 = 𝑎𝑟𝑔𝑚𝑎𝑥𝑖𝑃(𝑌 = 𝑖|𝑥,𝑊, 𝑏)
シグモイド関数の多変量版
多変量ロジスティック回帰や多クラスのフィードフォアワード型のニューラルネットの活性化関数として利用される.
シグモイド関数は生物の神経細胞が持つ性質をモデル化したもの 1
1 + 𝑒−𝑥
0か1かの2分割判別につかうモデル 今回は多値(0-9)なのでsoftmaxを使う
2015/12/18 29
モデル-softmax
𝑊は重み付けの行列(2次元配列)
𝑏はバイアスのベクトル(配列)
𝑃 𝑦 = 𝑖 𝑥,𝑊, 𝑏 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥𝑖 𝑊𝑥 + 𝑏 =𝑒𝑊𝑖𝑥+𝑏𝑖
𝑒𝑊𝑗𝑥+𝑏𝑗𝑗
入力したベクトル𝑥がクラス𝑖に含まれる確率が最大となるW,bを求める
𝑦𝑝𝑟𝑒𝑑 = 𝑎𝑟𝑔𝑚𝑎𝑥𝑖𝑃(𝑌 = 𝑖|𝑥,𝑊, 𝑏)
eは自然対数の底 eを底とする指数関数はその導関数と等しくなる
𝑑
𝑑𝑥 𝑒𝑥 = 𝑒𝑥
⇒微分が簡単! 2015/12/18 30
モデル – softmax - Σ
𝑊は重み付けの行列(2次元配列)
𝑏はバイアスのベクトル(配列)
𝑃 𝑦 = 𝑖 𝑥,𝑊, 𝑏 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥𝑖 𝑊𝑥 + 𝑏 =𝑒𝑊𝑖𝑥+𝑏𝑖
𝑒𝑊𝑗𝑥+𝑏𝑗𝑗
入力したベクトル𝑥がクラス𝑖に含まれる確率が最大となるW,bを求める
𝑦𝑝𝑟𝑒𝑑 = 𝑎𝑟𝑔𝑚𝑎𝑥𝑖𝑃(𝑌 = 𝑖|𝑥,𝑊, 𝑏)
すべての事象の内,特定の事象の割合(確率)を求める 𝑓 𝑖 = 𝑒𝑊𝑖𝑥+𝑏𝑖 のとき iを1~4を与える場合
𝑓 1 +𝑓 2 +𝑓 3 +𝑓(4)
𝑓 1 +𝑓 2 +𝑓 3 +𝑓(4)=1 、すべての事象の発生確率の合計は1
i=1の発生確率は 、𝑓 1
𝑓 1 +𝑓 2 +𝑓 3 +𝑓(4)
0.05 入力画像が’0’である確率
0.40 0.05 0.05 0.15 0.05 0.05 0.15 0.05 0.05 入力画像が’9’である確率 -------------------------------------------- 1.00 合計
2015/12/18 31
モデル – softmax 理想値
• パラメタ算出時は理想値を置く
1行784列
W x + b = 確率
784行1列 10行784列 10行1列 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 --------- 1.00
10行1列 入力が’1’の場合の理想値
2015/12/18 32
モデル
𝑊は重み付けの行列(2次元配列)
𝑏はバイアスのベクトル(配列)
𝑃 𝑦 = 𝑖 𝑥,𝑊, 𝑏 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥𝑖 𝑊𝑥 + 𝑏 =𝑒𝑊𝑖𝑥+𝑏𝑖
𝑒𝑊𝑗𝑥+𝑏𝑗𝑗
入力したベクトル𝑥がクラス𝑖に含まれる確率が最大となるW,bを求める
𝑦𝑝𝑟𝑒𝑑 = 𝑎𝑟𝑔𝑚𝑎𝑥𝑖𝑃(𝑌 = 𝑖|𝑥,𝑊, 𝑏)
𝑎𝑟𝑔𝑚𝑎𝑥 𝑓(𝑥): 𝑓(𝑥) を最大にする𝑥の集合
クラスiの発生確率を最大にする𝑥,𝑊, 𝑏を求めろ
2015/12/18 33
negative log-likelihood
• Likelihood – 尤度関数(ゆうどかんすう)とは統計学において、ある前提条件に従って結果が出現する場合に、逆に観察結果からみて前提条件が「何々であった」と推測する尤もらしさ(もっともらしさ)を表す数値を、「何々」を変数とする関数として捉えたものである。また単に尤度ともいう。
wikipedia
2015/12/18 34
単純パーセプトロン
• 1層のネットワーク、単純パーセプトロンをLogistic Regressionで解く過程を追う
• 以下の順で説明する
–モデル Model
–損失関数 Loss Function
–アルゴリズム
• 確率的勾配降下法 DGD:Stochastic Gradient Descent
2015/12/18 35
損失関数
学習の結果は損失関数を用いて最適化する
多値分類のロジステック回帰では
負の対数尤度関数を用いることが多い
𝐿 𝜃 = 𝑊, 𝑏 , 𝐷 = log (𝑃 𝑌 = 𝑦 𝑖 𝑥 𝑖 ,𝑊, 𝑏))|𝐷|𝑖=0
最小化問題にしたいから対数尤度関数に-1をかけて最小化する事を考える。
𝑙 𝜃 = 𝑊, 𝑏 , 𝐷 = −𝐿(𝜃 = 𝑊, 𝑏 , 𝐷)
2015/12/18 36
損失関数
学習の結果は損失関数を用いて最適化する
多値分類のロジステック回帰では
負の対数尤度関数を用いることが多い
𝐿 𝜃 = 𝑊, 𝑏 , 𝐷 = log (𝑃 𝑌 = 𝑦 𝑖 𝑥 𝑖 ,𝑊, 𝑏))|𝐷|𝑖=0
最小化問題にしたいから対数尤度関数に-1をかけて最小化する事を考える。
𝑙 𝜃 = 𝑊, 𝑏 , 𝐷 = −𝐿(𝜃 = 𝑊, 𝑏 , 𝐷)
𝐷は学習データの集合 カードの束 シャッフルしてカードを1枚引く
引いたカードの𝑖𝑛𝑑𝑒𝑥が𝑖(0,1,2… ) W, b が与えられたとき、カードの束Dのそれぞれのカードが
が正しく推定される確率
2015/12/18 37
損失関数
学習の結果は損失関数を用いて最適化する
多値分類のロジステック回帰では
負の対数尤度関数を用いることが多い
𝐿 𝜃 = 𝑊, 𝑏 , 𝐷 = log (𝑃 𝑌 = 𝑦 𝑖 𝑥 𝑖 ,𝑊, 𝑏))|𝐷|𝑖=0
最小化問題にしたいから対数尤度関数に-1をかけて最小化する事を考える。
𝑙 𝜃 = 𝑊, 𝑏 , 𝐷 = −𝐿(𝜃 = 𝑊, 𝑏 , 𝐷)
𝐷 カードの束 のそれぞれをW, b で推定した確からしさを 𝑙𝑜𝑔(確からしさ)として値を加算する 𝑙𝑜𝑔の加算なので、乗算を意味 確からしさの乗算なので同時確率
2015/12/18 38
損失関数 log (𝑃𝑖)|𝐷|𝑖=0
• 各カードの正解確率をlogして加算 – log(0.40) + log(0.40) + log(0.40) ・・・・ log(0.30) – Logを取ると乗算と同じ意味
• 正解確率の乗算結果は、同時確率の意味 • 乗算は扱いにくいので対数にして、加算
i=0
0.05 0.40 0.05 0.05 0.15 0.05 0.05 0.15 0.05 0.05
i=1 0.05 0.15 0.05 0.05 0.15 0.05 0.05 0.40 0.05 0.05
i=2 0.05 0.15 0.05 0.05 0.15 0.05 0.05 0.40 0.05 0.05
i=j 0.30 0.15 0.05 0.05 0.15 0.05 0.05 0.15 0.05 0.05
….. 0.40 x 0.40 x 0.40 ・・・・・ 0.30
データを増やすと…やっかい
2015/12/18 39
損失関数
学習の結果は損失関数を用いて最適化する
多値分類のロジステック回帰では
負の対数尤度関数を用いることが多い
𝐿 𝜃 = 𝑊, 𝑏 , 𝐷 = log (𝑃 𝑌 = 𝑦 𝑖 𝑥 𝑖 ,𝑊, 𝑏))|𝐷|𝑖=0
最小化問題にしたいから対数尤度関数に-1をかけて最小化する事を考える。
𝑙 𝜃 = 𝑊, 𝑏 , 𝐷 = −𝐿(𝜃 = 𝑊, 𝑏 , 𝐷)
2015/12/18 40
単純パーセプトロン
• 1層のネットワーク、単純パーセプトロンをLogistic Regressionで解く過程を追う
• 以下の順で説明する
–モデル Model
–損失関数 Loss Function
–アルゴリズム
• 確率的勾配降下法 SGD:Stochastic Gradient Descent
2015/12/18 41
確率的勾配降下法 (SGD:Stochastic Gradient Descent)
• ランダムに学習データを1つ選んで誤差関数を計算し,その勾配方向にパラメータを修正する操作を反復する
• モデル
𝑃 𝑦 = 𝑖 𝑥,𝑊, 𝑏 =𝑒𝑊𝑖𝑥+𝑏𝑖
𝑒𝑊𝑗𝑥+𝑏𝑗𝑗
• 誤差関数
𝑁𝐿𝐿 𝜃 = 𝑊, 𝑏 , 𝐷 = − log (𝑃 𝑌 = 𝑦 𝑖 𝑥 𝑖 ,𝑊, 𝑏))
|𝐷|
𝑖=0
集合𝐷の同時発生確率を最大にする
2015/12/18 42
最急降下法と確率的勾配降下法
• 𝜃を引数とする𝑓 𝜃 の値を最小化したい
• 最急降下法
𝜃𝑖+1 = 𝜃𝑖 − 𝜂 𝜕
𝜕𝜃𝑓(𝜃𝑖)
• 確率的勾配降下法
𝜃𝑖+1 = 𝜃𝑖 − 𝜂 𝜕
𝜕𝜃𝑓𝜃𝑖 (𝑥𝑛)
–収束させるにはη を適切に設定する
–局所的な参照のためメモリ効率が良い
2015/12/18 43
Theanoでの解法
• 同時発生確率を誤差関数costとして定義 – 加算の代わりに平均meanを使用
• costを𝑊, 𝑏で偏微分T.grad, 𝜕
𝜕𝜃相当
• 学習率learnig_rateで減衰させながら更新
2015/12/18
def negative_log_likelihood(self, y): return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]), y]) cost = classifier.negative_log_likelihood(y) g_W = T.grad(cost=cost, wrt=classifier.W) g_b = T.grad(cost=cost, wrt=classifier.b) updates = [(classifier.W, classifier.W - learning_rate * g_W), (classifier.b, classifier.b - learning_rate * g_b)]
44
エラー率が7.5%で打ち切り
73世代 600x83x73=
3635400画像(延数)
Batchあたり600画像x83バッチ
動かしてみる
• ドキュメント
– http://deeplearning.net/tutorial/logreg.html#logreg
• ソースコード
– https://github.com/lisa-lab/DeepLearningTutorials
$ python logistic_sgd.py ... loading data ... building the model ... training the model epoch 1, minibatch 83/83, validation error 12.458333 % epoch 1, minibatch 83/83, test error of best model 12.375000 % : epoch 73, minibatch 83/83, validation error 7.500000 % epoch 73, minibatch 83/83, test error of best model 7.489583 %
1世代
73世代
2015/12/18 45
MULTILAYER PERCEPTRON 多層化
2015/12/18 46
Multilayer perceptron
• 入門用向けの例題 1. Logistic Regression - using Theano for something simple 1950年代
2. Multilayer perceptron - introduction to layers 1980年代
3. Deep Convolutional Network - a simplified version of LeNet5 2010年代*
http://d.hatena.ne.jp/uhiaha888/20130803/1375513648
0
2
4
6
8
10
12
14
1
40
79
118
157
196
235
274
313
352
391
430
469
508
547
586
625
664
703
742
781
820
859
898
937
976
Logistic Regression
Multilayer perceptron
Deep Conventional Network
minibatch
誤答率
1.7% 0.91%
7.5%
*1979年に福島邦彦氏が発表したネオコグニトロンの再発明
Theanoの例題で実測
2015/12/18 47
次はこれ 1990年代
Multilayer perceptron
• 1層モデルと同じくMNISTを例題にして、多層(2層以上)のNNの原理と効果について説明
• モデル
–線形分離問題
–誤差逆伝達法
• その他テクニックは簡単な紹介のみ
–パラメタの初期
–正則化
2015/12/18 48
モデル
• 𝑓 𝑥 = 𝐺 𝑏 2 +𝑊 2 𝑠 𝑏 1 +𝑊 1 𝑥
• ロジステック回帰の前段に一層追加した場合を例に説明
• Layerの追加で誤答率が7%から1.69%へ大きく改善
0.05 0.40 0.05 0.05 0.15 0.05 0.05 0.15 0.05 0.05
𝑊1 𝑏1 𝑊2 𝑏2
‘1’
ロジステック回帰の例題 今回追加
2015/12/18 49
隠れ層の役割
𝑓 𝑥 = 𝐺 𝑏 2 +𝑊 2 𝑠 𝑏 1 +𝑊 1 𝑥
• 隠れ層:𝑠 𝑏 1 +𝑊 1 𝑥
• 線形分離不可問題に効果がある – 空間を曲げる、次元変換
– 空間を行列演算で曲げ、平面で分離する
• どうやって?
http://sinhrks.hatenablog.com/entry/2014/11/30/192940
2015/12/18 50
Back propagation - 誤差逆伝播法
• 出力層から入力層側への学習
• 2層分のパラメタをまとめて学習
𝜃 = 𝑊 2 , 𝑏 2 ,𝑊 1 , 𝑏 1 .
– SGDと同様に𝑊 2 , 𝑏 2 誤差最小の値を計算
–誤差が𝑊 1 , 𝑏 1 から生じたとして𝑊 1 , 𝑏 1 を更新
• フレームワークが処理してくれるので意味と目的が理解できればよい
2015/12/18 51
Theanoでの2層分の偏微分
• 損失関数 cost を、パラメータ HiddenLayer.W, HiddenLayer.b, LogisticRegression.W, LogisticRegression.bそれぞれで偏微分した偏導関数を求めておく
• パラメータごとに勾配計算 / 更新
𝜃 = 𝑊 2 , 𝑏 2 ,𝑊 1 , 𝑏 1 を𝜕𝑙
𝜕𝜃
class HiddenLayer self.params = [self.W, self.b] class LogisticRegression self.params = [self.W, self.b] self.params = self.hiddenLayer.params + self.logRegressionLayer.params gparams = [T.grad(cost, param) for param in classifier.params]
2015/12/18 52
隠れ層の可視化
Epoc:0 Epoc:828
http://sinhrks.hatenablog.com/entry/2014/11/30/085119 •隠れ層からの出力データ 500 次元に主成分分析をかけて 2次元に写像 •ランダムサンプリングした 300 レコードを描画
2015/12/18 53
‘8’と’6’の分離
•
Epoc:0 Epoc:828
http://sinhrks.hatenablog.com/entry/2014/11/30/085119 2015/12/18 54
DEEP CONVOLUTIONAL NETWORK
2015/12/18 55
Convolutional Network
• 3つの入門用向け例題 1. Logistic Regression - using Theano for something simple
2. Multilayer perceptron - introduction to layers
3. Deep Convolutional Network - a simplified version of LeNet5
0
2
4
6
8
10
12
14
1
40
79
118
157
196
235
274
313
352
391
430
469
508
547
586
625
664
703
742
781
820
859
898
937
976
Logistic Regression
Multilayer perceptron
Deep Conventional Network
minibatch
誤答率
1.7% 0.91%
7.5%
56
最後はこれ 2012年
Multi Layer Perceptronを拡張
𝑓 𝑥 = 𝐺 𝑏 2 +𝑊 2 𝑠 𝑏 1 +𝑊 1 𝑥
s
s
s
s
s
G
G
G
s 0.05 0.40 0.05 0.05 0.15 0.05 0.05 0.15 0.05 0.05
𝑊1 𝑏1 𝑊2 𝑏2
‘1’
𝑤1 入力層 - 隠れ層の間で適用される係数行列 𝑏1 入力層 - 隠れ層の間で適用される重みベクトル 𝑠 隠れ層の活性化関数 𝑤2 隠れ層 - 出力層の間で適用される係数行列 = ロジスティック回帰の係数行列 𝑏2 隠れ層 - 出力層の間で適用される重みベクトル = ロジスティック回帰の重みベクトル 𝐺 出力層の活性化関数。多クラスの場合はソフトマックス関数
入力層 隠れ層 出力層
Convolutional と maxpooling を
追加
57
convolutional_mlp.pyのモデル • convolution 濃淡構造をフィルタで抽出 • maxpooling 位置感度を低下させる
layer0 = LeNetConvPoolLayer( rng, input=layer0_input, image_shape=(batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2) )
layer1 = LeNetConvPoolLayer( rng, input=layer0.output, image_shape=(batch_size, nkerns[0], 12, 12), filter_shape=(50, 20, 5, 5), poolsize=(2, 2) )
layer2 = HiddenLayer( rng, input=layer2_input, n_in=50 * 4 * 4, n_out=500, activation=T.tanh )
layer3 = LogisticRegression( input=layer2.output, n_in=500, n_out=10 )
28
28
24
24 1枚
20枚
layer0 LeNetConvPoolLayer
convolution maxpooling
layer2 HiddenLayer
layer3 LogisticRegression
800
500
10
4x4x50
1.Logistic Regression
2.Multilayer perceptron
3.Deep Convolutional Network
W[20, 1, 5, 5] 5x5画素1chを20個
学習するフィルタ
20枚
12
12
layer1 LeNetConvPoolLayer
8
8
50枚
4
4
50枚
convolution maxpooling
W[50,20, 5, 5] 5x5画素20chを50個
学習するフィルタ
W W
58
Layer0 - Convolutionの演算 • 5x5画素1chのフィルタを20個を学習する
• 元データに畳み込む – ずらしながら演算
– 入力画像W×W
– フィルタがH×H
– 出力サイズW−2⌊H/2⌋×W−2⌊H/2⌋
layer0 = LeNetConvPoolLayer( rng, input=layer0_input, image_shape=(batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2) )
28
28
24
24 1枚 20枚 20枚
12
12
layer0 LeNetConvPoolLayer
convolution maxpooling
20個
5
5
20個、1CH、5x5
28
24
59
Layer0 - maxpoolingの演算 • 2x2の画素の最大値をとる
• 画素数は縦横半分に
layer0 = LeNetConvPoolLayer( rng, input=layer0_input, image_shape=(batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2) )
28
28
24
24 1枚 20枚 20枚
12
12
layer0 LeNetConvPoolLayer
convolution maxpooling 24
24
12
12
2x2 60
Layer1 - Convolutionの演算 • 5x5画素20chのフィルタを50個を学習する
50個、20CH、5x5
20枚
12
12
layer1 LeNetConvPoolLayer
8
8
50枚
4
4
50枚
convolution maxpooling
layer1 = LeNetConvPoolLayer( rng, input=layer0.output, image_shape=(batch_size, nkerns[0], 12, 12), filter_shape=(50, 20, 5, 5), poolsize=(2, 2) )
50個
5
5 20CH
20枚
12
12
8
8 1/50枚
12
12
8
8 5
5
20枚
12
12
8
8
50枚 convolution
X20回
X50回
61
convolutional_mlp.pyの4層モデル
28
28
24
24
1枚 20枚
convolution maxpooling
800 500 10
4x4x50
20枚
12
12
8
8
50枚
4
4
50枚
convolution maxpooling
W W
updates = [ (param_i, param_i - learning_rate * grad_i) for param_i, grad_i in zip(params, grads) ] train_model = theano.function( [index], cost, updates=updates, givens={ x: train_set_x[index * batch_size: (index + 1) * batch_size], y: train_set_y[index * batch_size: (index + 1) * batch_size] } )
test_model = theano.function( [index], layer3.errors(y), givens={ x: test_set_x[index * batch_size: (index + 1) * batch_size], y: test_set_y[index * batch_size: (index + 1) * batch_size] } ) validate_model = theano.function( [index], layer3.errors(y), givens={ x: valid_set_x[index * batch_size: (index + 1) * batch_size], y: valid_set_y[index * batch_size: (index + 1) * batch_size] } )
Forwardのみ Forward & Backward
Backward
5x5画素
20個
5x5画素20枚
50個
5x5画素1chを20個を学習 5x5画素20chを50個を学習
Forward
layer0 layer1 layer2 layer3
flatten
62
THEANOのTIPS
2015/12/18 63
Forward(推定)の構文木
layer0
layer1
layer2
layer3
64
Forward(推定)とBackward(学習)の構文木
Forward
layer0
layer1
layer2
layer3
65
Forward(推定)とBackward(学習)の構文木
66
構文木を出力 • Theanoのプログラム中に構文木の出力を指示
theano.printing.pydotprint(test_model, outfile="./c_graph_test_model.png",var_with_name_simple=True) theano.printing.pydotprint(validate_model, outfile="./c_graph_validate_model.png", var_with_name_simple=True) theano.printing.pydotprint(train_model, outfile="./c_graph_train_model.png", var_with_name_simple=True)
• 環境変数を設定 export THEANO_FLAGS=mode=FAST_RUN,profile=True,device=gpu,floatX=float32
• 変数 – シアン: 共用変数 – 緑:入力変数 – 青:出力変数 – 灰:未使用の変数
• Default apply node code:: – 赤: gpu転送 – 黄:scan node – 茶:shape node – マジェンタ:IfElse node – ピンク:elemwise node – 紫:subtensor – オレンジ:alloc node
67