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「深層学習で死にそう」
そのあとの紆余曲折はだいたいここに書いてあります
(ここでの正解率は全て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パーセント
\パンッ/ヨッシャアアアアアアアアアアアア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を多く参考にしました。
僕たちのリポジトリ
誘ってくれたアンド最後まで付き合ってくれたpotetisenseiへの感謝の言葉で終わりにします
サンキューポテチ!