2017年Google团队含Google Brain和Google Research与多伦多大学的八位研究者发表了一篇论文。标题很嚣张——Attention Is All You Need你只需要注意力。言下之意那些复杂的循环网络、卷积网络统统不需要。当时没几个人当回事。RNN和LSTM统治了NLP十多年谁信你靠一个注意力机制就能颠覆一切结果呢这篇论文提出的Transformer架构成了后来所有大语言模型的基石。GPT系列、BERT、Claude、Gemini——全是它的后代。今天这篇文章我们不讲公式不背概念。我们只回答几个问题Transformer到底做了什么它为什么能work那些设计选择背后的Why到底是什么Transformer架构图来源原论文Figure 1一、先搞清楚Transformer要解决什么问题在Transformer之前NLP的主流架构是RNN和LSTM。它们的工作方式很直觉——像人读书一样从左到右一个词一个词地处理。但这个从左到右带来了两个致命问题。第一个问题记不住太远的东西。RNN有一个叫长期依赖的毛病。句子一长网络在处理后面内容的时候前面信息的信号已经衰减得差不多了。就像你读一篇论文读到第五章的时候第一章讲了啥已经记不清了。LSTM通过引入门控机制遗忘门、输入门、输出门缓解了这个问题但只是缓解没有根治。当你需要处理一段几千字的文章时LSTM依然会遗忘。第二个问题没法并行计算。这个对工程师来说更致命。RNN必须顺序处理第i个词必须等第i-1个词处理完才能开始。这意味着你有一张价值几万块的GPU也只能一个词一个词地算算力完全浪费了。这两个问题不是不太方便而是根本性的瓶颈。第一个问题限制了模型的理解能力第二个问题限制了训练规模。不解决它们就不可能训练出今天这样的大模型。二、注意力机制一个反直觉的想法Transformer的核心创新是提出了一个反直觉的问题为什么非要一个词一个词地读想象你在读一个句子那只猫坐在垫子上它看起来很开心。当你读到它的时候你的大脑不会去逐词回忆那、只、猫、坐、在……。你的注意力会直接跳到猫这个词——因为你瞬间就知道它指的是猫。这就是注意力机制的本质不是按顺序处理所有信息而是让每个词直接去找跟它最相关的其他词。这个想法带来了一个巨大的好处既然每个词都可以直接看所有其他词那所有词就可以同时处理——完美并行。RNN的第二个问题直接消失了。第一个问题也解决了不管两个词隔多远注意力机制都可以直接把它们连起来。不存在遗忘因为根本不需要记忆——所有信息都在眼前。三、Q、K、V用程序员的方式理解注意力机制的实现用了三个矩阵Query查询、Key键、Value值。很多教材会说这是从信息检索系统借鉴来的。但我觉得这个类比还不够直白。让我们换一种方式。你写过数据库吧想象一个系统里面每个词都注册了三条信息Key这个词的标签。比如猫的标签可能是动物、名词、可以做主语。坐在的标签可能是动词、表示动作。Query这个词发出的查询请求。比如它发出的请求可能是找一个名词在前面不远可能是我的指代对象。Value这个词真正携带的语义信息。这是当别人查到你的时候你给别人看的东西。计算过程就三步1. 每个词用自己的Query跟所有词的Key做点积得到一个相似度分数2. 用softmax把分数变成概率加起来等于13. 用这些概率对Value做加权求和最终每个词都会得到一个新的表示这个表示融合了整个句子中跟它最相关的上下文信息。等一下为什么是点积两个向量的点积衡量的是它们的方向一致性。方向越一致点积越大。所以Query和Key越相似方向越接近注意力分数就越高。但这里有一个问题如果向量维度很大点积的值也会很大。值一大softmax就趋向于赢者通吃——最大的那个分数接近1其他全部接近0。这不是我们想要的。所以论文里除了一个根号d_kKey的维度相当于把分数拉回来。这个细节虽小但很关键。没有这个缩放注意力分布会太尖锐模型只能关注一个词失去了综合考虑的能力。四、多头注意力为什么要分头行动Transformer不只用了注意力它同时用了8个头。为什么不能只用一个头把所有信息一起处理因为语言中的关系是多种多样的。同一个句子中猫和它可能是指代关系坐和垫子上可能是动作-地点关系开心和猫可能是情感关系一个注意力头可能只能捕捉一到两种关系。但如果让8个头分别从不同角度去看这句话每个头可以专注于一种关系模式最后把结果拼起来信息就更丰富。一个常见的疑问每个头的维度变小了512/864会不会丢信息不会。因为8个头的输出会拼接回512维。信息总量没变只是被分工了。这就像把一个项目拆给8个工程师每个人只需要深入了解一个方面最后合在一起反而比一个人做所有事情更全面。从工程角度讲这还有一个好处每个头独立计算可以并行。计算量几乎没增加但模型的表达能力大大提升。五、位置编码没有它Transformer就是个瞎子这里有一个很多人忽略的矛盾。注意力机制本身是完全不考虑词的顺序的。猫吃鱼和鱼吃猫在注意力机制看来词的集合一模一样词与词之间的关系模式也一样。但意思完全相反。所以Transformer必须通过额外的方式告诉每个词你在第几个位置。论文选择的方式是用sin和cos函数生成位置编码然后加到词向量上。为什么不直接用数字1, 2, 3...两个原因。第一简单整数会让模型误以为位置关系是线性的——位置1和2的距离等于位置100和101的距离。但语言不是这样工作的。在一句10个词的句子里位置1和位置3的关系跟一句100个词的句子里位置50和52的关系重要性完全不同。第二也是更重要的原因sin和cos有一个漂亮的数学性质。对于任意固定的偏移量ksin(xk)都可以用sin(x)和cos(x)的线性组合来表示。也就是说模型只需要学习一个线性变换就能从位置i的编码推导出位置ik的编码。这意味着模型可以自然地理解相对位置关系而不是死记绝对位置。这对语言的泛化能力非常重要。一个思考题后来很多模型比如GPT-3改用了可学习的位置编码直接让模型自己学一组位置向量。哪种更好答案是——可学习的更灵活但sin/cos的方式有一个优势遇到训练时没见过的更长序列sin/cos可以自然外推而可学习的位置编码会不知道第N1个位置该怎么编码。这也是为什么后来的RoPE旋转位置编码试图兼顾两者的优点。六、残差连接和LayerNorm深层网络的保命符Transformer的编码器和解码器各堆了6层每层包含自注意力前馈网络。GPT-3更是堆了96层。这么深的网络怎么保证梯度不会在反向传播中消失残差连接Residual Connection的做法极其简单把输入直接加到输出上。也就是 y F(x) x这样一来即使F(x)学到的变换把信号搞乱了x那条直接通道永远在。梯度在反向传播时可以直接沿着x这条高速公路跳过中间层不会消失。打个比方残差连接就像在每个楼层修了一个直达电梯。你可以走楼梯通过F(x)学习但如果楼梯坏了电梯还在。Layer Normalization做的事情更直白。它对每个样本的特征向量做三件事1. 减去均值2. 除以标准差3. 乘以一个可学习的gamma加上一个可学习的beta为什么要这样做因为经过多层变换后不同特征维度的数值范围可能差异巨大。就像你同时用公里和毫米来描述距离——数值差了六个数量级优化器很难工作。LayerNorm把所有维度拉回到同一个尺度上。为什么不用Batch NormalizationBN依赖一个batch内的统计量均值和方差。问题在于batch size小的时候统计量不稳定而且NLP任务的序列长度不一不同位置的统计量混在一起没有意义。LN对每个位置独立做标准化完美避开了这些问题。另外一个容易忽略的点原始Transformer用的是Post-LN先算F(x)再加x最后做LayerNorm后来的研究发现Pre-LN先做LayerNorm再算F(x)最后加x训练更稳定。GPT-2之后就全部改成了Pre-LN。一个小小的顺序调整影响了整个行业的实践。七、Transformer到底改变了什么让我们退后一步看看Transformer究竟带来了什么。训练效率的质变。因为完全去掉了循环结构所有位置可以并行计算。这意味着同样的算力可以训练大得多的模型。这是GPT系列能够scaling up的前提条件。长距离依赖的彻底解决。不管两个词隔多远注意力机制一步到位。这比RNN靠记忆逐步传递信息的方式强了几个数量级。架构的统一。在Transformer之前NLP几乎每个任务都需要定制架构。Transformer出现后同样的架构加上不同的训练策略就能处理翻译、摘要、问答、分类……几乎所有NLP任务。这个通用架构的理念直接催生了后来的预训练-微调范式。2017年的那篇论文正文不过寥寥数页。但它改变的不是某一个任务的效果而是整个AI的走向。从某种意义上说今天所有的大模型公司都在做同一件事用更大的数据、更多的算力去放大Transformer的潜力。架构本身从2017年到今天核心思想没有变过。这不是夸张这是事实。论文链接https://arxiv.org/abs/1706.03762kk的大模型论文学习笔记 · 第1篇 · Transformer