Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ぼくの実装した最弱のディープラーニング / Weakest deep learning I implemented

ぼくの実装した最弱のディープラーニング / Weakest deep learning I implemented

2015年9月4日の「プログラマのための数学勉強会@福岡 #1」でのプレゼン資料です。
https://maths4pg-fuk.connpass.com/event/18609/

(2023/4/12に再アップ)

Naoki Kishida

September 07, 2015
Tweet

More Decks by Naoki Kishida

Other Decks in Programming

Transcript

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

    View Slide

  2. 機械学習

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. 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

    View Slide

  19. 学習の工夫

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  27. GPU対応

    View Slide

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

    View Slide

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

    View Slide

  30. 記述
    • 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);

    View Slide

  31. 効果
    • 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日!

    View Slide

  32. バグがある・・・
    • 三項演算子のカッコが反映されない
    – (修正してプルリクなげてます)
    • 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;
    }

    View Slide


  33. View Slide

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

    View Slide

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

    View Slide