Transformer的架构由编码器(Encoder) 和解码器(Decoder) 两大部分组成
这里重点介绍编码器部分的核心机制:自注意力机制(Self-Attention),它是Transformer的核心创新之一。
TIP工程上,行优先,常见于代码,例如X∈Rn×d;列优先,常见于数学公式。这里为了方便理解,采用列优先的方式。两者在乘积顺序和转置上面有一点区别,但本质上是一样的。
| 符号 | 含义 |
|---|
| n | 输入序列的长度(词元个数) |
| d | 词嵌入向量的维度 |
| X∈Rd×n | 输入序列的词嵌入矩阵,每一列是一个词元的嵌入向量 |
| Q∈Rdk×n | 查询(Query)矩阵,每一列是一个词元的查询向量 |
| qi∈Rdk | 第 i 个词元的查询向量 |
| K∈Rdk×n | 键(Key)矩阵,每一列是一个词元的键向量 |
| kj∈Rdk | 第 j 个词元的键向量 |
| V∈Rdv×n | 值(Value)矩阵,每一列是一个词元的值向量 |
| vj∈Rdv | 第 j 个词元的值向量 |
| dk | 查询和键向量的维度 |
| dv | 值向量的维度 |
| 中间量 | 含义 |
|---|
| sij | 第 i 个词元对第 j 个词元的注意力得分 |
| S∈Rn×n | 注意力得分矩阵 |
| A∈Rn×n | 注意力权重矩阵 |
| Aij 或 Attentionij 或 αij | 第 i 个词元对第 j 个词元的注意力权重 |
| Z∈Rdv×n | 自注意力机制的输出矩阵 |
| zi∈Rdv | 第 i 个词元的输出向量 |
| 参数 | 含义 |
|---|
| WQ∈Rdk×d | 查询的权重矩阵 |
| WK∈Rdk×d | 键的权重矩阵 |
| WV∈Rdv×d | 值的权重矩阵 |
| WO∈Rd×hdv | 输出的权重矩阵,用于将多头注意力的输出映射回原始维度 |
”自” 参注意力#
在机器翻译中,传统的注意力(Cross-Attention,交叉注意力)是:解码器在生成“苹果”这个词时,去编码器里找输入句子“I love apples”中哪个词(I / love / apples)最相关。
而自注意力中的“自”指的是:Query(查询)、Key(键)、Value(值)这三个向量,全部来自同一个输入序列本身。
前置概念#
词嵌入向量(Embedding):每个输入词都会被映射为一个高维向量,称为词嵌入向量。假设输入序列长度为 n,每个词的嵌入维度为 d,则输入序列可以表示为一个矩阵 X=[x1,x2,...,xn]∈Rd×n。
为了计算注意力,需要为每个词生成三个不同的向量。这三个向量是通过三个可训练的权重矩阵与输入向量相乘得到的:
- Query(查询)向量 Q=WQX=[q1,q2,...,qn]∈Rdk×n,
- 其中 WQ∈Rdk×d 是查询的权重矩阵,dk 是查询向量的维度。
- “提问者”。这个词想知道:“在当前语境下,我应该关注谁?”
- Key(键)向量 K=WKX=[k1,k2,...,kn]∈Rdk×n,
- 其中 WK∈Rdk×d 是键的权重矩阵。
- “被问者”。这个词说:“我的特征是XXX,看看你要找的是不是我?”
- Value(值)向量 V=WVX=[v1,v2,...,vn]∈Rdv×n,
- 其中 WV∈Rdv×d 是值的权重矩阵,dv 是值向量的维度。
- “实际内容”。一旦确认了“提问者”和“被问者”很匹配,这就是我实际要传递给你的具体语义信息。
self-attention计算步骤#
第1步:计算注意力得分(点积)#
计算任意两个词元 i 和 j 的注意力得分(标量)
sij=qiTkj=l=1∑dkqilkjl得分矩阵 S=[sij]∈Rn×n,其中 sij 表示第 i 个词元对第 j 个词元的注意力得分。
S=QTK第2步:缩放 + Softmax(按行做 Softmax,使每一行之和为 1)#
A=softmax(dkS)A是注意力权重矩阵,A∈Rn×n,其中 Aij 表示第 i 个词元对第 j 个词元的注意力权重。
第3步:加权求和(对应的Value向量)#
对于每个词元 i,其输出向量 zi 是所有值向量的加权和:
zi=j=1∑nAijvj写成矩阵形式:
Z=VAT∈Rdv×n写成矩阵形式#
Z=VAT=V⋅softmax(dkQTK)T
多头注意力机制(Multi-Head Attention)#
多头指的是:将查询、键、值向量分别映射到多个子空间中,进行多次注意力计算,然后将结果拼接起来。
有点类似于CNN中的多通道卷积,每个通道可以学习到不同的特征表示。这里每个头也可以看作是一个独立的注意力机制,它们可以关注输入序列的不同方面。
每个头的QKV以及输出#
对于每个头 r,有独立的权重矩阵 WQr,WKr,WVr,计算得到每个头的输出 Zr:
Zr=VrArT=Vr⋅softmax(dk(Qr)T(Kr))T拼接(Concatenate)所有头的输出#
将 h 个头的输出矩阵在行方向(特征维度)上堆叠:
Zconcat=[Z1;Z2;...;Zh]∈Rhdv×n输出回到原始维度#
需要一个新参数矩阵 WO∈Rd×hdv,将拼接后的输出映射回原始维度:
Zfinal=WOZconcat∈Rd×n小巧思#
对于嵌入维度 d,通常选择 dk=dv=d/h,这样每个头的输出维度为 dv,拼接后总维度为 hdv=d,与输入维度一致。
- 不增加总参数量。
- 这种“降维投影 + 多头并行”的设计,强迫每个头必须在低维空间(64 维)里寻找特征。由于每个头的初始权重随机且独立训练,它们会自然演化出不同的关注重点(有的擅长局部纹理,有的擅长全局形状)。