ココアのお勉強ブログ

技術職の一般人です。趣味でコード書いたりソフト触ったり。

半教師あり学習自分用にメモ

教師あり学習について調べようと思ったので、初歩的な手法としてTemporal ensembling、Mean teachers、UNSUPERVISED DATA AUGMENTATION(UDA)、MixMatchについて調べました。
間違いがあったら教えてください。

そもそも半教師あり学習って何?

現実問題、ラベルあり画像(教師ありデータ)を大量に用意することは難しい。
だけどラベルなし画像(教師なしデータ)を用意するのは簡単。
そこで少量の教師ありデータと大量の教師なしデータから学習する手法として半教師あり学習が提案されている。

Temporal Ensembling for Semi-Supervised Learning

arxiv.org

本報告ではΠ-modelとTemporal ensemblingが提案されている。

ここで
x_i:学習データ
y_i:正解ラベル
B:バッチサイズ
t:何エポック目か
w(t):時間に依存する重み。0から始めるramp up 関数 とする。

Π-model

確率的なData Augmentation と 確率的にDropoutの位置を変えるネットワークを用いる。

流れは以下のようになる。

上図にも書いてあるが損失関数は以下のように定義されており、前の項(黄色線)が教師あり損失関数項、後ろの項(赤線)が教師なし損失関数項となる。

アルゴリズム全体

TEMPORAL ENSEMBLING

流れは以下のようになる。

損失関数は先と同じ。
学習後、Z_i←αZ_i+(1−α)z_i を更新することにより、ネットワーク出力z_iがアンサンブル出力Z_iに累積される。

\tilde{z}生成するには、因子 (1−αt) で除算する。

アルゴリズム全体

Mean teachers are better role models:Weight-averaged consistency targets improve semi-supervised deep learning results

arxiv.org

構成と流れは以下の図のようになる。
TeacherモデルとStudentモデルは同じ構造をしている*1

classification cost

SoftmaxCrossEntropyを用いている。

consistency cost

Studentモデルの重みをθ、ノイズをη
Teacherモデルの重みをθ′, ノイズをη′ とすると以下のように書ける。

※この論文ではMSEを使ってるがKL-divergenceなどでも良い。

ちなみにモデルには3つのノイズが入っているが、詳しくは以下のような構成となっており、入力でははRandom Translation、Horizonal flip、Gauusian noiseを、中間層ではDropoutをノイズとして扱っている。

Mean Teacherでは、学習ステップtでのθ′_tを以下の式のようにした。
Teacherモデルの重みはStudentモデルの重みの 指数移動平均(Exponential Moving Average) を用いている。

ここでαはハイパーパラメータ。
確率的勾配降下法(SGD)を用いて各学習ステップでノイズη, η′をサンプリングすることによってconsistency costを近似できる。

総コストは以上2つのコストの加重合計としている(詳しくは以下)。

教師ありデータのとき


教師ありデータが入力にきたとき classification cost と consistency costを求める。
totalcost=classificationcost+w(t)×consistencycost

教師なしデータのとき

教師なしデータが入力にきたとき正解ラベルがなくclassification costを求めることができないため、consistency costのみを用いる。
totalcost=w(t)×consistencycost

こうすることでラベルなし画像もうまく学習に組み込むことができるため半教師学習であると言える。

UNSUPERVISED DATA AUGMENTATION FOR CONSISTENCY TRAINING

arxiv.org

今までは教師なしデータに対して、何かしらの摂動・ノイズ(例えばガウスノイズとかDropoutとか)を加えた。それらをモデルに入力した時の出力が(差の二乗和やKL-divergenceなどを使って)ばらつかないようにするというものであった。
この論文ではガウスノイズやDropoutなどではなく、より現実的なdata augmentationを用いる。

UDAの概略図

RandAugment

RandAugmentについてはよく分からないけど、Data Augmentationを自動で行うAuto Augmentを、学習と同時に行う手法らしい。

他の様々なタイプのノイズも(ガウスノイズ、敵対的ノイズなど)試したが、本手法のようにdata augmentationを用いたらより優れている結果がでたらしい。

MixMatch: A Holistic Approach to Semi-Supervised Learning

arxiv.org

ここでは
バッチサイズをB
教師ありデータをX=( (x_b,p_b) );b\in(1,...,B)
教師なしデータをU=(u_b);b\in(1,...,B)
とします。

step1

ラベルあり画像(教師ありデータ)x_bに対してdata augmentation(ランダム水平反転処理やランダムクロップ処理など)を行い新たな画像\hat{x}_bを作る。

step2

同様にラベルなし画像(教師なしデータ)u_bに対してもdata augmentationを行い新たな画像を作る。
ラベルなし画像をdata augmentationする時、K回行いK個の新たな画像\hat{u}_{b,k};k\in(1,...,K)を作る。

step3

step2で生成したdata augmentation後のラベルなし画像に対して、モデルでラベルを予測する。
data augmentation後のラベルなし画像はK個あるので、K個分モデルで予測することになる。

step4

step3の予測値を平均する。

これで得られる値を  \bar{q}_bとする。

step5

step4で出力した平均値をSharpen(エントロピーを小さく)する。
TはハイパーパラメータでT→0でonehotに近づくようになっている。

これにより得られる値をq_bとする。
q_b=Sharpen(\bar{q}_b,T)

step6

以下のようにラベルありデータは(画像,ラベル)のペア\hat{X}にする。
\hat{X}=( (\hat{x}_b,p_b ) );b\in(1,...,B)

以下のようにラベルなしデータは(画像,疑似ラベル)のペア\hat{U}にする。
\hat{U}=( (\hat{u}_{b,k},q_b) );b\in(1,...,B),k\in(1,...,K)

step7

ラベルありデータとラベルなしデータそれぞれをMixupする。
合成するデータはラベルありデータでもラベルなしデータでも良い。

これにより得られる合成後のラベルありデータを X' 、合成語のラベルなしデータを U'とする。

step8

(合成後の)ラベルありデータ x の予測値と(合成後の)正解ラベル p に対し、CrossEntropyを計算する(ラベルありデータの損失関数項)。
(合成後の)ラベルなしデータ u の予測値と(合成後の)生成したラベル qとの差の二乗和を計算する(ラベルなしデータの損失関数項)。
そしてそれぞれを加算し、損失関数とする。

ここで
λ_uはハイパーパラメータ
Lpの次元数
とする。

step9

step1~step8を繰り返して学習を行う。

MixMatchアルゴリズム

step1~step7をまとめると以下のようになる。

ReMixMatch

最近これの進化系ReMixMatchという論文が出たらしいです。
以下の記事が非常に詳しく書いていたのでここでは解説は省きます。

qiita.com

自分用用語メモ

Sharpen

Pseudo-label

*1:Temporal ensemblingはTeacherモデルとStudentモデルともに同じネットワークを共有するが、Mean teacherはそれぞれ別々のネットワーク(構造は同じ)を使うという点に注意