終末 A.I.

データいじりや機械学習するエンジニアのブログ

CNNの精度向上手法のモデルサイズによる効果の違いを調べてみた

画像認識タスクはDeep Learningにより大幅に精度が向上してきた分野です。
1クラス500枚・100クラスの分類を行う必要がある、比較的難易度が高めのCIFAR-100ベンチマークでも、最新の手法であるGPipeやEfficientNetでは、テストセットにて90%を超えるAccuracyを達成しています。

paperswithcode.com

しかし、これらの最高精度を叩き出すような手法はパラメーター数が600Mや、60Mと大量のパラメーターが必要になります。
このように、パラメーター数が多いモデルは、精度を向上させやすい分、推論や学習にパラメーター数に応じた時間が必要な問題があります。

一方で、多くのモデル構造では、パラメーター数が数Mにいくかいかないかの、より小さいモデルを構築することができます。

このようなモデルは、深いモデルに比べ精度面では劣るものの、処理速度は圧倒的に高速で、実用面においてはどのようなアプローチが有効かを試行錯誤するために非常に使い勝手が良い一面もあります。

しかし、非常に小さいモデルは、通常の論文では報告対象になっていないことが多く、一般的なサイズのモデルで効果が出ているような手法でも、必ずしも効果がある保証はありません。

この記事では、ネットワーク構造としてResNet、データセットとしてCIFAR-100を使用して、ネットワーク構造の微変更およびデータ拡張手法が、非常に小さいモデルでもどのくらいの精度向上が可能か、非常に小さなモデルでの精度向上の効果は、一般的なモデルの効果をどのくらい相関があるのかを調べてみました。

その結果、ResNet164とResNet29の比較において、以下のように、精度向上手法の効果は、非常に小さいモデルと一般的なサイズのモデルとの間で相関が見られることがわかりました。

目次

実験条件

この記事では、ResNetのうちCIFAR-100を学習したモデルでの精度の比較対象によく使用される、ResNet164をベースラインとして扱います。

ResNet164は本家論文の設定ではなく、一般的によく使われているpre-activtionを含む設定を利用します。

比較対象としては、ResNet164からResBlock数が6分の1と非常に小さい、ResNet29を使用しました。

ベースのデータ拡張手法として、ランダムな水平方向への反転、上下左右4ピクセルのパディングを入れた上でのランダムクリッピングを使用しています。

入力するデータは、学習データすべてのチャネルごとの平均と分散を使用して正規化した状態でモデルに入力しています。

Weight Decayは1e-4、学習は160エポック行い、Learning Rateは最初は0.1、80エポック以降は0.01、120エポック以降は0.001としています。

報告しているテストデータのAccuracyは、各組み合わせそれぞれ一回のみ行った実験の結果で、最終エポック時点での学習済みモデルでの結果をそのまま記載しています。

ResNet164での結果

通常のResNet164による学習

まず上記の実験設定の記載のまま、ResNet164により学習した結果は下記のとおりでした。

f:id:KSKSKSKS2:20190915172020p:plain
ResNet164通常版

テストデータのAccuracyは75.09%と、論文に記載されている75.67%より若干低い結果ですが、概ね論文と同等の性能が出ることを確認できました。

Squeeze and Excitationを追加

Squeeze and Excitationは、各Residual層の出力に、チャネル単位でAttentionのような働きをする重みを計算した後、Identity層の出力と合計するように処理を加えたものです。

実装は、こちらにあるように非常に簡単に実現できますが、ResNet-164を使用したCIFAR-100では、3ポイントほどテストデータでのAccuracyが向上し、78.69%であったと論文で報告されています。

今回の実験では、前述の通常のResnet164より1.5ポイントほど向上し76.7%のAccuracyを実現しました。論文で報告されているほどの精度ではありませんでしたが、確かにAccuracyがベースモデルより向上することを確認できました。

f:id:KSKSKSKS2:20190915172711p:plain
ResNet164 SEBlock追加版

mixupを追加

mixupはデータ拡張手法の一つで、二つのクラスの画像を重み付きで合成した画像を入力とし、クラスラベルも同じ重みを使用して合成し、それをもとにモデルのロスを計算します。

CIFAR-100では、ResNet18のpre-activationモデル(今回使用しているモデルとは各層のチャネル数が異なり非常に多い)を使用した場合、テストセットでベースラインを4.5ポイント上回る78.9%のAccuracyが報告されています。

