コース進捗 コース目次 34レッスン中 34件を公開中
第0部―まず地図を広げる
第1部―簡単な目的で、なぜ動画が分かるのか
第2部―一本の動画を一台のエンコーダーへ
第3部―実験を読めてこそ、論文を読んだと言える
第4部―公式リポジトリから自分の実験へ
第5部―表現を世界モデル構想へ戻す
付録―必要なときに開く技術リュック
箱の向きを最後まで追う
- 動画箱
B,T,C,H,W - 大小の窓大域1、局所 V
- 小片へ切る一辺16画素
- 5%だけ残す学習時の疎な列
- 要約を並べる
V+1,B,K
走るのに間違っている計算
空港で「旅客・時刻・色・高さ・幅」の順に積んだ荷物を、検査機の前で「旅客・色・時刻・高さ・幅」へ並べ替えます。札だけを書き換え、箱を動かさなければ、機械は色を時間として読みます。寸法がたまたま合えば、例外すら出ません。
だから 5次元テンソル とだけ覚えず、各軸の名前、値域、型を最初の標本で断言します。
記号の旅券
| 記号 | 意味 | 論文・公開設定でよく使う値 |
|---|---|---|
B | 各装置のバッチサイズ | リポジトリ既定 96。全体の実効バッチサイズは別計算 |
V | 一動画あたりの局所視点数 | 統制比較は主に 4、リポジトリ既定は 10 |
T | 入力フレーム数 | 16 |
C | 色チャンネル数 | 3 |
Hg,Wg | 大域視点の高さ・幅 | 224,224 |
Hl,Wl | 局所視点の高さ・幅 | 96,96 |
P | 空間パッチの一辺 | 16 |
τ | チューブレットの時間幅 | 1。一トークンは一時刻 |
D | ViT の隠れ幅 | ViT-B は 768、公開 ViT-L は 1024 |
K | 投影器の出力幅 | 256 |
ρ | トークン削減率 | 0.95 |
M | SIGReg の無作為方向数 | 1024 |
Q | SIGReg の積分点数 | 17 |
論文のある比較条件と、公開リポジトリの既定値は同じ実験設定ではありません。特に V=4 と V=10 は、条件を添えればどちらも正しい値です。
読み込みから多視点まで
一つのエピソードから抜いた元の動画窓は、通常次の順です。
[T,C,H_raw,W_raw]
同じ T フレームへ空間変換を施し、標本をまとめると、公開ローダーは次の二箱を返します。
| 名前 | 形 | 中身 |
|---|---|---|
global_frame | [B,T,C,224,224] | 近い全景一つ。局所用の強い光度変換はしない |
local_frames | [B,V,T,C,96,96] | 独立した空間切り抜き V 個と光度変換 |
エンコーダー直前で軸を並べ替えます。
global_video = rearrange(global_frame, "b t c h w -> b c t h w")
local_video = rearrange(local_frames, "b v t c h w -> (b v) c t h w")
大域入力は [B,C,T,224,224]、局所入力は [B·V,C,T,96,96] です。視点軸を一時的にバッチ軸へ畳むことで、全局所窓を同じエンコーダーへまとめて通し、出力後に B,V,D へ戻せます。
パッチ数の算数
τ=1 なので時間は16区画のままです。空間パッチは16×16画素。
大域パッチ数 = 16 × (224/16) × (224/16) = 16 × 14 × 14 = 3136
局所パッチ数 = 16 × ( 96/16) × ( 96/16) = 16 × 6 × 6 = 576
パッチ埋め込み後、[CLS] を加える前は次の形です。
| 枝 | 全パッチ数 | 形 |
|---|---|---|
| 大域 | 3136 | [B,3136,D] |
| 局所 | 576 | [B·V,576,D] |
τ=2 にすれば時間区画は8となり、数も一トークンが覆う時間も変わります。LeVJEPA の既定は τ=1。V-JEPA や VideoMAE の設定を無断で混ぜません。
95%落とした学習時
公式実装の保持数は次です。
keep_len = round(N_patches × (1 - ρ))
各標本で独立に無作為な保持集合を作ります。
| 枝 | 元のパッチ | 残るパッチ | [CLS] 込みの列長 |
|---|---|---|---|
| 大域 | 3136 | round(156.8)=157 | 158 |
| 局所 | 576 | round(28.8)=29 | 30 |
これは学習時だけの形です。評価・推論ではトークンを落とさないので、16×224×224を入れた公開 ViT-L は3137トークンを返します。学習時の158を配布重みの出力長と書けば、密特徴の並べ直しが壊れます。
[CLS] から損失まで
既定削減率での学習時の流れです。
global_tokens : [B, 158,D]
local_tokens : [B·V, 30,D]
global_cls : [B, 1,D]
local_cls : [B, V,D]
all_cls : [B, V+1,D]
projected_z : [B, V+1,K]
実装は embeddings[:, :1] で大域埋め込み [B,1,K] を取り、全部の [B,V+1,K] と比べます。大域と自分自身の差は常に0ですが、公式式・実装では平均に含まれます。
SIGReg の前に軸を替えます。
[B,V+1,K] -> [V+1,B,K]
同じ動画の似た視点を独立標本として数えず、各視点位置について異なる B 本の動画から分布を作るためです。
SIGReg の内側
入力を [S,B,K]、S=V+1 とします。
| 段階 | 形 | 意味 |
|---|---|---|
無作為な単位方向 A | [K,M] | M=1024 本の懐中電灯 |
射影 z @ A | [S,B,M] | 各標本が各方向へ落とす影 |
| 積分点を掛ける | [S,B,M,Q] | Q=17 個の周波数 |
| cos/sin の標本平均 | [2,S,M,Q] | 経験特性関数の実部と虚部 |
| 正規分布の指紋との差 | [S,M,Q] | 視点・方向・積分点ごとの差 |
| 最終損失 | [] | 重み付き平均のスカラー |
分散処理で all-reduce するのは [2,S,M,Q] の経験特性関数です。全 [B,K] 埋め込みを交換しないので、通信量がおおむね標本数と埋め込み幅に依存しない、という論文の説明につながります。
公開モデルを読む形
Hugging Face 版の入力は [B,C,T,H,W]。[1,3,16,224,224] を公開 ViT-L/16 に入れると、次の形です。
last_hidden_state: [1,3137,1024]
pooler_output: [1,1024]
静止画を16回複製しても、出力形式は動画トークン列です。形式が動画になっただけで、実際の運動を観測したことにはなりません。
最低限の五つの断言
assert global_frame.ndim == 5 and global_frame.shape[1:3] == (16, 3)
assert local_frames.ndim == 6 and local_frames.shape[2:4] == (16, 3)
assert global_frame.shape[-2:] == (224, 224)
assert local_frames.shape[-2:] == (96, 96)
assert torch.isfinite(loss).all()
正規化前後の dtype/min/max/mean/std も出します。uint8 の0〜255を、そのまま正規化済み浮動小数点だと思って入れる失敗も「動いてしまう」からです。
形の根拠
送り状の三行
- ローダーは
[B,T,C,H,W]、エンコーダーは[B,C,T,H,W]です。 - 95%削減は学習時だけで、公開重みの推論は3137個すべてを返します。
- SIGReg の標本軸は異なる動画であり、一動画の視点数ではありません。
荷ほどき問題
- 局所視点がエンコーダー入口で
[B·V,C,T,96,96]になるのはなぜですか。 - 大域学習列が158、公開重みの出力が3137になる違いは何ですか。
[B,V+1,K]を[B(V+1),K]とみなして SIGReg へ入れると、何を取り違えますか。
送り状と照合する
- 視点をバッチ軸へ一時的に畳み、共有エンコーダーでまとめて処理するからです。
- 学習は157パッチだけ残して
[CLS]を足し、評価は3136パッチをすべて残して[CLS]を足します。 - 同じ動画の強く相関した視点を別標本として数え、分布と見かけの標本数を変えてしまいます。