深入浅出Masked Attention:大模型学习必备,小白也能轻松掌握并收藏
本文详细介绍了Masked Attention的工作原理,包括因果遮挡和Padding Mask的应用,以及Cross Attention在Transformer中的作用。同时,还探讨了Teacher Forcing的训练方法及其优缺点,以及Transformer的参数共享优化策略。对于想要学习大模型的小白或程序员来说,本文提供了全面且易于理解的指导,帮助你更好地掌握大模型的核心技术。
1、Masked Attention

Mask是做了一个什么呢,这里有一个optional的mask,可选可不选。它只有在decoder的第一个attention层,只有在decoder的self attention里才会去用到这个mask。如果加上mask,它在整个attention 里是怎么操作的,第一步先设置这个mask是什么样子,这个Mask的维度是T乘以T,第一行代表的是第一个TOKEN要注意到谁,所以它是一个T乘以T的,每一个TOKEN都可以注意到每一个TOKEN,灰色的这一部分就认为它是一个遮挡住的,蓝色这部分认为它是没遮挡的。
这个mask,这么一个三角矩阵mask一般称为causal mask,叫因果遮挡。第一个TOKEN进来之后,发现只能看到自己的位置,后面的位置都看不到,那么第二个TOKEN可以看到它前面这个位置和它自己的位置,后面的又看不到了。第三个TOKEN,因为是整个序列的最后一个 TOKEN,所以它可以看到迄今为止的所有值,所以这个因果遮挡的含义就是说我们不能去进行一个时间的穿越,只能看到过去发生的事情,不能看到未来,所以它遮挡的是未来的信息。对每一个TOKEN来说,都只能看到当前和之前的事情,之后未来的TOKEN都看不到。

设置好TOKEN之后,正常的去计算它的query和它的key, 然后去计算它们的相似度之后得到了一个attention scores,attention scores 也就是这个位置经过了一个scale,在进入到下一步softmax之前,要去对它进行一个mask操作,就是把刚求到的这个attention score,首先考虑它也是一个T乘以T的维度,也就是说attention这个矩阵里面的第i 元素代表的就是第j个TOKEN的注意力得分,首先把它加上一开始设置好的mask,加完之后得到一个值,这个mask遮挡的部分把它设置为负无穷,没有遮挡的部分设置为0,对它进行一个加和,得到masked attention scores,也就是说没有遮挡的部分还是维持原样,之前得多少分,现在还是得多少分没有变,但是如果遮挡的部分,得分变成负无穷,无论之前是多少分,都变成负无穷。所以总结为unmasked不变,因为加了一个0,那mask的这些位置就变成负无穷。

为什么要用0和负无穷这两个值,因为现在mask是在进入softmax之前操作,softmax把它变成一个概率分布,mask用负无穷是因为经过 mask之后的这个tension score变成负无穷之后,去计算概率分布的时候为e的负无穷,也就是趋近于0,目标就是遮挡掉的值在softmax之后权重为0,把所有遮挡掉的值设为负无穷,经过softmax之后相对应位置的值也会变成0,经过遮挡之后正常计算softmax,正常进行加权求和就ok了。

经过softmax之后,这些遮挡的值就变成0了,那么没有遮挡的值:首先前面这个因为它只能看到自己,一定是个1,也就是说100%的注意力都只能给到这一个位置,因为这一行也只有这一个位置,剩下的每一行也是一样的,每一行都符合概率分布,没有遮挡的部分它的求和为1,因为遮挡的部分它的注意力为0,这就是Masked attention 做的事情。
为什么在decoder里面要去做因果遮挡,因为Transformer一开始做的是一个机器翻译问题,在机器翻译的时候,输入一句中文,想翻译成英文,在翻译英文的时候是一个词一个词生成的,比如说“我爱网球”,那么输出的英文,decoder第一个输出的是“爱”,第二个输出的是“love”, 在输出love的时候看不到tennis。所以对于self attention,每一个位置它只能看到自己之前的序列。
2、两种Mask

