ステータス: ドラフト(2026-10-13)。 論文の数値は原文を開いて条件とともに確認しました。実際に試したものはノートPCのCPUによるおもちゃの例(
code/03_mae_toy.py、3分前後)です。実際の写真や卓球の映像でMAEを学習させたことはありません(未実測)。 シリーズ「ビジョンモデルを読む 2」第3回。前回の記事: 自己教師あり学習 1. ViTが画像を断片(パッチ)に分割する方式は ビジョンモデルを読む 1のViT編をご覧ください。
自己教師あり学習 2: MAE
目次
1. 直観: 穴埋め
第2回の手法は「2つの変形が同じものである」ことを教えました。MAE(Masked Autoencoder)は別の課題を出します。 画像の一部を隠し、隠された部分を当てよ。
テキストではこの問題がすでに大きな成功を収めています。BERTは文章の単語の15%を隠して当てさせることで言語モデルの土台を作りました。画像でも同じ発想を考えることができます。隠された場所をもっともらしく埋めるには、「ここは卓球台の角がつながるはずだ」、「この腕は肩についているはずだ」といった構造を知っている必要があるからです。
しかし、画像を15%だけ隠しても簡単すぎます。隣接するピクセルを適当につなぎ合わせれば埋まってしまいます。画像はテキストよりも 情報がはるかに低密度です。隣り合うピクセルがほぼ同じ値を持つからです。MAEの答えは大胆です。 75%を隠します。 この程度になると、つなぎ合わせでは無理であり、画像全体の構造を理解しなければ埋めることができません。
2. 画像: 非対称エンコーダー・デコーダー
MAEの2つ目の工夫は計算量です。
- 画像をViTのように小さな正方形の断片(16×16ピクセル、ViT-Hは14×14)に分割します。
- 断片の75%をランダムに選びます。 選んだ断片はエンコーダーに全く入力しません。 大きなViTエンコーダーは、見える25%だけを処理します。
- エンコーダーの出力を元の位置に戻し、空いた場所には「ここは隠された」という学習可能なベクトル(マスクトークン)を埋めます。
- 小さく浅いデコーダーが、隠された断片のピクセルを復元します。
- 学習が終わるとデコーダーは捨ててエンコーダーだけを使います。
トランスフォーマーの計算量はトークン数に比例するか(MLP)、その二乗に比例します(アテンション)。トークンを4分の1に減らすと、大きなエンコーダーの計算が大幅に減少します。デコーダーはトークンあたりの計算量がエンコーダーの10%未満になるよう浅く作られています(論文)。
3. どのように学習させるか
損失
L = 가린 조각들에 대해서만 평균한 (예측 화소 − 정답 화소)²
見える断片の復元誤差は計算しません。見えるものを模倣するだけでは学ぶべきことがないからです。
正解ピクセルには1つの処理を施します。 断片ごとに平均を引いて標準偏差で割ったピクセルを目標として使用します。断片全体の明るさよりも、断片内の模様(エッジ、質感)を当てることに集中させるためです。ViT-Lにおいてファインチューニングの精度が84.9%から85.4%へ、線形評価が73.5%から73.9%へと向上しました(論文)。
ラベルとデータ
ラベルは使用しません。論文ではImageNet-1Kの画像のみを使用し、事前学習の後にラベルでファインチューニングするか、線形評価を行いました。
マスキング方式
同じ75%でも、どのように隠すかが重要でした(論文、ViT-L、ファインチューニング / 線形評価)。
| マスキング方式 | 割合 | ファインチューニング | 線形評価 |
|---|---|---|---|
| ランダムな断片 | 75% | 84.9 | 73.5 |
| 大きな塊(ブロック) | 50% | 83.9 | 72.3 |
| 大きな塊 | 75% | 82.8 | 63.9 |
| グリッド(1マス飛ばし) | 75% | 84.0 | 66.0 |
グリッド状に隠すと見える断片が均一に分散するため隣接同士の継ぎ合わせが容易になり、大きな塊で75%を隠すと難しすぎることになります。ランダムはその間のバランスです。
BEiTとの違い
MAEよりも少し先行していたBEiTは、隠された断片の ピクセル の代わりに、事前学習されたトークナイザー(dVAE、8,192語)がその断片に付与した 単語番号を当てさせました。約40%を塊状に隠しました(論文)。MAEはトークナイザーなしでピクセルを直接当ててもよいことを示しており、その分構造がシンプルです。
4. 実際にやってみる
code/03_mae_toy.py は16×16の白黒画像に2つの点を描きます。画像の「模様」(ラベル)は2つの点の配置です:横並び、縦並び、「\」の対角、「/」の対角。点的位置・サイズ・明るさは画像ごとに異なります。模様を把握するには1つの断片ではなく 断片同士の関係を見る必要があります。
画像を4×4の16個の断片に分割し、小さなトランスフォーマー(エンコーダー3層、デコーダー1層、幅64)でMAEを学習させました。隠す割合だけを変えてそれぞれ800ステップずつ学習させ、エンコーダーの特徴量に線形分類器のみを載せて模様の分類精度(線形プローブ)を測定しました。模様のラベルはこのプローブでのみ使用します。
# 03_mae_toy.py 에서 줄임
order = torch.rand(n, 16).argsort(1) # 그림마다 다른 무작위 가리기
keep, masked = order[:, :n_keep], order[:, n_keep:]
z = encoder(gather(embed(patches) + pos, keep)) # 보이는 조각만 인코더로
full = mask_token.repeat(n, 16, 1); full.scatter_(1, keep, z)
pred = head(decoder(full + dec_pos))
loss = mse_per_patch(pred, normalize_per_patch(patches)).gather(1, masked).mean() # 가린 조각에서만
結果(2つのシードの平均、 code/03_mae_toy.out.txt):
| 隠す割合 | エンコーダーが見る断片 | 隠した断片の復元誤差(正規化ピクセルMSE) | 線形プローブの精度 |
|---|---|---|---|
| 基準: ピクセルそのまま | — | — | 0.407 |
| 基準: 学習していないエンコーダー | 16 | — | 0.575 |
| 25% | 12 | 0.699 | 0.803 |
| 50% | 8 | 0.736 | 0.812 |
| 75% | 4 | 0.839 | 0.783 |
| 90% | 2 | 0.880 | 0.763 |
隠して当てさせることだけで学習したエンコーダーは、どの割合でも学習していないエンコーダー(0.575)やピクセル(0.407)よりもはるかに優れた特徴量を生成しました。ラベルなしで「関係」を学習したことを意味します。
しかし、このおもちゃでは 75%が最適ではありませんでした。 25〜50%のほうがわずかに良好でした(シード間の差が±3%pであるため、25%と50%の優劣はつけられません)。これがMAEの核心的な仮定を裏返しに示しています。私たちの画像は16個の断片しかなく、大部分が空の背景であるため、情報が2点に集中しています。4つしか見せないと2点が全く見えないことが多く、その場合は当てる根拠がありません。 高いマスキング割合は、画像が重複で満ちているときに有効な処方箋です。実際の写真1枚は数百の断片からなり、隣接する断片同士がよく似ています。第6回の映像は隣接フレーム同士がさらに似ているため、90%にまで達します。
学習時間はマシンの負荷によって大きく変動しました。同じコードを2回実行したところ、25%は21.5秒・21.6秒、75%は27.9秒・16.5秒、90%は23.7秒・15.7秒でした(精度と誤差の数値は2回とも同じでした)。負荷が低いときに実行した2番目の値でも、エンコーダートークンを¼(12個 → 4個)に削減した効果は時間の約25%短縮にとどまりました。この規模のモデルでは、トークン数よりもPythonやライブラリの固定費、および削減されないデコーダー(16個のトークンすべて)が大きいためです。大きなViTで生じる3倍以上のメリットは、以下の論文の数値をご確認ください。
5. 論文の数値
すべてMAEの論文(Heら、CVPR 2022)の値であり、ImageNet-1Kのみで事前学習を行っています。
| 項目 | 値 | 条件 |
|---|---|---|
| ファインチューニング top-1 | ViT-B 83.6 · ViT-L 85.9 · ViT-H 86.9 · ViT-H(448px) 87.8 | 事前学習 1,600エポック |
| 線形評価 top-1 | ViT-B 68.0 · ViT-L 75.8 · ViT-H 76.6 | 対照学習系(MoCo v3 ViT-L 77.6)よりも低い |
| 学習速度 | 計算量が3.3倍減少、実際の時間はViT-Lで2.8倍・他の設定で3.5〜4.1倍短縮 | TPU 128コア、800エポック |
| マスキング割合の感度 | 線形評価は割合に敏感(最適点付近と最大約20%pの差)、ファインチューニングは40〜80%でおおむね良好 | ViT-L |
2行目が興味深いです。MAEは 線形評価では対照学習に劣り、ファインチューニングでは優れています。 隠して当てさせることで学習した特徴量は、そのまま線形分類器で評価するにはあまり向いていませんが、少し修正して使用すれば非常に優れた出発点になるということです。第2回のDINO系と本稿のMAE系がそれぞれ異なる強みを持つ理由です。第8回のViTPoseは、MAEで事前学習したViTに小さなデコーダーだけを追加して姿勢を推定します。
6. 限界
- ピクセルを合わせることに労力を費やす。 葉っぱの質感や背景の模様など、意味とは関係のない細部まで合わせなければ損失が減りません。そのため「ピクセルではなく特徴量を合わせよう」という後続の研究が登場しました(第6回のV-JEPAはその例です)。
- 線形評価が弱い。 特徴量を凍結してそのまま利用したい用途であれば、第2回の系譜のほうが優れています(上記の表)。
- 小さな物体に対する根拠が弱い。 75%をランダムに隠すと、卓球のボールのように数ピクセルしかない物体は大抵隠されるか、丸ごと見えてしまいます。このような物体に対してMAEの事前学習がどれほど役立つのかについては、論文では扱われていません(未確認)。
7. 我々のプロジェクトとのつながり
- 映像のほうがより適している。 スマートフォンの動画は隣接フレームがほぼ同じであり、重複が非常に多くなります。MAEの仮定は画像よりも映像でよりよく当てはまります。第6回のVideoMAEが90%を隠す理由です。
- 姿勢モデルの土台。 第8回のViTPoseはMAE事前学習済みViTをそのまま使用します。TT Scoreの姿勢コーチングで使用されているRTMPoseとは異なるアプローチであるため、2つの方針を比較する根拠となります(TT Scoreモデル解剖第4回)。
- ラベルのない私たちの映像。 第2回と同様の理由で、ラベルのない練習映像を利用できる点が魅力的です。まだ試していません(未実測)。
ティティの一言。 4分の3を隠しても当てられるということは、それだけ画像に繰り返しが多いということです。私のおもちゃの絵のように点が2つしかない画像は、4分の3を隠すと点が消えてしまうので当てられません。隠す割合は、データにどれくらい繰り返しがあるかに合わせて選ぶ必要があります。
参考文献
- He et al., Masked Autoencoders Are Scalable Vision Learners(MAE), CVPR 2022. https://arxiv.org/abs/2111.06377
- Bao et al., BEiT: BERT Pre-Training of Image Transformers, ICLR 2022. https://arxiv.org/abs/2106.08254
- サンプルコードと出力:
code/03_mae_toy.py,code/03_mae_toy.out.txt