まだだ、まだ終わらんよ…【PCASの検証】
こんにちは、小野・バジーナです。
今回もPCASの検証の続きになります。まだ終わらんよ…。
前回をご覧になっていない方はこちらもご覧ください!
小野くん、前回検証してみたい事が色々あるって
言ってたよね?
あまり見ていなかったからよく知らないんだけど、
前回の軽量化って、けっこう時間がかかったの?
はい。実は軽量化を実行してから完了するまでの
時間ってけっこうかかっていて、PCASループ回数(イテレーション数)を増やすと、その分長い時間がかかりました。何回もデータ取りを行ったから大変だったんですよ。
そうなんだ。。。長い時間がかかってたんだね。
実は、とっても気にはなっていたんだ。
そうなんですよ!実は、あの後反響がありまして。
どのくらい時間がかかったのか気になるという
質問を、たくさんいただいたんですよね!
「パラメータを色々振って試したい!」と思ったら
時間がかかりすぎて…。もっと早くできればいいのにな…。
PCASループ回数を5回に設定したときには
4時間程度、PCASループ回数を10回に設定した
ときには一晩くらいかかりました。
前回、どの程度できたかのか、おさらいも兼ねて、
まとめるとこんな感じです。

前回の結果でどれくらいモデルの軽量化ができる
ということがわかったから、今回は軽量化に要する
時間に焦点を当てた検証をしてみるのはどうだろう?
なるほど!時間をあまりかけずに、軽量化を行う
にはどうすればいいのか?という点は、使う人なら
気になるポイントですよね。やってみましょう!
どんな設定にしよう?
前回は、圧縮率の設定を10%、15%、30%と振りました。比較をしたら、精度も大きく落ちるけど、30%と
高い値に設定すると、少ないPCASループ回数で軽量化ができるということがわかりました。
PCASループ回数が少なくて済むということは短時間
で軽量化ができるということだ。ということで圧縮率を
30%に設定しておこうか。他にも、PCASを実行するに
あたり、設定できるパラメータがいくつかあったよね。
たしかPCASループ回数(イテレーション)、エポック数、学習率、再学習率、バッチサイズなどがありました。
ここでいう「学習率」というのは軽量化を行う
前の、つまり初期の学習率のことだよ。
前回は共通で10%で設定したね。
甘いな、坊ちゃん。
それよりも有効なパラメータがあると思われる!
それが再学習率(finetune_lr_rate)だよ。
再学習…。
Pruningを行った後、精度が落ちるから、それをカバー
するために再学習すなわち「ファインチューニング」を
行って…。
その通り!「ファインチューニング」という言葉は
本来、微調整という意味で、機械学習の分野では
モデルのパラメータを微調整するという意味で
使われるんだ。
再学習を行う時、あまり大きな値に設定してしまうと、影響が大きすぎて認識精度が落ちてしまうこともある。だから、小さな値を設定することが多いんだ。
「これを微調整するとどうなるんでしょうか?」
を検証するんですね。
うん。この値は0~1の範囲で設定できる。
前回はデフォルトの0.5で設定したよ。
となると、0.5から大きい値と小さい値でそれぞれ
試してみるのがよさそうですね。0.2と0.8で設定して
みますか。ええい!ままよ!!
よし。じゃあやってみましょう。
条件設定の時に抜け漏れがないようにね。
数時間後…

