系列文章见: 《回忆AI时代-从图灵机到人工智能》
文章目录
大模型的奠基之作《Attention Is All You Need Transformer》(中文译“注意力就是你所需要的一切”)是2017年由谷歌八位科学家联合发表的一篇里程碑式机器学习研究论文。论文中提出了自注意力机制的深度学习框架Transformer,如今已经成为大多数大模型的核心基础,可以处理文本、代码、音频和视频类数据等。
Transformer架构与工作原理
以下是Transformer的工作流程,图的左边是输入信息,右边是输出信息。
Transformer整个工作流程共分为三大部分:
- 嵌入词向量(Embedding)
- 编码器(Encoder)
- 解码器(Decoder,包含Linear与Softmax输出)
一. 嵌入词向量(Embedding)
我们以输入什么是机器学习? 为例,来看一下Transformer的工作流程:
- 分词
- Tokenizer(转Token ID)
- 转词向量(Embedding)
- 加位置编码。
1.1 分词
首先对输入进行分词,分词后的结果如下:
1 | [什么] [是] [机器] [学习] |
1.2 Tokenizer
Tokenizer会把分词转成Token ID(注:Token ID只是一个编号,没有任何语义)。
1 | Token Token ID |
大模型按照输入Token数量+输出Token数量进行计费,而Token数量由对应模型的Tokenizer决定。
1.3 转词向量
Embedding查表转词向量。因为计算机不能理解语言的本身,它只能理解数字,因此要把语言转成计算机理解的数字。
我们也可以理解一个身份证,Token ID更像身份证号码,只负责唯一标识,Embedding更像一个人的完整档案,里面包含年龄、职业、性格等大量信息。
从Token ID转换向量的过程,以“机器“为例:机器 -> token id(927) -> Embedding([0.80, 0.30, 0.20, 0.10]),其它分词的文字也一样的转换过程,最终转换的结果如下:
1 | 什么 -> [0.20, 0.50, 0.30, 0.80] |
需要注意的是,这是案例只转换了四维,真实模型例如GPT模型,可能是3072维或者4096维甚至更高的12288维。
1.4 词的位置编码
同一个词可能出现在不同的位置,譬如:
1 | 我 爱 你 |
Embedding后可能是:
1 | 我 |
Transformer如果没有位置编码,这两个句子得到的是同一组词向量集合,模型无法区分词序,所以在计算时,希望最终得到的是既包含“词义”也包含“位置”。
Transformer会给每个位置也准备一个向量,譬如。
1 | P0: [0.10, 0.20, 0.30, 0.40] |
注:在论文中位置编码并非一个数字,而是PE(pos,2i)=sin(...)和PE(pos,2i+1)=cos(...)
Embedding是4维,位置编码也必须4维。然后对位置相加:
1 | Embedding:[0.20, 0.50, 0.30, 0.80] |
最终输入Attention,这时Transformer就知道如果是是同一个词,但它出现在不同的位置。
1.5 整个工作流程
用一句话总结这几步就是输入 → 理解 → 生成 → 打分 → 输出循环这个过程。再来看一下整个工作流程:
1 | 以 "机器" 为例 |
二. 编码器(Encoding)
进入编码器环节,主要经过以下四个流程:
- 2.1 Multi-Head-Attention (多头注意力机制)
- 2.2 Residual Connection(残差连接)
- 2.2 Layer Normalization(层归一化)
- 2.3 FFN(Feed-Forward Network,前馈神经网络)
2.1 Multi-Head-Attention
Multi-Head-Attention (中文译“多头注意力机制”)。以下是Embedding + 位置信息后的向量,输入给Attention:
1 | 什么 -> [0.20, 0.50, 0.30, 0.80] |
以“机器”为例,模型不知道“机器”和“学习”的关系是什么,在Encoding这一步Attention会问为了理解”机器”,我应该找谁、我有什么特点和我的内容是什么,它的公式如下:
公式输入三个向量:
- Query(Q) 我想找谁?
- Key(K) 我有什么特点?
- Value(V) 我的真正内容是什么?
通过公式找到词上下文中关联最多的词。“机器”一词与谁关联最大,结论是学习。
1 | 机器 -> 什么 计算结果 5% |
模型认为理解”机器”的时候,最重要的是”学习”。反过来理解“学习”:
1 | 学习 -> 什么 计算结果 8% |
于是“机器”与“学习”相互关注,建立上下文关系。
更新向量,原来“机器”的向量经过多头注意力机制后会参考“学习”的向量,最终得到新的向量。
1 | 机器 -> [0.6 0.9 0.8 0.5] |
新的向量表示“机器”在这句话里的意思,而非词典中的意思。同样”学习“也是一样,它吸收了”机器“的位置信息会更新自己的位置信息。
2.2 Residual Connection
Residual Connection(中文译“残差连接”),残差连接做的是不会把原来的信息丢掉,而是在学习的信息基础上,加回原来的信息。
它的公式也非常简单y=x+F(x),其中:
- x:输入
- F(x):Attention或FFN学出来的新内容
- y:最终输出
譬如,“机器”的向量[0.60, 0.90, 0.80, 0.50],在Attention后是[0.10, -0.20, 0.30, 0.40],那残差连接做的事儿,原来的:[0.60,0.90,0.80,0.50] + Attention输出[0.10,-0.20,0.30,0.40] = 最终 [0.70,0.70,1.10,0.90]。
我们对比一下有残差连接和没有的区别:
- 没有残差连接:路径(输入 -> Attention -> FFN -> Attention -> FNN -> 循环几十层), 原来的信息都会改变一点,最后模型可能已经”忘了”最开始的信息。更严重的是梯度越来越小,训练越来越困难,这就是以前很多深层神经网络训练失败的重要原因。
- 有残差连接:路径(输入 -> Attention -> 加回输入 -> FFN -> 再加回输入),即使Attention学得不好,至少还有原来的信息。
所以,残差连接主要解决是保护原始信息,让梯度更容易传播,从而训练更深的网络。
2.3 Layer Normalization
Layer Normalization(中文译“层归一化”),是把每个Token的向量调整到比较稳定的数值范围,譬如Attention输出:
- “机器”的向量[10,20,35,40]
- “学习”的向量[0.01,0.02,0.03,0.05]
如果直接送给下一层,一部分数特别大一部分特别小导致训练不稳定,所以要做一次”归一化”。归一化的数学公式:
其中:
- μ(均值)
- σ(标准差)
- γ(缩放)
- β(平移)
- 计算”机器“的均值:
1 | (10+20+35+40)=105 |
结论 μ = 26.25
- 减去均值(中心化)
每个元素都减去26.25。
1 | 10-26.25=-16.25 |
得到[-16.25, -6.25, 8.75, 13.75]
- 计算方差
1 | (-16.25)² = 264.0625 |
求平均:(264.0625+39.0625+76.5625+189.0625) =568.75; 568.75÷4 = 142.1875得出最终方差 σ²=142.1875。
计算标准差
σ = 142.1875 开根号 = 11.924。归一化,计算:
1 | -16.25÷11.924=-1.363 |
最中得到 [-1.363, -0.524,0.734,1.153]。 同样学习也是以上方法计算,计算结果。
| Token | LayerNorm 前 | LayerNorm 后 |
|---|---|---|
| 机器 | [10,20,35,40] | [-1.363,-0.524,0.734,1.153] |
| 学习 | [0.01,0.02,0.03,0.05] | [-1.183,-0.507,0.169,1.521] |
LayerNorm不会改变向量表达的相对关系,而是把每个Token的数值调整到相近的分布范围均值约为0、标准差约为1。这样,无论前一层输出的是很大的数还是很小的数,下一层都能在稳定的数值范围内继续学习。
2.4 Feed-Forward Network
Feed-Forward Network(简称“FFN”,中文译“前馈神经网络”)。经过多头注意力机制后,Transformer已经知道了词与词之间的关系。既然已经知道上下文,那怎样把这个语义表达得更准确,这就是Feed-Forward Network。
前者多头注意力机制:
1 | "机器"去看看:[什么] [是] [机器] [学习] |
这里的机器的向量是在本句话中的向量。
后者前馈神经网络。
1 | 拿到新的机器向量 |
前馈神经网络的数学公式FFN(x)=W₂σ(W₁x+b₁)+b₂,虽然看起来复杂,其实可以拆成三步:
- 第一步:放大维度
- 第二步:激活函数
- 第三步:压缩回来
第一步:放大维度
先经过第一层“W₁x+b₁” ,4维变16维,高维空间能够容纳更多不同方向的语义特征,让模型学习到更多特征,因此模型拥有更强的表达能力。
1 | 机器 [0.60 0.90 0.80 0.50] |
譬如,它扩展了更多与机器相关的表达信息:
1 | 更加丰富的语义组合 |
维度越高,可以表达的信息越丰富,而真实的的GPT可能在3072维或更高的12288维。
第二步:激活函数
准备Linear,相关步骤:
- 输入向量矩阵,譬如“机器”的向量
- W矩阵在模型初始化时随机生成,随后通过大量训练不断更新,推理阶段使用的是已经训练好的参数。
- Bias(偏置)
- 点积
- 激活函数
- “机器”的向量:
1 | 机器向量 [0.60, 0.90, 0.80, 0.50] |
- 矩阵里是系统随机生成的数:
1 | W 矩阵=[ |
Bias(偏置)b = [0.1, 0.2, 0.3]。
计算点积,其实就是矩阵乘法:
1 | 4维: [0.60 0.90 0.80 0.50] |
计算过程:
- 取W第一列为例(2,1,0,1)做点积(0.60×2 + 0.90×1 + 0.80×0 +0.50×1 =2.6),第一列结果就是2。6,以此类推计算其他列。 这里之所以机器向量行 * w矩阵列就是要做点积。
- Bias是[0.1,0.2,0.3] + 点积[2.60,0,4.30] = [2.70,0.20,4.60]
- 激活函数
激活函数的公式ReLU(x)=max(0,x)。
输入[2.70, 0.20, 4.60],经过ReLU得到[2.70, 0.20, 4.60]因为都大于 0,所以没有变化。假设Linear[-1.5, 0.2, 4.6],那结果就会变成[0,0.2,4.6],负数全部变为0。
2.5 整个工作流程
1 | 输入信息 |
三. 解码器
共分为五步:
- 3.1 读取内容
- 3.2 多头注意力机制
- 3.3 读取解码器的理解结果
- 3.4 前馈神经网络
- 3.5 Softmax转换概率
3.1 读取内容
解码器首先读取已经生成的内容<BOS> 机器 学习 是 然后经过Output Embedding + Position Encoding转成向量。
3.2 Masked Multi-Head-Attention (多头注意力机制)
为了预测下一个词,我前面已经写了什么?
1 | 机器 -> 学习 -> 是 |
多头注意力机制会计算”是“与上文”机器学习“的关联项最强。
3.3 读取解码器的理解结果
仅知道自己已经写了什么还不够还要知道用户真正问了什么?所以解码器会读取编码器的输出,即”什么是机器学习“。解码器会关注:
1 | 机器★★★★★ |
于是知道当前回答应该围绕”机器学习”展开,而不是回答其它内容。
3.4 Feed-Forward Network
得到上下文后,FFN(Feed-Forward Network)会进一步优化每个Token的表示。经过FFN后,模型会得到更加准确的语义表示。
3.5 Softmax转换概率
Decoder输出隐藏向量[0.81,0.42,0.73,…],经过Linear-> Softmax得到整个词表的概率:
| Token | 概率 |
|---|---|
| 一种 | 86% |
| 一个 | 5% |
| 数据 | 2% |
| AI | 1% |
于是生成下一个次”一种“。 重复以上过程:
1 | Masked Attention |
最终生成”机器学习是一种让计算机自动学习数据规律的技术“。
| 已生成 Token | 下一步预测 |
|---|---|
<BOS> |
机器 |
<BOS> 机器 |
学习 |
<BOS> 机器 学习 |
是 |
<BOS> 机器 学习 是 |
一种 |
<BOS> 机器 学习 是 一种 |
让 |
<BOS> 机器 学习 是 一种 让 |
计算机 |
<BOS> 机器 学习 是 一种 让 计算机 |
自动 |
<BOS> 机器 学习 是 一种 让 计算机 自动 |
学习 |
| … | … |
最后生成 <EOS> |
停止 |
3.6 整个工作流程
1 | 已经生成的 Token |
四. 编码器与解码器
Encoder与Decoder对比。
| 编码器(Encoder) | 解码器(Decoder) |
|---|---|
| 阅读整篇输入 | 一边生成一边阅读 |
| 使用Self-Attention | 使用Masked Self-Attention |
| 理解输入含义 | 根据上下文生成输出 |
| 输出隐藏表示 | 输出下一个Token |