ココンの情報をいつでも、どこでも。ココントコ。

エンジニア 2019.02.13

【論文検証】ニューラルネットワークのプルーニングについて

AI戦略室は組織改編に伴いAI戦略部になりました。坂本です。

日々の業務に追われていると、なかなか論文を読み解いて検証するという事が出来なくなってきますが、それではいけませんね。
今回は少し趣を変えて、論文に載っている手法の検証実験をしたのでそのレポート記事を書きたいと思います。
なお、この記事中で使用している実験のプログラムコードは、GitHub(https://github.com/cocon-ai-group/experiment-pruning-neuralnet)にて公開しています。

目次

背景

非常に表現力が広く汎用性に富んだニューラルネットワークですが、その泣き所はやはり過学習に陥りやすいという点でしょう。
そのためニューラルネットワークの過学習を防ぐ目的で、色々な手法が考案されてきました。
中でも広く使われるのが、ドロップアウトという手法です。
実は私、以前書いた書籍(https://www.amazon.co.jp/dp/4863542194/)のコラムで、こんな事を書きました。

『この、あえてニューロンを「間引く」という手法は、人間の脳に喩えると、まるでアルツハイマー病の症例を連想させます。もちろん、学習の際にのみ用いられるドロップアウトと、死んだら復活しない人間の脳細胞を比較することはナンセンスですが、ひょっとしたら人間の脳も、わざと脳細胞を「間引く」ことで、特定の事柄にこだわりすぎて新しいことを学べなくなるのを防いでいるのかもしれません。』

まぁ、元々技術者向けの内容ではなく、一般の方に向けてAIを説明する書籍の、それも本筋から外れたコラムでの一節なのですが、ちょっと面白い発想を含んでいると思いませんか?
もっとも私は脳神経科学には全くの素人なので、単なる連想で書いたコラムにどの程度の意味があるかは解りませんが・・・

実は、脳ではなくAIに使われるニューラルネットワークでも、ドロップアウトとは別に、ニューロンの数自体を減らしてゆくという手法が提案されています。
プルーニングといえば主に決定木の学習で使用されるテクニックですが、それをニューラルネットワークに応用して、重要度の低いニューロンを‘枝刈り’してゆけばどうなるか、というのが、この手法の主眼点です。


(図は論文中より)

ちょっと古い論文ですが、スタンフォード大学とNVidiaの研究者が共同で発表したこの論文(↓)

Song Han, Jeff Pool, John Tran, William J. Dally, “Learning both Weights and Connections for Efficient Neural Networks”, 2015
http://papers.nips.cc/paper/5784-learning-both-weights-and-connections-for-efficient-neural-network.pdf

では、ニューラルネットワークのニューロンをプルーニングした後再学習することで、0.5%程度の精度向上が見込めるという結論になっています。
で、まぁ、論文の結論を疑う訳ではないのですが、0.数%程度とは言え、もしこの手法が一般的、かつ汎用的に使える手法で、ニューラルネットワークの性能を向上させることが出来るならば、もっと広く使われるようになっていても良いのではないか、と思った訳なのです。
なので今回は、この論文の内容を検証する実験を行ってみました。

使用したニューラルネットワーク

前述の論文の結果にある精度向上について、私の見た限り、
・高々0.数%の向上だし誤差の範囲では?
・比較対象の学習条件が良く解らない。再学習しないスコアならプルーニングした側が再学習によって向上している可能性があるし、同様に再学習したならプルーニングしない側が過学習している可能性がある。
という疑問があります。そこで、まずその疑問を晴らすための検証実験を行います。

論文ではAlexNetを使用していますが、今回の実験では簡便のために、単純な畳み込みニューラルネットワークを作成します。
使用したニューラルネットワークは以下のように、畳み込み層1層と全結合層1層および出力層からなるシンプルなもので、手法の効果を確認しやすいようにあえて低い性能になるように作成しています。
学習させるデータはCIFAR-10データセットとします。このデータセットには、32×32ピクセルで10クラス分類の画像が60000個存在しています。そのうち50000個が学習用、10000個がテスト用になっています。

Chainerでの定義は以下のようになります。

そして、この全結合層と出力層の間にある1000個のニューロンをプルーニングによって‘枝刈り’してみることにします。
まず、プルーニングは行わずに、単純にデータを学習させてみます。
バッチサイズ100、学習アルゴリズムはAdamを使用して、Accuracyスコアと損失の値を、学習回数毎にプロットすると、以下のようになります。

この結果では損失の値は順調に減少し、学習データに対するAccuracyスコアも順調に上昇する一方で、15エポックあたりからテスト用データに対するAccuracyスコアが減少してゆきます。
これは、非常に素直な、教科書通りの過学習のグラフですね。
15エポックあたりから過学習が発生し、テスト用データに対するスコアが逆に減少してゆくことが解ると思います。
スコアの数値は以下の通り。この結果は、乱数種を変えながら3回実行した結果の平均値です。

プルーニングを行う

さて、それでは論文に従って、ニューロンの‘枝刈り’を行ってみましょう。
一般的なニューラルネットワークのライブラリでは、ニューロンではなく接続を層として扱うので、ニューロンのプルーニングは、前後の二つの層に影響します。
つまり、前述のソースコードにおけるLinear層の「self.l2」と「self.l3」の間にあるニューロンを減らすことになります。
論文に従い、ニューロンの重みのL2ノルムを求め、全体の中から指定された割合だけノルムの小さい順にニューロンを削除し、そのモデルを帰す「prun」関数を作成しました。

この関数は、自分の現在の重みをそのまま引き継いで、かつ、プルーニングによってニューロンを削除した、新しいChinerのモデルを帰します。
そして、15エポックまで通常通り学習を進めた後、プルーニングを行って、さらに15エポック再学習させます。
まずは論文通り、再学習の際には畳み込み層は学習させずに、全結合層のみを学習させてみた結果です。
プルーニングによって‘枝刈り’するニューロンの数は、論文ではスコアの向上が認められた65%および75%とします。

最大スコアを見ると、先ほどの通常に学習させた結果と比べて、テスト用データに対してのスコアについて0.38〜0.60%の向上があります。論文とは異なったモデルを使用しても、論文の結果にある精度向上を再現することが出来ました。

しかし、このモデルの場合、一度15エポック学習させた後に再学習させているので、その再学習の影響がどうなるかが気になります。
同じ条件で、プルーニングを行わないまま、一度15エポック学習させた後にもう15エポック再学習させた結果も求めてみましょう。

はい。元々と同じ1000個のニューロンのまま、15エポックまで通常通り学習させて、その後全結合層のみを再学習させることで、プルーニングした結果と同等のスコア向上(0.52%)が発生しました。
検証実験の結果からは、どうやら論文の結果にある精度向上は、プルーニングよりも再学習の効果の方が大きいように見えます。
ちなみにこの精度向上は、再学習の際に全結合層のみではなく、畳み込み層も含めて再学習した場合は認められませんでした。プルーニングを行っても、その他の層も含めて再学習した場合、どうやら少なくなったニューロンに合わせてその他の層も学習してしまうため、過学習を防止する効果はないようです。

イテレーション学習を行う

精度向上に関しては微妙な結果に終わりましたが、前述の論文では、プルーニング後の再学習に関して、プルーニングと再学習を繰り返し行うことも提案しています。
それによると、ニューロン数の90%近くを削除しても、元々のモデルと同じ精度を実現できるそうなので、IoT機器などに向けたニューラルネットワークの軽量化に使用できないか、という期待があります。
そこで、まず15エポックまで通常通り学習させた後に、さらに15エポック(合計30エポック)まで、少しずつニューロンの数を少なくしてゆき、最終的に元の65%および90%のニューロンを削除したモデルを学習させてみます。

うーん、確かに過学習の進行は少なくなっている、ようにも見えます。
ただし、この場合、最終的なニューロンの削減が完成するのは合計30エポック学習後なので、スコアは最大スコアではなく最終スコアを採用すべきでしょう。
そうすると、90%のニューロンを削除したモデルでは、テスト用データのスコアの数値は0.516とあまり良いものではありません。また、学習用データに対してもスコアが大きく下がっており、再学習によってもニューロン数の減少を補えていないことが解ります。ただし、追加の再学習と過学習が同時に行われて必要以上に精度が減少している可能性があります。
削減数が65%のモデルではスコアの減少は見られない(元のモデルの最大スコアの0.36%増し)ので、90%は単純にニューロン数を少なくしすぎたのでしょう。

ちなみに、では最初から全結合層のニューロン数を少なくしておいたら、どの程度の精度が期待できるのか、という事で、全結合層のニューロン数を100にしたモデルを通常通り学習させた結果がこちら。

最終スコアでも先ほどのモデルと大差なく、最大スコアではむしろ1%以上上回る結果となりました。

確かにプルーニングによって過学習の進行が遅くなる、という効果はあるようですが、精度向上という意味ではイテレーション学習に意味は無さそうです。

まとめ

今回の実験において、論文で示されている精度の向上を、論文とは異なるニューラルネットワークのモデルを使用して再現することが出来ました。
しかし、学習条件を変えて試してみると、その精度向上は、論文の主題であるプルーニングによってもたらされると言うよりも、全結合層に対する追加の再学習によってもたらされているようだ、というやや残念な結果となりました(論文内のグラフでは見切れている部分に相当)。
また、イテレーション学習によってニューロン数を大きく減少させることが出来る、という指摘についても、そもそも初めから少ないニューロン数で構築したモデルを学習させても、ほぼ同じような精度を達成できることが解りました。
全般的に論文の内容からすると残念な結果となった訳ですが、この実験では元々の論文とは異なるニューラルネットワークのモデル(元の論文ではAlexNet)を使用している点に注意してください。そのため、論文の内容を全否定するものではありません。
ただ、異なるモデルを使用してこのような結果となった事で、論文の手法が、一般的、かつ汎用的に使える手法で、常にニューラルネットワークの性能を向上させうる万能手法ではない、という事は言えると思います。
まぁ、そのような汎用的にニューラルネットワークの性能を向上させる手法があるなら、とっくに人気の手法として広く知られていて然るべきなので、ある意味予測していた結果ではあります。
やっぱり論文は読むだけではなく検証してみないといけませんね。
といったところで今回の記事はお終いです。お付き合いありがとうございました。

エンジニア 2019.08.23

危険すぎると話題の文章生成モデル「GPT-2」で会社紹介文を生成してみました

ココングループのAI TOKYO LABの細川です。 AI、特にディープラーニング系のホットな技術を実…

イベントインタビュー広報 2019.08.23

「Black Hat USA 2019」トレーニング参加者インタビュー

広報の馬場です。 アメリカ・ラスベガスにて開催された「Black Hat USA 2019」において、イエラエセキュリ…

イベント広報 2019.08.11

DEFCON 27 現地レポート

広報の馬場です。 アメリカ・ラスベガスにて8月8日から11日まで開催されている「DEFCON 27」に参加してい…