🧠 图解记忆:图像经过ViT后产生大量token(如14×14=196个);点击图片可查看原图。
💡 答案要点
背景问题:
- 图像经过ViT后产生大量token(如14×14=196个)
- 直接送入LLM计算量巨大
- 需要对视觉token进行压缩/重采样
两种方案对比:
| 方案 | 结构 | 优点 | 缺点 |
|---|---|---|---|
| 线性投影 | y = Wx | 简单、参数量少 | 表达能力有限 |
| Perceiver Resampler | Transformer交叉注意力 | 动态长度、可学习压缩 | 参数量更大 |
Perceiver Resampler原理:
视觉特征:[H×W×1024](如196个token,每个1024维)
↓
可学习的 queries:[32×1024](固定32个查询token)
↓
Cross-Attention:queries attend to 视觉特征
↓
输出:[32×1024](压缩到固定32个token)
效果:196 → 32,压缩6倍Flamingo的重采样实现:
python
class PerceiverResampler(nn.Module):
def __init__(self, dim, num_queries=32, visual_dim=1024):
super().__init__()
self.query_tokens = nn.Parameter(torch.randn(num_queries, dim))
self.cross_attention = CrossAttention(dim, num_heads=8)
self.ffn = FeedForward(dim)
def forward(self, visual_features):
# visual_features: [B, 196, 1024]
# query_tokens: [B, 32, 1024](可学习)
queries = self.query_tokens.unsqueeze(0).expand(visual_features.size(0), -1, -1)
# 交叉注意力
x = self.cross_attention(queries, visual_features)
x = self.ffn(x)
return x # [B, 32, 1024]面试话术:
"Perceiver Resampler本质上是用少量可学习query去'查询'视觉特征,实现压缩。相当于视觉特征的摘要器。相比固定压缩,动态query能根据任务自适应调整关注区域。"
