当前位置: 首页 > news >正文

多模态大模型学习笔记(十五)——Transformer 学习之 Masked-Attention

多模态大模型学习笔记(十五)——Transformer学习之Masked-Attention

在Transformer的自注意力机制中,Masked-Attention(掩码自注意力)是生成式大模型(如GPT系列)的核心模块。它通过“屏蔽未来Token”的方式,强制模型在生成文本时只能依赖已生成的内容,从而实现自回归式的序列生成。


1. 为什么需要Masked-Attention?

在标准的Self-Attention中,每个Token都能看到序列中的所有其他Token,包括它“后面”的Token。这对于文本理解任务(如BERT)是有效的,但对于生成式任务(如GPT)来说,这是一个致命的问题:

  • 如果模型在生成第iii个Token时,就能“看到”第i+1i+1i+1个及之后的Token,它就可以直接“抄答案”,而不是真正地学习如何预测下一个词。
  • 这会导致模型无法学习到合理的语言模式,生成的文本会变得毫无逻辑。

因此,我们需要一种机制,强制模型在生成时只能看到当前位置及之前的Token,而看不到未来的Token。这就是Masked-Attention的核心作用。


2. Masked-Attention的核心原理:下三角掩码

2.1 直观理解

Masked-Attention通过一个下三角矩阵(Lower Triangular Matrix)来实现对未来Token的屏蔽:

  • 下三角(保留部分):矩阵中对角线及以下的位置(j≤ij \le iji)被保留,代表当前Tokeniii可以关注它自己及之前所有的Token。
  • 上三角(屏蔽部分):矩阵中对角线以上的位置(j>ij > ij>i)被屏蔽(赋值为−∞-\infty),代表当前Tokeniii无法看到它之后的任何Token。

这种结构确保了模型在生成序列时,只能“向后看”,而不能“向前看”,从而保证了生成过程的自回归性。

2.2 数学原理

在Scaled Dot-Product Attention的基础上,我们引入一个下三角掩码矩阵MMM

