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=QiKiT,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输入输出
版权声明:本文标题:理清Transformer输入输出 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732360850h1535169.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论