記事紹介:  Video generation models as world simulators ～Sora に触ってみた～

<!-- 論文紹介: Video generation models as world simulators -->

## はじめに

こんにちは、ひよこです。新年度開始でバタバタしていましたが、ゴールデンウィーク前になにか一つくらいと思ってこの記事を書いています。今回は今更感もありますが、OpenAI が昨年公開した動画生成モデル Sora に関する技術報告「Video generation models as world simulators」を紹介します。

> 🐣 ジブリ風アニメといい最近の OpenAI は画像・動画方面の力の入れ方がすごいですよね

参考文献:  
T. Brooks, B. Peebles, C. Holmes, W. DePue, Y. Guo. ["Video generation models as world simulators."](https://openai.com/index/video-generation-models-as-world-simulators/) OpenAI (2024).

---

## 0 時間がない人向けの概要

この技術報告書では、OpenAI のビデオ生成モデル「Sora」が紹介されています。Sora は、テキストから最大 1 分間の高品質なビデオを生成できるモデルであり、物理世界の一般的なシミュレータとしての可能性を示しています。

- **多様な入力に対応**：テキスト、画像、ビデオから新しいビデオを生成
- **高解像度の出力**：最大 1080p の解像度でビデオを生成
- **柔軟な出力形式**：横長、縦長、正方形など、さまざまなアスペクト比に対応
- **ChatGPT との統合**：ChatGPT Plus および Pro のサブスクリプションで利用可能

---

## 1 技術報告書の概要

この技術報告書は、Sora のアーキテクチャとその能力について詳述しています。Sora は、テキスト条件付きの拡散モデルを使用して、さまざまな長さ、解像度、アスペクト比のビデオと画像を生成します。モデルは、ビデオと画像の潜在コードの時空間パッチ上で動作する Transformer アーキテクチャを活用しています。

以下に本論文を読む際の予備知識として必要な用語について示します。

| 用語 | 説明 |
|------|------|
| 拡散モデル | データを徐々にノイズから復元する生成モデルの一種 |
| Transformer | 自己注意機構を用いた深層学習モデルのアーキテクチャ |
| 潜在コード | データの圧縮表現で、モデルが内部的に使用する表現形式 |
| 時空間パッチ | 時間と空間の両方の情報を含むデータの小さな部分 |
| LLM（大規模言語モデル） | 大量のテキストデータで訓練された言語モデル |

---

## 2 関連研究

これまでのビデオ生成に関する研究では、リカレントネットワーク、GAN、自己回帰型 Transformer、拡散モデルなどさまざまな手法が試されてきました。しかし、これらの多くは特定のカテゴリの視覚データや短いビデオ、固定サイズのビデオに焦点を当てていました。Sora は、より一般的な視覚データのモデルとして、これらの制限を超えるための新しいアプローチを提供しています。

---

## 3 数式を使わない提案手法の紹介

Sora は、ビデオと画像を統一された表現に変換し、大規模な生成モデルの訓練を可能にする方法を採用しています。具体的には、ビデオを圧縮し、時空間パッチに分解することで、Transformer が処理できる形式に変換します。

```mermaid
graph TD
A[入力ビデオ] --> B[ビデオ圧縮ネットワーク]
B --> C[潜在表現]
C --> D[時空間パッチへの分解]
D --> E[Transformer による処理]
E --> F[生成されたビデオ]
```

---

## 4 提案手法の詳細

### Sora の主な技術的特徴

- **ビデオ圧縮ネットワーク**：生のビデオを入力として受け取り、時間的および空間的に圧縮された潜在表現を出力
- **時空間パッチ**：圧縮されたビデオから時空間パッチを抽出し、これを Transformer のトークンとして使用
- **Transformer アーキテクチャ**：これらのパッチを処理し、新しいビデオを生成
- **デコーダーモデル**：生成された潜在表現をピクセル空間にマッピングし、最終的なビデオを出力

このアプローチにより、Sora は多様な解像度、長さ、アスペクト比のビデオと画像を生成する能力を持ちます。

### Sora の数学的解説
まず以下に全体の流れ図を乗せておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/a09417c9-6d2e-4058-a8e9-face3f99320a.png)

#### ビデオ圧縮ネットワークの技術的内容と潜在表現  
Sora では、まず生動画を自己符号化器型の「ビデオ圧縮ネットワーク」で 1/8 空間・1/2 時間へ圧縮し、
$$(t × h × w × c)$$ の潜在テンソルを得ます。
チャンネル軸 $$c$$ を全結合層で埋め込み、$$d≈2048$$ の 2 次元ベクトル列に変換して Transformer のトークンとします。生成後は、この潜在をデコーダでアップサンプリングし、元解像度動画へ戻します。

> 🐣 Transformer は本当にどこにでも登場しますね

### 時空間パッチとは  
時空間パッチは「2 フレーム × 16 × 16 画素」のように時間 $t$ と空間 $(x、y)$ を束ねた 3D ブロックで、$t=1$ の場合は静止画パッチになるため画像と動画を同一表現で扱うことになります。
パッチ数を変えるだけで長さ・解像度・アスペクト比を自在に制御できる点が Sora のスケーラビリティの鍵となっているようです。

### 時空間パッチの数学的定義と符号化手順
入力動画を $$V\in\mathbb{R}^{T\times H\times W\times 3}$$ として、ビデオ圧縮ネットワークで  
```math
Z = f_{\text{enc}}(V)\in\mathbb{R}^{T'\times H'\times W'\times C},\qquad
(T',H',W')=\left(\tfrac{T}{s_t},\tfrac{H}{s_s},\tfrac{W}{s_s}\right)
```
と時間・空間ストライド $(s_t,s_s)$ でダウンサンプリングされた潜在テンソルを計算します。

ここで 1 パッチを **時幅 $\tau$** と **空間幅 $P$** の三次元ブロック  
```math
\mathcal{P}_{t,h,w}=Z_{\,t:t+\tau-1,\;h:h+P-1,\;w:w+P-1,\,:}\in\mathbb{R}^{\tau\times P\times P\times C}
```
と定義します。各パッチは最終的にベクトル化されて
```math
x_{t,h,w}=\mathrm{vec}(\mathcal{P}_{t,h,w})\in\mathbb{R}^{\tau P^{2}C}
```
と表現されます。ただし実際にはベクトル化次元が大きすぎるため、線形写像  
```math
E=W_{p}\,x_{t,h,w}+b_{p},\qquad W_{p}\in\mathbb{R}^{d\times \tau P^{2}C}
```
で $d$ 次元（例：$d=2048$）に射影することで最終的な **トークン埋め込み** $E\in\mathbb{R}^{d}$ を得ます。

全パッチ数  
```math
L=\frac{T'}{\tau}\times\frac{H'}{P}\times\frac{W'}{P}
```
のトークン列 $\{E_i\}_{i=1}^{L}$ に対し、時間位置 $p_t(t)$ と空間位置 $p_s(h,w)$ の **分離型位置エンコーディング** を加算して  
```math
z_i = E_i + p_t(t_i)+p_s(h_i,w_i)
```
とし、ようやく Transformer への入力となります。
Sora の Self-Attention は 時空間トークン全体に対して Multi-Head Attention を張りつつ，計算量削減のために層ごとに「空間→時間」へと射程を拡げる階層的パターン を利用しています。プロンプトに関するテキスト条件は別途エンコードされて各フレームにクロスアテンションによって融合されます。このテキストエンコーダは OpenAI が DALL·E 3 用に強化した 独自のテキストエンコーダのようですね。
Sora のモデル全体は DiT 系の“拡散デコーダ” UNet のダウンサンプリング・アップサンプリングを Transformer ブロックで置換した構造になっています。

> 🐣 数式で続きを書くと頭が痛くなってしまうので今回はここまでです

---

## 5 数値実験と結果

Sora の性能評価は主に定性的なものであり、以下の点が強調されています。

- **高品質なビデオ生成**：最大 1 分間の高解像度ビデオを生成可能
- **多様な入力に対応**：テキスト、画像、ビデオからの生成が可能
- **柔軟な出力形式**：さまざまなアスペクト比と解像度に対応

### 補足: Sora の応用例

Sora は、映画制作、教育、マーケティングなど、さまざまな分野での応用が期待されています。例えば、映画のプリビジュアライゼーションや教育用ビデオの迅速な作成などに利用できます。

---

## 6 まとめ

Sora は、ビデオ生成モデルのスケーリングが物理世界の一般的なシミュレータを構築する有望な道であることを示しています。今後の課題としては、モデルの詳細な実装や定量的な評価、さらなる応用分野の開拓などが挙げられます。

## 補足: 最新の動向
最新の Sora ではいろいろなパワーアップがなされていますので、それをまとめておきます。

### Transformer スケーリングによる品質向上  
Sora は Transformer ベースの拡散モデルとして、学習に投入する計算リソースを増やすほどサンプル品質が大幅に向上することが確認されました。

### 可変長・解像度・アスペクト比のネイティブ対応  
- **サンプリングの柔軟性**  
  1920×1080（ワイド）、1080×1920（縦長）、さらには任意の中間比率まで、同一モデルで直接生成可能になりました。  