因果遮挡是在decoder的self attention里面做的,它的目的是防止 decoder在训练的时候让每一个TOKEN看到它未来的信息,保证每一个 TOKEN只能看到它左侧的值,它之前过去的值。
除了刚那个mask attention的过程,它并不依赖mask到底是什么形状,在这个T*T的矩阵里随机遮掉一些值,经过mask attention的操作,在最后的时候让TOKEN看不到我遮到的这些位置的值。所以说mask有因果遮挡就是遮挡了一个三角矩阵的形式,在transform里还有另外一种遮挡padding mask是处理非等长序列,Transformer能处理变长序列,可以翻译处理变长的序列,DNN和CNN都做不到。
为什么Transformer可以做到,是因为里面每一个模块都不依赖于这个 T的大小,整个处理都跟T的大小没有关系。在tension里做线性变换,TOKEN和TOKEN之间去进行。feed forward层有两层全连接层,但这个feed forward它是在position wise逐个位置进行先升维再降维,整个过程都跟T的输入长度没有关系。训练好的参数量就可以处理任意长度的序列。
既然transformer多长的序列都能处理,为什么还要处理非等长序列,非等长序列是同一个batch在推理的时候没有关系,多长都可以,但是在训练的时候还是逐batch去计算,还是进行小批量梯度下降,在训练的时候还是每次放进去b个样本,b个句子放一起进行训练。那么这b个序列它们不是一样的长度,所以说这个是在batch内部所有样本,可能是非等长的。比如考虑一个只有两个样本的batch,它的第一个样本是“你好“,第二个样叫“我爱网球“。你好这个长度是两个,我爱网球有三个长度,但是整个batch是要一起放进网络里,这个情况下就要对这种比较短的句子去进行Pad的操作,把所有的句子都pad到一个batch 内最长那个序列的长度。
所以说输入(B,T,D) 的这个T是整个batch中最长序列的长度,没有达到这个长度的后面就增加Pad值。无论在encoder还是decoder,在这三个attention里都不要看到,都要遮挡掉Pad信息。所以说因果遮挡只有在decoder self attention里做的,Pad mask是在三个attention里面都要去做的。
这个序列的长度,序列里有多少个词源,如果按照单词去分词,那么“我爱网球“是三个词,它的长度就是3,当然也可以按照字去分,这个就取决于用的是什么分词器。如果按字去分的话,它就是4,它的长度实际上就代表着这一个序列里面有多少token,多少个词元,我们说这三个attention里面都要做padding mask,无论哪一个位置,都不要看到第三个位置信息以及第三个位置是一个Pad的值。所有Pad都不需要互相看见,这个batch可以是几十几千个TOKEN都没有问题。
3、Cross Attention

第二个问题是第二层的attention,它是对encoder做了一个cross attention,cross attention不需要对它进行mask。
假设“I love tennis”进来,把它翻译成我爱网球,在翻译爱这个字的时候,能看到刚已经生成的我,肯定看不到网球,这就是为什么self attention需要去做mask,但对于I love tennis,整个原本输入的英文句子,本来都能看到,只有知道整个句子之后才开始翻译中文,所以对于encoder的信息都能看到,所以decoder里的self attention做了因果遮挡,但是cross attention是不需要,正常去做attention就可以。

encoder里还有一个不同的地方,是它输入的output。这个output,这个embedding和这个positional encoding跟这边是没有区别的,它不一样的地方是encoder的输入在这里做了一个向右移一位的操作。输出是“我爱网球“这三个词,一步一步的输出来。实际上decoder 看到的是它前面会加一个标志位,BOS是begin of sequence序列开始的意思,它输出的这一部分是“我爱网球”,告诉你我生成结束了end of sequence,因为我爱网球和这边它往下错了一位。
为什么要右移一位是因为在想要生成“我”的时候,“我”不应该看到任何信息,只需要说现在开始翻译了,看完“I love tennis”之后该开始翻译了,那么就就知道序列开始了,生成第一个词是“我”,到生成“I”的时候,知道整个词的语义,并且还要知道前面已经翻译好了一个“我”,要考虑的是要把“I love tennis”翻译出来,第二个要考虑的是现在已经翻译到“我”了,下一个词该是“I”了,到“网球“也是一样的。所以它输入比输出往后错了一位,横着写的话也就是往右移了一位,这就是右移一位的含义。
最后要输出它的结果,decoder之后接的是一个输出层,那么输出层做了一个什么事情呢。首先经过一个linear,因为这里的每一个TOKEN,输入的是一个(B,T,D),经过decoder输出一个张量,linear层是把每一个TOKEN的d维重新恢复到词表的大小。因为最后输出要去做一个v分类问题,一共有v个单词,在这v个单词里最后应该输出哪一个单词,所以它其实是一个v分类问题。在每一个TOKEN把它转化为一个词表大小长度的向量,再经过softmax之后就经过一个归一化,把它变成未分类之前,应该接一个softmax,再接一个交叉商,这是正常做多分类问题的损失函数的设计。
attention Transformer比RNN的一大优点在于它可以并行训练,所以它的输入是一下子输入所有单词,不是喂一个BOS,喂一个我,喂一个爱,喂一个网球,而是直接把整个我爱网球直接输入进来。那么输入的就是一个我爱网球,希望它预测出来的值是原本我爱网球加上一个结束符,这个是ground truth,一下子把它都输入进去,希望在这个位置的时候输出I,在这个位置的时候输出网,通过mask保证他们不看到未来信息。
4、训练优化teacher forcing

