最終層でMIXUPしたら良さげだった件

Source: Deep Learning on Medium

実験

実際に最終層MIXUPと入力層MIXUPを比較してみます。使うデータはCIFAR10 です。実験に使用したコード(Jupyter Notebook)は、私のGithubにアップロードしておきます。

中間層で混ぜるという操作が必要になるため、MIXUP_layerを下記のように作ります。このレイヤーに2つの入力と比率を入れることで、その比率に従ってMIXUPするレイヤーになっています。

このレイヤーを使うことで、Input Mixup(通常のMIXUP)、Final Layer Mixup(Manifold mixupを最終層で行う)は以下のように実装できます。

使っているのはResNet18で、実装に関しては以前書いたブログをご覧ください。

学習コードの実装

コードの一部を抜粋して掲載します。1 epoch 毎にbeta分布に従って乱数を生成し、その比率でMIXUPをしています。(95行目)

実験結果

mixupのαは[0.04, 0.2, 1.0, 5.0]の4水準で実験をおこなって、最終valid lossを記録したのが下記の表です

mixupの水準と最終的なvalid loss

一番よかったのはαが0.2の最終層MIXUPですが、alpha=1.0でもほとんど変わらない結果を出しています。

Input mixupはαが小さい方が良く、1.0を超えると急激に精度が悪化します。一方Final Layer mixupも大きいαだと悪化しますが、Input Mixupほどは悪化しません。この差は、Mixupする特徴量空間が整理されているかどうかを反映していると考えられます。

Manifold mixupでも大きいαで精度が悪化しているのは、特徴量空間が整理されていると雖も、最終層の特徴量空間は下記のようなものになっていると考えられるため、内挿データが必ずしも良い値になっているわけではないことを示しています。

[4]のFigure2より引用。softmaxを使った場合の最終層特徴量空間の分布(t-SNEで次元を減らしている)