深層学習

半教師ありと自己教師あり学習

ラベルの有無で半教師あり学習と自己教師あり学習を切り分け、一貫性正則化・教師モデルの重み平均と、対照学習・データ拡張・投影ヘッドの役割を整理する。

  • A|中核
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

半教師あり学習は、少量のラベル付きデータと大量の未ラベルデータを同じ学習に使う枠組みです。自己教師あり学習は、人手ラベルを使わず、データ自身から作った課題で表現を学ぶ枠組みです。切り分けの軸は「教師」という名前ではなく、学習に人手ラベルを入れているかです。

半教師あり学習は、少数の採点済み答案を基準に、未採点答案にも同じ解き方を守らせる勉強です。自己教師あり学習は、答案に正解ラベルを付ける代わりに、同じ画像の見え方を変えた2枚を「同じもの」として見分ける練習です。

なぜ必要か

実務では、画像や文章を集めるより人手でラベルを付けるほうが高コストです。ラベルを増やせないとき、半教師あり学習はラベル付き集合の教師信号に加えて、未ラベル集合の予測が入力の変化に対して安定するという条件を使います。一方、自己教師あり学習はラベル収集を前提にせず、後段の分類などに使える表現を先に学びます。

両者は未ラベルデータを使うため混同されます。しかし、前者の損失には人手ラベル付き例の教師あり損失が残り、後者の事前学習段階には人手ラベルがありません。ラベルが足りないからといって、ただ自己教師ありに置き換わるわけではありません。

状況選ぶ見方学習で作る信号
少量の正解ラベルがあり、未ラベル例も多い半教師あり学習正解ラベル+予測の一貫性
正解ラベルを使わず表現を先に学ぶ自己教師あり学習データから作った疑似的な正例・課題

仕組み

半教師あり学習では、ラベル付き集合を mathcalDL\\mathcal{D}_L、未ラベル集合を mathcalDU\\mathcal{D}_U、モデルのパラメータを theta\\theta とします。典型的には、教師あり損失と未ラベル例の一貫性損失を足します。

L(theta)=Lmathrmsup(theta;mathcalDL)+lambdaLmathrmcons(theta;mathcalDU)L(\\theta)=L_{\\mathrm{sup}}(\\theta;\\mathcal{D}_L)+\\lambda L_{\\mathrm{cons}}(\\theta;\\mathcal{D}_U)

lambda\\lambda は一貫性損失の重みです。同じ未ラベル入力に異なる摂動を与えたとき、予測を近づけるので、モデルは入力の偶然の揺らぎに過敏になりにくくなります。Mean Teacher では、学生モデルのパラメータを theta\\theta、教師モデルのパラメータを bartheta\\bar{\\theta} として、教師を重みの指数移動平均で更新します。

barthetat=alphabarthetat−1+(1−alpha)thetat\\bar{\\theta}_{t}=\\alpha\\bar{\\theta}_{t-1}+(1-\\alpha)\\theta_t

tt は更新ステップ、alpha\\alpha は平均の係数です。教師の予測を保存して例ごとに更新するのではなく、モデル重みを平均するのがこの手法の要点です。学生はラベル付き例では正解に、未ラベル例では教師の予測に近づきます。

自己教師あり学習の代表例として SimCLR の流れを見ます。入力 mathbfx\\mathbf{x} からランダムなデータ拡張で2つのビュー tildemathbfxi,tildemathbfxj\\tilde{\\mathbf{x}}_i,\\tilde{\\mathbf{x}}_j を作り、エンコーダ ff で表現 mathbfh=f(tildemathbfx)\\mathbf{h}=f(\\tilde{\\mathbf{x}}) を得ます。その後、投影ヘッド gg を通した mathbfz=g(mathbfh)\\mathbf{z}=g(\\mathbf{h}) を対照損失に入力します。

同じ元データから作った2ビューを正例、バッチ内の別データから作ったビューを負例として、正例の表現を近づけ、負例を分けます。ここで投影ヘッドは損失を受ける空間を表現 mathbfh\\mathbf{h} と分ける役割を持ち、評価や下流タスクでは通常、エンコーダの表現を使うという設計上の切り分けが生じます。データ拡張は単なる前処理ではなく、「変えても同じとみなす」不変性を定義する教師信号です。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
半教師ありと自己教師ありの区別半教師ありは人手ラベル付き例も損失に使う未ラベルデータを使えばすべて自己教師あり、とする
Mean Teacher の教師の作り方教師モデルの重みを指数移動平均し、一貫性の目標にするラベル予測を例ごとに保存する方法と混同する
自己教師あり対照学習の正例同じデータの異なる拡張ビューを正例にするクラスラベルが同じ別画像を必ず正例にする
SimCLR の投影ヘッド表現と対照損失の間に学習可能な非線形変換を置く分類器そのもの、または教師モデルだと考える

実装で確かめる

未ラベル例で「別の拡張に対する予測を近づける」項が何をしているか、NumPyで最小限確認します。ここでは教師モデルを固定し、学生のロジット間の二乗誤差を一貫性損失にしています。

import numpy as np

student = np.array([1.0, 0.0, -1.0])
teacher = np.array([0.8, 0.1, -0.9])
lam = 0.5

def softmax(v):
    e = np.exp(v - v.max())
    return e / e.sum()

ps, pt = softmax(student), softmax(teacher)
consistency = ((ps - pt) ** 2).mean()
loss = lam * consistency
print("一貫性損失:", loss)

このコードでラベルは一度も参照していません。実際の半教師あり学習ではここに未ラベル例の項として加え、別途ラベル付き例の教師あり損失を足します。自己教師あり対照学習なら、クラスIDの代わりに拡張ビューの対応関係を使います。

取り違えやすいもの

用語何をラベルとして使うか判断の要点
半教師あり学習人手ラベル+未ラベル例一貫性正則化を使っても教師あり損失がある
自己教師あり学習データから作った課題の対応関係人手ラベルなしで表現を学ぶ
疑似ラベルモデルの予測を一時的なラベルとして扱う人手ラベルではないが、半教師ありの仕掛けになり得る
対照学習正例・負例の関係自己教師ありにも教師ありにも使える。方式名だけでラベルの有無は決まらない
転移学習・BERT事前学習個別の学習段階・対象を指すここでは、どの表現を後段へ渡すかという接続だけを考える

「対照学習だから自己教師あり」「教師モデルがあるから半教師あり」と短絡しないことが実装上の安全策です。最初に損失へ入るラベルの出所を確認します。

想起チェック

半教師あり学習と自己教師あり学習を分ける最短の基準は何か

人手ラベルを学習に使うかどうかです。半教師ありは少量でも人手ラベルを使い、自己教師ありはデータ自身から課題を作ります。

Mean Teacher で平均する対象は何か

教師モデルの重みです。教師の予測値を例ごとに平均するのではなく、学生モデルの重みを指数移動平均して一貫性の目標を作ります。

SimCLRでデータ拡張と投影ヘッドは何を担うか

2つの拡張ビューを同じ元データの正例として対応付け、投影ヘッドはエンコーダ表現と対照損失を受ける空間を分けます。

対照学習という名前だけで自己教師ありと判断できるか

できません。正例・負例を人手ラベルで作る対照学習もあり得るため、ラベルの出所を見ます。

出典