teacher forcing的概念,这个是在做自回归生成的时候用到的一种训练方法,Transformer里面用了,RNN也会用这种方式去训练,机器翻译的任务它在推理的时候做的就是一个自回归生成,输入“I love tennis”,输入到一个encoder里,encoder经过很多层的block之后输出了一个T,D这么一个维度的张量,就是要开始生成一个符号,在第一个decoder生成的是I,这里就是推理的过程,decoder接收到encoder 给过来的语义信息,并且接收到了"我"刚开始生成,现在要生成的是第一个TOKEN是我,到了该生成第二个词汇的时候,会把我拼到后面,也就是说进入decoder看到的是一个BOS加上我这么长的序列,通过cross attention结合过来,这个是output的输入,这个时候生成的可能就是 I,但是这个地方它推理的过程中不一定输出I,比如输出的是“我恨”,继续生成在decoder认为句子结束之前,它都会继续往后拼接。decoder可能就会认为我恨,比如虫子, 最后一个decoder就会过来把虫子拼过来输出,翻译完了,最后输出一个EOS的标志位,整个推理的过程生成机器翻译的过程就是这么一个过程。
首先它是对我原语言的句子进行一个encode, 在抵扣过程中我是一个词一个词的生成,要注意的一点是每一次都会用到这一次的decode, 都会用到上一次的输出,那么发现I love tennis它正确的翻译应该是我爱网球。但是它有可能在一次输出中,比如把love给翻译错了,翻译成了恨,再往后的时候可能后面的这个就会更加的不是原来的意思了,因为“虫”字的生成还会受到前一个单词的影响,这就是推理的时候生成的一个过程,叫自回归的生成,每一次的输入是拼接了上一次的输出。
teacher forcing就是一个训练方法,训练的时候不是每一次都用到上一次的输出作为这一次的输入,而是直接用标准答案。比如输入I love tennis,它的标准答案是我爱网球,在第一个位置的时候它输入的是 Bos,第二个位置的时候输入的不是我,而是从这个地方取出来一个右移一位,虽然它前一个步骤生成的是恨,但在训练的时候根本不考虑它上一个位置生成的是什么,因为直接用的是标准答案里面它之前的序列。那么当想要生成第三个位置的词的时候,给它输入的其实就是标准答案里面取出来的"我爱"这两个单词,到这个位置取出来的也是标准答案里"我爱网球",所以我们说 teacher forcing 做的是一个什么事情呢?
它不再像推理的时候一样使用,像这种自回归生成一样,不使用上一个时刻的输出作为当前的输入,而是直接用标准答案作为当前的输入,那么上一个时刻的输出是什么不重要,直接从标准答案里面截取。当预测第t个 TOKEN的时候,直接从前面截取0到t-1这么一个序列作为此刻的输入。 如果是这样自回归的去生成,很有可能在某一次句子只有三个单词,但当这个句子有很长的单词的时候,某一次生成错误,这个错误就会不断的累积,每一次的错误都会影响下一个单词的生成,当生成一个很长很多单词的序列的时候,后面这个错误就会不断的放大,所以用teacher forcing每次给他看前面所有的标准答案,这么一种训练方法,可以加快收敛,训练更加稳定,并且最大的一个优势就是并行训练。输入直接从标准答案里面取,不需要等上一个时刻输出完毕之后,才去进行当前的输入,在Transformer里它促进了Transformer的并行训练。

