0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DINOv3の詳細な技術解説

Last updated at Posted at 2025-10-13

今後の画像基盤モデルとしての最有力候補の一つであるDINOv3について、主に技術的な内容を解説する。
ここでのDINOv3は、自己教師あり学習手法(SSL: Self-Supevised Learning)、またはそれを使って事前学習された画像基盤モデルのいずれかを指す。

目次

  1. DINO (v1) (ICCV'21)
  2. iBOT (ICLR'22)
  3. DINOv2 (TMLR'24)
  4. DINOv3 (25)

[先行研究]DINO (v1) (ICCV'21)

DINO(v1)は先行研究BYOL(NeurIPS'20)をベースとした自己蒸留型の自己教師あり学習手法である。(自己教師あり学習≒ラベルなしデータで良い感じの事前学習モデルを作る手法)

下図の構造をしており、ベース画像に2パターンのdata augmentationをそれぞれ適用して2個の画像を作り、それらの画像に対する出力が同じになるようにモデルを学習する。
以下がDINO学習の簡易版フローである。

  1. 画像$x$に対して2パターンのdata augmentationを掛けて、それぞれ$x_1, x_2$を生成する
  2. $x_1$をstudentモデル$g_{θs}$へ、$x_2$をteacherモデル$g_{θt}$へ入力し、それぞれで出力をsoftmaxして疑似クラス確率分布$p_1, p_2$を算出する
    • 実装では疑似クラス数K=65536
    • teacherだけsoftmax前にcentering(≒確率均等化)することで、非対称性(出力相違)を作り出す
  3. studentとteacherの疑似クラス確率分布が同じになるようにCross Entropyロスを取る
  4. studentへのみ誤差逆伝播してstudent重み$θs$を更新する
  5. teacher重み$θt$はstudent重み$θs$を一定割合だけ取り込んで更新する
    (student重みの移動指数平均(EMA))
    ※ 以降ではこのフローで計算されたステップ3. のロスを DINOロス と呼ぶ
    image.png
    最終的に、上記フローで学習されたstudentモデル$g_{θs}$(ViT)から、head(最終層MLP)を除外した部分が、事前学習済みbackboneモデル(patch埋め込み+Transformer層)として利用される。

[先行研究]iBOT (ICLR'22)

iBOTはDINOをベースにLLMでよく使われるmask学習(iBOTロス)を追加した手法である。
ViTモデル前提の下図の構造をしており、CLSトークンでDINOロスを扱い、各patchトークンがiBOTロス(mask復元ロス)を扱う。
iBOTロスは以下のフロー(簡易版)でstudentモデルを自己教師あり学習する。
(DINOのstudentモデル$g_{s}$は、iBOTではbackbone $f_s$とhead $h_s^{CLS}$に分割されてる)

  1. 画像xにdata augmentationを掛けて画像$u$を生成する($v$も完全に同じなので、省略)
  2. $u$にランダムマスクを掛けた$\hat u$をstudent $f_s \circ h^{patch}_s$ に入力し、各patchで出力をsoftmaxして疑似クラス確率分布$p_s$を出力する
  3. マスクを全く掛けない完全なuをteacher $f_t \circ h^{patch}_t$ に入力し、各patchで出力をsoftmaxして疑似クラス確率分布$p_t$を出力する
    • DINO同様に、teacherだけcentering(≒確率均等化)する
  4. 各patchで、studentとteacherの疑似クラス確率分布が同じになるようにCross Entropyロスを取る
  5. studentへのみ誤差逆伝播してstudent重み$θs$を更新する
  6. teacher重み$θt$はstudent重み$θs$を一定割合だけ取り込んで更新する
    (student重みの移動指数平均(EMA))
    ※ 以降ではこのフローで計算されたステップ4. のロスを iBOTロス と呼ぶ
    image.png

[先行研究]DINOv2 (TMLR'24)

DINOv2はiBOTをベースに学習フレームワーク(データセット、手法、等)を大幅に改良した手法(あるいは事前学習モデルそのもの)である。
手法にまつわる改良だけでも、以下にようにたくさんの工夫が凝らされているため、特徴的な改良に絞って一部を解説する。
image.png

KoLeo正則化

各CLSトークンが同じ出力ばかりになるのを防止する。
自身に最も近い他の出力に対し、互いを引き離すようなロスになっている。

  • $L_{koleo}=-\frac{1}{n} \sum^B_{i=1}\log(d_{\min,\ i}) \qquad \text{where} \qquad d_{\min,\ i}=\lVert z_i-z_{nearest(i)}\rVert_2$
    • B: バッチサイズ
    • i: バッチインデックス
    • z: CLSトークン出力
    • nearest(i): バッチ内で、$z_i$に最も近い出力である$z_j$のバッチインデックスj

Sinkhorn-Knopp化 (SwAV (NeurIPS'20))

Cross Entropy前の[centering+softmax]処理を、[Sinkhorn-Knoppアルゴリズムによる二重確率行列化]処理に置き換える。

バッチサイズB、疑似クラス数K(prototype数)のとき、B×Kの行列に対する確率化を考えると、softmaxではK方向にのみ正規化する(行総和=1)。Sinkhorn-Knoppアルゴリズムは行列を二重確率行列へ変換するアルゴリズムであり、それを適用するとB方向・K方向の両方向を正規化する(行総和=1、列総和=1)。
この二重確率行列化により、出力が特定の疑似クラスばかりへ偏ってしまうのが抑制され、学習が安定化するらしい。

Register token (Vision Transformers Need Registers (ICLR’24))

CLSトークン+patchトークンらに加えて、内部の途中計算結果の格納用にregisterトークンを4個追加する。
(初期のDINOv2にはなかったが、後に追加された)

CLSトークン+patchトークンらだけで推論した場合における、各patchの情報量ヒートマップが下図(左)であり、黄色いほど情報量が多いことを表している。下図(左)のどの推論ヒートマップにおいても、あまり重要でないはずの背景に情報量が多い領域(黄色)がぽつぽつと存在している。これはあまり使われていないトークン(≒重要でない)を途中計算結果の格納場所として利用していることが原因であり、patchトークンの表現能力低下に繋がってしまう。
この現象は途中計算結果の格納用にregisterトークンを追加することで防ぐことができ(下図の右)、そうすることでpatchトークンに余計な情報が入り込まなくして局所特徴の表現力を向上させられる。
image.png

DINOv3

成功を収めたDINOv2をさらにパワーアップさせたフレームワーク(あるいは基盤モデルそのもの)がDINOv3となる。

学習データ

データセット

LVD-1689Mデータセット(今回作成)や公開データセット(ImageNet等)を組み合わせたデータセットを学習に用いている。
LVD-1689Mの作成方法は Instagramの170億画像 > DINOv2で各embedding作成 > 5階層k-meansクラスタリング > 末端クラスタから均等にサンプリング > 1.689億データセット完成 といった感じで、多様かつ偏りが少なくなるように工夫して作成されている。

データサンプリング

また、実際の学習では、各バッチで ImageNet1k or それ以外の混合データセット をランダム(1:9)に選択しており、全体の10%はImageNet1Kの画像で学習されている。

Multi-crop戦略

1枚の画像に対し、2種類のcropping(global / local)で複数の学習画像を取得する。
(例) global crop: 2枚の256×256、local crop: 8枚の112×112

モデル

DINOv2から色々と変更されているが、特徴的な変更点に絞って解説する。
image.png

モデルサイズが約7倍(1.1B → 6.7B)

Gram anchoringによる局所領域の表現能力向上(後述)などにより、大規模モデルの学習がより安定化している。

位置エンコーディング方式の変更: Axial RoPE (2次元版RoPE)

画像は相対位置関係が重要なため、DINOv2の絶対位置埋め込みであるLearnable PEから、相対位置埋め込みであるRoPEへと変更している。
この際、画像は2次元データなのでAxial RoPE方式が採用されている。Axial RoPEでは、PEが内部的に2分割されていて、前半分はx方向RoPE・後半分はy方向RoPE という構造を取ることで、x,yの両方向の情報を埋め込んでいる。(実際の実装では少し配置方式が異なるが)

学習時、解像度やアスペクト比へのロバスト性向上のために以下のRoPE-box jitteringする。
※ この機能はgithub実装では無効化されている。実は必要なかった?

  • ベースRoPE: 画像全体のpatch位置は[-1,1]に正規化する
  • RoPE-box jittering: 正規化範囲[-1,1]を、縦横で別々に0.5~2倍にランダムスケールする
    ⟹ 解像度を維持しつつ、縦横を伸縮するdata augmentationに似た学習効果が得られる

LayerNormの分離

backbone最終層のLayerNormにおいて、global token群(CLS + register)とlocal token群(patches)を分けて、2個のLayerNormを適用している。
⟹ 局所特徴の表現能力が向上する

学習方式

以下のスケジュールで学習する。

  • [0 ~ 100万 iteration] $L_{Pre} = L_{DINO} + L_{iBOT} + 0.1 * L_{DKoleo}$
    • DINOv2と全く同じロス
    • ($L_{DKoleo}$はKoleo正則化を分散GPU実装しただけで、中身は$L_{Koleo}$)
  • [100 ~ 220万 iteration] $L_{HRef} = L_{DINO} + L_{iBOT} + 0.1 ∗ L_{DKoleo} + L_{Gram}$
    • $L_{Gram}$(Gram Anchoringロス)が追加(後述)
  • [220 ~ 223万 iteration] $L_{HRef}$ : 高解像度適合フェイズ(HR Adaptation)
    • ロスは同じだが、入力画像を高解像度化する
      • (最後だけやる理由は、高解像度画像は学習コストが極めて大きいため)
    • これにより、4Kなどの高解像度画像からも良い特徴表現が得られるようになる

(参考)下図はHR Adaptationの有無による4種のタスクの精度比較結果であり、ほとんどのタスク・解像度で性能向上が確認できる。(Pre-HRが無し、Post-HRが有り)
image.png

Gram Anchoring

画像のpatchトークン間の類似度関係が維持されるようにGramロスを追加する。
この際、専用のgram-teacherモデル(10k iteration毎にteacherモデルをコピーして更新)を用意する。
$$L_{Gram}=\lVert X_S・X_S^\top - X_G・X_G^\top \rVert^2_F \qquad \text{where} \quad X_S,X_G∈ℝ^{P×d}$$ P:パッチ数d:トークン次元であり、$X_S/X_G$ は student/gram-teacherのpatchトークン出力(L2ノルム正規化済み) である。$L_{Gram}$では専用のgram-teacherモデル(10k iteration毎にteacherモデルをコピーして更新)を用意される。
patchトークン出力のGram行列である$X・X^\top∈ℝ^{P×P}$は各patch間のcos類似度行列を意味し、結果として $L_{Gram}$ はstudentとgram-teacherのcos類似度行列の各要素の二乗誤差総和となっている。つまりこのロスにより、studentの各patch間の関係性(類似度)がgram-teacherから離れないように(維持するように)なる。

[$L_{HRef}$]さらに、gram-teacherへの入力だけを2倍の解像度に高めることで、より滑らかで高品質な局所特徴が得られるようにしている。
※ $L_{Gram}$計算時にpatch全体を1/2 downsampleしてpatch数を揃えている
※ github実装では2倍でなく1.5倍にしてた

Gramロス導入の背景

下図は赤い点(patch)を基準とした類似度ヒートマップであり、黄色いほど類似度が高いことを表している。(図の下方の数値がiteration)学習が進むに連れて、画像全体のpatchがどれも赤い点(patch)と類似してきており、これは画像全体のどこも同じような特徴を持ってしまっていることを意味する。

image.png
下図の中段が$L_{Gram}$無し、下段が$L_{Gram}$有りで学習した結果である。$L_{Gram}$により局所特徴の表現が向上しているのが見て取れる。
image.png

多様なモデルへ蒸留

DINOv3 7Bモデルを蒸留して、S, S+, B, L, H+の5種類のViTモデルを追加で作成している。
さらにCNNへの蒸留もしており、4種類のConvNeXtモデルも作成している。
image.png

蒸留方式

teacherとして、studentのEMAモデルでなくDINOv3 7Bを固定teacherとして採用している。
また、蒸留ではCLSやpatch同士が類似した出力になってまう問題が生じなかったので、Gramロスは採用していない。
(DINOv3の方式そのままではbackbone出力形状が異なるConvNeXtへの蒸留は適用できないので、色々と調整が必要だと思われるが、その詳細は論文に書かれていない‥)

評価結果

下図は様々なタスクでの比較結果で、DINOv3はほとんどのタスクでDINOv2や最新の弱教師あり学習モデル(SigLIP 2, PE)に勝ってる。ただ、classificationタスクだけはまだ弱教師あり学習モデルを上回るレベルにまでは達せてない。
image.png

局所特徴表現が重要となる3種のタスクに絞って、最新の自己教師あり学習モデルや弱教師あり学習モデル(SigLIP 2, PE)と性能・計算量・モデルサイズを比較した結果が下図である。局所特徴の表現能力が高いDINOv3はほとんどの結果で他より優れたトレードオフカーブを見せている。特にSemantic segmentationにおいては、Segmentation系の学習情報を利用しているAM-RADIOの性能すら上回っている。
image.png
※ 縦軸が精度指標、横軸が計算量、円のサイズがモデルサイズ


DINOv3論文にはまだまだ大量の評価結果が載ってるので、気になる人は論文を直接見ると

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?