GAでDNNのPruningしてみた
大学で学部3年生以前から研究らしきことができる実験科目を履修し,「遺伝的アルゴリズムを用いたディープニューラルネットワークのモデル圧縮」というテーマに取り組みました. 1月ごろに取り組んでいたものではありますが,書いたレポートを公開したいと思います.
注意
このブログ記事はあくまで取り組んだことの記録として書いています. なにか有用な情報が書いてあるわけではありません.
レポート
このレポートは提出時にわかっていた情報で書きましたが,このレポートで主張している有用性は後の実験で否定されています.
実験で用いた技術
この実験ではPython, Chainer, Cupyを用いました.特にGAの計算はGPUで行わないと非常に時間がかかるので,Cupyにとても助けられました.
再学習を行うとこの手法は無意味
このレポートではPruning後に再学習をしない設定で精度を比較していました. 元々「手持ちのデータが少ない」という問題設定だったので,再学習をしても精度はそれほど変わらない/悪化してしまうだろうと考えてのことでした.
しかしそれは完全に間違いでした.実際に再学習を行ってみると,Pruning率80%で再学習に各クラス1枚のみを用いた場合では,Test Accuracyは80%程度まで上昇しました.
再学習前のTest AccuracyがMagnitude BasedでもGAでも60%後半であることを考えると,これは無視できない影響の大きさです.
しかも,どちらの手法でPruningしても,再学習後のTest Accuracyはほとんど変わりませんでした.*2
この手法の発展
上述の実験から,データが少なくても再学習を考慮する必要があることがわかりました.
レポートでも紹介しているIterative Pruningを参考にすると,「GA Pruning→再学習→GA Pruning→...」と繰り返していく手法が考えられます.
ここで,Pruningに用いているマスク行列をハイパーパラメータのようなものだと考えると,GA Pruningと再学習を繰り返す手法はPopulation Based Trainingに類似した手法であると考えることができます.*3
また,GAで最適化するものをマスク行列ではなく,各層の計算方法などにした場合,アーキテクチャ探索系の手法になります.
補足:この実験に対する批判
再学習関連が最も重要な情報ですが,それ以外にもこのレポートの手法には様々な批判があると思うので,一応補足しておきます.
- 実験が粗い
- 実際には「精度が過度に落ちた状態でよりマシな精度になる」手法は使えない
- GAのチューニングが足りない(GAの集団を同一のものにするべきではない)
- 他のメタヒューリスティクス系の手法と比較するべき
1点目についてはその通りだとしか言えません.実験結果が出るまで多少時間がかかるので,レポート提出期限までに十分な回数実験を行えませんでした...*4
2点目について,実際に使える手法を開発する場合は「一定の精度を達成することを条件として,よりパラメータ数が少ないモデルを探索」という問題設定にするべきだと思います.その点でこのレポートはあまり良くないです.
3点目について,初期集団に関して「重みが大きいものが指数的に選ばれやすい」というようなものに関しても実験しましたが,あまり上手く行きませんでした.*5
4点目について,SAを用いたPruningについても軽く実験しましたが,あまりうまくいきませんでした.
工夫すれば上手くいく方法もあるかもしれませんが,良い近傍を模索する必要があると感じたので,今回は素直に適用できるGAのみの結果をレポートにしました.
なお,GAがランダムサーチより優れていることは確認しました.
*1:大学の研究室の計算機をお借りして作業しており,諸事情ありソースコードがその計算機上にしか無いのですが,学期が変わった関係かその計算機にアクセスする権限が無くなっていました...GW明けに再度権限をいただけるようお願いしてみます...
*2:再学習用のデータが少ない場合,どのデータが再学習用データに選ばれるかによってAccuracyは±5%程度変動します.しっかりとデータを取ると平均的にはどちらか一方の手法が優れている可能性はありますが,パラメータを変えて色々と試していた限りでは,はっきりとした有意差は見られませんでした.
*3:PBTはGAというより進化戦略のような方法ですが
*4:Deep系実験あるあるかもしれません...
*5:正直これに関してはバグがある可能性はあります...