那么Transformer为什么可以并行训练?
它还依赖另外一个masked,它虽然能看到标准答案,但是它不是能看到完整的标准答案,它只能看到当前位置之前的标准答案。怎么能保证整个句子都输入进去让每个位置都只看到自己之前的内容,不看到未来的信息?就是采取因果遮挡,在self attention里应用一个因果遮挡。Transformer对于RNN的一个优势是可以并行训练,那RNN在训练的过程中也用了teacher forcing,为了加快收敛和训练稳定,也用了 teacher forcing,但是RNN并不能够并行训练,因为RNN不光依赖输入,它还依赖于上一时刻隐状态,这个隐状态是没有标准答案的,所以推理和训练的时候只能顺序的一个一个的计算,但在Transformer里,基于attention的架构,利用了teacher forcing和mask attention,它就可以整体进行并行训练。
teacher forcing可以帮助transformer加快收敛,并且可以并行训练,但是也有风险所在,它的风险就是暴露偏差exposure bias,就是说在训练的时候,每次总能看到前面所有序列正确的值,每次总能看到此前所有的标准答案,那么在推理的时候,前面并不保证每一个词都生成是对的,那么就会看到跟训练的时候不一样的分布,因为在训练的时候从来没见过前面出过错,一旦出错,就完全不知道要怎么改。在推理的时候,一旦前面的序列出现了错误,这个错误就会累积,而它对于错误的修改能力是很弱,因为在训练的时候没见过这种情况,就把这种情况总结为暴露偏差。其实的大语言模型也是用teacher forcing来训练的,现在大语言模型经常有幻觉问题,就是训练和推理的时候看到的分布不一致,后面有可能会瞎编,前言不搭后语。
另外一个情况就是它受小扰动影响太大,比如给大语言模型的时候,很有可能这个输入就差一个字,但是它的输出是完全不相同,语义差距很大,一般称这个叫鲁棒性差,太容易受到输入的小扰动,对它造成很大的影响,因为这个错误会累积。
那么大语言模型怎么去缓解这个问题?现在有一些是基于强化学习的方法,基于人类反馈的强化学习,还有DPO、 DRPO,整个基于标签的训练它都是用teacher forcing去做,强化学习是它对于这种完整回答进行打分,去判断完整的回答好不好。如果前面生成错误的累积,一个非常离谱的序列,强化学习就能帮助他去修改,每次前面都看到了标准答案,真正的像推理时一样完整的运行一遍,然后根据回答好不好去修改。
在用teacher forcing的整个训练过程中用的都是标准答案。翻译一个句子,翻译到第四个词的时候,前三个词都是标准答案里得到的词,而不是这个decoder自己生成。那么翻译第100个词的时候,前99个词全部都是来自标准答案的词。
5、优化点-参数共享

