admin 管理员组

文章数量: 887006

理清Transformer输入输出

文章目录

  • 前言
  • padding
  • 训练阶段
    • Encoder
    • Decoder
  • 测试阶段

前言

之前写完一篇笔记以为自己搞得很懂了,其实还是有些小细节没注意到,特别是跟NLP比较有关的内容,就再记录一下Transformer的整个输入输出过程。



padding

不用担心输入的句子不一样长,不用担心预测的时候decoder的输入不是完整的句子,因为在输入decoder和encoder时都会进行补0,把句子长度补到一样,因此序列长度是固定的N。



训练阶段

假设batch_size记为B,序列长度记为N(已进行padding),每个单词对应的 one-hot 编码维度也即 vocab_size 记为 d v s d_{vs} dvs​。

Encoder

注意:下面的乘法都是一个batch一个batch地乘(就是torch.bmm)

输入的是B个长度为N的序列,记作 X ∈ R B × N × d v s X\in R^{B\times N\times d_{vs}} X∈RB×N×dvs​;

进行word embedding后把每个单词对应的向量的维度变为 d m o d e l d_{model} dmodel​,此时维度为 R B × N × d m o d e l R^{B\times N\times d_{model}} RB×N×dmodel​;
加上维度也为 R B × N × d m o d e l R^{B\times N\times d_{model}} RB×N×dmodel​的postional encoding

输入multi-head attention
对于第i个head,分别乘以矩阵 W i Q , W i K , W i V W^Q_i, W^K_i, W^V_i WiQ​,WiK​,WiV​得到 Q i , K i , V i Q_i, K_i, V_i Qi​,Ki​,Vi​,维度分别为 R B × N × d q , R B × N × d k , R B × N × d v R^{B\times N \times d_{q}},R^{B\times N \times d_{k}},R^{B\times N \times d_{v}} RB×N×dq​,RB×N×dk​,RB×N×dv​;
Q i , K i Q_i, K_i Qi​,Ki​ 做scaled dot-product attention( A i = Q i K i T , A i ′ = s o f t m a x ( A i d k ) A_i = Q_iK^T_i, A_i' = softmax(\frac{A_i}{\sqrt{d_k}}) Ai​=Qi​KiT​,Ai′​=softmax(dk​ ​Ai​​))得到 A i ′ ∈ R B × N × N A'_i\in R^{B\times N \times N} Ai′​∈RB×N×N ;
A i ′ A'_i Ai′​与 Q i Q_i Qi​做乘法(就是加权求和),得到输出 h e a d i head_i headi​ 的维度为 R B × N × d v R^{B\times N \times d_v} RB×N×dv​;
合并所有 h e a d i head_i headi​,先将它们按列拼接在一起,得到 ( h e a d 1 , . . . , h e a d h ) ∈ R B × N × h d v (head_1, ..., head_h)\in R^{B\times N\times hd_v} (head1​,...,headh​)∈RB×N×hdv​,再乘以矩阵 W O ∈ R B × h d v × d m o d e l W^O\in R^{B\times hd_v\times d_{model}} WO∈RB×hdv​×dmodel​,得到输出维度为 R B × N × d m o d e l R^{B\times N\times d_{model}} RB×N×dmodel​;

论文中,取 d v = d k = d q = d m o d e l / h d_v=d_k=d_q=d_{model}/h dv​=dk​=dq​=dmodel​/h;

add&norm:
没什么好说的,加上multi-head attention的输入后再layer norm,维度仍为 R B × N × d m o d e l R^{B\times N\times d_{model}} RB×N×dmodel​;

feed forward:
这个子层是由2个全连接层和中间一个激活函数组成的。第一个全连接层把维度变为 R B × N × 2 d m o d e l R^{B\times N\times 2d_{model}} RB×N×2dmodel​,第二个全连接层再变回 R B × N × d m o d e l R^{B\times N\times d_{model}} RB×N×dmodel​;

add&norm:
同前一个;

Decoder

在训练阶段decoder的输入是完整的序列(ground truth),word embedding部分和positional encoding部分与encoder一致;

进入masked multi-head attention
decoder在预测下一个输出的时候是不可以看到真实答案的后面的内容的,所以需要把后面的内容遮住。举个例子:翻译答案为"机器学习",第一个输入[BOS] (begin of sequence的意思),输出预测’鸡’(注意这里预测错了);第二次要输入[BOS]和’机’(注意:在训练时前面预测错了,不用管他,直接输正确答案就行),输出预测’器’…
masked的操作方法是在softmax前把attention scores矩阵 A A A对应位置的值设为 − ∞ -\infty −∞,这样softmax后对应的 attention scores 会变成0,加权求和的时候就不会加上它们。
其它都跟encoder的一样,输出维度为 R B × N × d m o d e l R^{B\times N\times d_{model}} RB×N×dmodel​;

add&norm:
同前一个;

进入multi-head attention
这个是连接encoder和decoder的地方,计算方式是相同的,只是这里的 Q i Q_i Qi​ 是用decoder前面的输出乘以矩阵 W i Q W_i^Q WiQ​ 得到的, K i , V i K_i, V_i Ki​,Vi​ 是用encoder一个block的输出乘以 W i K , W i V W_i^K, W_i^V WiK​,WiV​ 得到的。
输出维度为 R B × N × d m o d e l R^{B\times N\times d_{model}} RB×N×dmodel​;

add&norm:
同前一个;

feed forward:
同encoder;

add&norm:
同前一个;

Linear & softmax:
这个地方就是要输出每个位置对应词汇表中每个单词的概率。
Linear层要用前面得到的维度为 R B × N × d m o d e l R^{B\times N\times d_{model}} RB×N×dmodel​的输出,乘以维度为 R B × d m o d e l × d v s R^{B\times d_{model}\times d_{vs}} RB×dmodel​×dvs​的矩阵,得到输出维度为 R B × N × d v s R^{B\times N\times d_{vs}} RB×N×dvs​,再进行softmax得到最终的概率矩阵。
最后列中取softmax值最大对应的那个单词就是预测值。



测试阶段

测试阶段跟训练阶段唯一的不同就是在decoder的输入。测试阶段是没有正确答案的,输入的序列就是原原本本的模型的预测值(比如前面举的例子中,预测错的’鸡’是要作为输入的),也因此不需要遮住后面的序列(因为根本没有)。

本文标签: 理清Transformer输入输出