asopi tech
asopi techOSS Developer
【第5回】物理的に正しい動画へ ― ワールドモデル統合とAIが教師データを作る時代

【2026年7月版】

【第5回】物理的に正しい動画へ ― ワールドモデル統合とAIが教師データを作る時代

公開日: 2026/07/09
読了時間: 約 13分

より「リアルな動画」とは何か

食卓で、俳優がスパゲッティを食べている。カメラが手元に寄る。フォークがパスタを巻き取り、口元へ運ばれる——ところが次の瞬間、フォークも山盛りのスパゲッティも、彼の唇や頬をすり抜け、そのまま喉の奥へ吸い込まれていった。肌の質感も、立ちのぼる湯気も、照明の反射も文句なしに本物なのに、起きていることだけが決定的におかしい。

最新の動画生成には、こういう瞬間があります。見た目は実写と見分けがつかないのに、物理としては破綻している。ではあらためて——より「リアルな動画」とは、いったい何を指すのでしょうか。

問いを分けてみると、「リアルさ」には二つの層があります。絵として自然かと、世界の振る舞いとして正しいか。最新の動画生成が得意なのは前者までで、後者——物理的な整合性——には別の仕組みが要ります。

その鍵が、前回紹介した2つのモデルの組み合わせです。動画生成(テキスト→動画)は「もっともらしい映像」を作るのは得意でも、物理的な整合性までは保証しません。一方のワールドモデル(状態+行動→次状態)は世界の動きを予測できますが、それ自体はきれいな映像を出す仕組みではありません。

最終回のテーマは、この2つを組み合わせて「物理的に正しい動画」を作ること。そして最後に、これまで各回で見てきた「AIが教師データを作る」流れが行き着く先——シミュレーションによる合成データ——を見ていきます。

原因は「世界状態」が抜けていること

これらの破綻は、偶然ではありません。動画生成は P(video | text)——「テキストからそれっぽいピクセル列」を直接当てにいく仕組みで、途中に「世界がいまどうなっているか」という状態を持っていないのです。物体が次のフレームで消える(物体永続性の破綻)のも、速度が不連続に跳ぶのも、引き出しを開けた結果が一貫しないのも、根はここにあります。

これを直すには、動画生成モデルに状態・行動・幾何/物理・未来予測を組み込む必要があります。

基本アイデア ― 途中に「世界状態」を置く

単なる動画生成はこうです。

text + noisy video latent ─▶ video diffusion model ─▶ video

ワールドモデル統合型では、途中に世界状態を挟みます。

状態 S_t + 行動 A_t + テキスト + 物理/幾何表現
   ─▶ world model ─▶ 未来状態 S_{t+1}, S_{t+2}, ...
   ─▶ video decoder / diffusion renderer ─▶ 物理的に整合した動画

ポイントは、テキストから動画ピクセルを直接当てにいくのではなく、

Text ─▶ 世界状態 ─▶ 未来状態 ─▶ 動画

という順にすること。第4回の P(S_{t+1} | S_t, A_t)(状態遷移)と、P(video | S)(状態から映像)を分けて学習します。動画生成モデルを「絵を描くモデル」として使い、ワールドモデルを「現実の遷移を管理するモデル」として使う。この分業が中核です。

なお、物理的に整合した動画へ近づける道は一つではありません。データと計算をひたすら増やして拡散モデル単体に学習させる、生成の途中に物理エンジンやシミュレータを組み込む、生成結果を強化学習の報酬で矯正する、明示的な3D表現やニューラルレンダリングを介する——といったやり方もあります。本記事では、そのなかでも第4回のワールドモデルと素直につながる「状態遷移+状態条件付き生成」という代表的な構成を取り上げます。

学習の骨格 ― 2つの損失を足す

必要な教師データは、単なる動画では足りません。ロボットなら camera / depth / 関節角度 / モーター指令 / 力覚 / グリッパ状態 / 未来フレーム、自動運転なら camera / lidar / depth / GPS / IMU / steering / throttle / brake / 未来フレーム を時刻同期で持ちます(第4回参照)。

まず動画をlatentに圧縮し、そこから世界状態を作ります。

state = state_encoder(
    video_latents=latents,
    depth=batch["depth"],
    camera_pose=batch["camera_pose"],
)
# state.shape = [B, T, D]

次に、行動を条件に未来状態を予測します(ワールドモデル側の損失)。

pred_next_state   = world_model(state[:, :-1], actions=batch["action"][:, :-1])
target_next_state = state[:, 1:]

loss_state = F.mse_loss(pred_next_state, target_next_state)

そのうえで、予測した未来状態を条件に動画を復元します(動画生成側の損失)。拡散モデルなら、いつも通りノイズ予測です。

target_latents = latents[:, 1:]
noise = torch.randn_like(target_latents)
t = torch.randint(0, 1000, (target_latents.size(0),))

noisy = scheduler.add_noise(target_latents, noise, t)

pred_noise = video_diffusion(noisy, t, condition=pred_next_state)
loss_video = F.mse_loss(pred_noise, noise)

最小構成の学習ループは、この2つを足すだけです。

