【王树森】Transformer模型(2/2): 从Attention层到Transformer网络(个人向笔记)
Single Head Self-Attention
上节课讲到的属于单头注意力:
Multi-Head Self-Attention
- 使用 l l l 个单头注意力层堆叠成一个多头注意力层,注意它们之间不共享参数
- 一个单头注意力有 3 个参数矩阵,所以多头注意力有 3 l 3l 3l 个参数矩阵
- 我们把多个单头注意力的输出做concatenation,就能得到多头注意力的输出
Multi-Head Attention
和上面讲到的类似,我们把单头注意力堆叠起来,就能得到一个多头注意力
Stacked Self-Attention Layers
- 在上面的多头自注意力层上的输出再接一个全连接层,对于每个输出的全连接层共享参数,将它们和
W
U
W_U
WU 进行计算后丢到一个激活函数ReLU里面
- 在此基础上可以网上堆多头自注意力层,这个的道理和多层RNN是一样的:
- Transformer一个Block的encoder的输入和输出都是一个
512
×
m
512×m
512×m 的矩阵,其中
512
512
512 是向量的维度,
m
m
m 是向量的个数,用符号可以这样表示,其中
X
\boldsymbol{X}
X 表示矩阵:
X
∈
R
512
×
m
\boldsymbol{X} \in \mathbb{R}^{512×m}
X∈R512×m
- 这样我们就可以把Block堆叠起来,Block之间不共享参数,Transformer里面一共堆叠了6个Block
Blocked Attention Layers
- decoder需要先堆叠一个Self-Attention层:
- 之后堆叠一个多头注意力层
- 最后对所有的输出都映射到
s
s
s 向量:
- 对于decoder的一个Block是这样的:其中需要输入两个序列,都是512维的向量,长度分别为
m
m
m 和
t
t
t ,如果是英译德的话,那么
m
m
m 就是英语单词的数量,
t
t
t 就是已经生成的德语单词的数量:
- 堆叠decoder层:图的左边是刚刚堆叠的encoder层,右边是堆叠的decoder层,其中decoder层接受两个输入,一个输入来自encoder,一个输入来自
X
X
X 或自身decoder的输出,最后输出和输入
X
X
X 的维度一样
- 与RNN的Seq2Seq模型的输入大小完全一致,所以以前RNN的Seq2Seq模型能做的,Transformer也能做
Summary
把单头多个attention堆叠起来就能得到多头注意力,其中参数是独立的,不共享: