ジョイジョイジョイ

ジョイジョイジョイジョイジョイ

JOI夏季セミナー2015チューター記

 

JOIの夏季セミナーにチューターとして参加してきました。

本が6冊なのになぜかチューターは5人だったので僕は『プログラミング言語の基礎概念』と『深層学習』の2冊を担当することになりました。

 

1日目

catupperと共にヌエックに到着

自己紹介する(チューター→生徒の順)

ぼく「最近興味があるのは深層学習です」(伏線)

本決めとかする

セミナーはじまる(プログラミング言語の基礎概念』を担当)

生徒優秀すぎるでしょ...(何もできずただ座っている)

ヌエックのご飯おいしい

1日目は談話室なかったのでちょっと集まってすぐ寝る

 

2日目

セミナーと講義

師匠に私は熟女好きですされる

わたあめ大人気

今日からは談話室が使える

がっこうぐらしをつけながら枯山水をやる

枯山水たのしい

hogloidの徳の高さには勝てなかったよ...

ここでめぐねえが死ぬ

寝る

 

3日目

catupperの班(関数プログラミング)と相部屋になる

絵しりとりなどする

catupperにHaskellを教わる

ABCの問題をHaskellで解く

Haskell楽しい('ω' )三('ω')三( 'ω')

夕食時、わたあめ機が壊れていた(けっきょく食べられなかった)

シンデレラ見たかったけど談話室は24時に閉まるので見られず死

この日は談話室では特になにもしなかった

 

4日目

深層学習と相部屋になる

potetisenseiがkaggleの犬と猫を見分けるのをやるらしい

面白そうなので勝負を申し込む

画像読み込む段階で挫折しそうになる

potetiにライブラリを教えてもらってなんとか読み込む(これをつかった)

とりあえず昔書いた単純なパーセプトロンに学習させてみる

49.1%

ランダムにラベルつけた期待値の方が高いじゃん...

MNIST(手書き数字認識)を学習させたら9割超えるんだけどなぁ...

Deeplearningの必要性を感じたので畳み込みニューラルネットワーク(CNN)をpotetiから一通り教わる

協力プレイしない?という話になる

基礎はpotetiが既に作っていたのでぼくは畳み込み層の逆伝播とプーリング層を実装することに

セミナーが終わったので談話室で実装することに

hogloidとdegwerがウェイについて話している

hogloidはウェイ

catupperはウェイ

人類皆ウェイ

全然終わらないのでぼくの部屋で実装することに

開発の都合上gitを入れることに

パソコン弱いのでgitインストールできない(結局potetiとcatupperにめっちゃ手伝ってもらった)

アイマス曲を流して歌いながらぐだぐだ実装する

いつのまにか部屋にめっちゃ人が集まっていた

そしてだんだん外が明るくなりはじめる

potetiがスライド一通り作り終えたようなので一緒に考えながら実装する

一応完成した

20分くらい学習させてみる

50.0%

 

5日目

結局寝ないまま5日目の朝を迎える

potetisensei「深層学習で死にそう」

そのあとの紆余曲折はだいたいここに書いてあります

www.slideshare.net

(ここでの正解率は全てMNISTの正解率で結局犬と猫のにはチャレンジできなかった)

 

ア、皆の発表ちゃんと聞いてたからね?

ここでdegwerに私は熟女好きですされる

 

まぁ一からCNN書いて理解も深まったし、なにより動いてくれたのでめでたしめでたし

 

 

...?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

K理事長「分からなかったことに納得するまでが夏季セミナーです。」

 

6日目

基本的にレイヤーの実装が良くないというはなしになる

また設計やり直すか?とか話す

 

7日目

 

ConvNetJSと比べてパフォーマンスが悪いなぁという話になる

ConvNetJSでは活性化関数にReLUを使ってるけどこちらでReLUを使うと重みが発散して死ぬ

ConvNetJSのコードを見て学ぶ

重み制限を実装する

このおかげでReLU使って重み発散しなくなる(ただしパフォーマンスは悪い)

6層のCNNでReLU使って79.66%が出る

逆伝播のデルタを初期化していないという深刻なバグを見つける(これのせいで変な方向に重みが動いていた)

直したけどパフォーマンス全然変わらない

これもう分かんねぇな

potetiがレイヤーの設計改めて実装する(プロ)

 

8日目

新しい設計でテストする

4層だと学習するんだけど6層だと学習しない

ConvNetJSの設定みて初期値とか学習率を変えるとめっちゃパフォーマンスよくなる(ただし依然6層では学習しない)

でもまだConvNetJSの方がパフォーマンス良い

向こうはAdadelta使ってるからだろうなという結論になる

とりあえずmomentum実装する

まぁいい感じ

momentumの符号逆であることに気付く

