Lastig

初級Web系エンジニアの技術系とかもろもろのブログ

DeepLearning fastai #Lesson2 CNNS (Lesson1の続き lesson1.ipynb) 感想とか

Lesson2の動画は前半はLesson1のjupyter notebookの内容なので、記事のタイトルが変なのはそのせい。
動画の00:00:00 ~ 1:11:00までの感想メモ。

1:11:00以降はLesson1の補足とか、AWSでの環境構築とかなので省く。

Lesson2の内容



・learning rate (学習率) の算出ロジック
・学習率を一定周期でリセットして、より良い値を計算する手法
・precomputeの使い方
・learn系の使い方、 freeze/unfreeze
・differential learning rate
・SGDR
TTA

DL用語


CNN convolutional neural networks。畳み込みニューラルネットワーク
data augmentation データ拡張。画像をたくさん集めるのは大変なので、画像を拡大、縮小、回転してカサまししてデータを効率よく使う手法。
TTA Test Time Augumentation。推論時にもAugumentationを使用することで精度を上げる手法
inference time 推定時間
annealing 学習率が勾配の最低値に近づくにつれて、値の下げ幅を小さくする手法。理想値に近づくにつれて、ちょっとずつ慎重に進んでくイメージ。
SGDR stochastic gradient descent with restarts。再帰確率的勾配降下法

英単語


crop (写真を) トリミングする
resilient はねかえる
fiddling つまらぬ, ささいな

cropって収穫以外の意味知らなかったな

復習



precompute

precomputeは以前に使った画像と活性化関数を使うかどうかを決めるフラグ。
learnをprecompute=Trueで初期化しているので、このままlearn.fitするとData Augumentationをした画像は適用されない。
f:id:lazycat99:20190103111519p:plain
f:id:lazycat99:20190103111532p:plain
f:id:lazycat99:20190103112318p:plain

precompute=Trueにすることで、今回サイズを変えたりしてカサ増ししたData Augumentation済みの画像が適用される。
f:id:lazycat99:20190103111554p:plain
f:id:lazycat99:20190103112149p:plain
lossがちょっとだけ小さくなっている。

learning rateのcycle_len

cycle_lenというのは何epochごとにlearning rateをリセットさせるかを指定するパラメータ。
cycle_len=1なら1epochごとに、cycle_len=2なら2epochごとだ。

SGDRでより正確なlearning rateを計算するために
今回だと3回、learning rateをリセットして計算しなおしている。
f:id:lazycat99:20190103111554p:plain
f:id:lazycat99:20190103114236p:plain

learn save/load

save Data Augumationした画像とモデルを保存する。
load 上記を読み込む。

※data/modelsとdata/tmpディレクトリに学習内容は保存される。

learn frozen/unfrozen

freeze 畳みこみレイヤーを変えたくない場合に使う。レイヤーを固定する感じ。
unfreeze 畳みこみレイヤー(エッジとか斜めの特徴量をもったレイヤー)そのものを変えたい場合に使う。

※unfreezeは引数なしだとすべてのレイヤーが対象。

differential learning rate ~レイヤーごとの学習率指定~

f:id:lazycat99:20190103142811p:plain
レイヤーごとに学習率を変えるというやりかたはちょっと衝撃だった。こんな方法があるとは。
当たり前すぎて名前もついてないらしい。

np.arrayの各引数は以下のような意味らしい。

1e-4 1e-3 1e-2
first layerの学習率 middle layerの学習率 top layerに上乗せしたlayerの学習率
基本的な地理的特徴 firstより複雑で洗練された特徴 追加した特徴

基本的な特徴については、Data Argumentationした画像を大きく反映させる必要はないので学習率を小さく設定する。
対照的に新しいレイヤーには強く反映させたいので、さっき使ったのと同じ学習率を設定する。

既存の上手くいってるモデルを活かしつつ、そのモデルに変更を上乗せするときに価値を発揮するタイプらしい。

f:id:lazycat99:20190103145546p:plain
f:id:lazycat99:20190103145658p:plain
結果を見てみると、validating lossがだいぶ下がっているのが確認できる。
学習率をレイヤーごとに変えたのがいい感じに効いてるためだ。ちょっとテンション上がる。
accuracyもちょっとあがってるし。

SGDR

今度はcycle_mult=2にしているので、勾配の降下にかかる進み具合が2倍、4倍と遅くなっている。
左端の山だと、最下点まで下ったあとにすぐジャンプして次の山に進んでしまうが、右端の山では最下点でちょっと落ち着いている。
なので、右に進むにつれて良い学習率が得られるということみたいだ。

f:id:lazycat99:20190103150543p:plain

TTA

test time augumentation。
推論するときにもAugumentationすることで、精度を高める手法。
f:id:lazycat99:20190103153348p:plain
今回だとオリジナルの画像に加えて、4つAugumentした画像を用意する。これらのすべてに対して推論して平均を採用する。
f:id:lazycat99:20190103153541p:plain
0.994とめっちゃいい値が出る。ただ単に推論するよりもAugumentしたほうが伸びるということだ。やばし。


感想



augumentationの話は聞いたことがあったけど、数値で結構効くのを確認できたのが面白かった。
学習率の計算部分を図で説明してくれていたのが呑み込みやすかった。
講義の内容は2回目ぐらいになるとちょっとわかってくるけど、まだ生徒の質問の部分がさっぱりついていけない。
Youtubeの字幕編集画面を使うと、講義のわからない内容を調べるのに便利だった。
TTAとかメソッド呼ぶだけでできるってfastaiライブラリってだいぶかっこいいと思う。

精度がくそ高いのがやっぱりテンションあがる。

Lesson2へのリンクとかパス



・講義
course.fast.ai
・フォーラム
forums.fast.ai
・画像のパス
~/courses/fastai/courses/dl1/data/planet
・データがjupyter notebook上になかった場合のダウンロード先
http://files.fast.ai/data

関連する/勉強になる別記事



データ拡張(Data Augmentation)について、画像付きで解説してくれている。わかりやすい。
qiita.com