所要時間ですが、3つの条件とも共通して
4時間程度です。
これは…。再学習率(finetune_lr_ratio)を0.8で軽量化を
進めると、3回目の軽量化でモデルサイズはサチッて
しまっています。
でも、なんでfinetune_lr_ratioが大きいと精度が下がるんですか?再学習の効率が上がるものだと予想していました。
再学習すると確かに精度は上がるよ。
でも学習率って学習を行う量ではないよね。
学習率とは、AIモデルに学習させるときに、モデルの重みを更新するための分解能いわば一歩の歩幅の大きさを決定するハイパーパラメータだから。
これが大きいと、学習データに適合してしまいすぎる
過学習に陥いりやすいというデメリットもあるんだ。
「過学習」って、学習データに対してはいい結果を出すけど、テストデータに対しては期待した精度が出ないという現象ですよね。
それに加えて、Pruningの段階で重要となりうるニューロンが刈り取られてしまったという可能性もあるね。
刈り取られてしまった状態で追加で学習しても、
あまり意味はないのかもしれない。
なるほど、じゃあ反対にfinetune_lr_ratioを低くすると
過学習にならず、まさに微調整というレベルで再学習が
行われていたんですか?
ということになるね。反対に小さすぎると、
局所的最適解にハマってしまう場合もある。大域的な最適解が見逃されて正しい結果が出ないという現象だね。
でも、今回は局所的最適解にハマらなかったようですね。ちょうどいいパラメータだったようです。
ちなみに、実は再学習を行うときは学習率を小さくした方がいいということは一般的に知られているんだよね。
最後に
最後に、今まで行ったそれぞれの検証で、モデルサイズがサチった時点をベストな条件下として、
そのときの精度とモデルサイズをそれぞれ比較してみますとこんな感じです。
|
|
条件① |
条件② |
条件③ |
条件詳細 |
圧縮率[%] |
30 |
30 |
15 |
Finetune_lr_ratio |
0.2 |
0.5 |
0.5 |
イテレーション
(PCASループ数)[回]
|
5 |
5 |
8 |
結果 |
所要時間[H] |
4 |
4 |
8 |
精度[%] |
88.5 |
83.9 |
90.3 |
モデルサイズ[MB] |
23.7 |
20.0 |
55.1 |

これを見ると、精度は①と③の条件下でもほぼ同じだね。
①が精度は③より1.8%低いけど、モデルサイズは③と比較すると、50%以上小さいことがわかる!
しかも、①ならPCASループ数5回ですが、③では
8回もかかっています。①と②は4時間程度かかった
のに対して、③は8時間くらいかかっています。
短時間でより良い結果が得られたと言っていいのでは
ないでしょうか?
と、このようにパラメータを調整する事でさらにいい結果が得られたりすることもわかったな。
でも、圧縮率を高く設定して、PCASループ回数も増やしてしまうと、とモデルサイズを小さくできても狙った目標精度を下回ってしまうから、PCASツールを扱う者が注意しなければならないな…。
気になることがあるんですけど…。
なぜ軽量化に失敗しうるパラメータ設定ができるんですか?
失敗する設定ができてしまうのであれば、そんな設定が
できないようにすればいいのに、と思います。
「このパラメータは触らないでください」とした方が、
パラメータ調整による失敗は少なくなるんじゃないですか?
実はパラメータ調整できる理由がちゃんとあるんだよ。
前回と今回の検証を通して、圧縮率やイテレーション数、finetune_lr_ratioをいくつに設定したらいいか、当たり所がわかってきたと思う。
はい、なんとなく。圧縮率を高め、finetune_lr_ratioを小さくすれば、PCASループ数を少な目に設定しても
いい結果が得られることがわかりました。
そんな感じで当たり所がわかると、PCASループ回数を少なくして、軽量化にかかる時間を短縮することができるはずじゃないか。
ということは、もっと上達すれば、イテレーションを数回にしても、精度低下を最小限にしつつ、モデルサイズを小さくすることができるはずだよ。
何回か条件を変えて試してみれば、今回のモデルやデータセットに限らず、目標とした精度やモデルサイズにするには、どんなパラメータ設定にするかおのずとわかってくるかもですね。なかなか上級者テクニックのようにも感じますけど、軽量化をどんどんこなしたいというときには有効なテクニックですね。
軽量化がなかなか進まないときに、最初の数回の
PCASループでは圧縮率を高めに設定して、その後
圧縮率やfinetune_lr_ratioを小さく設定してみるのも
効果的かもしれない。
ということで、まだまだ条件を変えて色々やってみないとわからないことが多いから、挑戦あるのみだね。
次回のブログ更新は1月を予定しています。
お楽しみに!
- ※記載されている会社名、製品名は、各社の商標または登録商標です。
- ※ここに記載されている仕様、デザインなどは予告なしに変更する場合があります。