transformer里面一个小优化就是做了一个参数共享,这里有两个input和output 都有自己的一个嵌入矩阵,那么这两个之间是可以共享的,但是这个在Transformer原论文里没有做共享,因为它是做的是一个机器翻译问题。
假设输入中文,输出英文,那中文的词表有V1个单词,英文的词表有V2个单词,嵌入左边这个input embedding的嵌入矩阵就是一个V1乘以 D的矩阵,右边是一个V2乘以D的矩阵,单就中文的词表和英文的词表它们两个,如果要是共享,直接把它们拼在一起就可以了,中文的词表W1 W2把它们拼在一起,每一次查的时候,在小词表能查到的把它拼在一起的大词表也一定能查到,但是它共享的什么东西,就是如果这个词表里有一些共同的词,它是可以共享的,跨语言的这种共同的词比较少,所以原版Transformer里并没有做共享。但是后面做一些多语言任务的时候,这两个词表可以用一个大词表包含所有可能出现的词,比如这里数字12345是可以共享,逗号、句号这种都可以共享。如果这里面有一些像英语和德语这种,或者是西语,它们里面有很多共同的词源,如果去看一个英文字典和一个西文字典,会发现它们里面会有一些单词是有重复的,并且语义也很相近,那我们用这种input embedding和output embedding共享的方式就可以
首先W2里每一行对应这一行这个单词的词向量,在最后做linear,首先转置之后这每一列就对应着一个词向量,那么在做Linear的时候,把一个D维的向量输入进来,跟Linear的W2转置做一个乘法,其实就是看它们两个有多相似,对它们两个求内积,最后得到的一个长为V2的值,对应这个位置就代表它们两个有多相似,那么最后要做一个V2分类问题,所以也就代表它们两个的得分比较高,这个词的概率比较大,因为跟转置里面这一列相似度比较高,所以是这个词的概率比较大,所以这个地方取它的一个转置,这两个里面的参数是同一个参数,做梯度的时候用这两个梯度一起对里面的参数进行优化。
input embedding、output embedding和最后输出层的线性变换,它们三个之间共享了一组参数。
Transformer可以处理变长序列,整个Transformer架构的设计对输入的长度没有做任何的限制,但实际上真正的Transformer它是有设置Max length,设置了最大的输入输出TOKEN数,那为什么我Transformer的架构里对它的输入长度没有要求,还会设置一个最大长度,PE是从一个词表里取的,用一个可学习的PE,那么它的维度是它每一行是一个PE, 都是一个D维的PE,它的行数也就是能够容忍的最大序列数。如果超过这个序列数,位置编码,没见过这么靠后的位置,位置编码就没有办法编码了,这是第一个问题,所以会设置一个最大序列数。
第二个问题是没有办法编码。还有一个就是开销太大,transformer里面基于attention机制,它的时间和空间开销都是o(n) 方,每一个 TOKEN都要跟其他所有TOKEN去做注意力,如果有n个TOKEN,它就是一个o(n)方复杂度,那么随着长度变长,复杂度是平方增长,而且空间复杂度也是平方增长,所以要设置一个Maxlen, 防止算力没有办法去计算输入,或者说显存直接爆掉。Transformer在工程上它是要设置最大序列长度,但架构设计上它对于输入是没有任何限制的。
最后
对于正在迷茫择业、想转行提升,或是刚入门的程序员、编程小白来说,有一个问题几乎人人都在问:未来10年,什么领域的职业发展潜力最大?
答案只有一个:人工智能(尤其是大模型方向)
当下,人工智能行业正处于爆发式增长期,其中大模型相关岗位更是供不应求,薪资待遇直接拉满——字节跳动作为AI领域的头部玩家,给硕士毕业的优质AI人才(含大模型相关方向)开出的月基础工资高达5万—6万元;即便是非“人才计划”的普通应聘者,月基础工资也能稳定在4万元左右。
再看阿里、腾讯两大互联网大厂,非“人才计划”的AI相关岗位应聘者,月基础工资也约有3万元,远超其他行业同资历岗位的薪资水平,对于程序员、小白来说,无疑是绝佳的转型和提升赛道。

对于想入局大模型、抢占未来10年行业红利的程序员和小白来说,现在正是最好的学习时机:行业缺口大、大厂需求旺、薪资天花板高,只要找准学习方向,稳步提升技能,就能轻松摆脱“低薪困境”,抓住AI时代的职业机遇。
如果你还不知道从何开始,我自己整理一套全网最全最细的大模型零基础教程,我也是一路自学走过来的,很清楚小白前期学习的痛楚,你要是没有方向还没有好的资源,根本学不到东西!
下面是我整理的大模型学习资源,希望能帮到你。

👇👇扫码免费领取全部内容👇👇

1、大模型学习路线

2、从0到进阶大模型学习视频教程
从入门到进阶这里都有,跟着老师学习事半功倍。

3、 入门必看大模型学习书籍&文档.pdf(书面上的技术书籍确实太多了,这些是我精选出来的,还有很多不在图里)

4、 AI大模型最新行业报告
2026最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5、面试试题/经验

【大厂 AI 岗位面经分享(107 道)】

【AI 大模型面试真题(102 道)】

【LLMs 面试真题(97 道)】

6、大模型项目实战&配套源码

适用人群

四阶段学习规划(共90天,可落地执行)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
-
硬件选型
-
带你了解全球大模型
-
使用国产大模型服务
-
搭建 OpenAI 代理
-
热身:基于阿里云 PAI 部署 Stable Diffusion
-
在本地计算机运行大模型
-
大模型的私有化部署
-
基于 vLLM 部署大模型
-
案例:如何优雅地在阿里云私有部署开源大模型
-
部署一套开源 LLM 项目
-
内容安全
-
互联网信息服务算法备案
-
…
👇👇扫码免费领取全部内容👇👇

3、这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)