blip中的bi-self attention
时间: 2024-12-27 10:17:55 浏览: 7
### BLIP模型中的Bi-Self Attention机制解析
在BLIP (Bridging Language and Image Pre-training) 模型架构中,引入了一种独特的双模态自注意力(Bi-Self Attention, Bi-SA)[^1]。这种设计旨在更有效地捕捉图像和文本之间的交互关系。
#### 双模态输入表示
对于给定的一张图片以及对应的描述语句,在进入编码器之前会分别被转换成一系列离散特征向量序列。具体来说:
- 图像部分通过卷积神经网络提取得到视觉token;
- 文本则由预训练的语言模型转化为词嵌入形式[^2]。
这些来自不同模态的数据会被拼接在一起形成统一的表征空间内的tokens集合用于后续处理过程。
#### 自注意力建模跨模态关联
为了使模型能够理解两者间复杂的对应联系并从中学习到有用的信息,采用了基于Transformer结构下的多头双向自注意力层来实现这一点。这里的关键在于如何定义查询(Query),键(Key),值(Value):
- 当前位置上的任一元素既可以作为Query去寻找其他地方的相关线索(无论是同属一个域还是另一个领域);
- 同时也充当Key供他人检索匹配;
- Value则是用来汇总计算最终输出结果的部分[^3]。
整个过程中不仅考虑到了单个模式内部各组成部分间的依赖性,更重要的是加强了异质数据源之间潜在互补性的挖掘力度。
```python
import torch.nn as nn
class BiSelfAttention(nn.Module):
def __init__(self, dim, num_heads=8, qkv_bias=False, attn_drop=0., proj_drop=0.):
super().__init__()
self.num_heads = num_heads
head_dim = dim // num_heads
self.scale = head_dim ** -0.5
self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias)
self.attn_drop = nn.Dropout(attn_drop)
self.proj = nn.Linear(dim, dim)
self.proj_drop = nn.Dropout(proj_drop)
def forward(self, x):
B, N, C = x.shape
qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4)
q, k, v = qkv.unbind(0) # make torchscript happy (cannot use tensor as tuple)
attn = (q @ k.transpose(-2, -1)) * self.scale
attn = attn.softmax(dim=-1)
attn = self.attn_drop(attn)
x = (attn @ v).transpose(1, 2).reshape(B, N, C)
x = self.proj(x)
x = self.proj_drop(x)
return x
```
阅读全文