1. 研究背景与问题定义

1.1 多模态模型的现状

当前大型视觉-语言模型(VLM)面临一个根本性的问题:理解与生成被视为两个截然不同的任务1

这种割裂导致:

  • 碎片化架构:理解模型和生成模型各自独立
  • 级联管道:多阶段处理,信息逐级传递
  • 不对齐的表示空间:跨模态推理受限

1.2 核心挑战

挑战描述影响
架构碎片化理解与生成使用不同架构难以端到端优化
表示不对齐视觉与语言表示分离跨模态推理困难
级联效率低多阶段处理增加延迟实时应用受限

1.3 研究目标

SenseNova-U1论文《SenseNova-U1: Unifying Multimodal Understanding and Generation with NEO-unify Architecture》提出了一个统一的解决方案1

2. NEO-unify架构

2.1 核心思想

NEO-unify = Native End-to-end Omnimodal Unify

核心洞察:将多模态理解与生成统一在单一架构中,共享表示空间和生成机制。

┌─────────────────────────────────────────────────────────────────────────┐
│                        NEO-unify 核心架构                                │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                          │
│  输入:                                                                  │
│    - 文本 T                                                             │
│    - 图像 I                                                             │
│    - 视频 V                                                             │
│                                                                          │
│    │                                                                     │
│    ▼                                                                     │
│  ┌─────────────────────────────────────────────────────────────────┐    │
│  │                    统一编码器 (Unified Encoder)                    │    │
│  │                                                                 │    │
│  │   T ──► Tokenizer ──► Token Embedding ──┐                      │    │
│  │                                         │                      │    │
│  │   I ──► Tokenizer ──► Token Embedding ─┼► Unified Space      │    │
│  │                                         │                      │    │
│  │   V ──► Tokenizer ──► Token Embedding ──┘                      │    │
│  │                                                                 │    │
│  └─────────────────────────────────────────────────────────────────┘    │
│    │                                                                     │
│    ▼                                                                     │
│  ┌─────────────────────────────────────────────────────────────────┐    │
│  │                    NEO Transformer                                 │    │
│  │                                                                 │    │
│  │   理解任务: Image Captioning, VQA, Classification               │    │
│  │                                                                 │    │
│  │   生成任务: Text Generation, Image Synthesis, Video Creation    │    │
│  │                                                                 │    │
│  └─────────────────────────────────────────────────────────────────┘    │
│    │                                                                     │
│    ▼                                                                     │
│  输出:                                                                  │
│    - 理解输出 (文本描述、答案)                                         │
│    - 生成输出 (文本、图像、视频)                                       │
│                                                                          │
└─────────────────────────────────────────────────────────────────────────┘

2.2 统一表示空间

NEO-unify的关键是构建统一的表示空间

所有模态的表示被投影到同一个语义空间:

2.3 表示对齐机制

对比对齐损失

其中 是温度参数。

3. 技术细节

3.1 统一Tokenizer

class UnifiedTokenizer:
    """
    统一Tokenizer
    将所有模态转换为token序列
    """
    def __init__(self, config):
        self.text_tokenizer = BertTokenizer.from_pretrained('bert-base')
        self.image_tokenizer = ImageTokenizer(
            codebook_size=config.codebook_size,
            latent_dim=config.latent_dim
        )
        self.video_tokenizer = VideoTokenizer(
            num_frames=config.num_frames
        )
        
    def tokenize(self, inputs):
        """
        统一token化
        """
        tokens = {}
        
        if 'text' in inputs:
            tokens['text'] = self.text_tokenizer(
                inputs['text'], 
                padding=True, 
                return_tensors='pt'
            )
        
        if 'image' in inputs:
            # 图像 → 离散token序列
            tokens['image'] = self.image_tokenizer(inputs['image'])
        
        if 'video' in inputs:
            # 视频 → 离散token序列
            tokens['video'] = self.video_tokenizer(inputs['video'])
        
        return tokens

3.2 NEO Transformer

class NEOT ransformer(nn.Module):
    """
    NEO Transformer
    统一多模态理解和生成的骨干网络
    """
    def __init__(self, config):
        super().__init__()
        self.d_model = config.d_model
        self.num_heads = config.num_heads
        self.num_layers = config.num_layers
        
        # 统一嵌入层
        self.embedding = UnifiedEmbedding(config)
        
        # Transformer层
        self.layers = nn.ModuleList([
            NEOLayer(config) for _ in range(config.num_layers)
        ])
        
        # 模态特定输出头
        self.text_head = TextOutputHead(config)
        self.image_head = ImageOutputHead(config)
        
    def forward(self, tokens, mode='understand'):
        """
        前向传播
        Args:
            tokens: 统一token序列
            mode: 'understand' 或 'generate'
        """
        # 统一嵌入
        x = self.embedding(tokens)
        
        # Transformer处理
        for layer in self.layers:
            x = layer(x, tokens['modality_mask'])
        
        # 模态特定输出
        if mode == 'understand':
            return self.text_head(x)
        else:
            return self.image_head(x)

3.3 统一训练目标

NEO-unify使用多任务联合训练

4. 实验结果

4.1 多模态理解

VQA任务性能

