Slide 1

Slide 1 text

ぼくの実装した最弱の ディープラーニング 2015/9/4 きしだ なおき

Slide 2

Slide 2 text

機械学習

Slide 3

Slide 3 text

学習が進むにつれて正答グラ フがなんとなくあがってきて いる なんかAirplaneって言ってる 現在の状況

Slide 4

Slide 4 text

機械学習とは • 多数のデータからパラメータを学習する • いろいろ判定に使う • あんまりファンタジーじゃない

Slide 5

Slide 5 text

ニューラルネットワーク • ニューロンを模した構造

Slide 6

Slide 6 text

各ユニットの計算 • 入力に重みをかけてバイアスを足して活 性化関数を適用

Slide 7

Slide 7 text

活性化関数 • 入力に、なにか掛けて足すだけでは線形 にしかならない • 非線形な活性化関数を入れる – シグモイド関数 – ReLU(正規化線形関数) • 計算が速い!

Slide 8

Slide 8 text

ニューラルネットワークの学習

Slide 9

Slide 9 text

最急降下法 • 微分して傾きを求めて深いほうに進む • 最適ではない谷に落ちないように工夫が 必要

Slide 10

Slide 10 text

バックプロパゲーション • 誤差を逆伝播させる

Slide 11

Slide 11 text

ディープラーニングによる画像識別

Slide 12

Slide 12 text

ディープラーニング • 階層の深いニューラルネット • 最近、人工知能っていわれてるのは、ほぼこれ • いままでできなかったわけ – コンピュータが遅かった • GPUで速い計算 – データがなかった • インターネッツ! – データあさり放題 • クラウドソーシング! – ImageNetの1400万の画像はクラウドソーシングでタグ付けして るらしい

Slide 13

Slide 13 text

参考文献 • 「深層学習」 – 広い範囲が解説してある – http://www.amazon.co.jp/dp/4061529021 • AlexNet論文 – パラメータなどが詳しく説明して ある http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf

Slide 14

Slide 14 text

畳み込みニューラルネット • 畳み込み層やプーリング層といった、特 徴的なレイヤーを持つニューラルネット • 画像識別に向いている • AlexNetで有名に – 2012年のILSRVCで2位に大差をつけて優勝

Slide 15

Slide 15 text

畳み込み層 • フィルターを畳み込む • 重み共有

Slide 16

Slide 16 text

プーリング層 • 区域の最大値をとったり平均をとったり する • 学習パラーメタはない

Slide 17

Slide 17 text

正規化層 • 値の平均や分散を一定にする • 学習パラメータはない

Slide 18

Slide 18 text

AlexNetの構造 • C->P->N->C->P->N->C->C->C->P->F->F->F – C:畳み込み層 • 96/256/384/384/256 – P:プーリング層 – N:正規化層 – F:全結合 • 4096/4096/1000 • いま動いてるやつ – C->P->N->C->P->N->F->F • C:48/96 • F:1024/256

Slide 19

Slide 19 text

学習の工夫

Slide 20

Slide 20 text

データ正規化 • 入力画像の画素ごとの平均をとっておい て、入力画像から引く

Slide 21

Slide 21 text

ミニバッチ • 一枚の画像ごとに重み更新するんではな くて、何枚かの画像の差分を平均して重 みを更新する

Slide 22

Slide 22 text

モメンタム • 重みの更新に慣性をつける。 • 谷に落ちにくくなる

Slide 23

Slide 23 text

局所正規化 • 近いフィルタの出力を使って正規化する

Slide 24

Slide 24 text

ドロップアウト • 複数の機械学習の結果を平均させるといい 結果になる。 • 複数の機械学習器を用意するのは面倒 • ニューラルネットの ユニットを確率的に 省く – 構造の違う ニューラルネット!

Slide 25

Slide 25 text

doubleではなくfloatを使う • 学習に精度はあまり関係ない – 「誤差の減り方は殆ど同じであり、数値に高 い精度は必要ない」 http://news.mynavi.jp/articles/2015/04/08/gtc2015_google/ • 速くなった! – float 95枚/分 – double 75枚/分

Slide 26

Slide 26 text

ぼくの機械学習が学習してくれなかっ たわけ • フィルタの初期値が大きすぎた – フィルタは標準偏差0.01、平均0のガウスノイズに – バイアスは0か1 • 青イルカ本に書いてない工夫 – 局所正規化 • となりのフィルタ出力と平均化させる – 重み減衰を取り入れる • aparapiのバグ! – これはひどい

Slide 27

Slide 27 text

GPU対応

Slide 28

Slide 28 text

GPUつよい! • GPU – ちょうたくさんコアがある – 同じ処理を行う – 行列計算に向いてる • GTX 970 – 1664コア! – 衝動買い!

Slide 29

Slide 29 text

aparapi – A PARalell API – Javaで書いたコードを実行時にOpenCLのコー ドに自動変換してくれる。 – JavaでGPUコードが書ける! – Mac Book Proでもいける!(Intel Iris Pro)

Slide 30

Slide 30 text

記述 • Kernelを継承 • runを実装 – getGlobalId()でインデックスを取る • executeを呼び出し – 引数で与えた回数 runが呼び出される @Override public void run() { int fxy = getGlobalId(); float d = result[fxy] >= 0 ? delta[fxy] : 0; tempBiasDelta[fxy] = learningRate * d; } execute(outputChannels * outputWidth * outputHeight);

Slide 31

Slide 31 text

効果 • AlexNetの学習 • 自宅 (Core i7 4コア+GTX 970) – CPU 15枚/分 – GPU 95枚/分 • このMac(Core i7 4コア+Intel Iris Pro) – CPU 12枚/分 – GPU 16枚/分 • ImageNetのサンプル1400万枚が100日で学習で きる! – CPUなら640日!

Slide 32

Slide 32 text

バグがある・・・ • 三項演算子のカッコが反映されない – (修正してプルリクなげてます) • CPUとの結果と比較するテストを用意したほうが いい – けど、丸めの違いを考慮するの面倒 void proc(int fxy) { float d = (result[fxy] >= 0 ? 1 : 0) * delta[fxy]; tempBiasDelta[fxy] = learningRate * d; } void kishida_cnn_kernels_ConvolutionBackwordBiasKernel__proc(This *this, int fxy){ float d = (float)(this->result[fxy]>=0.0f)?1:0 * this->delta[fxy]; this->tempBiasDelta[fxy] = this->learningRate * d; return; }

Slide 33

Slide 33 text

Slide 34

Slide 34 text

課題 • ミニバッチ内のサンプルが偏らないよう にする • 学習結果の保存・読み込み – (9/5-6の土日に実装した) • 学習結果を使った判定 – いまはドロップアウトしたまま

Slide 35

Slide 35 text

まとめ • 一ヶ月がんばればなんでも組める気がする • お金さえあればたくさんデータが処理できる