transformer数据流解析 Bbatch_size批次大小S源输入序列长度Encoder侧句子T目标输出序列长度Decoder侧句子ddmodel:模型隐藏维度标准512计算机为了理解这个词用多长的一个数字数组向量来表示它在代码中输入到模型的张量形状是[B,S,d]。举例赋个值来说B32是batch_size模型一次并行处理32句话。S128Seq Lenghth/序列长度每句话被截断或补齐到了128个词。d512(Hidden dim/隐藏维度这128个词里的每一个词都被表示为一个长度为512的向量h:多头注意力头数单头维度dkd/hV词表总大小1.原始文本-模型输入张量分词后将token映射为整数ID生成二维整数矩阵源输入矩阵B*S 目标输入矩阵 B*TT是输出序列长度词嵌入层将ID映射为稠密向量 B*S*d 。位置编码PE生成和嵌入向量同尺寸时许向量逐元素相加注入词序信息Encoder编码器层多层堆叠每层输入输出形状不变B*S*d)单层Encoder由两个子模块顺序执行多头自注意力MSA multi-head self attention--FFN前馈网络所有子模块执行后均做【残差连接LayerNorm(post-LN)多头自注意力MSAQKV,Sftmax全部在此计算输入的是 B*S*dQKV线性投影投影后尺寸 B S d.多头维度拆分流程(1)reshape B,S,d--B,S,h,dk (2):transpose交换序列、头维度B,h,S,dk) 分为多头之后交换序列和头维度单头注意力计算公式 softmax执行 Q和k的转置计算得到相似度得分矩阵 B h S S 根号dk进行缩放防止梯度消失 这个S S是因为 S dk * dk S 得到的就是S S注意矩阵乘法仅作用于最后两维B h S S 和VB h S dk)得到的是 B h S dk 然后进行多头拼接得到 B S dk多头结果拼接输出线性投影(为什么要进行线性投影拼接后的多头特征直接拼接只是简单合并多头信息缺少跨头融合通过可学习权重Wo d*d,作用是融合多个注意力头学习到不同语义特征统一特征分布匹配后续FFN输入要求得到最终注意力张量 得到注意力输出 B S dencoder自注意力掩码padding掩码。句子对齐的padding无效对应位置得分填 -inf经过softmax之后权重趋近于0模型不会关注填充占位符post-LN残差归一化子模块2FFN前馈网络输入的是X B S dk.FFN输出Xffn残差层归一化得到单层Encoder最终输出Encoder整体功能总结1.每层输入输出维度恒定 B*S*dk2.双向全局编码序列内每个token能看到全部源文本上下文3.全部Encoder堆叠完成后输出记忆张量 完整送入每一层的Decoder的交叉注意力Decoder解码器层多层堆叠每层输出 B*T*dk)每层3个子模块固定顺序掩码多头自注意力Masked MSA-交叉注意力 Cross attention-FFN搭配残差连接Post-LN归一化Decoder第一层输入在训练阶段完整目标序列经过嵌入位置编码一次性输入在推理生成截断初始时仅传入起始符start每次预测新词拼接至输入末尾循环迭代生成额外依赖每层交叉注意力必须使用Encoder输出的Memory作为K,V输入子模块1掩码多头自注意力 Masked MSA输入当前Decoder层输入Y B*T*dk,QKV全部由自身输入投影双重掩码叠加使用Look_Ahead未来三角掩码仅此处使用上三角位置填充-inf预测第i个token时屏蔽i之后所有未来的token训练时防止标签泄露为什么三角掩码上三角填充-inf就能屏蔽未来token?Decoder输入序列长度为T那么相似度矩阵式T*T方阵矩阵中位置ij 代表的是第i个token对第j个token的关注度。那么你想上三角是不是就说明了在前面的token对后面的token的关注度。那么将上三角屏蔽是不是就是只能看到小于这个i的前文逐元素相加看不到后面的 就比如在预测第2个词的时候是看不到第1个词第2个词对于第三个词的关注程度的padding掩码屏蔽目标序列填充占位token跟之前的那个encoder是一样的多头维度变换、点积缩放、softmax计算流程、残差归一化子模块2交叉注意力Q Decoder中间特征B*T*dk) K V来自于Encoder全局记忆 (B*S*dk多头维度拆分QKT点积缩放Softmax计算流程不变。前馈神经网络是一致的padding填充数据预处理阶段和注意力计算无关。原始句子长短不一训练时一个batch内所有句子长度必须统一所以句子末尾补占位符 源文本和目标文本都统一填充两种Mask掩码注意力计算阶段加在相似度分数矩阵上控制模型能不能看见某个tokenpadding掩码屏蔽pad占位符look-ahead三角掩码上三角-inf)仅Decoder第一层自注意力使用屏蔽未来未生成的tokenDecoder每层两个注意力模块掩码自注意力第一层-交叉注意力第二层模块ADecoder掩码自注意力QKV全部来自Decoder自身目标序列分数矩阵T*TEncoder 完整跑完 6 层得到唯一的 MemoryDecoder 一共 6 层每一层执行交叉注意力时都会读取这同一份 Memory 生成 K、V 参与计算。