for batch in dataloader:
    latents = vae.encode(batch["frames"]).latent_dist.sample()
    state = state_encoder(latents, batch["depth"], batch["camera_pose"])

    pred_state = world_model(state[:, :-1], batch["action"][:, :-1])

    target_latents = latents[:, 1:]
    noise = torch.randn_like(target_latents)
    t = torch.randint(0, 1000, (target_latents.size(0),), device=latents.device)
    noisy = scheduler.add_noise(target_latents, noise, t)
    pred_noise = video_diffusion(noisy, t, condition=pred_state)

    loss = F.mse_loss(pred_noise, noise) + 0.5 * F.mse_loss(pred_state, state[:, 1:])

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

「テキストから動画」を一発で当てにいくのではなく、状態遷移を挟むことで、動画が「絵として自然」なだけでなく「状態遷移として自然」になります。

物理制約を損失に入れる

もう一歩、「現実と矛盾しない」方向へ寄せるには、物理的な制約そのものを損失に加えます。たとえば——

速度・加速度の連続性(急に跳ばない):

def velocity_loss(pos):
    v = pos[:, 1:] - pos[:, :-1]
    a = v[:, 1:] - v[:, :-1]
    return (a ** 2).mean()

物体が急に消えない(物体永続性):

def object_permanence_loss(mask_t, mask_next):
    return torch.abs(mask_t - mask_next).mean()

地面を突き抜けない(接触制約):

def ground_penetration_loss(object_z, ground_z=0.0):
    return torch.relu(ground_z - object_z).mean()

これらを重み付きで足し合わせます。

loss = (
    loss_diffusion
    + 0.5 * loss_state
    + 0.1 * velocity_loss(object_positions)
    + 0.1 * ground_penetration_loss(object_z)
    + 0.1 * object_permanence_loss(mask_t, mask_next)
)

これで、単に「見た目が自然」なだけでなく、「物体が消えない・速度が跳ばない・重力と矛盾しない・操作結果が一貫する・視点が破綻しない」方向へ映像を寄せられます。仕上げの構造はこうです。

Text ─▶ Scene / State Plan ─▶ World Model ─▶ Future State Rollout
     ─▶ Video Diffusion Renderer ─▶ Physically Consistent Video

ここで効いてくるのが「AIが作った教師データ」

上のパイプラインは、大量の depth / camera pose / 物体位置 / 行動 / mask を要求します。これを人間が動画に一つずつ付与するのは非現実的です。だから現在の研究では、複数のAIモデルを組み合わせて前処理します。

動画(元データはこれだけ)
  ├─ Depth Anything     ─▶ 深度
  ├─ Grounding DINO     ─▶ 物体検出
  ├─ SAM2               ─▶ セグメンテーション / 追跡
  ├─ COLMAP / DUSt3R    ─▶ カメラ姿勢・3D
  └─ VLM                ─▶ 行動ラベル(Open Drawer, Pick Cup ...)

つまり元データは「動画」しかなくても、AIで Depth / Pose / Object / Mask / Tracking / Camera / 行動 を全部作れる。第1回から繰り返してきた「AIが教師データを作る」流れが、ワールドモデルでは前処理パイプラインの中核そのものになっています。速度・加速度・接触・重力方向といった物理量まで、動画からAIが推定する研究も進んでいます。

究極形 ― シミュレーションが完全な教師データを生み出す

そして、いま最大の変化が起きているのがここです。教師データをシミュレーションで丸ごと生成するアプローチです。

NVIDIA Omniverse、Isaac Sim、MuJoCo、Unity、Unrealのような環境でシーンを動かすと、そこでは Object Pose / Camera Pose / Depth / Normal / Segmentation / Velocity / Force / Actionすべて既知です。現実の動画にAIで注釈を付ける必要すらなく、完全な教師データをそのまま保存できます。

これまで:  現実 ─▶ AI(注釈付け)─▶ 教師データ
これから:  シミュレーション ─▶ 完全な教師データ

物理AI(Physical AI)向けの世界基盤モデルが、こうしたシミュレーション由来の合成データを前提に設計されつつあるのは、この流れの延長です。現実データの希少性や注釈コストを、シミュレーションが一気に飛び越えていきます。

この先にあるもの ― フィジカルAIへ

結局のところ、LLMも画像も音声も動画も、違いは「教師データをどう表現するか」だけです。ただし、その表現ごとに必要な工夫はまるで違いました。そして、この工夫の延長線上にフィジカルAIがあります。

ワールドモデルが「行動すると世界がどう変わるか」を予測できるということは、裏を返せば、AIが現実世界で行動するための足場を手に入れつつある、ということです。シミュレーションで完全な教師データを作り、そこで「どう動くか」を学び、実機のロボットへ移す——生成AIの教材づくりは、ロボットが身体を持って世界に働きかけるフィジカルAIの土台そのものになります。

その具体像——ロボットに「見る・言葉で理解する・物理的に動く」をどう統合するのか、VLA・拡散・ワールドモデルをどう積み重ねるのか——は、フィジカルAIというテーマそのものです。別シリーズで詳しく掘り下げているので、ここを入口にしてみてください。