Code for The Annotated Transformer blog post:
- 每个注意力输入的 3 个箭头,从右到左依次是Q、K、V
- Encoder 输出的对应代码中的 memory ,这个memory 在 N 个 Decoder 子结构**享
- Encoder 输入的是需要翻译的序列, Decoder 输入的是已经翻译过的序列部分
其中:
这几个头的设定是在不同的子空间内,也就是把
最早的 Attention 是九几年在视觉领域提出的,火起来是2014年Google的 Recurrent Models of Visual Attention,第一个将 Attention 用在 NLP 上的就是 Bahdanau 的 Neural Machine Translation by Jointly Learning to Align and Translate ,这个工作主要是用 Attention进行翻译和对齐,下一次大火就是 Transformer 的 self-Attention 。
注意力机制的目标是缓解 长依赖( long-range dependencies)问题 。
传统的 Attention 机制是在 seq2seq 任务中使用的,通常是算输出序列每个单位与输入序列每个单位的注意力权重(对齐),而 Self-Attention 是在 Source 内部或 Target 内部或二者合体计算的注意力权重,可以不要求输入输出都是序列。
举个栗子:
我买了一杯饮料,这杯饮料里有芋圆,我很喜欢它。
对于这个“它”,“饮料”的注意力就会更高。
接在每一层的 Attention 之后,由两个线性变换组成,中间是 ReLU 激活函数,可以视为两个大小为 1 的卷积核,就是用来增大模型复杂度的。
目的是将数据标准化到 ReLU 激活函数的作用区域。
还有一种标准化是 Batch Normalization ,二者的区别在于 LN 是对每一个数据进行标准化,更适合用在 RNN 等时序模型中,而 BN 是对一个批量的数据的标准化。
位于 embedding 后,block 之前,是 Transformer 的特有机制,直接叠加在 embedding 上。
不同于 RNN 的一步一步处理序列,Transformer 的工作方式是输入一整个序列、生成一整个序列,所以 从根源上解决了长依赖( long-range dependencies)问题 ,同时还赋予模型并行处理的能力,但这也意味着输入序列都是平等的,因此必须使用位置编码。
**:理想的深度网络的表现应该不比浅层网络差,深层网络内部的小区块可以实。现 恒等映射 ,也就是输入输出相同,实现上把模块的输入加在输出上再去激活函数就可以了
在 transformer 中,我们知道它的 decoder 和 encoder 都有 6 个 Attention+FFN 结构,操作方法是 Residual (Atten) --> Norm --> Residual (FFN) --> Norm 。
Glorot / fan_avg
:对每一层的输入 f_i 和输出 f_o ,该层的范围是