こちらを参考に実装し試した所、テストデータで78.47%とベースラインを3.4ポイントほどと、論文の報告よりは小さいものの大きく向上することを確認できました。

f:id:KSKSKSKS2:20190915173338p:plain
ResNet164 mixup追加版

Squeeze and Excitationおよびmixupの両方を追加

最後に、Squeeze and Excitationおよびmixupの両方を追加したものを試した見た結果が下記となります。
参考になる論文はありませんが、テストデータでのAccuracyが79.40%と、mixupのみを追加した際に比べて0.9ポイントほど上昇していることから、それぞれの手法が効果を発揮しよりよい性能を実現できていることがわかります。

f:id:KSKSKSKS2:20190915174045p:plain
ResNet164にSEBlockおよびmixupを追加した版

通常のResNet29による学習

さて、上記までではResNet164を用いて既存の論文の再現実験を行い、概ね実験結果が再現でき、少なくともベースラインよりはテストデータのAccuracyが向上することは、論文の報告どおりであることを見てきました。

ここからは、ResNet164より大幅に小さいResNet29でどのくらい上記の精度向上手法が有効かをみていきます。

ResNet29での結果

ResNet164のブロック数を6分の1にして作成したResNet29にて、同じ実験条件で学習を行いResNet29での性能確認を行いました。

下記のように、テストデータで71.19%とResNet164に比べて3.9ポイント低い性能でした。

f:id:KSKSKSKS2:20190915175215p:plain
ResNet29通常版

ResNetの本家論文では、CIFAR-10において同じ6分の1のブロック数の違いのあるResNet110とResNet20の比較において、2.3ポイントほどの差が見られたことを報告していますので、比較的妥当な結果であると考えられます。

各精度向上手法を適用した結果

ResNet29にSqueeze and Excitationのみ追加した場合、テストデータデータでのAccuracyが71.62%と、ベースラインを0.4ポイントほど上回る結果を示しました。

f:id:KSKSKSKS2:20190915175632p:plain
ResNet29 SEBlock追加版

ResNet29にmixupのみ追加した場合、テストデータデータでのAccuracyが72.34%と、ベースラインを1.1ポイントほど上回る結果を示しました。

f:id:KSKSKSKS2:20190915175437p:plain
ResNet29 mixup追加版

ResNet29にSqueeze and Excitationとmixupの両方を追加した場合、テストデータデータでのAccuracyが74.72%と、ベースラインを3.5ポイントほど上回る結果を示しました。

f:id:KSKSKSKS2:20190915175812p:plain
ResNet29にSEBlockおよびmixupを追加した版

まとめ

それぞれの精度向上手法と、テストセットでの最終エポックまで学習した際のAccuracyは下記の通りでした。

ResNet29 pre-activation ResNet164 pre-activation
精度向上手法適用なし 75.09 71.19
Squeeze and Excitationのみ 76.70 71.62
mixupのみ 78.47 72.34
Squeeze and Excitationおよびmixupのみ 79.40 74.72

ここから、ResNet29で精度向上が見られた手法は、ResNet164でも同等以上の精度向上が見られること、上昇の仕方の傾向は概ねResNet29とResNet164で同じであることが読み取れます。

ResNet29はResNet164に比べてパラメーター数が約6分の1と非常に小さいモデルです。
また学習に要した時間は、GeForce2080を使用した今回の実験においては、ResNet29で40分ほど、ResNet164で3時間20分ほどと、約5分の1でした。

単純に計算すると、ResNet29はResNet164の30分の1ほどのリソースの専有量で一回の実験が行えると考えられます。

今回は、非常に限られた実験条件で測定した結果ですが、モデルサイズによらず既存の精度向上手法は同じような傾向の実験結果が得られることがわかりました。

タスクの内容やベースモデル、使用するデータセット、行う精度向上手法によって、大きく変わるとは思いますが、
小さいモデルで有効そうなアプローチをピックアップした後、大きいモデルで実際に使用するモデルを学習させ最終結果を得るという方法が、現実的に意味がありそうなアプローチであることは、
より多くのパターンをより少ないリソースで試行錯誤するためには、非常に重要な仮定となります。

リソースが少ない環境で実験をせざるを得ない身としては、このような小さくて高速なモデルでの実験結果や条件を変更したときの効果の相関性なども、ぜひ公開していって欲しいなと思う所です。

参考