模型VQAv2GQAOK-VQA
Flamingo56.3%49.4%50.4%
IDEFICS58.1%51.2%52.1%
LLaVA59.8%53.1%54.5%
SenseNova-U168.2%62.8%61.9%

4.2 多模态生成

图像生成质量

模型FID↓CLIP Score↑
DALL-E 312.30.82
SDXL18.20.76
Emu214.10.79
SenseNova-U111.20.84

4.3 跨模态推理

复杂推理任务

任务描述SenseNova-U1
Visual Math图像数学问题求解72.3%
Chart Understanding图表理解和推理81.5%
Multimodal Reasoning复杂多模态推理68.9%

5. 与其他方法的对比

5.1 架构对比

方法理解能力生成能力统一性
分离模型
后融合
前融合
NEO-unify

5.2 表示空间对比

┌─────────────────────────────────────────────────────────────────────────┐
│                     表示空间对比                                          │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                          │
│  分离模型:                                                             │
│                                                                          │
│     视觉空间                      语言空间                               │
│        V                           L                                     │
│        │                           │                                     │
│        │                           │                                     │
│        └───────── × ──────────────┘                                     │
│                   (对齐困难)                                               │
│                                                                          │
│  NEO-unify:                                                            │
│                                                                          │
│                     统一空间                                             │
│                       U                                                 │
│                      ╱│╲                                                │
│                    ╱  │  ╲                                              │
│                  V    │    L                                             │
│                                                                          │
│               (自然对齐)                                                 │
│                                                                          │
└─────────────────────────────────────────────────────────────────────────┘

6. 代码实现

6.1 统一嵌入层

class UnifiedEmbedding(nn.Module):
    """
    统一嵌入层
    将不同模态的token映射到统一表示空间
    """
    def __init__(self, config):
        super().__init__()
        
        # 文本嵌入
        self.text_embed = nn.Embedding(
            config.vocab_size, 
            config.d_model
        )
        
        # 视觉token嵌入
        self.vision_embed = nn.Sequential(
            nn.Linear(config.vision_dim, config.d_model),
            nn.GELU(),
            nn.Linear(config.d_model, config.d_model)
        )
        
        # 模态嵌入(区分不同模态)
        self.modality_embed = nn.Embedding(
            config.num_modalities,
            config.d_model
        )
        
        # 位置嵌入
        self.position_embed = nn.Embedding(
            config.max_seq_len,
            config.d_model
        )
        
    def forward(self, tokens, modality_ids):
        """
        Args:
            tokens: token序列
            modality_ids: 模态ID
        Returns:
            统一嵌入向量
        """
        # 文本嵌入
        text_embeds = self.text_embed(tokens['text'])
        
        # 视觉嵌入
        vision_embeds = self.vision_embed(tokens['vision'])
        
        # 融合
        if 'text' in tokens and 'vision' in tokens:
            # 交错融合
            embeds = self._interleave(text_embeds, vision_embeds)
        elif 'text' in tokens:
            embeds = text_embeds
        else:
            embeds = vision_embeds
        
        # 添加模态嵌入
        modality_embeds = self.modality_embed(modality_ids)
        embeds = embeds + modality_embeds
        
        # 添加位置嵌入
        positions = torch.arange(embeds.shape[1], device=embeds.device)
        embeds = embeds + self.position_embed(positions)
        
        return embeds

6.2 完整模型

class SenseNovaU1(nn.Module):
    """
    SenseNova-U1完整模型
    """
    def __init__(self, config):
        super().__init__()
        
        # 统一tokenizer
        self.tokenizer = UnifiedTokenizer(config)
        
        # 统一嵌入
        self.embedding = UnifiedEmbedding(config)
        
        # NEO Transformer
        self.transformer = NEOT ransformer(config)
        
        # 输出头
        self.output_heads = nn.ModuleDict({
            'text': TextOutputHead(config),
            'image': ImageOutputHead(config),
            'video': VideoOutputHead(config)
        })
        
    def forward(self, inputs, task='understand'):
        # Tokenize
        tokens = self.tokenizer.tokenize(inputs)
        
        # 嵌入
        modality_ids = self._get_modality_ids(tokens)
        x = self.embedding(tokens, modality_ids)
        
        # Transformer
        x = self.transformer(x, task)
        
        # 输出
        if task == 'understand':
            return self.output_heads['text'](x)
        elif task == 'generate_image':
            return self.output_heads['image'](x)
        else:
            return self.output_heads['video'](x)

7. 总结与展望

7.1 主要贡献

  1. 统一架构:首次实现真正的多模态统一
  2. 表示对齐:统一的语义表示空间
  3. 性能优异:在理解和生成任务上都达到领先水平

7.2 局限性

  1. 计算开销:统一模型计算量较大
  2. 训练复杂:多任务联合训练困难
  3. 模态平衡:不同模态的数据可能不均衡

7.3 未来方向

  • 扩展到更多模态(音频、3D)
  • 更高效的统一架构
  • 更好的模态平衡策略

参考文献

Footnotes

  1. SenseNova-U1: “SenseNova-U1: Unifying Multimodal Understanding and Generation with NEO-unify Architecture”, arXiv:2605.12500 2