来自于论文:attention is all you need
1. 基本构造:encoders+decoders
- 其中encoders和decoders分别由很多个encoder堆叠或者decoder堆叠。
- encoder由自注意力层和前馈神经网络构成
- decoder构成
2. embedding模块
-
word embedding
-
作用:word的独热表示造成维度爆炸,用nn.Embedding对词的onehot形式进行压缩,转化为稠密的词向量。
-
Embedding的权重矩阵有两种选择:
- pre-trained的embeddings固定,这样就是一个lookup table。
- 随机初始化,社会trainable,这样在训练过程中不断对embedding进行改进。(Transformer用的方法)
-
-
position embedding
- 作用:单个词的embedding只表达意思,但是在seq中的上下关系就没办法表示了,所以位置编码是用来表达word在seq中的位置关系。而采用的三角函数形式表示的话每个维度都能对应一个正弦曲线,这样可以相对轻松的通过对应位置学习。
- 公式:
- 参数:
- pos指逐个word在句子中的位置。
- i指embedding维度。
-
两个embeddings相加后,即组成了带有位置信息的embedding。
3. encoder
-
自注意力机制
- 输入:词向量,先通过权重矩阵
得到三个新向量q,k,v,以增加更多可训练参数(wq, wk, wv).
- 其中q(query)和k(key)理解为找关系手握自身号牌(即q和别的k做乘法),和别人来找关系领的号牌(别人的q来跟我的k做乘法),他们通过相乘找到自身和上下文以及上下文和自身的关系().
- v(value)则就是本身的数值,要和相互关系做乘法,得到的注意力得分()。其中分母的作用是做缩放,压制QK乘积过大的情况。
- 输入:词向量,先通过权重矩阵
-
多头自注意力机制
- 多头起到的作用是提供了自注意力角度的多样性,最后多个子注意力得分矩阵z拼接得到了自注意力层的输出。
- 然后用一个额外的权重矩阵对拼接矩阵进行embedding,得到最后的拼接结果。
-
前馈神经网络
-
输入:自注意力层输出的综合得分矩阵z(序列长度x词向量)。
-
结构:两层线性层。
-
作用:考虑到注意力机制对负责过程的拟合程度不够,通过两层网络加强模型的拟合能力。
-
数学表达:
- 输出:跟输入同维度矩阵。
-
-
实际组成
- word + position embedding输入多个串联形式的encoders,输出的结果通过FFN进一步拟合,然后送入decoder的第二个attention模块。
4. decoder
-
masked self-attention
- mask在训练阶段使用主要是因为不能让模型接触到未来信息。所以在一个batch中使用下三角阵来达到掩盖的目的,逐个释放seq中需要预测的词。
- 第二步的self-attention起的作用是对masked self-attention和encoder的输出z拼接进行注意力计算。
- FFN作用和encoder中一样。
-
最后输出的结果通过一个线性层和softmax预测对应的词的概率。
参考: