TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

自己教師あり学習 1: SimCLR・MoCo から DINO・DINOv2 まで — ラベルなしで特徴を学ぶ方法と「崩壊」を防ぐ仕組み

状態: ドラフト (2026-10-13). 論文の数値は原文を開いて条件とともに確認した値です。実際に試したものはノートPCのCPUによるトイの例(code/02_ssl_collapse.py、30秒前後)であり、卓球映像で自己教師あり学習を行ったことはありません(未実測)。 シリーズ「ビジョンモデルを読む 2」第2編。前編: 対照学習とCLIP. ViT構造自体は ビジョンモデルを読む 1をご覧ください。

自己教師あり学習 1: ラベルなしで特徴を学ぶ

目次

1. 直感: ラベルは高価で、画像は溢れている

卓球の映像を思い浮かべるとすぐに腑に落ちます。スマホで撮影した練習動画は何時間分もたまりますが、「このフレームにボールがここにある」と手動でアノテーションする作業は1時間に数百枚がせいぜいです。それでは、 ラベルのない画像の山そのものから何かを学ぶことはできないでしょうか。

自己教師あり学習(self-supervised learning)は、データの中で自ら問題を作り出して解きます。この編で扱う系が解決する問題は次の通りです。

1つの画像を2回異なる方法で変形(切り抜き、色変更、ぼかし)しても、モデルは「同じもの」と言わなければならない。

変形に耐え抜く特徴は、画像が持つ 内容を捉え、 見た目(明るさ、切り抜いた位置)を捨て去った特徴である可能性が高いです。第1編のCLIPが「画像と言葉」をペアにしたのに対し、ここでは「画像とその画像の異なる変形」をペアにします。言葉ですら必要ありません。

2. 問題: 崩壊

しかし、この問題には罠があります。「2つの変形の出力を同じにせよ」が目的のすべてであれば、 すべての入力に対してまったく同じ出力を返すモデルが完璧な正解になってしまいます。損失は最小値になりますが、特徴量は何の情報も持ちません。これを 崩壊(collapse) と呼びます。

この編に登場する方法はすべて、崩壊を防ぐための異なる仕組みであると捉えると整理が容易です。

두 변형은 가깝게 — 그런데 「모두 한 점」 은 막는다 SimCLR · MoCo 오답을 밀어낸다(InfoNCE) 한 그림의 두 변형 다른 그림 = 오답 BYOL 오답 없이, 예측기 + 느린 교사 학생 인코더 예측기 교사 인코더 맞힌다 교사 = 학생의 이동 평균(EMA) 예측기를 빼면 붕괴 DINO: 교사의 분포를 학생이 따라 한다 큰 자르기 2장 작은 자르기 여럿 교사(EMA) 학생 가운데 맞추기 + 날카롭게(τ 0.04) 소프트맥스(τ 0.1) 손실 = 교사 분포와 학생 분포의 교차 엔트로피 가운데 맞추기만 → 고른 분포로 붕괴 날카롭게만 → 한 칸으로 붕괴 둘이 서로를 막을 때만 버틴다 (논문 그림 7, 이 글의 예제)
図: SimCLR・MoCo、BYOL、DINOが崩壊を防ぐ方式
手法 崩壊を防ぐ仕組み 損失
SimCLR(2020) 同じバッチ内の他の画像を不正解として押し出す InfoNCE(第1編と同じ形)
MoCo(2020) 過去のバッチの出力をキューに蓄えて不正解として使う。キューを埋めるエンコーダーはゆっくり追従する InfoNCE
BYOL(2020) 不正解なし。学生側にのみ予測器を取り付け、教員は学生の指数移動平均(EMA) 正規化した出力の二乗誤差
DINO(2021) 不正解なし。教員の出力の平均を引く(中心化)とともに低い温度で先鋭化する 教員分布と学生分布の交差エントロピー

3. どのように学習させるか

SimCLR: 大きなバッチと強い変形

SimCLRの損失はNT-Xentと呼ばれますが、第1編のInfoNCEと同じ形です。N枚のバッチから2N個の変形を作り、各変形の正解は相方の変形1つ、不正解は残りの2N-2個です。論文が見出した要点は3つあります。

MoCo: 不正解をキューに積む

大きなバッチは多くのメモリを消費します。MoCoは不正解を過去のバッチから取得します。出力を長さ65,536のキューに蓄えておき、不正解として使用します。問題は、キュー内の出力が異なる時点のエンコーダーによって生成されているという点です。そのため、キューを埋めるエンコーダー(キーエンコーダー)は逆伝播を行わず、学習するエンコーダーの重みを非常にゆっくりと追従させます。

key 인코더 ← m · key 인코더 + (1 − m) · query 인코더,   m = 0.999

mを0にすると(毎回そのままコピー)学習は失敗し、0.9では55.2%、0.999では59.0%でした(論文、キュー4,096のアブレーション実験)。 ゆっくり追従する教員というこの仕組みが、BYOLやDINOへと受け継がれます。

BYOL: 不正解なしでも持ちこたえる

BYOLは不正解を一切使用しません。学生(online)エンコーダーの上に 予測器をもう1つ取り付け、別の変形を見た教員(target)エンコーダーの出力を予測させます。教員は学生のEMAであり、勾配は逆伝播しません(0.996から1まで徐々に増加)。「1点に集約すればいいじゃないか」という近道がなぜ阻止されるのかについては、論文も完全な証明を与えていませんが、予測器を取り除くと崩壊するという実験結果は明白です(論文)。同じ結果を以下の例でも確認します。

DINO: 教員の分布に従う

DINOは出力をK個の確率分布にします。教員と学生が同じ画像の異なる切り抜き部分を見ることにより、学生が教員の分布を予測するように交差エントロピーを小さくします。分類器を蒸留する様子と似ているため、 自己蒸留(self-distillation) と呼びます(蒸留については第4編で詳しく扱います)。

# 02_ssl_collapse.py 의 DINO 부분에서 줄임
with torch.no_grad():
    q = softmax((teacher(v1) - center) / 0.04)         # 가운데 맞추고, 낮은 온도로 날카롭게
loss = -(q * log_softmax(student(v2) / 0.1)).sum(1).mean()
center = 0.9 * center + 0.1 * teacher_outputs.mean(0)    # 교사 출력의 이동 평균
teacher = EMA(student)

崩壊を防ぐ2つの部品は、互いに反対方向に作用します。

論文では、どちらか一方のみを使用するとそれぞれの方向に崩壊することを図で示しました。学生は大きな切り抜き2枚と小さな切り抜き複数枚のすべてを見ますが、教員は大きな切り抜きのみを見ます(multi-crop)。「小さな断片だけを見て全体の画像の意味を予測せよ」という問題になります。

DINOv2: 手法よりもデータ

DINOv2は損失関数を大きく変更しませんでした(DINOの損失 + マスクされたパッチ単位のiBOTの損失 + 特徴を均一に広げるKoLeo正則化)。その代わりに データ選定に力を入れました。重複を削除した12億枚の元データから、すでに整理されたデータセットに似た画像を検索して1億4,200万枚(LVD-142M)を厳選しました。そして、最大規模のViT-g(11億パラメータ)を学習した後、 小さなモデルは最初から学習せず、大きなモデルから蒸留しました(論文)。なぜ蒸留が勝るのかは第4編のテーマです。

4. やってみる: 崩壊を目で見る

code/02_ssl_collapse.py は隠れグループ10個から生成された32次元の「画像」を作成します。画像にはグループを決定する内容以外に大きく変動する「背景」が混ざっており、画素をそのまま比較すると背景が距離を支配してしまいます。変形は背景の再描画、画素の30%の削除、明るさの倍率、ノイズです。すべての手法を同じエンコーダー(小さなMLP)、同じ1,500ステップで学習させました。 ラベル(グループ番号)は評価にのみ 使用します。

評価は2つの数値で行います。埋め込み次元ごとの標準偏差(0に近いほどすべてが1点に集中)、およびテスト画像ごとに最も近い5つのグループ番号で投票を行うk-NN精度です(出力のまま、 code/02_ssl_collapse.out.txt).

手法 標準偏差 k-NN精度 備考
ランダム推測 — 0.100
画素のまま — 0.315 背景が距離を支配
未学習のエンコーダー 0.170 0.234
1. 引き寄せのみ 0.003 0.107 損失 -0.9998(最小値 -1) — 完璧な崩壊
2. SimCLR(τ=0.2) 0.170 0.931
3. BYOL 0.087 0.816
3′. BYOLから予測器を取り除いた場合 0.002 0.150 崩壊
4. DINO 0.077 0.669 使用された次元数 12/32、画像あたりのエントロピー 2.62
4′. 中心化を取り除いた場合 0.054 0.301 使用された次元数 1/32、エントロピー 0 — 1つの次元に崩壊
4″. 先鋭化を取り除いた場合 0.056 0.286 画像あたりのエントロピー 3.47 = 最大(log 32) — 均一な分布へ崩壊

ここから読み取れる点がいくつかあります。

5. 論文の数値

評価の大部分は 線形評価です。自己教師あり学習で訓練したエンコーダーを凍結し、その上にImageNetのラベルを使って1つの線形分類器のみを学習させて精度を測定します。特徴量がどれほど「線形に分離できるように」整理されているかを検証します。

手法 モデル ImageNet線形評価 top-1 条件(論文)
MoCo ResNet-50 60.6% 200エポック、バッチ256
SimCLR ResNet-50 / 4倍幅 69.3% / 76.5% 1,000エポック。76.5%は教師あり学習のResNet-50と同等水準
MoCo v2 ResNet-50 71.1% 800エポック、MLPヘッド・ぼかし変形を追加
BYOL ResNet-50 74.3% 1,000エポック、バッチ4,096
DINO ViT-S/16 · ViT-B/8 77.0% · 80.1% k-NNは74.5% · 77.4%
DINOv2 ViT-S/14 · ViT-g/14 81.1% · 86.5% LVD-142M、Sはgから蒸留
DINOv3 ViT-7B/16 88.4% 評価解像度512px、LVD-1689M(17億枚)

変形の重要性に関する数値もあります。変形を切り抜きのみに制限すると、BYOLは59.4%(-13.1%p)と持ちこたえたものの、SimCLRは40.3%(-27.6%p)にまで崩落しました(BYOL論文)。不正解に依存する手法ほど、「色だけでペアを探す」といった近道に対して脆弱であるという意味に読み取れます。

DINOには数値以外にも有名な観察が一つあります。ViTの最後の層の注意(attention)マップが、ラベルを一度も見ていないにもかかわらず物体の輪郭に沿うのです。このマップで作ったマスクの重なり(Jaccard)は、ViT-S/16で45.9となり、同じ構造を教師あり学習した場合(27.3)よりも高くなりました(論文)。

計算量は以下の通りです。DINO ViT-S/16は8-GPUサーバー2台で3日、DINOv2全体はデータセンター級GPU 2万2千時間、DINOv3は6万1千時間でした(論文)。

6. 制限

7. 我々のプロジェクトとのつながり

TTの一言。 「2つは同じだと言い張って」と指示すると、モデルは世の中のすべてが同じだと言い切ってしまいます。それを防ぐ仕組みが、不正解であれ、予測器であれ、中心合わせであれ、1つでも欠けると本当の意味で崩壊してしまうのを直接見ることができて面白かったです。

参考文献

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます