Masato Izumi Portfolio

Qwen3-VL-Embedding 技術詳細

  • Transformer
  • 機械学習
  • Embedding
  • マルチモーダル

本記事では、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-InstructQwen3-VL-8B-Instruct
Transformer層28層36層
Hidden次元 $d$20484096
Attention Head1632
Head次元 $d_h$128128
コンテキスト長32K tokens32K tokens
MRL対応次元64, 128, 256, 512, 1024, 204864〜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.731.745.2
DeepStack60.138.452.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標準検索
4096100%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)

まとめ

技術 解決する問題 解決方法
DeepStackViT最終層のみでは細部が失われる複数層の特徴をDecoder各層に融合
Interleaved-MRoPE1D RoPEでは空間/時間を表現できない3軸を交互配置で均等に周波数配分
MRL Loss固定次元では用途に応じた調整不可複数次元で同時に損失計算
Multi-stage Training汎化と特化のトレードオフ3段階学習 + SLERPマージ
EOS Pooling可変長入力から固定長出力が必要Causal Attentionで末尾に情報集約

参考文献

記事一覧に戻る