MixConvの論文を読んでみた
MixConvとは
MixConv1とはConvolutional Nueral Networkのにおいてパラメータ数を減らしつつ,高精度を実現する新しい畳み込みを提案した手法のことです.本手法はGoogleBrainのMingxingTanとQuoc V. Leが発明したものになります. MixConvがどのように優れているのかというとdepthwise convolutionにおけるカーネルサイズの増加に伴う精度低下という課題を改善した部分にあります.以下ではMixConvの論文内容をまとめていこうと思います.
概要・イントロ
通常のConvNets(畳み込み)は画像分類やセグメンテーション,多くの応用で広く使われています.
最近のConvNetsにおけるトレンドは精度と効率の両方を改善することだそうです.このトレンドに従って,MobileNetやShuffleNet,NASNet,AmoebaNet,MnasNet,EfficientNetのようにdepthwise convolutionが取り入れられ現在のConvNetsにおいてますますより利用が増えていってると論文では記載されています.
通常の畳み込みと違って,depthwise convolutionのカーネルはそれぞれの個々のカーネルに適応され,これに従ってチャネル数の計算機的なコストを削減します.しかし,depthwise convolutionのカーネルを用いてConvNetsを設計することは重要と見なされる一方で,カーネルサイズの要素は見落とされがちです.通常の畳み込みの学習は3×3のカーネルが一般的に利用されますが,最近の研究結果では5×5や7×7のような大きいカーネルサイズが潜在的にモデルの精度と効率性を改善できることを示しています.
そこで,論文内では単純にカーネルサイズを大きくすると精度が向上するのかといった疑問について言及しており,MobileNetを題材に単純にカーネルサイズを大きくしていった場合の精度の遷移を確認しています.実際の結果は以下のようなグラフになっておりカーネルサイズが大きくなるとモデルサイズが大きくなり,より多くのパラメータが利用され,非常に大きなカーネルサイズは精度と効率の両方を損なう可能性があることを示しています.
論文では、モデルの精度と効率性を高めるには高解像度のパターンをキャプチャする大きなカーネルと低解像度のパターンをキャプチャする小さなカーネルの両方が必要だと述べた上で,さまざまな解像度でさまざまなパターンを簡単にキャプチャできるように、単一のたたみ込み演算でさまざまなカーネルサイズを混合する混合深さ方向たたみ込み(MixConv)を提案しています.下の図はMixConvの構造を表しており,複数のグループにチャネルを分割,異なるカーネルサイズをチャネルのそれぞれのグループに適応する仕組みを図示したものになります.
関連研究
関連研究ではEfficient ConvNetsとMulti-Scale Networks and Features,Nueral Architecture Searchの3つの観点で述べており,Efficient ConvNetとMulti-Scale Network and Featuresではそれぞれの観点でMixConvにおける差異を記載しています.そして,Nueral Architecture Searchの項目ではニューラルネットワークの設計プロセスを自動化してMixConvを用いた手動構築よりも優れたモデル(MixNet)を作成したとも述べています. 具体的な内容は割愛しますが気になる方は本家の論文を読んでみて下さい.既存研究との差異やMixNetをより詳細に理解できると思います.
MixConvの手法
MixConvの手法を簡単に述べるとチャネル(のグループ)ごとに異なる大きさのフィルターを使うようにしたDepthwise Convと言い換えられます.処理のイメージを簡略化したものを以下に示します.畳み込みの処理をg個のグループに分けて,グループごとに異なるカーネルサイズを適応して畳み込んだものをマージします.処理としては非常にシンプルでわかりやすいですよね.
また,論文内にはtensorflowを利用したmixconvの実装方法を紹介していますので,直ぐに自らの問題に適応することができます.pytorchではdepthwise_conv2dといったメソッドはないのでconv2dのパラメータにgroupのオプションがあるのでそれを利用することで再現できるようです.
def mixconv(x, filters, **args): G = len(filters) y = [] for xi, fi in zip(tf.split(x, G, axis=-1), filters): y.append(tf.nn.depthwise_conv2d(xi, fi, **args)) return tf.concat(y, axis=-1)
MixConvにおけるデザイン設計
論文では以下に示す大きく4つの観点別にパラメータやTipsに関する言及をしています.
- グループの数
- グループ毎のカーネルサイズ
- グループ毎のチャネル数
- Dilated Convolution
それぞの項目について内容を簡単に述べると,グループサイズについてはMobileNetを題材としてグループ数を4に設定することが一般的に安全としています.また,Neural Architecture Searchによってグループ数は1から5の間の範囲が安定して精度と効率性をより高める様子です.
次に各グループのカーネルサイズですが,基本的にグループには任意のカーネルサイズを設定しても良い一方で,各グループは異なるカーネルサイズを設定する必要があるとのことです.さらに,パラメータ数と計算量を減らす関係で3×3のカーネルサイズから初めて,グループ毎とに2i+1のカーネルサイズを設定するとのことです.つまり,4つのグループを想定した場合は{ 3×3, 5×5, 7×7, 9×9} といったカーネルサイズを設定するようです.
グループ毎のチャネル数は主に2つの設定方法があるそうです.1つは均一分割でそれぞれのグループは同じ数のフィルタを設定する方法で2つ目が指数分割でチャネル数の合計を の指数をかけて分割した値を設定するやり方です.具体例を用いて説明すると,32のチャネル数と4つのグループを想定した場合には均一分割では(8, 8, 8, 8)で指数分割では(16, 8, 4, 4)となります.
そして,最後のDilated Convolutionについては,より大きいカーネルサイズを扱うことによって増加するパラメータ数と計算量に対するTipsで,Dilated Convolutionを使用することで効率性を向上させることができると紹介しています.一方で精度については若干低くなるという懸念があると状況を鑑みて導入する必要がありそうです.
パフォーマンス
評価はMobileNetを題材に3×3のdepthwise convolutionをMixConvに置き換えた場合の分類タスクにおいて検証を実施しています.
ImageNetを用いた分類問題のパラメータ数と計算量,精度をまとめた表を以下に記載します.
Network | MobileNet V1 (#Prams, #FLOPS, mAP) |
MobileNet V2 (#Prams, #FLOPS, mAP) |
---|---|---|
baseline 3×3 | 5.12M, 1.31B, 21.7 | 4.35M, 0.79B, 21.5 |
depthwise 5×5 mixconv 35(ours) |
5.20M, 1.38B, 22.3 5.16M, 1.35B, 22.2 |
4.47M, 0.87B, 22.1 4.41M, 0.83B, 22.1 |
depthwise 5×5 mixconv 357(ours) |
5.32M, 1.47B, 21.8 5.22M, 1.39B, 22.4 |
4.64M, 0.98B, 21.2 4.49M, 0.88B, 22.3 |
これをみてわかる通り,MixConvはより少ないパラメータ数とFLOPSであるにも関わらず,depthwise convolutionと同様もしくはそれ以上の精度を叩き出しています.
また,depthwise convolutionはより大きいカーネルサイズを用いることで精度低下という問題に直面するのに対して,MixConvはカーネルサイズの大きさによる精度低下の感度を鈍化させることが示唆されるため安定した精度を実現できるようです.
MixNet
さて,最後になりますが論文内ではnueral architecture serachを活用してMixConvに基づいたモデルとしてMixNetを提言しています.MixNetの詳細はここでは割愛しますが,以下のようなネットワークアーキテクチャを備えたモデルでMixConvの恩恵を簡単に受けることができます.ImageNetにおける評価ではSOTAで78.9%という高い数値を出しているため是非試しに使用してみて下さい.
まとめ
今回はMixConvについて論文の内容をまとめてみました.
MixConvの論文を読むことでConvNetにおける動向のキャッチアップを通じながら,MixConvの活用におけるポイントを理解することができました.論文を読むことは自身が取り組んでいる課題に対しての新しい解決策を得られる機会になることもしばしばあるので継続的に読むことをおすすめします.特に自らの専門領域とは直接的に関係ない内容であったとしても読むことで新しい発見があると感じます.
今後もまた別の論文を読んだ際には内容をまとめていこうと思います.