Contenu connexe Similaire à Deep learning実装の基礎と実践 (20) Deep learning実装の基礎と実践2. ⾃自⼰己紹介
l 得居 誠也 (Seiya Tokui)
l Preferred Networks リサーチャー
l Jubatus のアルゴリズム開発
– Jubatus: NTTとPFIで共同開発しているオープンソースの分散
リアルタイム機械学習基盤 http://jubat.us/
l 現在は映像解析とディープラーニングの研究開発に従事
2
3. ニューラルネットの基礎、実装、実験について話し
ます
l ニューラルネットの道具
– 全体の構成、⾏行行列列による表現、損失関数、誤差逆伝播、SGD
l 主要な実装
– Pylearn2, Torch7, Caffe, Cuda-‐‑‒convnet2
l フレームワークの基本的な設計
– テンソルデータ、レイヤー、ネット、最適化ルーチン
– アーキテクチャの記述⽅方法(宣⾔言的、スクリプティング)
l 実験の進め⽅方
– データの前処理理、アーキテクチャの設計、パラメータの初期値、
正則化、学習率率率の初期値と調節、モーメンタム
– 評価の⽅方法、プロット、パラメータの可視化
– 中断・レジューム、パラメータの差し替え
3
5. Deep Learningいろいろ
Neural Network: 右図のような
計算グラフで表される⾮非線形関数
Convolutional NN: 画像や⾳音声
などの構造を反映したNNの⼀一種
Deep Belief Network(左),
Deep Boltzmann Machine(右):
多層のグラフィカルモデル(確率率率モデル)
※今⽇日は触れません
“Deep” の定義は⽂文脈により様々。普通は3層以上で深いと⾔言われる
5
6. Feed-‐‑‒Forward Neural Network
(結合)重み
x ⼊入⼒力力層隠れ層隠れ層出⼒力力層1
wj1
x2
wj2
x3
wj3
x4
wj4
ユニット
活性
hj = f(wj1x1 + · · · + wj4x4 + bj)
活性化関数
バイアス項
= f(wj x + bj)
重みとバイアス項を調節
して、望みの予測を得ら
れるようにするのが学習
の⽬目標
8. 最適化としての学習
l モデルの出⼒力力(予測)と正解とがよく⼀一致するほど⼩小さくなるよう
な値(損失 loss)を考える
l 各教師データごとの損失の平均を⽬目的関数とするのが⼀一般的
L(W) =
1
N
XN
i=1
`(y(xi;W), yi)
l 学習=⽬目的関数の最⼩小化
`
y(x;W)
(xi, yi)i=1,...,N
W
l 損失関数:エントロピー誤差(分類)や⼆二乗誤差(回帰)
8
損失関数
モデルの予測
各教師データ
予測器の重み
minimize (パラメータ)
W
L(W)
`(y, yi) = ky − y1k2 (⼆二乗誤差)
10. 確率率率的勾配降降下法
Stochastic Gradient Descent (SGD)
l 教師データ全部を⾒見見ず、⼀一部(ミニバッチ)だけを⾒見見て勾配を計算
する( :ミニバッチ)
l 最初にデータセットをランダムシャッフルして、前から 個ず
つミニバッチとして取り出して更更新するのが⼀一般的
– データの順序に偏りがある場合、シャッフルしないと性能が⼤大
きく落落ちる
– 理理論論的には毎回ランダムにミニバッチを選ぶのが収束の速さと
いう意味で良良いが、ランダムアクセスが増えるので実際には遅
くなることが多い
10
B
|B|
W W −
⌘
|B|
X
i2B
r`(y(xi;W), yi)
11. モーメンタム法
l SGD は勾配のブレが⼤大きいとなかなか収束しない
l ブレを低減するために、勾配の移動平均(モーメンタム)を使う
11
h h + μ
1
|B|
Xn
i2B
r`(y(xi;W), yi),
モーメンタムモーメンタム係数
W W − ⌘h.
W(t)
r`
W(t1)
W(t+1)
上付きの添字は
更更新回数を表すとする
W(t+2)
12. 勾配の計算⽅方法
誤差逆伝播法 (backpropagation)
l Feed Forward Neural Network はたくさんの関数の合成
l 勾配を求めるには合成関数の微分(連鎖律律 chain rule)を使う
l すると勾配の計算は、出⼒力力側から⼊入⼒力力側に向かって各ユニットの勾
配を伝播させるような処理理としてかける
誤差関数
(error)
⼊入⼒力力層隠れ層隠れ層出⼒力力層正解
12
(groundtruth)
重みの勾配重みの勾配重みの勾配
13. 主要な実装
名前主要な開発者⾔言語特徴
Pylearn2Univ. Montrealの
LISA Lab
Python (C++)NumPyとの親和性、
強⼒力力な⾃自動微分
Torch7NewYork Univ.など?Lua/C++Luaによるスクリプ
ティング、拡張性の
⾼高さ
CaffeBerkeley Vision and
Learning Center
(UCB)
C++ (Python)単⼀一GPUで最⾼高速度度
(2014/08現在)
Cuda-convnet2Alex KrizhevskyC++ (Python)マルチGPU環境での
並列列実⾏行行(Tesla
K20x8)
13
19. テンソルデータ構造
l 浮動⼩小数点の配列列に、次元の情報が加わったもの
l データの構造を使わない、全連結なニューラルネットワークを作る
場合、⾏行行列列とベクトルだけで実装できる
l 画像に対する畳込みニューラルネットを作る場合、4階のテンソル
が必要
l 動画に対して時間軸も区別する⼿手法を作る場合、5階のテンソルが
必要
l 実装例例:NumPy の ndarray
– Pylearn2 は ndarray を使う
– Caffe のデータ構造もゼロコピーで ndarray との相互変換がで
きる
19
20. レイヤー
20
最適化ルーチン
出⼒力力データ
中間データ
⼊入⼒力力データ
正解データ
バイアス
重み
中間エラー
バイアス
重み
ネットワーク実装
レイヤーレイヤー
25. ネットワークは順伝播と逆伝播を実装する
l ネットワークの仕事は、ニューラルネット全体=計算グラフを保持
して、その上で順伝播や逆伝播を実⾏行行すること
l ネットワーク上の誤差逆伝播は⾃自動微分
– 指定された⼊入⼒力力変数・出⼒力力変数に対して、どういう順番で
backpropを呼び出せば⽬目的の勾配を計算することができるのか
を⾃自動で判断する
– ネットワークが⼀一本のチェーン状の場合は簡単
– ネットワークが複数の⼊入⼒力力、合流流、分岐、複数の出⼒力力を持つ場
合には少しややこしくなる
l 正しくDAGになっていれば計算可能
25
26. 最適化ルーチン
26
最適化ルーチン
出⼒力力データ
レイヤー
中間データ
レイヤー
⼊入⼒力力データ
正解データ
バイアス
重み
中間エラー
バイアス
重み
ネットワーク実装
27. 最適化ルーチンは重み・バイアスの配列列に対して勾
配を⽤用いてオンライン最適化を実⾏行行する
l ここは⽐比較的単純な実装になることが多く、現在のパラメータと勾
配を受け取って更更新するルーチンとして書かれる場合が多い
l ほぼすべてのフレームワークではモーメンタムSGDをサポートして
いる
– State of the art なニューラルネット学習で⽤用いられる
– 学習率率率のチューニングが精度度に重要
– Pylearn2 などは、現在のパラメータの性能を監視して⾃自動的に
学習率率率を下げる機能などもサポートしている
l 学習率率率を⾃自動調節する⼿手法を実装していることも(AdaGrad,
AdaDelta, RMSpropなど)
27
28. アーキテクチャの記述⽅方法
l アーキテクチャ:ネットワークの構成
– ⼊入⼒力力データの情報(パスや前処理理⽅方法)も⼀一緒に記述することが多い
– 最適化ルーチンの設定を⼀一緒に記述するフレームワークもある
l 試⾏行行錯誤を簡単にするために、宣⾔言的に書けるような仕組みを持っ
ていることが多い
l Pylearn2: PyYAML
l Caffe: Protocol Buffer(テキスト形式)
l Cuda-‐‑‒convnet: iniファイル
28
29. 例例:Pylearn2
l 多層パーセプトロンの
チュートリアルから
アーキテクチャ部分の
みを抜粋
l Layersにレイヤー定義
を並べていく
l 指定の仕⽅方は model に
よって異異なる
l スクリプトで構築する
こともできる(複雑な
グラフを作りたい場合
など)
29
30. 例例:Caffe
l Caffe の MNIST サンプルのアーキテク
チャ設定から⼀一部を抜粋
l Protocol Buffer の layers メッセージと
してレイヤーの設定を並べる
l bottom, top が⼊入⼒力力、出⼒力力レイヤーに対
応していて、複雑なグラフも書ける
30
32. 実験の流流れ
l 計算機環境の準備
l データの前処理理(重要!!!)
l チューニング:以下の繰り返し
– アーキテクチャの設計
– パラメータ初期値の設定
– 学習率率率の初期値を探す
– 評価しながら学習率率率調節
33. 計算機環境の準備
l ⼩小さなデータセット(10万件)なら CPU のみでOK
l ⼤大きなデータセットでは GPGPU が必須
– ⼀一回の実験が数⼗十分〜~数時間になってくると欲しくなる
l 多くのフレームワークは CUDA 対応なので NVIDIA GPU が良良い
l 価格と性能のトレードオフ
– 性能は CUDA コア数、メモリサイズ、クロック数で⾒見見る
– メモリサイズは巨⼤大な NN を⼤大きなミニバッチで学習する際に
必要
– トレードオフの意味で最もリーズナブルなのは
NVIDIA GeForce GTX770(2014年年8⽉月現在、4万円弱)
l 電源と冷冷却にも気をつける
33
34. データの前処理理(重要!!!)
l よく⾏行行われるのは⽩白⾊色化 whitening
– データの平均が 0 ベクトルになるように平⾏行行移動させる
– データの各次元の分散が 1 になるようにスケールさせる
l 主成分分析に基づく⽩白⾊色化もよく⾏行行われる
– 主成分に変換する:主成分軸⽅方向の分散を 1 に揃える効果
– 画像などデータの⾒見見た⽬目が解釈しやすい、あるいはデータの構
造を学習に活⽤用したい場合、変換後に主成分表⽰示からもとの
RGB空間に戻すことがある(ZCA whitening)
l 画像では他にもコントラスト正規化を⾏行行うことがある
l 前処理理は最適化の収束速度度に強く影響する
34
35. アーキテクチャの設計
l まずは各フレームワークの examples を⾒見見ていろいろ学ぶ
l はじめは狭くて浅いネットワークから始める
l チューニングしながら、精度度が上がらなくなったら広くする(各層
のユニット数を増やす)
l 精度度が上がらなかったり過学習の兆候が⾒見見えたら、少し狭くして
ネットワークを深くする
– 過学習:訓練データでは精度度が上がるが評価データでは精度度が
落落ちる
l どの活性化関数を使うかや、ドメイン依存のレイヤー(画像に対す
る正規化レイヤーなど)は最適な組合せがタスクによって違うので、
いろいろ変えて⽐比較して選ぶ
35
36. パラメータの初期値
l 活性化関数によって設定の仕⽅方が変わる
l 最善の⽅方法がわかっているわけではない
l シグモイド型関数の場合(ロジスティック関数、tanh関数)
– 重み⾏行行列列は各ユニットの 1/sqrt(⼊入⼒力力辺数) 以下の乱数にする
l ⼀一様分布か、ガウシアンからサンプリングすることが多い
– バイアス項は 0 で初期化
l Rectified Linear Unit (ReLU) の場合
– 重み⾏行行列列の初期値に知られた経験則はないが 1/(⼊入⼒力力辺数) 以下
の乱数が良良い(⼊入⼒力力と出⼒力力の値の範囲が⼤大体⼀一緒になる)
– バイアス項は 0 以上の定数値で初期化(正の値にすると学習が
速くなるが、⼤大きすぎると学習が不不安定になる)
36
37. 最適化パラメータの調節
l 学習率率率の初期値
– はじめは⼤大きい値を試す
– ⼤大きすぎるとパラメータが爆発する(infやNaNなど)
– 爆発しないぎりぎりを探し、それより少し⼩小さい値を使う
– 爆発しないぎりぎりの値は結局学習が不不安定になるので避ける
l 学習率率率の調節
– 評価データでスコアの値を監視する
– だいたいスコアが変わらなくなったあたりで学習率率率が下がるよ
うにスケジューリングする
– この作業を⾃自動でやってくれるフレームワークもある
(Pylearn2など)
37
40. まとめ
l ニューラルネット実装は主にテンソルデータ構造、レイヤー、レイ
ヤーをつなげ合わせたネットワーク、最適化ルーチンからなる
l レイヤーは勾配計算つきの関数
l ネットワークは⾃自動微分ができる計算グラフ
l ニューラルネットはチューニングが必要
– 設定、実験、評価の繰り返し
– 設定にはいろんな経験則があるが、タスクによって変わる部分
もある
– 評価はプロットで! 重みのプロットも重要
40