Transformer-大模型开发中的必备知识 - 第二章(自注意力机制)
Transformer的核心思想-自注意力机制
很好,在上一章,我们用很通俗的例子和伪代码来分析了原有神经网络在处理序列问题的痛点
那么 有没有好的一种模型,可以建模序列关系,又不依赖时间步顺序计算?
答案来了 就是transformer
那我们可以用一句话来概括transformer的核心思想
用注意力机制(Attention)完全替代循环结构(RNN/LSTM),
从而实现序列的并行建模与全局依赖建模。
自注意力机制(Self-Attention)
注意力机制的本质
注意力机制其实是一个帮助算法来辨别信息重要性的计算流程,在这个流程中,它通过计算样本和样本之间的相关性来判断每个样本对于一个序列的重要程度,并且给这些样本赋予能代表其重要性的权重。
为什么要判断序列中样本的重要性?重要性对于序列有什么意义?
这部分概念很好理解,我们通过一个通俗易懂的例子来进行解释:
尽管今天下了雨,但我因为________________而感到非常开心和兴奋。
_____________,但我因为拿到了梦寐以求的offer而感到非常开心和兴奋。
来自-赋范大模型社区
大家观察上面两句话,对这两句话的一部分进行了挖空,就这俩个例子对比而言,在第一句中,读起来就是感觉缺少了什么,不管是天气怎么样,这位同学的心情是好的,那么为什么他的心情是好的呢? 到底发生了什么导致了他心情好呢?
很好,因为我们是人类,我们可以分辨出这个句子中的重要内容是什么,就是这位同学今天拿到了offer,那么对于机器而言,我们就需要一个机制来让它来进行情感分析。
自注意力机制可能会为“开心”和“兴奋”这样的词分配更高的权重,因为这些词直接关联到句子的情感倾向。如果我们能够判断出一个序列中哪些样本是重要的、哪些是无关紧要的,就可以引导算法去重点学习更重要的样本,从而可能提升模型的效率和理解能力。
相关性计算
样本与样本之间的相关性是如何计算的(重要性是如何计算的)?
样本和样本之间的相关性本质上是
一个样本的需求(Query)和另一个样本能提供的信息特征(Key)有多匹配
明白这个道理之后,就要通过计算了
在NLP的世界观中,序列数据中的每一个样本都会编码成一个向量,文字数据叫做词向量,时间序列数据则为时序向量
所以,要计算样本和样本之间的相关性,其实就是计算这两个向量之间的相关性
那就可以通过算法来进行计算了,计算方法就是:向量点积计算
假设现在有两个三维向量A和B,则他们的点积计算就可以为:
A⋅BT=(a1,a2,a3)⋅(b1b2b3)=a1⋅b1+a2⋅b2+a3⋅b3
\mathbf{A} \cdot \mathbf{B}^T = \begin{pmatrix}
a_1, a_2, a_3
\end{pmatrix} \cdot
\begin{pmatrix}
b_1 \\
b_2 \\
b_3
\end{pmatrix} = a_1 \cdot b_1 + a_2 \cdot b_2 + a_3 \cdot b_3
A⋅BT=(a1,a2,a3)⋅b1b2b3=a1⋅b1+a2⋅b2+a3⋅b3
相乘的结构为:(1 × 3) × (3 × 1) → (1 × 1) 得到一个标量
在NLP的世界观中,我们获得到的词向量或者时序向量数据,一定是具有多个样本的,所以我们要去求解某一个向量和另一个向量的相关性,根据这个相关性,我们就能计算出一个样本对于整个序列的重要性。
有一个非常重要的点,就是在NLP的世界观中,样本和样本之间相关性的计算会收到向量顺序(样本顺序)的影响,就是说,用一个样本为中心来计算相关性,和另一个样本为中心计算相关性,会得到不同的结果,即不同的相关性数据,所以说,向量之间的相关性和顺序有关。
我们来举例说明:
我喜欢喝可乐
如果以我为中心,计算我和这个序列(句子)中其他样本(词语)的相关性,那么在这句话中,喜欢和可乐在这个序列中都非常重要,我对可乐是什么情感? 我的感情对象是可乐,所以说,这里的喜欢 和 可乐 和 我 这个样本的相关性就很大。
那么好
如果以可乐为中心,来计算可乐在整个序列中与其他样本的相关性的时候,那 我 这个词的重要性就没有那么大了,不管是谁喜欢喝可乐,都不会改变可乐本身,那在这个时候,可乐就对我这个词的重要性就相对变小了。
很好,现在我们明白了这个道理:
向量之间的相关性和顺序有关 非常非常重要!!!
Q&K:询问&应答
那么接下来我们再写一个例子,来引出下一个知识点:Q&K
如果一条数据中有A和B两个样本,那我们要计算整整四组相关性:AB,AA,BA,BB
在计算中,作为中心的那个样本就是在询问(Question),那在计算的另一端就是在应答(Key)
那么A和B的相关性计算就是A询问,B应答的结果,那AA就是自己询问自己应答。
这个过程可以用矩阵乘法来完成:
同样还是两个样本A和B的相关性计算,假设这两个样本被编码成有四个特征的词向量,那就可以让 特征矩阵 转置矩阵:

A⋅BT=(a1a2a3a4)⋅(b1b2b3b4)
\mathbf{A} \cdot \mathbf{B}^T
=\begin{pmatrix}
a_1 & a_2 & a_3 & a_4
\end{pmatrix}
\cdot
\begin{pmatrix}
b_1 \\
b_2 \\
b_3 \\
b_4
\end{pmatrix}
A⋅BT=(a1a2a3a4)⋅b1b2b3b4
那同样 进行四步点积运算后结果为(最终矩阵):
[rAArABrBArBB]\begin{bmatrix}
r_{AA} & r_{AB} \\
r_{BA} & r_{BB}
\end{bmatrix}[rAArBArABrBB]
这个矩阵便是样本之间的相关性矩阵,矩阵中的每一个元素表示 一个样本对另一个样本的相关性
其中:
- rAAr_{AA}rAA 表示 A 对 A 的相关性
- rABr_{AB}rAB 表示 A 对 B 的相关性
- rBAr_{BA}rBA 表示 B 对 A 的相关性
- rBBr_{BB}rBB 表示 B 对 B 的相关性
换句话来说,这个矩阵可以理解为 注意力得分矩阵
| Query\Key | A | B |
|---|---|---|
| A | rAAr_{AA}rAA | rABr_{AB}rAB |
| B | rBAr_{BA}rBA | rBBr_{BB}rBB |
上表中,行表示Query(谁在提问),列表示Key(谁在回答)
例如:
- rABr_{AB}rAB 表示 A 向 B 查询信息时的相关性
- rBAr_{BA}rBA 表示 B 向 A 查询信息时的相关性
但是这里有一个问题:
这些相关性得分可能是任意大小的数值,它们还不能直接作为权重使用。
因此,我们需要把这些值 转换成概率形式的权重。
Softmax:把相关性转换为注意力权重
将现在矩阵计算之后的值,我们要通过softmax公式来对相关性得分来进行归一化
公式如下:
αij=erij∑kerik
\alpha_{ij} =
\frac{e^{r_{ij}}}
{\sum_{k} e^{r_{ik}}}
αij=∑kerikerij
其中:
- rijr_{ij}rij 表示 Query iii 与 Key jjj 的相关性得分
- αij\alpha_{ij}αij 表示 最终的注意力权重
Softmax 有两个重要性质:
- 所有权重都在 0−10-10−1 之间
- 每一行权重的总和为 111
我们举一个简单的例子:
假设某个词的相关性得分为:
| 词 | 相关性 |
|---|---|
| A | 2 |
| B | 1 |
经过 Softmax 计算后:
| 词 | 注意力权重 |
|---|---|
| A | 0.73 |
| B | 0.27 |
这表示:当模型在处理这个词的时候,它会73%关注A,27%关注B
这样我们就得到了元素在样本之中的注意力权重。
Value:真正被加权的信息
在注意力机制中,还有一个重要的角色:value
| 名称 | 可以理解为 |
|---|---|
| Query | 谁在提问 |
| Key | 谁和问题最匹配 |
| Value | 真正提供的信息 |
| 很多人第一次看到这里都会疑惑: |
为什么已经有了 Query 和 Key,还要 Value?
我们用一个生活中的例子来理解value这个概念:
假设你现在在图书馆里找书。
整个流程其实是这样的:
第一步:提出需求(Query)
你心里想:
我想找一本关于机器学习的书
这就是 Query(查询需求)。
第二步:查书的位置(Key)
图书馆有一个图书管理系统,比如:
| 关键词 | 书的位置 |
|---|---|
| 机器学习 | A区3号 |
| 深度学习 | A区5号 |
| 数据结构 | B区2号 |
这里的 关键词 就可以理解为 Key。
你会拿你的需求(Query)去和这些 Key 做匹配:
机器学习 ↔ 机器学习
匹配度非常高。
第三步:真正拿到书(Value)
但注意一件事情:
目录本身不是书。
目录只是告诉你:这本书在哪里
真正的内容是:
《机器学习实战》
这本书本身就是 Value。
所以:
| 角色 | 在图书馆里的含义 |
|---|---|
| Query | 我要找什么书 |
| Key | 目录关键词 |
| Value | 书本的内容 |
这里的概念对计算机初学者可能会有一点难以理解,对于QKY,这的KY,在计算机开发中很常见,就是代码常用的数据结构键值对,就像Redis存储一样
一个非常形象的理解是:
Query:我现在需要什么信息
Key:谁和这个需求最匹配
Value:从谁那里拿到信息
计算流程其实只有三步:
第一步:计算相关性
首先用 Query 和 Key 计算匹配程度:
Score=QKT Score = QK^T Score=QKT
这一步的结果就是:
谁和谁更相关
第二步:Softmax 归一化
然后把这些相关性变成概率权重:
Weight=softmax(QKT) Weight = softmax(QK^T) Weight=softmax(QKT)
这一步得到:
注意力权重
第三步:加权信息
最后使用这些权重去加权 Value:
Output=softmax(QKT)V Output = softmax(QK^T)V Output=softmax(QKT)V
可以理解为:
从重要的词那里多拿一点信息,从不重要的词那里少拿一点
Self-Attention(自注意力机制) 的直觉理解
Self-Attention 的本质其实非常简单:
每一个词都会去看整个句子,然后决定自己应该关注谁。
例如一句话:
我 喜欢 喝 可乐
当模型在处理 “喜欢” 这个词的时候,它可能会这样关注:
| 词 | 注意力权重 |
|---|---|
| 我 | 0.3 |
| 喜欢 | 0.2 |
| 喝 | 0.1 |
| 可乐 | 0.4 |
这说明:
- “喜欢”最关注 可乐
- 其次关注 我
于是新的 “喜欢”向量表示 就会变成:
0.3×我+0.2×喜欢+0.1×喝+0.4×可乐 0.3 \times 我 + 0.2 \times 喜欢 + 0.1 \times 喝 + 0.4 \times 可乐 0.3×我+0.2×喜欢+0.1×喝+0.4×可乐
换句话说:
“喜欢”这个词的新表示,融合了整个句子的上下文信息。
这种表示方式叫做:
上下文表示(Contextual Representation)
小结
Self-Attention 的计算流程其实只有三步:
① 计算 Query 和 Key 的相关性
QKT QK^T QKT
② 使用 Softmax 得到注意力权重
softmax(QKT) softmax(QK^T) softmax(QKT)
③ 使用权重对 Value 进行加权求和
softmax(QKT)V softmax(QK^T)V softmax(QKT)V
最终得到:
Attention(Q,K,V) Attention(Q,K,V) Attention(Q,K,V)
这套计算机制,就是 Transformer 的核心组件:
Self-Attention(自注意力机制)
不过 Transformer 并不会只计算 一次注意力。而是会同时计算 多组注意力,从不同角度理解句子的关系。这就是接下来要介绍的内容:Multi-Head Attention(多头注意力)
持续更新中…
更多推荐


所有评论(0)