- **構図の改善**  
  従来の「正方形クロップ学習」と比較して、元のアスペクト比で学習するとフレーミングが向上し、主被写体が画面内に適切に配置されやすいことが示されています。  

### 言語理解の強化  
DALL·E 3 流の「再キャプショニング」技術を動画データセットに適用し、高精度な自動字幕を生成して学習に用いることで、テキスト指示への厳密な忠実度と全体的な映像品質が向上しました。さらに、短いユーザプロンプトを GPT で詳細化する手法を併用しています。  

### マルチモーダル入力プロンプトの拡張  
- **DALL·E 画像のアニメーション化**  
  静止画とテキストを入力するだけで、なめらかな動画を自動生成可能
- **動画の前後延長**  
  既存の動画クリップから、前後方向にシームレスにつながる長尺映像を生成可能  
- **ビデオtoビデオ編集**  
  SDEdit を応用し、入力動画のスタイルや環境をテキスト指示でゼロショットに変換可能  
- **動画間のシームレス接続**  
  異なるシーン同士を滑らかに補完・補間し、一つの連続映像としてつなぐ能力が追加 

### 画像生成機能の追加  
動画モデルを一フレーム相当として扱うことで、最大2048×2048解像度の静止画生成も同一モデルで実現可能です。  

### 世界シミュレータとしての新興機能  
- **3D一貫性**  
  カメラ移動や回転に伴い、人物やオブジェクトが三次元空間上で整合的に動作  
- **長期コヒーレンスと物体永久性**  
  長尺映像でも被写体の外観や位置関係を維持し続ける能力が向上
- **簡易的な世界との相互作用**  
  描画キャンバスに筆跡を残したり、バーガーを食べてかじり跡を生成するといった、状態変化を伴うシミュレーションを確認
- **デジタルワールドのシミュレーション**  
  Minecraft のプレイ映像を、基本的な操作ポリシーのもとで高忠実度にレンダリングするなど、仮想環境の動的シミュレータとして動作

### Sora のファインチューニング事情  
では実際に Sora を自分で使いたいときにファインチューニングをすることは可能なのでしょうか？

> 🐣 めちゃくちゃ GPU が必要そうではありますが

- **現状**　一般公開 API での微調整は未対応で、企業向けカスタムモデルのみが存在
- **カスタムモデルプログラム**　OpenAI は動画も対象に RL Fine‑Tuning 等を提供予定と発表
- **オープンソース派生**　*Open‑Sora 1.1* では LoRA を用いた 1000 GPUh 規模のスタイル適応実験が公開
- **実務的注意**　潜在長に比例して VRAM を消費するため、LoRA による学習コストの削減を用いても 8 GB GPU では 4 秒・480p 程度が限界で、数千本以上の字幕付き動画データが必要

> 🐣 当然ですがまだまだファインチューニングは難しそうですね

## おまけ: 試してみた
ほとんど使い方がわからない状態ですが、とりあえず試してみました。

### 画像を作る
私の [X 🐣ひよこ🐣](https://x.com/FYle0gzbnG16407) のアカウント画像をジブリ風にしてみました。1 枚目が立っているひよこなのでもう一枚飛んでいるひよこ画像を生成して、その間をつなぐような動画生成を目指しました。

### Sora Storyboard
2 枚の画像をどうつなげたらいいか調べてみると Blend と Storyboard という方法がありました。今回は Storyboard を使って 1 枚の画像を配置して動画を生成してみました。

- 1 枚目の画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/c7f1cf95-2ca3-459e-82ce-39eb1ddadee1.png" width=50%>

- 2 枚目の画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/7da1ac08-10c3-40ea-baf7-88aaf621b22f.png" width=50%>

- 動画
![hiyokodouga.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/fdc4e14c-b549-45eb-9f34-7e97370d9de9.gif)

うーん、うまくつながってくれていませんね。もう少し画像を増やして各シーンの設定をしっかり書かないとだめなようです。とはいえ誰でも使えるツールとして考えると驚きのクオリティといえるのではないでしょうか？

---

## おわりに

Sora の登場により、ビデオ生成の可能性が大きく広がりました。特に、テキストから高品質なビデオを生成できる点は、コンテンツ制作の効率化に大きく貢献するでしょう。一方で、モデルの詳細な実装や定量的な評価が公開されていない点は、今後の研究に期待が寄せられます。私自身、もう少し Sora の使い方を勉強したくなりました。まずは Storyboard の攻略をしてみたいです！ それではまた次の記事でお会いしましょう。