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堆叠起来就能得到多头注意力,其中参数是独立的,不共享: