大模型时代的奠基之作-Attention Is All You Need

系列文章见: 《回忆AI时代-从图灵机到人工智能》

文章目录

大模型的奠基之作《Attention Is All You Need Transformer》(中文译“注意力就是你所需要的一切”)是2017年由谷歌八位科学家联合发表的一篇里程碑式机器学习研究论文。论文中提出了自注意力机制的深度学习框架Transformer,如今已经成为大多数大模型的核心基础,可以处理文本、代码、音频和视频类数据等。

Transformer架构与工作原理

以下是Transformer的工作流程,图的左边是输入信息,右边是输出信息。
Transformer

Transformer整个工作流程共分为三大部分:

    1. 嵌入词向量(Embedding)
    1. 编码器(Encoder)
    1. 解码器(Decoder,包含Linear与Softmax输出)

一. 嵌入词向量(Embedding)

我们以输入什么是机器学习? 为例,来看一下Transformer的工作流程:

  • 分词
  • Tokenizer(转Token ID)
  • 转词向量(Embedding)
  • 加位置编码。

1.1 分词

首先对输入进行分词,分词后的结果如下:

1
[什么] [是] [机器] [学习]

1.2 Tokenizer

Tokenizer会把分词转成Token ID(注:Token ID只是一个编号,没有任何语义)。

1
2
3
4
5
Token       Token ID
什么 ------> 328
是 ------> 15
机器 ------> 927
学习 ------> 1420

大模型按照输入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
2
3
4
什么  -> [0.20, 0.50, 0.30, 0.80]
是 -> [0.10, 0.90, 0.40, 0.60]
机器 -> [0.80, 0.30, 0.20, 0.10]
学习 -> [0.70, 0.60, 0.50, 0.20]

需要注意的是,这是案例只转换了四维,真实模型例如GPT模型,可能是3072维或者4096维甚至更高的12288维。

1.4 词的位置编码

同一个词可能出现在不同的位置,譬如:

1
2
我 爱 你
你 爱 我

Embedding后可能是:

1
2
3



Transformer如果没有位置编码,这两个句子得到的是同一组词向量集合,模型无法区分词序,所以在计算时,希望最终得到的是既包含“词义”也包含“位置”。

Transformer会给每个位置也准备一个向量,譬如。

1
2
3
P0: [0.10, 0.20, 0.30, 0.40]
P1: [0.30, 0.10, 0.20, 0.50]
...

注:在论文中位置编码并非一个数字,而是PE(pos,2i)=sin(...)和PE(pos,2i+1)=cos(...)

Embedding是4维,位置编码也必须4维。然后对位置相加:

1
2
3
4
5
Embedding:[0.20, 0.50, 0.30, 0.80]
+
Position0:[0.10, 0.20, 0.30, 0.40]
=
Result: [0.30, 0.70, 0.60, 1.20]

最终输入Attention,这时Transformer就知道如果是是同一个词,但它出现在不同的位置。

1.5 整个工作流程

用一句话总结这几步就是输入 → 理解 → 生成 → 打分 → 输出循环这个过程。再来看一下整个工作流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
以 "机器" 为例
Token ID


Embedding 查表


[0.80 0.30 0.20 0.10]


├───────────────┐
│ │
▼ ▼
词向量 第2个位置
[0.50 0.20 0.10 0.30]


对应元素逐个相加


[1.30 0.50 0.30 0.40]


输入到 Attention

二. 编码器(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
2
3
4
什么  -> [0.20, 0.50, 0.30, 0.80]
是 -> [0.10, 0.90, 0.40, 0.60]
机器 -> [0.80, 0.30, 0.20, 0.10]
学习 -> [0.70, 0.60, 0.50, 0.20]

以“机器”为例,模型不知道“机器”和“学习”的关系是什么,在Encoding这一步Attention会问为了理解”机器”,我应该找谁、我有什么特点和我的内容是什么,它的公式如下:

Attention

公式输入三个向量:

  • Query(Q) 我想找谁?
  • Key(K) 我有什么特点?
  • Value(V) 我的真正内容是什么?

通过公式找到词上下文中关联最多的词。“机器”一词与谁关联最大,结论是学习。

1
2
3
机器 -> 什么  计算结果 5%
机器 -> 是 计算结果 10%
机器 -> 学习 计算结果 70%

模型认为理解”机器”的时候,最重要的是”学习”。反过来理解“学习”:

1
2
3
学习 -> 什么   计算结果 8%
学习 -> 是 计算结果 5%
学习 -> 机器 计算结果 80%

于是“机器”与“学习”相互关注,建立上下文关系。

更新向量,原来“机器”的向量经过多头注意力机制后会参考“学习”的向量,最终得到新的向量。

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]

如果直接送给下一层,一部分数特别大一部分特别小导致训练不稳定,所以要做一次”归一化”。归一化的数学公式:

Transformer

其中:

  • μ(均值)
  • σ(标准差)
  • γ(缩放)
  • β(平移)
  1. 计算”机器“的均值:
1
2
(10+20+35+40)=105
105÷4=26.25

结论 μ = 26.25

  1. 减去均值(中心化)
    每个元素都减去26.25。
1
2
3
4
10-26.25=-16.25
20-26.25=-6.25
35-26.25=8.75
40-26.25=13.75

得到[-16.25, -6.25, 8.75, 13.75]

  1. 计算方差
1
2
3
4
(-16.25)² = 264.0625
(-6.25)² = 39.0625
8.75² = 76.5625
13.75² = 189.0625

求平均:(264.0625+39.0625+76.5625+189.0625) =568.75; 568.75÷4 = 142.1875得出最终方差 σ²=142.1875

  1. 计算标准差 σ = 142.1875 开根号 = 11.924

  2. 归一化,计算:

1
2
3
4
-16.25÷11.924=-1.363
-6.25÷11.924=-0.524
8.75÷11.924=0.734
13.75÷11.924=1.153

最中得到 [-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
2
3
4
5
"机器"去看看:[什么] [是] [机器] [学习]

知道:[学习]最重要。

得到新的机器向量

这里的机器的向量是在本句话中的向量。
后者前馈神经网络。

1
2
3
4
5
6
7
8
9
拿到新的机器向量

进一步分析

加强有用的信息

减弱无关的信息

输出更加准确的新向量

前馈神经网络的数学公式FFN(x)=W₂σ(W₁x+b₁)+b₂,虽然看起来复杂,其实可以拆成三步:

  • 第一步:放大维度
  • 第二步:激活函数
  • 第三步:压缩回来

第一步:放大维度
先经过第一层“W₁x+b₁” ,4维变16维,高维空间能够容纳更多不同方向的语义特征,让模型学习到更多特征,因此模型拥有更强的表达能力。

1
2
机器 [0.60 0.90 0.80 0.50]
机器 [0.60 0.90 0.80 0.50 0.61 0.10 1.80 1.51 ...]

譬如,它扩展了更多与机器相关的表达信息:

1
2
3
4
更加丰富的语义组合
更多上下文特征
更加细粒度的表达能力
...

维度越高,可以表达的信息越丰富,而真实的的GPT可能在3072维或更高的12288维。

第二步:激活函数
准备Linear,相关步骤:

  • 输入向量矩阵,譬如“机器”的向量
  • W矩阵在模型初始化时随机生成,随后通过大量训练不断更新,推理阶段使用的是已经训练好的参数。
  • Bias(偏置)
  • 点积
  • 激活函数
  1. “机器”的向量:
1
机器向量 [0.60, 0.90, 0.80, 0.50]
  1. 矩阵里是系统随机生成的数:
1
2
3
4
5
6
W 矩阵=[
[ 2, 0, 1],
[ 1, -2, 2],
[ 0, 1, 3],
[ 1, 2, -1]
]
  1. Bias(偏置)b = [0.1, 0.2, 0.3]。

  2. 计算点积,其实就是矩阵乘法:

1
2
3
4
5
6
7
8
9
4维: [0.60 0.90 0.80 0.50]
×
W 矩阵
[
[ 2, 0, 1],
[ 1, -2, 2],
[ 0, 1, 3],
[ 1, 2, -1]
]

计算过程:

  • 取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]
  1. 激活函数
    激活函数的公式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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 输入信息 


Multi-Head Attention


Residual Connection(残差连接)


Layer Normalization(层归一化)


Feed Forward Network(FFN)


Residual Connection(残差连接)


Layer Normalization(层归一化)


输出

三. 解码器

共分为五步:

  • 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
2
3
4
5
机器★★★★★

学习 ★★★★★

什么 ★☆☆☆☆

于是知道当前回答应该围绕”机器学习”展开,而不是回答其它内容。

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
2
3
4
5
6
7
8
9
Masked Attention

Cross Attention

FFN

Linear

Softmax

最终生成”机器学习是一种让计算机自动学习数据规律的技术“。

已生成 Token 下一步预测
<BOS> 机器
<BOS> 机器 学习
<BOS> 机器 学习
<BOS> 机器 学习 是 一种
<BOS> 机器 学习 是 一种
<BOS> 机器 学习 是 一种 让 计算机
<BOS> 机器 学习 是 一种 让 计算机 自动
<BOS> 机器 学习 是 一种 让 计算机 自动 学习
最后生成 <EOS> 停止

3.6 整个工作流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
已经生成的 Token


Output Embedding


Positional Encoding


Masked Multi-Head Attention
(只能看前面的 Token)


Cross Attention
(读取 Encoder 的输出)


Feed Forward Network


Linear


Softmax


预测下一个 Token


加入到输入

└──────────────┐


下一轮生成

四. 编码器与解码器

Encoder与Decoder对比。

编码器(Encoder) 解码器(Decoder)
阅读整篇输入 一边生成一边阅读
使用Self-Attention 使用Masked Self-Attention
理解输入含义 根据上下文生成输出
输出隐藏表示 输出下一个Token