しんさんのブログ

科学や技術のこと読書のことなど

transfer learning, fine tunning, distillation, NNモデル圧縮について調べてみました

Transfer learning

ある領域で学習したモデルを別の領域の学習に利用する手法のことです。
例えばimage netのような膨大な量の学習データを使用して1000カテゴリ分類の学習を行ったとして、その結果を用いて学習データの少ない10カテゴリ分類の問題を解くという手法です。
具体的には、1000カテゴリ問題を解くネットワークと解きたい問題のネットワークを途中までは同じにして、重みに転移元(ここでは1000カテゴリ分類問題)の学習結果を使用します。
そして、少ないデータを使用して出力層近くの重みのみを学習することで、非常に精度よく10カテゴリ問題のモデルを構築できるという手法。
転移元と転移先の問題が似ていることが転移がうまくいく条件になります。
画像の分類なら、共通する特徴や、それを使用してクラス分類するという問題設定が共通しているので、転移学習が有効に働きます。

Fine tunning

fine tunningとはすでにあるのモデルの一部を再利用して、新しいモデルを構築する手法のことだそうです。 素粒子理論で出てくる超対称性の話とは違います。
転移学習と同じ手法に見えますが、以下のような違いがあります。
転移学習は上の例で書いたように、既存の学習済モデル(出力層以外の部分)を、重みデータは変更せずに特徴量抽出機として利用して、出力層部分のみ学習することで、新しいモデルを構築する手法です。
これに対して、ファインチューニングは既存の学習済モデル(出力層以外の部分)の重みデータを一部再学習して特徴量抽出機として利用するという手法です。
つまり転移学習では転移済み学習モデルは固定しているが、ファインチューニングでは元の学習済み重みをさらに書き換えて、新しいモデルに"詳細にtunningする"手法だといえます。
fine tunningを使用する目的はtransfer learningと同じで、少ない学習データで高い正解率を得るためですが、fine tunningの方がtransfer learningよりも柔軟性があるといえます。

Transfer learningは特徴量抽出機の部分を固定したfine tunningといえるかもしれません。

Distillation

Distillation(蒸留)というのは、上の二つと違いネットワークの構造にかかわる技術です。
Distillationは学習済みの複雑なネットワークと"ほぼ"同等なシンプルなネットワークを新たに学習する手法です。
なぜそんなことが必要かというと、ディープラーニングは実用上より少ないメモリでより高速に動作する必要があり、そのためには出力は同等のよりシンプルなネットワークを作ることに意味があるからです。
元のネットワークが非常に大規模なアンサンブルモデルの場合、それをシンプルなたった一つのネットワークで表現できるということには実用上大きな意味があります。
具体的には、例えば1000カテゴリ分類する複雑なネットワークの出力に対して、その出力の確率分布をソフトターゲットと呼び、そのソフトターゲットを出力するようなシンプルなネットワークを構築することでdistillationができます。
蒸留について非常にわかりやすく解説してあるサイトです。
Deep Learningにおける知識の蒸留
たとえて言うなら、教師が正解だけでなく問題の解き方までかみ砕いて教えることで、生徒は少ない学習量で効率よく問題に正解できるようになるということですね。

NNモデル圧縮の二つの手法

パラメータの多いモデルから、パラメータが少なく計算量の少ないモデルに抽出する手段。

よく使われるのがDistillation

Distillationは元の大きなモデルの出力を教師データにしてより小さいモデルを学習する手法のこと。

Pruningもよく使用される

Pruningはノードそのものや重みを削除してしまうことで全体のパラメータ数を削減する手法。

Anaconda でよく使うコマンド

Windows10でのpython環境の管理にAnacondaを利用していますが、Anaconda Navigatorが重いので大抵はコマンドラインで操作しています。
以下のサイトでよく使うコマンドがまとめられていましたのでご紹介します。
qiita.com

仮想環境の構築をするときは

conda create -n [name] python=[version][library]

仮想環境のrenameをするときには

仮想環境の名称変更 conda create -n [new name] --clone [old name]
仮想環境の削除 conda remove -n [old name] --all

とすればいいんですね。

tensorboardではまった話

最近久しぶりにtensorboarを使ったらはまったので顛末をメモ 動作環境はWindows10 + Anacondaでtensorflow1.9です。

現象

tensorboard --logdir LOG_FILE_PATH

(LOG_FILE_PATHは絶対パス)
でtensorboadは以下のメッセージが表示され問題なく動いているように見えます。

TensorBoard 1.10.0 at http://MachineName:6006 (Press CTRL+C to quit)

(MachineNameは動作させているPCの名前)   chromehttp://MachineName:6006 に接続するとなぜか接続できないです。
http://MachineName:6006の代わりにhttp://localhost:6006でもつながらないです。

解決策

起動する際に明示的にホストアドレスを以下のように指定しました。

tensorboard --logdir LOG_FILE_PATH --host=127.0.0.1

これで、http://127.0.0.1:6006 に接続すると以下のように動作しました。

f:id:wshinya:20181004112633p:plain
動作結果

ちなみに、LOG_FILE_PATHは ./hoge のように相対パスでも動きました。
ブラウザーChrome以外にもFirefoxでも問題なく動作しました。

tensorboardの詳しい解説は以下にあります
https://github.com/tensorflow/tensorboard

論文: "CNN-PS: CNN-based Photometric Stereo for General Non-Convex Surfaces"

"CNN-PS: CNN-based Photometric Stereo for General Non-Convex Surfaces"
https://arxiv.org/abs/1808.10093
ECCV2018 Accept論文
実装コード:
github.com
Photometric stereoで法線を取得する話。
複雑な光源環境でオブジェクトのphotometric stereo 画像からsurface normalをCNNを使って予想する方法の研究.
学習データはsyntheticに作成。

論文: "UNet++: A Nested U-Net Architecture for Medical Image Segmentation"

"UNet++: A Nested U-Net Architecture for Medical Image Segmentation"
https://arxiv.org/abs/1807.10165
医療画像のセグメンテーションや領域切り出しでよく使われているU-Netを変形してUNet++という新しいネットワークを
提案した論文。

Unetはencoder-decoderタイプの深層学習アーキテクチャだが、Unet++も同様の構造をしている。
ただし、encoderの出力がskip connectionにより同じサイズのdecoderにマージされるところが、異なり、Unetの場合には単純にdecode側にくっつけるだけだったが、
Unet++ではskip connectionのところをCNN(nested dense skip pathways.)にしてencoderとdecoderの持っているセマンティックに対する非対称性を緩和できるようにする。
目的は領域のセグメンテーションの精度を上げるため。

論文: "Loosely-Coupled Semi-Direct Monocular SLAM"

"Loosely-Coupled Semi-Direct Monocular SLAM"
https://arxiv.org/abs/1807.10073
https://www.youtube.com/watch?v=j7WnU7ZpZ8c&feature=youtu.be

Visual SLAMの話です。
ピクセルの情報を直接使うDirectな方法と画像の特徴量を使うFeature-baseな方法を合体させてそれぞれのいいとこどりをしましたという論文。
DSOとORB-SLAMのパイプラインを合体させた構造で、単眼SLAMでは正確性やロバストネスの点で二つのベンチマークのテストでSOTAだと言っています。