Transformer是什么?架构是怎么样的?为什么说Attention is all you need?
假设2050年,AI取代了人类,成为了蓝星扛把子,而人类正好又发明了时光机。
答应我,回到2017年,阻止那篇名叫《Attention is all you need》论文发表,没有它,就没有Transformer架构,也就没有后来的gpt,deepseek这些大模型。
这论文的含金量,就连我写的那本畅销书《趣味网络图解》都得避其锋芒,退让三分。
今天我们就假装不了解Transformer是什么,来看下它的原理到底是怎么样的。
看之前,你点赞了吗?关注了吗?谢谢!
从翻译问题说起
「货拉拉拉不拉拉布拉多」,短短10个字里有6个「拉」字,含拉量达到惊人的百分之60。人一看就能理解它的意思,所以很自然就能翻译成英文: Can Huolala carry a Labrador。注意,关键是「理解」,所以才能翻译。
那么问题就来了,计算机该如何理解一句话里每个词的含义?
token 与向量
我们知道,计算机只认识01这样的数字。所以在翻译之前,需要把文本变成数字。
最简单的方法是,将文本挨个字, 转成对应的数字编号,比如Unicode编码。
但这有个问题,编号只是个纯数字,不能承载任何语义信息,所以两个数字编号之间也不会有什么语义关联。
所以我们需要一种既能数字化,又能承载语义的方案。怎么办呢?
首先将这句话切分成多个词块,每个词块叫一个 token。
比如这句话会被切成「货拉拉」「拉不拉」「拉布拉多」三个 token。
然后想象有这么一个二维坐标系,x轴表示"是否和交通相关",y轴表示"是否和动物相关"。那么「货拉拉」会落在x轴正方向,「拉布拉多」会落在y轴正方向。"物流平台""网约车"这类词在坐标系上会更靠近「货拉拉」,而"金毛""牧羊犬"则会更靠近「拉布拉多」。
但只有两个维度不够,无法表达复杂的语义关系。比如「货拉拉」「物流平台」「网约车」在二维里都和交通相关,靠得很近。但如果加入第三维"是否运货",「货拉拉」和「物流平台」偏向运货物,「网约车」偏向运人,它们就被区分开了。
随着维度的增多,世界上所有已知词汇的 token 都能在这个多维坐标系里找到属于自己的位置。通过海量语料训练,就可以做到语义相近的词在坐标系空间中靠得很近,语义无关的词则离得很远。
词和词之间的关系还能通过数学方式计算出来。比如"国王"的坐标减去"男人"加上"女人",得到的结果会非常接近"王后"的坐标。
至于「拉不拉」这种多义词,它在坐标系里只是一个模糊的平均位置,只有结合前后词之后,它的位置才会被"拉"向正确的语义区域。
每个坐标维度都可以表示为数字,所以每个token,都可以用一组数字来表示,这种表示方式就是 vector, 也叫向量,实践中也经常被叫做embedding。
但语言不仅有词义,还有顺序。比如「货拉拉」和「拉布拉多」顺序颠倒时,意思就会完全不同。所以模型还会为每个 token 加入位置信息,让向量同时包含"它是什么"和"它在什么位置"。
Q、K、V 是什么
知道了每个token对应的向量,我们就可以考虑翻译的事情。
但问题就又来了,在翻译「拉不拉」这种多义词时,怎么结合上下文,判断这个「拉」究竟是 carry,还是 drag呢。
我们知道,每个词块除了表面上的字面意思,还有背后含义。比如拉布拉多,除了字面意思,背后的含义有宠物,狗等。
所以我们可以把一句话,抽象成一个"词块数据库"。数据库的查询键key就是词块本身,value就是词块背后的含义。
那么计算机在理解「拉不拉」时,应该重点关注哪些词。就可以抽象为拿着「拉不拉」这个词,去词块数据库里挨个遍历一遍,看哪个词对「拉不拉」参考价值更大。
注意这个过程中有三个概念,查询,键,值。但直接拿token的向量去做这三件事不够灵活,因为一个向量要同时扮演三个角色。所以我们通过三个权重矩阵wq, wk, wv的变换,让每个token的向量,分别变成三个专门的向量,各司其职。
其中承担查询角色的,叫Q,代表的是"这个token想关注什么"。就像数据库的查询SQL。
承担键角色的,叫K,代表的是"这个token能提供什么信息"。就像数据库里的查询键。
承担值角色的,叫V,代表的是"这个token背后的真正含义",就像数据库里的查询键对应的值。
每个token通过三次变换,可以得到各自的QKV。
注意力是什么
有了每个token的QKV之后, 我们看下怎么用它们进行计算。
首先,每个token的Q都会遍历句子中所有token的K,用点积计算相关程度。就像这样。
点积说白了就是相乘,从数学上看,其实就是在计算两个向量在坐标系里指向是否一致,越同向,数值就越大;从效果上看,就是两者相关程度越高,说明这个 token 越值得被重点参考,可以多关注它。
比如针对「拉不拉」这个 token,遍历结束后,就能知道「拉不拉」对整个句子中所有 token 的关注程度。
此时计算机就会发现「拉不拉」和「货拉拉」之间的相关性很高,那么「拉不拉」就会更关注「货拉拉」,所以后续"拉货"这一含义就会被显著放大。
如果向量维度较大,这些点积结果可能会整体偏大,容易导致某一个 token 的关注程度被放大得过于极端。为了让不同 token 之间的关注差异更容易被区分,模型会在点积之后除以维度的开方√dₖ,这一步被称为 scale。
接下来,模型会对这些关注程度做一次 softmax,把它们转换成一组权重。这样一来,「拉不拉」对所有 token 的关注程度之和就是 1,可以理解为“注意力分配比例”。
最后,再用这组权重去加权所有 token 的 V 向量。相当于知道了「拉不拉」这个token 应该以多大的权重,从其他 token 那里取哪些信息。
最终得到的结果,就是「拉不拉」这个 token 融合了上下文信息之后的表示,我们可以把它记作 h2。「货拉拉」和「拉布拉多」也会以同样的方式,分别得到各自的 h1 和 h3。
这一整套计算过程,就是所谓的注意力机制。可以用这段公式来表示
Attention(Q, K, V) = softmax(QKᵀ / √dₖ) · V它可以让每个 token 根据当前语境,自动决定应该重点参考其他哪些 token。
怕你们还是理解不了,我再总结下。
Q · K 点积用来计算 token 之间,关注谁、关注程度;
scale是为了防止点积数值过大,避免 softmax 饱和、梯度消失,让模型训练更稳定;
softmax 把关注程度转换成注意力权重,也就是概率分布;
再乘以 V,用这些权重从被关注的 token 中, 提取并融合“具体的语义内容”。
多头注意力
但只算一次注意力是不够的。因为词与词之间的关系是多样的,有的是语义上的关联,有的是语法结构上的依赖,单一角度很难捕捉全面。
所以模型会并行地做多次注意力计算,每一次关注不同的侧重点。这些并行计算的结果最终会被拼接在一起,这就是多头注意力。
Add & Norm 是什么
通过多头注意力,我们就将原句里的各种语义信息,通过向量表示了出来。
接着模型首先会把注意力的结果和原始输入相加,确保 token 自身的信息不会被覆盖掉。这一步叫 Add,残差网络。
接着,为了让数值保持在0到1之间,模型会对结果做一次统一调整,这一步通常被称为 Norm,归一化。
这样做既保留原有信息,又避免数值在多层计算后失控。
前馈网络是什么
经过残差连接和归一化处理后,从原始输入到当前输出的映射关系仍然是线性的,可以理解为:不同 Token 向量的变换路径,都是笔直的直线,没法捕捉复杂的语义关联。为了让模型具备更强的表达能力,拟合自然语言里非线性的语义关系,模型会让向量通过前馈网络,FFN,它的核心作用,是通过ReLU 等激活函数,把「线性的映射路径」掰弯,变成非线性的曲线。
随后同样会再接一次 Add 和 Norm。
编码器是什么
多头注意力、Add & Norm、前馈网络、再一次 Add & Norm,共同构成了 一个编码层。
一个编码层能让模型对整句话形成一次上下文理解。多个编码层堆叠起来,模型对语义的理解就会逐层加深。
多个编码层组成一个编码器。
编码器的最终输出,是一组向量,它们是原句的各个词块,融合了上下文语义信息之后的数字表现形式。它是计算机对输入文本的整体语义理解。
翻译原理
接下来就是基于编码器输出的整体语义理解,开始翻译成英文。
生成英文时,我们会放入一个固定的起始符号 <BOS>,它表示"英文从这里开始翻译",接着模型会结合编码器输出的中文理解,预测最合理的第一个英文词。这个例子中生成的是 Can。接着模型会把 <BOS> 和 Can 一起作为输入,预测下一个词 Huolala,依此类推。每一步都是在已有结果的基础上,预测下一个最合理的英文词,就像成语接龙。
这个过程需要解决两个问题。
第一个问题是,新生成的词怎么和已经写下的英文内容衔接,保证语法和表达连贯。
好办,用注意力机制解决。毕竟大佬说过,Attention is all you need, 我们还是将一句话,理解成词块数据库。
Q是当前要翻译单词的位置。KV呢?
既然要保证英文衔接自然连贯,那模型只关注已经生成的英文就够了,所以kv来自英文构成的词块数据库。这就相当于预测第 n 个词时只依赖前 n−1 个词的结果,保证生成过程从左到右,就像掩盖了后面部分, 做词语预测一样,所以叫 带掩码的多头自注意力。
第二个问题是,在原句已经理解好的整体语义中,此刻翻译最该参考原句哪部分信息。同样还是用注意力去解决,Q还是当前要翻译单词的位置, 而KV自然就来自中文构成的词块数据库。
比如在已经生成 Can Huolala 之后,再来翻译「拉不拉」时,由于编码器输出的中文理解中,它和运货相关的信息关联更强,因此更可能翻译成 carry,而不是 pull 或 drag。这部分叫 多头交叉注意力。
解码器是什么
这两次注意力计算之后,输出结果都会经过残差网络和归一化,以及前馈网络这些流程。每一步的作用都和前面处理中文时几乎一致。我就不重复了
这些组件共同构成了一个 解码层。多个这样的解码层堆叠在一起,形成完整的 解码器。每一层都在上一层输出的基础上进一步加工表示,使生成的英文序列在语法、语义和上下文理解上更准确。
最终会将解码器输出的向量,通过词表转成可读的文字,也就是英文输出。
Transformer是什么
编码器和解码器配合工作,共同完成了翻译任务。
这就是 Transformer的经典架构。
之所以说是经典,是因为并不是所有任务都需要编码器和解码器同时存在。
如果只需要理解文本,不需要生成,那只用编码器就够了。比如有名的BERT,专门用来做文本分类、情感分析这类理解任务。
而像ChatGPT、DeepSeek,这种大模型,直接将用户输入的问题,给到解码器做理解,然后一个词一个词地往后生成内容,省略了独立的编码器,变成了纯解码器架构。
而且大模型也能做翻译,所以像前面提到的编码器+解码器的完整架构,在后续应该主要用于小模型和低资源场景。
现在大家通了吗?
好啦,如果你觉得这期视频对你有帮助,记得转发给你那不成器的兄弟。文字版的笔记,见评论区。
最后遗留一个问题,你知道神经网络跟人类大脑有什么关系吗
点赞超过 1w,下期聊聊这个话题。
这里是小白debug,我们聚焦一切可能影响人类历史进程的技术。
如果你感兴趣,记得关注!我们下期见!