Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

機械学習プロ生20151121

6,391 views

Published on

ぷろなま

Published in: Software
  • Be the first to comment

機械学習プロ生20151121

  1. 1. ディープラーニングとGPU 2015/11/21 きしだ なおき
  2. 2. 自己紹介  刀語というアニメを見てます。  第8話なう(12話中)
  3. 3. 機械学習
  4. 4. 実装中
  5. 5. 機械学習とは • 多数のデータからパラメータを学習する • 適当にいろいろ調整して、いい感じのところを 覚えておく→学習 • いろいろ判定に使う • あんまりファンタジーじゃない
  6. 6. ニューラルネットワーク • ニューロンを模した構造
  7. 7. 各ユニットの計算 • 入力に重みをかけてバイアスを足して活性化 関数を適用
  8. 8. 活性化関数 • 入力に、なにか掛けて足すだけでは線形にし かならない • 非線形な活性化関数を入れる –シグモイド関数 –ReLU(正規化線形関数) • 計算が速い!
  9. 9. ニューラルネットワークの学習
  10. 10. 最急降下法 • 微分して傾きを求めて深いほうに進む • 最適ではない谷に落ちないように工夫が必要
  11. 11. バックプロパゲーション • 誤差を逆伝播させる
  12. 12. ディープラーニングによる画像識 別
  13. 13. ディープラーニング • 階層の深いニューラルネット • 最近、人工知能っていわれてるのは、ほぼこ れ • いままでできなかったわけ –コンピュータが遅かった • GPUで速い計算 –データがなかった • インターネッツ! – データあさり放題 • クラウドソーシング! – ImageNetの1400万の画像はクラウドソーシングでタグ付けしてるら しい
  14. 14. 参考文献 • 「深層学習」 –広い範囲が解説してある –http://www.amazon.co.jp/dp/4061529021 • AlexNet論文 • パラメータなどが詳しく説明して • ある – http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf
  15. 15. 畳み込みニューラルネット • 畳み込み層やプーリング層といった、特徴的 なレイヤーを持つニューラルネット • 画像識別に向いている • AlexNetで有名に –2012年のILSRVCで2位に大差をつけて優勝
  16. 16. 畳み込み層 • フィルターを畳み込む • 重み共有
  17. 17. プーリング層 • 区域の最大値をとったり平均をとったりする • 学習パラーメタはない
  18. 18. 正規化層 • 値の平均や分散を一定にする • 学習パラメータはない
  19. 19. 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
  20. 20. 学習の工夫
  21. 21. データ正規化 • 入力画像の画素ごとの平均をとっておいて、 入力画像から引く
  22. 22. ミニバッチ • 一枚の画像ごとに重み更新するんではなく て、何枚かの画像の差分を平均して重みを更 新する
  23. 23. モメンタム • 重みの更新に慣性をつける。 • 谷に落ちにくくなる
  24. 24. 局所正規化 • 近いフィルタの出力を使って正規化する
  25. 25. ドロップアウト • 複数の機械学習の結果を平均させると いい結果になる。 • 複数の機械学習器を用意するのは面倒 • ニューラルネットの • ユニットを確率的に • 省く • 構造の違う –ニューラルネット!
  26. 26. ぼくの機械学習が学習してくれな かったわけ • フィルタの初期値が大きすぎた –フィルタは標準偏差0.01、平均0のガウスノイズに –バイアスは0か1 • 青イルカ本に書いてない工夫 –局所正規化 • となりのフィルタ出力と平均化させる –重み減衰を取り入れる • aparapiのバグ! –これはひどい
  27. 27. GPU対応
  28. 28. GPUつよい! • GPU –ちょうたくさんコアがある –同じ処理を行う –行列計算に向いてる • GTX 970 –1664コア! –衝動買い!
  29. 29. CPU  高機能・高性能・高粒度  OSが実行できる  演算器はコアあたり10個程度  一チップに100個程度  明示的にメモリを制御できない  いかにキャッシュに載せるか  = いかにメモリをまとめて扱うか
  30. 30. GPU  GPU  ちょうたくさんコアがある  同じ処理を行う  行列計算に向いてる  GTX 970  1664コア!  衝動買い!
  31. 31. GPUの構成  いくつかのコアでグループを作る  同時に同じ命令を実行する  グループだけからアクセスできるメモリをもつ  コアのグループが多数ある  コアのグループあたり数個の演算器  数千から数万の演算器  グループ内では同じ演算が行われる  とってもSIMD
  32. 32. GPUの製品  NVIDIA  GeForce  Tesla  GPGPU専用  AMD  Radeon  Intel  Intel HD Graphics  CPUチップに内蔵されたGPU
  33. 33. GPGPU  General Purpose computing on GPU  GPUで汎用計算  シミュレーションとか速い  最近のスーパーコンピュータはGPUがたくさん載って る
  34. 34. GPGPU環境  CUDA  NVIDIA製品用  DirectX  Windows専用  OpenCL  OpenGLとか作った団体(Khronos Group)が策定  さまざまなデバイスで使える  FPGAでも使えたりする
  35. 35. JavaでGPU  Aparapi  JavaコードをOpenCLに変換  OpenCLを呼び出す  OpenCL:並列計算フレームワーク  AMD始め、IntelやNVIDIAなどが参加  JOCL(jogamp.org)  JOCL(jocl.org)  JavaCL  Project Sumatra  Stream処理を自動的にGPUで行う  Java VMに組み込む
  36. 36. Aparapi  A PARalell API  実行時にJavaコードをOpenCLに変換  https://code.google.com/p/aparapi/
  37. 37. Aparapiコード public class AparapiKernel extends Kernel{ float[] inputA; float[] inputB; float[] output; @Override public void run() { int gid = getGlobalId(); output[gid] = inputA[gid] * inputB[gid]; } public static void main(String[] args) { AparapiKernel kernel = new AparapiKernel(); int elementCount = 1_444_477; kernel.inputA = new float[elementCount]; kernel.inputB = new float[elementCount]; kernel.output = new float[elementCount]; fillBuffer(kernel.inputA);
  38. 38. バグがある・・・ • 三項演算子のカッコが反映されない –(修正してプルリクなげてとりこまれてます) • 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; ↓
  39. 39. JOCL(jogamp.org)  OpenCLを薄くラップ  https://jogamp.org/jocl/www/
  40. 40. JOCLのコードString KERNEL_CODE = "kernel void add(global const float* inputA," + " global const float* inputB," + " global float* output," + " uint numElements){" + " size_t gid = get_global_id(0);" + " if(gid >= numElements){" + " return;" + " }" + " output[gid] = inputA[gid] + inputB[gid];" + "}"; CLContext ctx = CLContext.create(); CLDevice device = ctx.getMaxFlopsDevice(); CLCommandQueue queue = device.createCommandQueue(); CLProgram program = ctx.createProgram(KERNEL_CODE).build(); int elementCount = 1_444_477; int localWorkSize = Math.min(device.getMaxWorkGroupSize(), 256); int globalWorkSize = ((elementCount + localWorkSize - 1) / localWorkSize) * localWorkSize; CLBuffer<FloatBuffer> clBufferA = ctx.createFloatBuffer( elementCount, CLMemory.Mem.READ_ONLY); CLBuffer<FloatBuffer> clBufferB = ctx.createFloatBuffer( elementCount, CLMemory.Mem.READ_ONLY); CLBuffer<FloatBuffer> clBufferC = ctx.createFloatBuffer( elementCount, CLMemory.Mem.READ_WRITE); fillBuffer(clBufferA.getBuffer()); fillBuffer(clBufferB.getBuffer());
  41. 41. 比較  Aparapi  めちゃ楽  GPUの性能出しにくい  JOCL  ちょっと面倒  GPUの性能出しやすい
  42. 42. Sumatra  Java VMに組み込むことを目標  実装難しそう  コード書くのもわかりにくそう  性能出しにくそう  Java VMに組み込むほどメリットなさそう  性能欲しい人はOpenCL使うよね
  43. 43. と思ったら  「Sumatra is not in active development for now.(2015/5/1) 」 http://mail.openjdk.java.net/pipermail/sumatra-dev/2015- May/000310.html
  44. 44. 効果 • AlexNetの学習
  45. 45. Aparapiを使う  Core i7 4コア+GTX 970  15枚/分(CPUのみ)→75枚/分(GPU)  1400万枚の画像処理が650日→130日!
  46. 46. doubleではなくfloatを使う • 学習に精度はあまり関係ない • 「誤差の減り方は殆ど同じであり、数値に高い精度は 必要ない」 – http://news.mynavi.jp/articles/2015/04/08/gtc2015_google/  精度が半分になれば並列度があげれる  データの転送量が減る
  47. 47. DoubleではなくFloatを使う  75枚/分→95枚/分  1400万枚の画像処理が130日→102日!
  48. 48. JOCLを使う  95枚/分→298枚/分  1400万枚の画像処理が102日→34日!
  49. 49. GPUローカルメモリを使う  298枚/分→300枚/分  1400万枚の画像処理が34日→33日
  50. 50. 違う処理を並列に行う  畳み込み層の逆伝播処理  重み更新  誤差伝播  バイアス更新 if(n < deltaCount){ // 誤差伝播 }else if (n < deltaCount + filterCount){ // 重み更新 }else if (n < deltaCount + filterCount + biasCount){ // バイアス更新 }
  51. 51. 条件分岐の注意 ひとつのグループにif/else両方走ると  if→elseの順に両方の処理が走る  ひとつのグループではどちらかになるよう に調整が必要  32個単位くらい
  52. 52. 画面表示をはぶく  画面表示のためにGPU→CPU間転送が行わ れていた  300枚/分→320枚/分  1400万枚の画像処理が34日→30日
  53. 53. 結果  機械学習  まだ学習できてません・・・  オレ学習  GPUのプログラミングが学習できました。
  54. 54. まとめ • 一ヶ月がんばればなんでも組める気がする • お金さえあればたくさんデータが処理できる

×