Transformer
00 分钟
2023-12-1

参考资料

Transformer

1. Encoder

1.1 Encoding输入部分(Positional Encoding)

notion image
输入=字向量+位置信息
i表示字向量第i维度,偶数用正弦函数,奇数用余弦函数,dmodel是总的维数
pos表示一句话中第pos个字
i表示字向量第i维度,偶数用正弦函数,奇数用余弦函数,dmodel是总的维数 pos表示一句话中第pos个字
前半部分表示位置信息,后半部分表示词向量的信息
前半部分表示位置信息,后半部分表示词向量的信息
  • 它能⽤来表示⼀个token在序列中的绝对位置
  • 在序列⻓度不同的情况下,不同序列中token的相对位置/距离也要保持⼀致
  • 可以⽤来表示模型在训练过程中从来没有看到过的句⼦⻓度。
 

1.2 注意力机制(单头、多头)

notion image
3.2 Attention
An 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.
a0,…,a3是完整的一个句子中的四个字,分别与WQ,WK,WV相乘,得到了qkv向量[QKV是同源的]
q0与每个k相乘得到a00,…,a03,softmax之后再与v累加之后得到加权的信息
a0,…,a3是完整的一个句子中的四个字,分别与WQ,WK,WV相乘,得到了qkv向量[QKV是同源的] q0与每个k相乘得到a00,…,a03,softmax之后再与v累加之后得到加权的信息
notion image
notion image
有些qk对在经过点积运算后的结果相对于其他点积对来说过⼤,这就导致在之后的softmax中占据了绝⼤多数注意⼒,⽽其他的点积对在经过softmax之后的分数则趋于0,结果就是会出现梯度消失的问题。因此这⾥除以⼀个常数的操作类似于归⼀化,使得各点积对的结果更加平滑。
 
直观理解:Q是查询对象,V是被查询对象,注意力体现于Q和V的相似度(哪个Q更容易得到V)→Key中表示了某种查询关系,其中包含了很多信息,一般使用点乘的方式得到Q关于k1,k2,…,kn的相似值attention score,softmax得到概率(也可以使用别的如ReLU)→将得到的概率与V相作用,就可以得到最后的一个期望
为了并行化计算,提高计算效率,引入了多头注意力机制
对KQV在特征维度上拆分,得到多个小矩阵进行并行化计算(论文中是8头)
对KQV在特征维度上拆分,得到多个小矩阵进行并行化计算(论文中是8头)
Q的维度[2, 8, 10, 64]:这意味着我们有2个句子,每个句子有8个并行的查询矩阵,每个查询矩阵有10行(对应于10个单词)和64列(对应于每个头的维度)

1.3 Add&LayerNorm

Add是体现了残差网络的思想,将输入与输出相加
Layer Normalization:是在一个句上的进行归一化。 Batch Normalization:是把每句话的同一维度上的字看成一组做归一化。
notion image

1.4 Feed Forward前馈神经网络

notion image

1.5 Encoder的整体实现

notion image
get_attn_pad_mask是生成掩码,覆盖掉没有意义的占位符

2. Decoder

notion image
  • 使用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进行实验,可以完成中文转英文的翻译
 

评论
Loading...