参考资料Transformer1. Encoder1.1 Encoding输入部分(Positional Encoding)1.2 注意力机制(单头、多头)1.3 Add&LayerNorm1.4 Feed Forward前馈神经网络1.5 Encoder的整体实现2. Decoder3. Transformer类4. 训练与测试
参考资料
- 论文复现
- 论文
Transformer
1. Encoder
1.1 Encoding输入部分(Positional Encoding)
输入=字向量+位置信息
- 它能⽤来表示⼀个token在序列中的绝对位置
- 在序列⻓度不同的情况下,不同序列中token的相对位置/距离也要保持⼀致
- 可以⽤来表示模型在训练过程中从来没有看到过的句⼦⻓度。
1.2 注意力机制(单头、多头)
3.2 AttentionAn attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key.
有些qk对在经过点积运算后的结果相对于其他点积对来说过⼤,这就导致在之后的softmax中占据了绝⼤多数注意⼒,⽽其他的点积对在经过softmax之后的分数则趋于0,结果就是会出现梯度消失的问题。因此这⾥除以⼀个常数的操作类似于归⼀化,使得各点积对的结果更加平滑。
直观理解:Q是查询对象,V是被查询对象,注意力体现于Q和V的相似度(哪个Q更容易得到V)→Key中表示了某种查询关系,其中包含了很多信息,一般使用点乘的方式得到Q关于k1,k2,…,kn的相似值attention score,softmax得到概率(也可以使用别的如ReLU)→将得到的概率与V相作用,就可以得到最后的一个期望
为了并行化计算,提高计算效率,引入了多头注意力机制
Q
的维度[2, 8, 10, 64]
:这意味着我们有2个句子,每个句子有8个并行的查询矩阵,每个查询矩阵有10行(对应于10个单词)和64列(对应于每个头的维度)1.3 Add&LayerNorm
Add是体现了残差网络的思想,将输入与输出相加
Layer Normalization:是在一个句上的进行归一化。
Batch Normalization:是把每句话的同一维度上的字看成一组做归一化。
1.4 Feed Forward前馈神经网络
1.5 Encoder的整体实现
get_attn_pad_mask是生成掩码,覆盖掉没有意义的占位符
2. Decoder
- 使用Mask(上三角矩阵)来掩盖掉当前词语后面的词汇
- Decoder 的 Multi-Head Attention 的输入来自两部分,K,V 矩阵来自Encoder的输出,Q 矩阵来自 Masked Multi-Head Attention 的输出。
- Decoder 的输出的形状
[句子字的个数,字向量维度]
。可以把最后的输出看成多分类任务,也就是预测字的概率。经过一个nn.Linear(字向量维度, 字典中字的个数)全连接层,再通过Softmax输出每一个字的概率。
- Shifted Right是指在训练过程中,将目标序列在喂给解码器之前向右移动一个位置的做法。这样做是为了确保位置
i
(第i
个标记)的预测只依赖于小于i
的已知输出。这防止了模型通过在预测位置i
时看到位置i
的正确输出来“作弊”。
decoder同时接收
dec_inputs
, enc_inputs
, enc_outputs
三个作为输入3. Transformer类
在Decoder的实现中也输入了原始的enc_inputs,其原因在于需要对enc_outputs中[PAD]的地方掩盖掉,故需要enc_inputs来产生掩码
4. 训练与测试
增加了注释后的代码如上
可参考
test.ipynb
进行实验,可以完成中文转英文的翻译