本記事では、Qwen3-VL-Embeddingの特徴的技術を数式レベルで解説します。ViTの基礎知識を前提としています。
技術サマリー
| 技術 | 概要 | 効果 |
|---|---|---|
| DeepStack | ViTの複数層からDecoder各層へ特徴を融合 | OCR・細部認識が大幅改善(DocVQA +6.7pt) |
| Interleaved-MRoPE | 3軸(時間・高さ・幅)の位置を交互配置でエンコード | 1Mトークン検索精度 >99.5% |
| MRL | 複数次元で同時に損失計算し、任意次元で切り取り可能に | 64次元でも85%の性能を維持 |
| Multi-stage Training | 弱教師 → 強教師 → SLERPマージの3段階学習 | 汎化と特化のバランス調整 |
| EOS Pooling | Causal Attentionで末尾トークンに情報集約 | 可変長入力から固定長Embeddingを生成 |
モデル概要
| 項目 | 2B | 8B |
|---|---|---|
| ベースモデル | Qwen3-VL-2B-Instruct | Qwen3-VL-8B-Instruct |
| Transformer層 | 28層 | 36層 |
| Hidden次元 $d$ | 2048 | 4096 |
| Attention Head | 16 | 32 |
| Head次元 $d_h$ | 128 | 128 |
| コンテキスト長 | 32K tokens | 32K tokens |
| MRL対応次元 | 64, 128, 256, 512, 1024, 2048 | 64〜4096 |
全体アーキテクチャ
入力 → 入力処理 → Interleaved-MRoPE → Transformer (DeepStack) → EOS抽出 → L2 Norm → Embedding
詳細:
テキスト → Embedding Layer → (seq, seq, seq)
画像 → ViT + DeepStack → (0, row, col)
動画 → フレーム → ViT + DeepStack → (frame, row, col)
↓
Transformer + DeepStack Fusion
↓
EOS hidden state → L2 Norm → Embedding Vector
DeepStack
解決する問題
従来のVLMは、ViTの最終層出力のみをDecoder(言語モデル部分)に渡します。
【従来のViT統合】
ViT Layer 1 → (低レベル特徴: エッジ、テクスチャ)
↓
ViT Layer 12 → (中レベル特徴: パーツ、パターン)
↓
ViT Layer 24 → (高レベル特徴: 物体、意味) ─→ Decoderへ
↑ここだけ使用
問題:
- 低レベル特徴(文字の輪郭、線の太さ)が最終層で失われる
- OCR、細かい空間関係の理解が困難
DeepStackの解決策
ViTの複数層から特徴を抽出し、LMM Decoderの異なる層に融合します。
【DeepStack】
ViT Encoder LMM Decoder
├─ 浅い層 ────────────────────→ Decoder 初期層へ融合
├─ 中間層 ────────────────────→ Decoder 中間層へ融合
└─ 深い層 ────────────────────→ Decoder 後期層へ融合
数式表現
ViTの各層出力を $V^{(l)}$ とします($l = 1, ..., L_{\text{vit}}$)。
従来手法:
$$ H^{(0)}_{\text{visual}} = \text{Proj}(V^{(L_{\text{vit}})}) $$最終層のみをDecoderの入力層に渡します。
DeepStack:
$$ H^{(k)}_{\text{Dec}} = H^{(k)}_{\text{Dec}} + \text{Proj}_k(V^{(\phi(k))}) $$ここで:
- $\phi(k)$: Decoder層 $k$ に対応するViT層のインデックス
- $\text{Proj}_k$: 層ごとの線形投影
具体的なマッピング(推定)
| ViT層 | 捉える特徴 | 融合先Decoder層 |
|---|---|---|
| 1〜8 | エッジ、テクスチャ、色 | 1〜10 |
| 9〜16 | パーツ、局所パターン | 11〜20 |
| 17〜24 | 物体、シーン、意味 | 21〜28 (or 36) |
効果(アブレーション)
| 構成 | TextVQA | DocVQA | ChartQA |
|---|---|---|---|
| 最終層のみ | 56.7 | 31.7 | 45.2 |
| DeepStack | 60.1 | 38.4 | 52.1 |
特にOCR依存タスク(DocVQA: +6.7pt)で顕著な改善が見られます。
Interleaved-MRoPE
解決する問題
標準RoPEは1次元の位置情報のみをエンコードします。
【標準RoPE】
位置 p ∈ ℤ → 回転角 θ = p × base_freq
問題:
- 画像の2D空間構造を表現できない
- 動画の時間+空間の3D構造を表現できない
MRoPEの基本概念
Multi-dimensional RoPE(MRoPE)は、位置情報を3軸で表現します。
$$ \text{pos} = (t, h, w) $$- $t$: 時間軸(テキストではシーケンス位置、動画ではフレーム番号)
- $h$: 高さ軸(行位置)
- $w$: 幅軸(列位置)
モダリティ別の位置ID変換
| モダリティ | 元の次元 | 3軸への変換 | 例 |
|---|---|---|---|
| テキスト | 1D position $p$ | $(p, p, p)$ | 位置3 → $(3, 3, 3)$ |
| 画像 | 2D $(row, col)$ | $(0, row, col)$ | $(1, 2)$ → $(0, 1, 2)$ |
| 動画 | 3D $(frame, row, col)$ | $(frame, row, col)$ | フレーム5の$(1,2)$ → $(5, 1, 2)$ |
Interleaved配置 vs Block配置
Block配置(従来、不採用):
次元インデックス i を連続的に分割:
i ∈ [0, d_h/6) → t軸用
i ∈ [d_h/6, d_h/3) → h軸用
i ∈ [d_h/3, d_h/2) → w軸用
問題: 高周波成分がt軸に集中
- 回転角 θ_i = pos × base^(-2i/d_h) は i が小さいほど高周波
- t軸: 高周波のみ(近距離に敏感、遠距離に鈍感)
- w軸: 低周波のみ(近距離に鈍感、遠距離に敏感)
Interleaved配置(採用):
次元インデックス i を交互に割り当て:
i % 3 == 0 → t軸用
i % 3 == 1 → h軸用
i % 3 == 2 → w軸用
効果: 各軸に高周波〜低周波が均等配分
→ 全軸で近距離・遠距離の両方を表現可能
数式表現
Head次元 $d_h = 128$、回転ペア数 $d_h/2 = 64$。 位置 $(t, h, w)$ に対する各ペア $i$ での回転角:
$$ \theta_i = \begin{cases} t \cdot \text{base}^{-2\lfloor i/3 \rfloor \cdot 3 / d_h} & \text{if } i \mod 3 = 0 \text{ (t軸)} \\ h \cdot \text{base}^{-2\lfloor i/3 \rfloor \cdot 3 / d_h} & \text{if } i \mod 3 = 1 \text{ (h軸)} \\ w \cdot \text{base}^{-2\lfloor i/3 \rfloor \cdot 3 / d_h} & \text{if } i \mod 3 = 2 \text{ (w軸)} \end{cases} $$ここで $\text{base} = 10000$(標準RoPEと同じ)。
効果
| 指標 | Block配置 | Interleaved配置 |
|---|---|---|
| 1Mトークン検索精度 | <50% | >99.5% |
| 動画ベンチマーク | ベースライン | +1〜2pt |
MRL(Matryoshka Representation Learning)
解決する問題
【従来】
出力次元: 4096次元(固定)
問題:
- 軽量用途(リアルタイム検索)には過剰
- 次元削減すると性能が大幅劣化
- 用途ごとに別モデルが必要
MRLの解決策
1つのモデルで任意次元のEmbeddingを生成可能にします。
フル次元: [d₀, d₁, d₂, ..., d₂₀₄₇]
先頭N次元を切り取り:
64次元: [d₀, ..., d₆₃]
256次元: [d₀, ..., d₂₅₅]
1024次元: [d₀, ..., d₁₀₂₃]
2048次元: [d₀, ..., d₂₀₄₇]
→ 切り取っても意味のあるEmbeddingになる
数式表現
学習時、複数の次元で同時に損失計算します。
MRL損失関数:
$$ \mathcal{L}_{\text{MRL}} = \sum_{m \in \mathcal{M}} c_m \cdot \mathcal{L}_{\text{InfoNCE}}(z_{1:m}) $$ここで:
- $\mathcal{M} = \{64, 128, 256, 512, 1024, 2048\}$: 学習する次元セット
- $c_m$: 次元 $m$ の重み
- $z_{1:m}$: Embeddingベクトルの先頭 $m$ 次元
InfoNCE損失(各次元で計算):
$$ \mathcal{L}_{\text{InfoNCE}}(z_{1:m}) = -\log \frac{\exp(\text{sim}(q_{1:m}, d^+_{1:m}) / \tau)}{\sum_{j} \exp(\text{sim}(q_{1:m}, d^j_{1:m}) / \tau)} $$なぜこれで機能するか
- 低次元で損失を計算するため、最も重要な情報が先頭に集約される
- 高次元では追加の詳細情報が格納される
- 結果として、次元数に応じた階層的な情報構造が形成
推論時の使用
# フル次元(最高精度)
embedding_full = model.encode(text) # [2048]
# 低次元(高速、省メモリ)
embedding_64 = embedding_full[:64] # 先頭64次元を切り取り
# 必ず再正規化
embedding_64 = embedding_64 / np.linalg.norm(embedding_64)
注意: 切り取り後は再度L2正規化が必要です。
次元別の性能(MMEB-V2, 8Bモデル)
| 次元 | 相対性能 | ストレージ | ユースケース |
|---|---|---|---|
| 64 | ~85% | 0.25KB | 超高速粗検索 |
| 256 | ~92% | 1KB | モバイル向け |
| 1024 | ~97% | 4KB | 標準検索 |
| 4096 | 100% | 16KB | 最高精度 |
Multi-stage Training
3段階学習パイプライン
Stage 1: Weakly Supervised Pretraining
↓
Stage 2: Supervised Fine-Tuning
↓
Stage 3: Model Merging (SLERP)
Stage 1: Weakly Supervised Pretraining
目的: 大規模な弱教師データで基礎能力を獲得。
- LLMで生成した合成ペアデータ(数百万〜数十億ペア)
- 多言語(100+言語)
- マルチタスク(検索、分類、クラスタリング、意味的類似性)
Stage 2: Supervised Fine-Tuning
目的: 高品質データで識別能力を向上。
- 人手でラベル付けされた高品質ペア
- Hard Negativesを含む(類似しているが正解でないサンプル)
- 少量(Stage 1より大幅に少ない)
Stage 3: Model Merging (SLERP)
目的: 汎化性能と特化性能のバランス調整。
Spherical Linear Interpolation (SLERP) で2つのモデルを補間します。
$$ \theta_{\text{merged}} = \frac{\sin((1-\alpha)\Omega)}{\sin(\Omega)} \theta_1 + \frac{\sin(\alpha \Omega)}{\sin(\Omega)} \theta_2 $$ここで $\Omega = \arccos(\theta_1 \cdot \theta_2 / (||\theta_1|| \cdot ||\theta_2||))$。
model_general: Stage 1後のモデル(広範なタスクに対応)
model_specialized: Stage 2後のモデル(特定タスクに最適化)
α = 0.3 の場合:
merged = slerp(0.3, model_general, model_specialized)
→ 汎化70% + 特化30%のバランス
なぜこの順序か
Stage 1 のみ: 広範だが浅い理解
→ 「なんとなく似てる」は分かるが、細かい違いを識別できない
Stage 2 のみ: 深いが狭い理解(過学習リスク)
→ 学習データに特化しすぎ、未見データに弱い
Stage 1 → 2: 広範かつ深い理解
→ 基礎を持った上で識別能力を追加
Stage 3: 最終調整
→ 汎化と特化のバランスを用途に応じて調整
EOS Pooling
解決する問題
入力長に依存しない固定長表現が必要です。
【Mean Pooling】
全トークンの平均: (h₁ + h₂ + ... + hₙ) / n
問題:
- パディングトークンの処理が必要
- 重要でないトークンも等重みで含まれる
EOSトークンによる代表ベクトル
Causal Attention(GPT系)では、各トークンはそれ以前のトークンのみを参照できます。
入力: [T₁, T₂, ..., Tₙ, <EOS>]
Attention Pattern:
T₁ → [T₁]
T₂ → [T₁, T₂]
...
Tₙ → [T₁, T₂, ..., Tₙ]
EOS → [T₁, T₂, ..., Tₙ, EOS] ← 全トークンを参照可能
EOSの hidden state は、自然にシーケンス全体の情報を集約しています。
数式表現
最終層の hidden states $H \in \mathbb{R}^{n \times d}$ から EOS 位置を抽出:
$$ h_{\text{eos}} = H[\text{seq\_len} - 1, :] $$L2正規化:
$$ e = \frac{h_{\text{eos}}}{||h_{\text{eos}}||_2} $$動画処理
トークン数の計算
1フレーム: 解像度 (H, W) → パッチ数 = (H/14) × (W/14)
例: 224×224画像 → 16 × 16 = 256 パッチ
例: 448×448画像 → 32 × 32 = 1,024 パッチ
動画のトークン爆発
10フレーム × 1,024パッチ = 10,240 トークン
32フレーム × 1,024パッチ = 32,768 トークン → コンテキスト長超過
対策:
1. フレームサンプリング: fps=1.0(1秒1フレーム)
2. 最大フレーム制限: max_frames=64
3. 解像度の動的調整: 長い動画は低解像度で処理
時間位置のエンコード
Interleaved-MRoPEの $t$ 軸がフレーム番号を表現:
フレーム0: 全パッチの位置 = (0, row, col)
フレーム1: 全パッチの位置 = (1, row, col)
...
フレームN: 全パッチの位置 = (N, row, col)
まとめ
| 技術 | 解決する問題 | 解決方法 |
|---|---|---|
| DeepStack | ViT最終層のみでは細部が失われる | 複数層の特徴をDecoder各層に融合 |
| Interleaved-MRoPE | 1D RoPEでは空間/時間を表現できない | 3軸を交互配置で均等に周波数配分 |
| MRL Loss | 固定次元では用途に応じた調整不可 | 複数次元で同時に損失計算 |
| Multi-stage Training | 汎化と特化のトレードオフ | 3段階学習 + SLERPマージ |
| EOS Pooling | 可変長入力から固定長出力が必要 | Causal Attentionで末尾に情報集約 |
参考文献
- Alibaba Qwen Team. (2025). Qwen3-VL-Embedding Technical Report. arXiv:2601.04720.
- Wang, P., et al. (2024). Qwen2-VL: Enhancing Vision-Language Model's Perception of the World at Any Resolution. arXiv:2409.12191.
- Kusupati, A., et al. (2022). Matryoshka Representation Learning. NeurIPS 2022.
- Su, J., et al. (2021). RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864.