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

この記事について

この記事に書かれている内容は以下の通りです。

  • Vikas Verma, Alex Lambらによって提案された中間層でMIXUP[1]をするManifold mixup[2]を紹介し、最終層でまぜるとより良い結果が得られそうだということを示します。

MIXUPとは

MIXUPとはデータ拡張の手法で、2017/10/25にHongyi Zhangらによって提案されました。Beta分布からサンプリングした混合比率をもとに、入力・出力ともに混合させてデータ拡張を行う手法です。これを使うことで、決定境界が滑らかになるため汎化性能が向上すると言われています。

MIXUPの表式

上の数式からもわかるように、既存のデータを混ぜ合わせたものを拡張データとして使います。簡単なデータを使ってMIXUPをしてみると、下記のようになります。青と赤が元データで(label :0 , label : 1)、ピンク色が拡張されたデータで,混合比率によってラベルyは0~1.の値をとります。

様々なalphaでMIXUPを実施したのが下記の図です。

α=1を境界にして、実データに近い場所に拡張されるのか(α<1)、中間に拡張されているのか(α>1)、が分かれています。

α=0.2 におけるMIXUP(左) BETA(0.2, 0.2)(右)
α=1.0 におけるMIXUP(左) BETA(1.0, 1.0)(右)
α=5.0 におけるMIXUP(左) BETA(5.0, 5.0)(右)

データ全体にMIXUPをかけると下記のようになります。

Manifold Mixup

mixupの問題点

MIXUPで生成されたデータは、全て良いデータになるとは限りません。

このデータでいうと下記図の左は決定境界を滑らかにする良いデータになりそう(赤と青を混ぜているため、ラベルの値は0~1の値)ですが、右は良いデータになりません。なぜなら、拡張されたデータのラベルは全て”赤”となっている(ラベル赤同士のデータを混ぜているため)にも関わらず、青データの特徴量空間と被ってしまっているからです。

良いデータ拡張(左) 悪いデータ拡張(右)

この問題に対処したのがManifold mixup[2]です。Manifold Mixupでは、より特徴量が整理された中間層で混ぜるMIXUPを行うデータ拡張手法です。

[2]より。入力で行うMIXUP(左) 中間層で行うMIXUP

上図は入力層・中間層それぞれでMIXUPを行なったときの概念図です。入力層MIXUP(左)では、青と赤の特徴量空間が入り混じっているおかげでいい拡張データは得られません。一方、中間層では入力層に比べると特徴量空間が整理されているため、良い拡張データが得られます。

どこで混ぜれば良いのか

では、どの層でMIXUPするのが一番良いのでしょうか?そのヒントとなりそうな研究[3]がありました。この研究では、温度項つきのSoft Nearest Neighbor LossというものをResNetの中間層に導入して、その挙動を調べています。Soft Nearest Neighbor Lossは値が大きいときはクラス別の特徴量が絡み合っている状態を示し、逆に小さいときにはクラス別に特徴量が分離できていることを示しています。

Soft Nearest Neighbor Loss[3]
データの分布とその時のSoft Nearest Neighbor Lossの値

ResNetの各ブロック中でのSoft Nearest Neighber Lossの値を調べたのが下の図です。ResNetは高性能な画像分類ネットワークとして知られていますが、最終層以外ではクラス毎の特徴量を分離できていないことを示しています。

[3]のFig16より

このことを踏まえると、ResNetを使う場合は最終層でMIXUPすれば良いのではないかという仮説が出てきます。実際にManifold Mixupの原論文[2]を見てみると、最終層でMIXUPした場合が一番良い結果になっています。

[2]のFig6より。

しかし、この図自体はAppendixに格納されており、Manifold Mixupの著者達はこの結果自体を重視していなかったようです。

実験

実際に最終層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で次元を減らしている)

まとめ

中間層でまぜるManifold mixupを紹介し、最終層で混ぜると良い効果が得られることを示しました。研究上の意義は大きくないかもしれないが、実務上では重要な結果ではないかと考えています

Twitter , 一言論文紹介とかしてます。

Reference

  1. Hongyi Zhang, mixup: BEYOND EMPIRICAL RISK MINIMIZATION, arXiv:1710.09412 (2017)

Data Scientist (Engineer) in Japan Twitter : https://twitter.com/AkiraTOSEI LinkedIn : https://www.linkedin.com/mwlite/in/亮宏-藤井-999868122