Mi,j={0,if j≤i−∞,if j>i M_{i,j} = \begin{cases} 0, & \text{if } j \le i \\ -\infty, & \text{if } j > i \end{cases}Mi,j={0,,ifjiifj>i

将这个掩码矩阵加到注意力分数矩阵QKTQK^TQKT上,再进行SoftMax归一化:

MaskedAttention(Q,K,V)=SoftMax(QKTdk+M)V \text{MaskedAttention}(Q, K, V) = \text{SoftMax}\left( \frac{QK^T}{\sqrt{d_k}} + M \right) VMaskedAttention(Q,K,V)=SoftMax(dkQKT+M)V

这样,被屏蔽的上三角位置的注意力分数会变成−∞-\infty,经过SoftMax后,这些位置的权重就会变为0,从而不会对最终的输出产生任何影响。


3. 两种关键的Mask类型

在实际应用中,除了用于生成的下三角掩码(Look-ahead Mask),我们还会遇到另一种用于处理不等长序列的填充掩码(Padding Mask)

3.1 Look-ahead Mask(前瞻掩码)

  • 作用:专门用于生成式模型(如GPT),强制模型在生成第iii个Token时,只能看到第111到第iii个Token,看不到第i+1i+1i+1及之后的Token。
  • 实现:生成一个下三角矩阵,对角线以上的位置全部设为1(表示需要屏蔽),对角线及以下设为0。

3.2 Padding Mask(填充掩码)

  • 作用:在处理长度不一的序列时,我们会用特殊的<pad>Token将短序列填充到统一长度。这些填充的Token不包含任何有效语义,因此需要在注意力计算中被屏蔽掉。
  • 实现:生成一个掩码矩阵,所有对应<pad>Token的位置设为1,其他位置设为0。

在实际的Transformer实现中,这两种掩码通常会被合并使用,以同时处理序列长度和生成顺序的问题。


4. Special Tokens(特殊Token)的角色

如你提供的示意图所示,Transformer中定义了一系列特殊Token,它们在注意力计算中扮演着重要角色:

特殊Token全称作用注意力行为
<bos>Beginning of Sequence声明序列的起始位置作为序列的第一个Token,参与注意力计算
<eos>End of Sequence声明序列的结束位置作为序列的最后一个Token,参与注意力计算
<pad>Padding用于填充不等长的序列注意力会被屏蔽,不参与语义计算
<sep>Separator用于区分两个或更多不同的序列(如翻译任务中的源语言和目标语言)参与注意力计算,用于分隔不同的上下文
<cls>Classification用于分类任务,通常作为整个序列的语义聚合表示参与注意力计算,聚合整个序列的信息
<unk>Unknown代表词表中未出现的未知Token参与注意力计算,但通常被赋予较低的权重

5. 代码实现(PyTorch版)

下面是一个完整的Masked Self-Attention实现,它严格遵循了上述原理:

importtorchimporttorch.nnasnnimporttorch.nn.functionalasFdefcreate_mask(seq_len):""" 创建下三角掩码(Look-ahead Mask) """mask=torch.triu(torch.ones(seq_len,seq_len),diagonal=1)returnmask.bool()defscaled_dot_product_attention(q,k,v,mask=None):""" 实现带掩码的缩放点积注意力 """d_k=q.size(-1)scores=torch.matmul(q,k.transpose(-2,-1))/torch.sqrt(torch.tensor(d_k,dtype=torch.float32))ifmaskisnotNone:scores=scores.masked_fill(mask==1,-1e9)attn_weights=F.softmax(scores,dim=-1)output=torch.matmul(attn_weights,v)returnoutput,attn_weightsclassMaskedMultiHeadAttention(nn.Module):def__init__(self,d_model,num_heads):super().__init__()self.d_model=d_model self.num_heads=num_heads self.d_k=d_model//num_heads self.w_q=nn.Linear(d_model,d_model)self.w_k=nn.Linear(d_model,d_model)self.w_v=nn.Linear(d_model,d_model)self.w_o=nn.Linear(d_model,d_model)defsplit_heads(self,x):batch_size,seq_len,_=x.shapereturnx.view(batch_size,seq_len,self.num_heads,self.d_k).transpose(1,2)defforward(self,x,mask=None):batch_size,seq_len,_=x.shape# 线性投影q=self.w_q(x)k=self.w_k(x)v=self.w_v(x)# 拆分多头q=self.split_heads(q)k=self.split_heads(k)v=self.split_heads(v)# 合并掩码(如果有Padding Mask,需要在这里合并)ifmaskisnotNone:mask=mask.unsqueeze(1)# [batch_size, 1, seq_len, seq_len]# 带掩码的自注意力计算attn_output,_=scaled_dot_product_attention(q,k,v,mask)# 拼接多头attn_output=attn_output.transpose(1,2).contiguous().view(batch_size,seq_len,self.d_model)# 最终投影output=self.w_o(attn_output)returnoutput# 测试代码if__name__=="__main__":# 初始化模型d_model=512num_heads=8masked_attn=MaskedMultiHeadAttention(d_model,num_heads)# 模拟输入batch_size=2seq_len=5x=torch.randn(batch_size,seq_len,d_model)# 创建下三角掩码look_ahead_mask=create_mask(seq_len)look_ahead_mask=look_ahead_mask.unsqueeze(0).repeat(batch_size,1,1)# [2, 5, 5]# 执行带掩码的自注意力output=masked_attn(x,look_ahead_mask)print(f"输入形状:{x.shape}")print(f"输出形状:{output.shape}")

6. 多模态场景下的Masked-Attention拓展

在多模态大模型(如GPT-4V、Qwen-VL)中,Masked-Attention的逻辑得到了进一步拓展:

  1. 图文混合序列掩码:当输入是图文混合序列时,我们需要确保文本生成时,只能看到已生成的文本和已输入的图像,而不能看到未来的文本。
  2. 图像块掩码:在处理图像时,有时也需要对图像块进行掩码(如MAE预训练),但这与生成式任务的下三角掩码逻辑不同。
  3. 跨模态注意力掩码:在Encoder-Decoder架构中,Decoder的注意力不仅需要对自身的未来Token进行掩码,还需要对Encoder的输出进行对齐,这就需要更复杂的掩码策略。

7. 总结

Masked-Attention是Transformer生成式能力的核心基石,它通过下三角掩码强制模型遵守自回归生成的规则,确保了生成文本的逻辑性和连贯性。

  • 核心思想:通过下三角矩阵屏蔽未来Token,强制模型“向后看”。
  • 关键应用:GPT等生成式大模型的核心模块。
  • 拓展方向:在多模态场景下,掩码逻辑需要适配图文混合序列的生成需求。
http://www.jsqmd.com/news/457014/

相关文章:

  • 帛书《周易》“益”象不是《易经》“益”卦
  • 2026降AI工具实测TOP12:从学生党到科研人,精准选品不踩坑 - 老米_专讲AIGC率
  • 长沙旧房改造优质服务商权威推荐榜:长沙二手房翻新公司、长沙二手房翻新工期、长沙二手房翻新设计、长沙二手房翻新预算选择指南 - 优质品牌商家
  • CSS:Less基础、Bootstrap前端开发框架
  • [省选2026游记]????
  • 2026年上海宠物牙科医院大比拼,哪家更靠谱?腹腔镜绝育/宠物牙科/猫咪绝育/宠物外科专家,宠物牙科医院哪家靠谱 - 品牌推荐师
  • 从零构建高精度关键词新闻监控系统:n8n保姆级全流程配置详解
  • 基于深度学习的密集人群行人检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Django+web+训练代码+数据集)
  • 效果佳气流膨化机口碑推荐榜单
  • docker部署nginx
  • 2026乳酸菌饮品优质厂商推荐指南:活性乳酸菌饮料公司、活性乳酸菌饮料厂家、活性乳酸菌饮料品牌、活性乳酸菌饮料排名选择指南 - 优质品牌商家
  • 【视觉心法】把庞然大物塞进单片机!撕开 OpenCV 底层编译机制,在 ESP32 上构筑微型视觉中枢
  • 基于java+springboot的宠物用品商城管理系统源码+远程运行+计算机专业
  • OpenClaw + 企业微信对接:2026年保姆级全链路操作指南
  • 【视觉心法】跨越虚实的终极一跃:撕开“手眼标定”的学术伪装,用 C++ 赋予机械臂绝对空间感知
  • 2026联合省选 游记
  • 毕设程序java本科毕业生就业信息管理平台 高校毕业生求职招聘一体化服务平台 大学生就业服务与用人单位对接系统
  • 学c语言~
  • 毕设程序java北罗镇中学校务通管理系统 北罗镇中学教育信息化协同管理系统 北罗镇中学校园事务数字化服务平台
  • 毕设程序java北京市民宿推荐系统 首都特色住宿智能匹配平台 SpringBoot框架下的京郊旅居推荐引擎
  • 四旋翼pid模糊pid控制,simulink仿真,matlab仿真,数据调好,自主学习
  • 【OpenClaw 学习技能与本地知识库提炼方案】
  • LEDVR 工作流(PDF 问答系统)落地代码清单
  • 类和动态内存分配(改进后的新String 类)
  • 解决织梦5.7添加新变量出现:Request var not allow!的办法dedecms
  • 无人机视角城市街道各种类型车辆三轮车摩托车检测数据集VOC+YOLO格式1534张6类别
  • 织梦彻底解决DedeTag Engine Create File False的方法
  • 我与 Gemini 关于 kamailio 路由的讨论
  • Halcon 通用流程
  • 2026长沙GEO优化公司实测排名:效果可量化才是硬实力 - 亿仁imc