目录
第一步:如何让计算机找到词的关联性?把文字变成模型能够处理的“向量”。
第四步:如何计算第一组注意力?计算第一个词与其他词的关联程度(注意力机制)
如何准确理解Transformer 架构?
是一种基于注意力机制(attention mechanism)的神经网络架构,最初由Vaswani等人在论文《Attention Is All You Need》中提出。它在自然语言处理(NLP)领域取得了巨大成功,特别是在机器翻译任务中。
传统的循环神经网络(RNNs)和长短时记忆网络(LSTM)在处理长距离依赖关系时存在一些问题,而Transformer引入了自注意力机制来解决这些问题。自注意力机制允许模型在处理序列数据时关注输入序列中的不同位置,而不仅仅是当前位置。这使得Transformer能够并行处理输入序列,加速训练。
Transformer模型设计之初,用于解决机器翻译问题,是完全基于注意力机制构建的编码器-解码器架构,编码器和解码器均由若干个具有相同结构的层叠加而成,每一层的参数不同。编码器主要负责将输入序列转化为一个定长的向量表示,解码器则将这个向量解码为输出序列。Transformer总体架构可分为四个部分:输入部分、编码器、解码器、输出部分。
如果理解这句话“用电电电器电器会不会被电坏”?
人理解这句话的逻辑:第一个点是名词,第二个点是动词,必须完整的理解每个字在上下文中的意思。显然我们单独看每个字是无法判断其含义的,必须从整体关联入手。
transformer架构的核心思想就是如此。
第一步:如何让计算机找到词的关联性?把文字变成模型能够处理的“向量”。
transformer首先会做输入预处理,用分词工具,把句子拆分为最小的语义单元token(词元),每个token会被编码为一个512位的子向量,也就是用512个数表示一个向量。
第二步:如何判断每个词的出现顺序?位置编码。
由于这些词向量是同时输入模型的,模型无法判断它们的顺序,所以就需要为每个词向量添加位置编码来标记它们的先后顺序。这样我们就得到了一个“10乘512”的词向量组。我们用X来表示为此向量,那么模型是如何通过X找到每个词之间的关联?让词与词之间相互计算相似度。
举例子:
假设某公司要面试 3 位候选人,面试官会根据候选人的出场顺序和表现内容综合评分。3 位候选人的表现描述如下(按出场顺序排列):
- 候选人 A:“熟悉 Python 编程,有数据分析经验”
- 候选人 B:“擅长团队协作,沟通能力强”
- 候选人 C:“项目管理经验丰富,曾主导大型项目”
面试官的评分逻辑是:越先出场的候选人,若表现与岗位核心需求(如 “编程能力”)匹配,权重越高。因此,候选人 A(先出场 + 核心技能匹配)应得最高分,其次是 C,最后是 B。
第三步:如何找到词与词之间的相似度?QKV矩阵
三个权重矩阵Q,K,V分别和每个词向量相乘,生成???个向量。Q是查询向量代表当前词想关注什么,K是见向量表示这个词能提供的信息,你可以把它看作一个标签或索引,V它是值向量,表示这个词包含的实际信息内容,它是真正被检索和聚合的信息本身,接着用每一个词的Q向量分别和句子中所有词的K向量做点积。
第四步:如何计算第一组注意力?计算第一个词与其他词的关联程度(注意力机制)
为了避免梯度爆炸,让分数更合理,我们把计算出来的结果除以一个常数,得到一组注意力分数,然后再套用softmax,把分数归一化,要分数全部都保持在0到1之间,得到一组注意力。重这一组权重就反映了词与词之间的关联程度。比如这个“用”字和第一个“电”,它们的权重比较高,和第二个第三个电子它们的权重就低。如果我们把每一个词的V向量乘以及注意力权重的话,然后再把每一行进行加权求和,就得到了一组新的V向量。这一组V向量就包含了句子中的每个词,对其他的理解,整个计算的过程就叫做自注意力机制。
举例子:
一个部门领导(面试官)面试一个CTO候选人,这个面试官提出自己最关心的各类问题(Q),当问CTO候选人,候选人正面回答可以解决这个问题,就找到了索引(K),如果详细描述处理这个问题的处理方案就是V。对候选人的问题进行打分计算就是自主注意力机制。
自注意力机制(Self-Attention): 模型能够同时考虑输入序列中的所有位置,而不是像传统的固定窗口大小的卷积或循环神经网络一样逐步处理。 传统的神经网络在处理序列数据时,对每个位置的信息处理是固定的,而自注意力机制允许模型在处理每个位置时关注输入序列的其他部分,从而更好地捕捉全局信息。
第五步:如何用注意力机制理解一句话?单层的多头注意力机制
512维的向量X就被拆,分为了8个64位的向量,它们各自进行独立的自注意力算。最后我们再把这八个计算的结果进行拼接,拼接成一个10乘以512维的向量Z这一来这个项就包含了八个头独立计算的结果,能够从多个角度去整合复杂的语义信息。而这整个过程就叫做多头注意力机制,它是transformer的核心模块。经过这一系列的操作,一个句子中复杂的语义信息就被向量化了。
举例子:
8个部门领导(面试官)面试一个CTO候选人,每个面试官提出自己最关心的各类问题(Q),有财务、人力和法务等,同时问CTO候选人,候选人正面回答可以解决这个问题,就找到了索引(K),如果详细描述处理这个问题的处理方案就是V。每个人对候选人的问题进行打分计算就是多头自主注意力机制。
多头注意力机制:为了增强模型的表达能力,自注意力机制通常会使用多个独立的注意力头。每个头学习不同的查询、键、值权重矩阵,最后将多个头的输出拼接在一起并通过线性映射进行融合。
第六步:如何来理解一个长文本?多层的多头注意力机制
但是单层的多头自注意力机制处理一个句子还勉强够用。如果是处理一段话,一篇文章,他们处理长文本还是有点吃力的。所以模型通常还需要设置多层结构来学习更深层次的语义信息。但是多层神经网络容易出现梯度消失的问题。
第七步:如何保障神经网络稳定性?残差网络
简单来说,神经网络在训练的过程中,如果某一层训练的最优解释什么都不做它的输出Fx就等于0,这样就会导致梯度信息无法传播,相当于就只有少数几层神经网络在起作用,后面的就没有用了。
接下来我们还需要在每一层添加一个前馈神经网络FF对每一个向量A的每一个元素使用Relu激活函数进行非线性变化。那为什么要这么做呢?是因为之前的计算再怎么复杂,它输出的结果都是线性的,是一条直线。但是我们用了Relu进行非线性变化之后,这条线就拐弯了,甚至可以画出任何形状的曲线,拟合任意的复杂函数。经过前会神经网络之后,同样我们也在后面加一个残差网络和规划。经过N层这样的结构,最后输出向量X’的过程就称为编码器。经过N层这样的结构,最后输出向量X’以上过程,就称为编码器。
举例子:
部门领导(面试官)面试一个CTO候选人,CTO是个这个高管职位,需要考核和面试内容很多,比如带团队的能力和做项目等10多个维度。如果形成一套面试流程SOP,考核专业能力和项目经验,然后设置不同的考核指标,这样很容易匹配候选人的真实能力。这个高效率采集学习的方法就是梯度,但是如果每次都是随便问一下,就出现了梯度消失,为了弥补这个不足,就用上次第一个面试人的面试结果X作为这次部门领导的面试结果F(X),不容造成信息偏差。这中跳跃应用是残差网络的基本原理。
残差网络(Residual Network,简称 ResNet)是深度学习领域中具有里程碑意义的架构,由何凯明等人在 2015 年提出,主要解决了深层神经网络训练中的 “梯度消失 / 爆炸” 和 “性能退化” 问题,使得训练超深网络(如 152 层)成为可能。其核心原理是引入残差连接(Residual Connection),通过 “跳跃连接” 的方式让网络更易优化。
第八步:如何对每个位置的向量进行局部特征增强?前馈神经网络
多头自注意力机制的核心是通过计算输入序列中不同位置的 “关联度”,实现信息的交互与聚合(例如,让句子中 “苹果” 一词同时关注到描述其属性的 “红色”“甜的” 等信息)。但注意力机制本质上是线性变换(通过矩阵乘法计算注意力权重并加权求和),难以捕捉复杂的非线性关系(如语义中的歧义、上下文的反转等)。
注意力机制关注的是序列中跨位置的全局关联(例如,长句子中不同分句的联系),而前馈神经网络则更侧重对每个位置的信息进行局部细化。
前馈神经网络通常会先将输入向量的维度升高(通过从 512 维升到 2048 维),再降低回原维度(再压缩回 512 维):
注意力机制负责 “信息的全局交互与关联聚合”;前馈神经网络负责 “信息的非线性细化与特征增强”。
举例:用 “学生考试总分评定” 理解前馈神经网络的非线性特征提取
学生期末评分不是简单加和各科分数,而是要先判断 “是否满足基础条件”“核心科目是否达标”,再综合得出总分 —— 这个过程和前馈神经网络通过非线性逻辑提取关键特征、输出结果的原理完全一致,且步骤更简洁直观。
1. 输入层:收集 “单科原始分数”(对应神经网络输入数据)
假设某小学期末评分,先收集学生 3 门课的原始分数(满分 100 分),这些分数就是神经网络输入层的 “原始特征”,单独看没有关联:
- 语文:85 分(基础学科)
- 数学:60 分(核心学科)
- 体育:90 分(辅助学科)
2. 隐藏层:非线性筛选 “有效特征”(对应神经网络核心运算)
前馈神经网络的隐藏层会用 “非线性激活函数”(比如 “不满足条件则特征无效”)过滤、组合原始特征;这里的 “隐藏层” 就是老师的 “评分规则”——不是直接加和分数,而是先判断 “核心科目是否及格”“是否有科目严重拖后腿”,这就是典型的 “非线性特征提取”。
第一步:判断 “核心科目有效性”(第一层非线性逻辑)
规则:数学是核心科目,只有数学≥60 分,该科分数才计入总分;若数学<60 分,数学按 0 分算(一票否决核心有效性)。
- 学生数学 60 分(刚好及格)→ 数学有效,保留 60 分;
- 若学生数学 59 分(不及格)→ 数学无效,按 0 分算(即使其他科满分,核心科目不达标也会拉低总分)。
这一步的 “非线性” 体现在:不是 “数学分数直接加和”,而是 “满足‘及格’条件才有效”—— 就像神经网络里 “特征值低于阈值则激活为 0”,打破了 “线性叠加” 的简单逻辑。
第二步:判断 “基础科目最低要求”(第二层非线性逻辑)
规则:语文是基础科目,若语文<60 分,总分直接扣 20 分(基础能力不达标需额外惩罚);若语文≥60 分,语文分数正常保留。
- 学生语文 85 分(≥60)→ 保留 85 分,无额外扣分;
- 若学生语文 55 分(<60)→ 语文按 55 分算,但总分额外扣 20 分(即使数学及格,基础科目差也要承担后果)。
这一步的 “非线性” 体现在:不是 “语文分数直接加和”,而是 “根据分数是否达标,触发‘正常保留’或‘额外扣分’的不同规则”—— 类似神经网络里 “特征值不同区间对应不同输出” 的非线性映射。
第三步:判断 “辅助科目合理性”(第三层非线性逻辑)
规则:体育是辅助科目,体育≥80 分则按满分 100 分算(鼓励优秀);体育<80 分则按实际分数算(不惩罚,但不额外奖励)。
- 学生体育 90 分(≥80)→ 体育按 100 分算(奖励优秀);
- 若学生体育 75 分(<80)→ 按 75 分算(正常计入)。
这一步的 “非线性” 体现在:不是 “体育分数直接加和”,而是 “超过阈值则提升分数,未超过则保持原样”—— 对应神经网络里 “特征值高于阈值则激活为更高值” 的非线性激活。
3. 输出层:计算 “期末总分”(对应神经网络最终结果)
经过隐藏层的非线性特征提取后,所有 “有效特征”(处理后的各科分数)才能相加,得到最终总分:
- 处理后分数:语文 85 分 + 数学 60 分 + 体育 100 分 = 245 分(满分 300 分)。
如果用 “线性逻辑”(直接加和原始分数):85+60+90=235 分 —— 和非线性处理后的 245 分有明显差异,原因就是非线性逻辑捕捉到了 “核心科目必须及格、辅助科目优秀有奖励” 的关键规则,而线性逻辑只做了简单叠加。
一句话总结核心:非线性的作用
前馈神经网络的 “非线性”,就像老师评分时的 “规则判断”——不是把原始数据直接相加,而是先根据 “重要性、达标条件” 过滤、调整特征,再组合出有意义的结果。如果没有非线性,就像不管数学是否及格、体育是否优秀,都直接加和分数,根本无法体现 “核心科目优先、鼓励优势科目” 的真实评分逻辑,这和现实世界中 “不是所有数据都同等重要” 的规律完全一致。
第九步:编码器输出
编码器由N 个相同的编码器层堆叠而成(如原论文中 N=6),每个编码器层包含两个核心子层:多头自注意力层(Multi-Head Self-Attention) 和前馈神经网络(Feed-Forward Network),每个子层后均有残差连接和层归一化(Layer Normalization)。
1. 编码器的输入预处理
- 原始输入:英文句子 "I love apples"(3 个词)。
- 词嵌入(Word Embedding):将每个词转化为固定维度的向量(如维度 512),例如:
- "I" → [0.2, 0.5, ..., 0.1](捕捉 "我" 的基础语义)
- "love" → [0.8, 0.1, ..., 0.3](捕捉 "爱" 的基础语义)
- "apples" → [0.3, 0.7, ..., 0.9](捕捉 "苹果" 的基础语义)
- 位置编码(Positional Encoding):由于 Transformer 无循环结构,需通过公式生成位置向量,与词嵌入相加,区分词序(如第一个词加位置向量 P1,第二个加 P2),确保模型理解 "I love apples" 与 "apples love I" 不同。
- 最终输入到编码器层的向量:词嵌入 + 位置编码后的 3 个向量(维度均为 512)。
2. 编码器层的层级作用与输出
每个编码器层的作用是深化对源序列的语义理解,通过自注意力捕捉词与词的关联,再通过前馈网络提炼特征。
-
第一步:多头自注意力层
- 作用:让每个词 "关注" 序列中其他相关词,捕捉局部和全局依赖。
- 过程(以 "love" 为例):
- 计算 "love" 与 "I" 的注意力权重(高,因为 "love" 的动作发出者是 "I");
- 计算 "love" 与 "apples" 的注意力权重(高,因为 "love" 的对象是 "apples");
- 加权融合这两个词的向量,得到 "love" 的上下文感知向量(不仅包含自身语义,还融合了与 "I" 和 "apples" 的关系)。
- 输出:3 个经过注意力加权的向量(每个词的语义更丰富,包含与其他词的关联)。
-
第二步:残差连接与层归一化
- 作用:缓解梯度消失,稳定训练。
- 过程:将自注意力层的输出与原始输入向量(词嵌入 + 位置编码)相加,再进行层归一化(使向量分布更稳定)。
-
第三步:前馈神经网络
- 作用:对每个向量进行独立的非线性变换,提炼更抽象的特征(如将 "love apples" 合并为 "喜欢苹果" 的隐含语义)。
- 过程:通过两个线性层和激活函数(如 ReLU),将向量从 512 维映射到更高维度(如 2048)再映射回 512 维。
-
第四步:残差连接与层归一化
- 作用:同上,稳定前馈网络的输出。
3. 编码器的最终输出
经过 N 个编码器层后,输出编码向量序列(仍为 3 个向量,维度 512),每个向量包含对应词的全局语义:
- 第一个向量(对应 "I"):融合了与 "love" 的 "主体 - 动作" 关系;
- 第二个向量(对应 "love"):融合了与 "I" 的 "动作 - 主体" 和与 "apples" 的 "动作 - 对象" 关系;
- 第三个向量(对应 "apples"):融合了与 "love" 的 "对象 - 动作" 关系。
整体输出可理解为对 "I love apples" 的 "语义蓝图",供解码器参考。
第十步:解码器(Decoder):生成目标语言输出
解码器同样由N 个相同的解码器层堆叠而成,每个解码器层包含三个核心子层:掩码多头自注意力层(Masked Multi-Head Self-Attention)、编码器 - 解码器注意力层(Encoder-Decoder Attention)、前馈神经网络,每个子层后均有残差连接和层归一化。
解码器的目标是基于编码器的语义蓝图,逐步生成目标语言(中文)序列,生成过程是 "自回归" 的:每一步生成一个词,依赖上一步的输出。
1. 解码器的输入
每一步生成时,解码器的输入包括两部分:
- 已生成的目标序列(带位置编码的词嵌入):初始为起始标记
<start>
,后续加入上一步生成的词(如<start>
→<start> 我
→<start> 我 爱
...)。 - 编码器的最终输出:作为编码器 - 解码器注意力层的 "键(Key)" 和 "值(Value)",提供源语言的语义参考。
2. 解码器层的层级作用与分步输出(生成 "我爱吃苹果")
以生成过程的关键步骤为例,拆解每个层级的作用:
(1)生成第一个词 "我"
-
解码器输入:
- 已生成序列:
<start>
(词嵌入 + 位置编码,向量维度 512); - 编码器输出:上述 3 个编码向量。
- 已生成序列:
-
第一步:掩码多头自注意力层
- 作用:确保生成时只关注 "已生成的词"(避免提前看到未来的词),这里仅关注
<start>
。 - 输出:
<start>
的上下文向量(仅包含自身语义)。
- 作用:确保生成时只关注 "已生成的词"(避免提前看到未来的词),这里仅关注
-
第二步:残差连接与层归一化:稳定输出。
-
第三步:编码器 - 解码器注意力层
- 作用:让
<start>
"查询" 编码器输出,找到源序列中最相关的词。 - 过程:计算
<start>
与编码器 3 个向量的注意力权重,发现与 "I" 的权重最高(<start>
需要对应源语言的主语)。 - 输出:融合了 "I" 语义的向量(理解为 "起始位置应生成与 'I' 对应的词")。
- 作用:让
-
第四步:残差连接与层归一化:稳定输出。
-
第五步:前馈神经网络
- 作用:将融合后的向量映射为词表概率分布。
- 输出:词表中 "我" 的概率最高(因与 "I" 语义匹配)。
-
最终输出:"我"。
(2)生成第二个词 "爱"
-
解码器输入:
- 已生成序列:
<start> 我
(两个词的词嵌入 + 位置编码); - 编码器输出:同上。
- 已生成序列:
-
第一步:掩码多头自注意力层
- 作用:关注
<start>
和 "我" 的关系(确保语法连贯,如 "我" 之后应接动词)。 - 输出:"我" 的上下文向量(包含与
<start>
的关联)。
- 作用:关注
-
第三步:编码器 - 解码器注意力层
- 作用:让 "我" 查询编码器输出,找到与 "我" 相关的动作词。
- 过程:计算 "我" 与编码器向量的权重,与 "love" 的权重最高("我" 之后应接与 "love" 对应的动词)。
- 输出:融合了 "love" 语义的向量(理解为 "我" 之后应生成与 "love" 对应的词)。
-
最终输出:"爱"。
(3)生成第三个词 "吃"
-
解码器输入:
<start> 我 爱
。 -
编码器 - 解码器注意力层:
- 作用:让 "爱" 查询编码器输出,发现 "爱" 的对象是 "apples",但中文习惯在 "爱" 和 "苹果" 之间加 "吃" 衔接。
- 输出:融合了 "love" 和 "apples" 部分语义的向量(理解为 "爱" 之后需要过渡词)。
-
最终输出:"吃"(符合中文表达习惯)。
(4)生成第四个词 "苹果"
-
解码器输入:
<start> 我 爱 吃
。 -
编码器 - 解码器注意力层:
- 作用:让 "吃" 查询编码器输出,与 "apples" 的权重最高("吃" 的对象是 "apples")。
- 输出:融合了 "apples" 语义的向量。
-
最终输出:"苹果"。
(5)生成结束标记<end>
当模型判断序列完整时,输出<end>
,生成结束,最终结果为 "我爱吃苹果"。
总结
自注意力机制(Self-Attention):这是Transformer的核心概念之一,它使模型能够同时考虑输入序列中的所有位置,而不是像循环神经网络(RNN)或卷积神经网络(CNN)一样逐步处理。自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。
多头注意力(Multi-Head Attention):Transformer中的自注意力机制被扩展为多个注意力头,每个头可以学习不同的注意权重,以更好地捕捉不同类型的关系。多头注意力允许模型并行处理不同的信息子空间。
堆叠层(Stacked Layers):Transformer通常由多个相同的编码器和解码器层堆叠而成。这些堆叠的层有助于模型学习复杂的特征表示和语义。
位置编码(Positional Encoding):由于Transformer没有内置的序列位置信息,它需要额外的位置编码来表达输入序列中单词的位置顺序。
残差连接和层归一化(Residual Connections and Layer Normalization):这些技术有助于减轻训练过程中的梯度消失和爆炸问题,使模型更容易训练。
编码器和解码器:Transformer通常包括一个编码器用于处理输入序列和一个解码器用于生成输出序列,这使其适用于序列到序列的任务,如机器翻译。