なぜ疑似ラベルが効果的か調べてみた

はじめに

なぜ疑似ラベル ( Pseudo-Label ) が効果的かを知るために、「Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks」を読んだので、内容を記載します。

http://deeplearning.net/wp-content/uploads/2013/03/pseudo_label_final.pdf

疑似ラベル ( Pseudo-Label ) とは

疑似ラベルを使った半教師あり学習の方法

1. ラベルづけされているデータで学習済みモデルを作る
2. 1.で作成したモデルを使って、ラベルづけされていないデータで予測値を出す
3. 2.の予測値を疑似的なラベル、疑似ラベルとし、疑似ラベルづきデータをラベルづきデータに混ぜて学習する

なぜうまくいくのか

Abstractを読むと「エントロピー正則化として作用するから」と書かれてました。

これだけだとよく分からなかったので、順を追って読んでみました。
多クラス分類問題を扱っています。

損失関数

損失関数を、ラベル付きデータと未ラベルデータで分けて表現すると、以下のように記載できます。
 nがラベル付きデータの個数で、 n'が未ラベルデータの個数で、 C がクラス数です。

 \displaystyle{L = \dfrac{1}{n}\sum_{m=1}^{n}\sum_{i=1}^{C}L(y_{i}^{m}, f_{i}^{m}) + \alpha(t) \dfrac{1}{n'}\sum_{m=1}^{n'}\sum_{i=1}^{C} L(y_{i}^{'m}, f_{i}^{'m})}

第 1 項目がラベル付きデータのLoss、第 2 項目が未ラベルデータのLossで、その合計が全体のLossです。

ここで、未ラベルデータの疑似ラベルで、以下のように、ネットワークの出力の最大予測確率を持つクラスを選択します。


y'_i=
\begin{cases}
1 & \text{if $i = argmax_{i'} f_{i'}(x)$} \\
0 & \text{otherwise}
\end{cases}

この損失関数 の  \alpha(t) はバランスを取るための係数で、徐々に大きくなるようにスケジューリングする必要があるそうです。あまりにも高いと学習を阻害し、低すぎると疑似ラベルの恩恵を受けられなくなるのだそう。

エントロピー正則化

エントロピー正則化は、エントロピーを最小化することで、クラス間の境界部分を低密度な状態 ( 境界にデータがあまりなくてが分類しやすい状態 ) にしてくれるそうです。
エントロピーは各クラスのデータのオーバーラップに対する評価値となります。

エントロピーは以下のように表されます。
 \displaystyle{H(y|x^{\prime})=-\dfrac{1}{n^{\prime}}\sum_{m=1}^{n^{\prime}} \sum_{i=1}^{C}P(y_{i}^{m} = 1 | x^{\prime m}) logP(y_{i}^{m}=1|x^{\prime m})}

 n': 未ラベルデータの個数
 C: クラスの個数
 x'_{\prime m}: 未ラベルデータ
 y_{i}^{m}: 未ラベルデータの疑似ラベル

先ほどの損失関数 (各 L : 交差エントロピー誤差) の両辺に負の値をとり、損失関数の最小化問題をMAP推定 ( 事後確率を最大化するようなパラメータを推定する問題 ) に置き換えるため、先ほどのエントロピーの式も合わせて、以下のように書き直して考えます。

 \displaystyle{C(\theta, \lambda) = \sum_{m=1}^{n}logP(y^{m}|x^{m}; \theta) - \lambda H(y|x'; \theta)}

これを最大化させるので、未ラベルデータのエントロピー(第2項)を最小化して、ラベル付きデータの対数尤度(第1項)を最大化することになり、ラベル付きデータだけの学習よりもパフォーマンスがよくなるそうです。

結果

MNISTのデータを使い、Pseudo-Labelを使ったものと使わなかったものとで、t-SNEにより比較しています。
確かに、Pseudo-Labelを使ったものの方が、各クラス間の境界部分が低密度な状態になっていると言えそうです。
f:id:YukoIshizaki:20191114113855p:plain:w300

終わり

完全に腑に落ちるところまで理解することはできなかったです( ˘ω˘ ; )

KaggleでもPseudo-Labelが上手くいく場合と、上手く行かない場合があるように見受けられ、疑似ラベル付きデータをどのくらいの数、どのタイミングで入れるかが難しいのかな、と思いました。

記載に誤りがあれば教えていただけたら嬉しいです。

終わり 2

転職して、まだ入社していないのですが ( 12月から入社です \( •̀ω•́ )/ ) 次の会社の勉強会に参加させてもらってます。めっちゃ面白いです。
今回のブログも、勉強会中で疑問になったことをきっかけに調べてみようと思って書きました。

ちなみに、勉強会の内容ですが、先輩がGitHubで公開してくれています!!良きです!
github.com


参考
https://papers.nips.cc/paper/2740-semi-supervised-learning-by-entropy-minimization.pdf
https://pdfs.semanticscholar.org/1ee2/7c66fabde8ffe90bd2f4ccee5835f8dedbb9.pdf
arxiv.org