直したけど精度変わらず

これもう分かんねぇな

momentum有りだと6層で学習するようになる

 

9日目

momentum有りの6層で94.20パーセントが出る(大勝利)

そろそろ犬と猫に挑戦してもいいんじゃない?

犬猫は80パーセントを目標にして、達成したらやめると宣言する(この時点で全く手を付けていなかったので80パーセントという数字は適当)

この見切り発車を後で後悔することになる

 

biasの更新に学習率をかけていないというバグをみつける

バグを直すを学習が遅くなる

これもう分かんねぇな

 

10日目

Adagradを実装する

Adagrad最強(めっちゃ学習が速くなった)(しかもReLUでもいい感じに学習する)

Pythonインストールしてpotetiのスクリプトいじって犬と猫の画像をリサイズする

画像のサイズ128*128にすると計算遅すぎてまともに学習しないので32*32に

とりあえず4層(input->conv->pool->fully->output)で学習させてみる

53.89パーセント(死)

一応統計的に有意に学習してます(白目)

8層(input->conv->pool->conv->pool->conv->pool->fully->output)で学習させる

59.9パーセント

厳しすぎる

8層に3時間くらい学習させて64.057パーセント

とりあえず学習させながら寝る

 

11日目

朝起きて確認

68.960パーセント

うーん

フィルタ増やしたいけど増やすと計算が遅くなる

計算資源の重要性を思い知る

amazonEC2と自宅のパソコンを使っていろいろパラメータをチューニングする

9層のCNN(input->conv->pool->conv->pool->conv->pool->fully->fuully->output)で71.794パーセントが出る

このあたりで80パーセントにしたことを後悔しはじめる

72パーセントとか言っとけばよかった(くっ)

 

12日目

画像の大きさを36*36にして、そのうちランダムで32*32を切り取るようにする

チューニングしながら学習させまくる

 

13日目

なかなか記録伸びず

9層CNNに40時間くらい学習させて75.874パーセントがこの時点で最高

dropout実装するか~という話になる

dropout実装する(二人で分担した)

とりあえず明日まで昔のCNNに学習させて、無理そうだったらdropout付きのに切り替えることにする

 

14日目

8epoch(50時間くらい)終わって77.794パーセント

つらい

というか8epochに50時間かかるの遅すぎませんかねぇ(1epochで2万画像)

ちょっと(3割くらい)プログラム高速化してdropout付きのに切り替える

一応昔のも走らせ続ける

 

 

15日目~18日目

ひたすら学習させる(放置)

6epoch 74.686パーセント

8epoch 77.394パーセント

9epoch 77.909パーセント

10epoch 79.268パーセント

12epoch 78.869パーセント

13epoch 79.806パーセント

 f:id:joisino:20150829201021p:plain

 

 \パンッ/ヨッシャアアアアアアアアアアアアwwwwwwwwwwwwww(高い声で)キタァwwwwwwwwwwウワァヤッタアアアwwwwwwwwwwwwwwwww

 

くぅ~疲れましたw これにて完結です!
実は、potetiに競争申し込んだら協力を持ちかけられたのが始まりでした

云々

 

最後にまとめ

 

まとめ

Deeplearningの闇

  • バグってなくてもパラメータ次第では学習してくれないのでバグのせいかパラメータのせいかの見分けがつかない
  • 下のようなCNNの構成とパラメータを探してもあまりない(実験系の論文や強いライブラリを使ったものはあるけど計算資源の都合上真似できない)
  • バグってても学習するのでバグってることに気付かない
  • 計算資源を無限に欲してしまう
  • 深層学習のアルゴリズムの解説に「理屈はないけど経験上うまくいく」というのが多くて結果の予測がむずかしい

 

最終的なCNNの構成

  • input 32*32 channel 3
  • conv size:5*5 channel 16
  • pool size 2*2 stride 2
  • dropout 0.25
  • conv size 5*5 channel 32
  • pool size 2*2 stride 2
  • dropout 0.25
  • conv size 5*5 channel 64
  • pool size 2*2 stride 2
  • droput 0.25
  • fully channel 64
  • dropout 0.5
  • fully channel 2

活性化関数は全てReLUで最後だけsoftmax

学習係数は0.01

学習方法はAdagrad

画像を全て36*36にリサイズして、うち32*32をランダムで選んで学習させた(推測時は16通り全て試して多数決)

 

ちなみにdropoutなしの同じ構成は20epoch学習させても77.886パーセントでした

 

構成はnagadomi/kaggle-cifar10-torch7 · GitHubを多く参考にしました。

 

僕たちのリポジトリ

github.com

 

 

誘ってくれたアンド最後まで付き合ってくれたpotetisenseiへの感謝の言葉で終わりにします

サンキューポテチ!