《attention is all you need》
博客:https://jalammar.github.io/illustrated-transformer/。 原理和结构图在论文以及上面的博客讲的都很清楚,下面提一些我自己阅读论文和博客时遇到的一些疑问,以及后来自己理解觉得对的答案。有些依然没有找到答案。。。
self-attention
- 做完key和query向量的点积之后,要除以向量维度的平方根,这样可以保持梯度比较稳定
- 为什么一定要有一个value向量,不能直接用原始向量替代么?
- value向量可以表示该token可以被分享到其他token的特征,和该token的embedding不一定一样。而且如果直接用原始embedding作为value的话,self-attention只是等价于之前embedding的重新打散、组合
- 在做完multi-head之后,把多个head的embedding concat之后还要再接一个Dense层,转化成更低维度传给FFN
position embedding
- 只加在encoder 和decoder最底层的输入中么? 是的
- 作用是什么?引入token之间的位置信息:attention机制不能感知token在序列中的位置距离
- 具体encoding的方案:
- 这是一个基于token在序列中相对位置做的embedding,所以可以适应任意长度的输入
FFN层
- FFN层的作用是什么?每个block除了要做attention,还需要做一些特征变换,在FFN层完成这些事
- feedforward层的权重是跨encoder decoder block共享的么? 不是
residual
- 每个self-attention层、FFN层、query-attention层都是有residual的
- 避免梯度消失
- 原始embedding和过了layer之后的tensor相加之后要过一个BathNormalize层
- BathNormalize也是有参数的 (θ, std) 现将原始数据归一化到(θ=0,std=1), 然后再变成想要的分布, 参数数=(layer’s dim - 2)
decoder
- decoder层的self attention只能attention到当前token前面的token,后面的token会被mask掉
- decoder输出一个softmax的seq
- GPT等价于使用transformer的decoder模块(没有给定encoder的信息)
训练
- 输入输出都是可变长的,由于self-attention层、FFN层、query-attention层都是可以并行计算的,所以不同长度的输入不影响计算。所以只要同一个batch的数据seq_len一样就行了
- 训练是decoder的输入是待生成的句子,输出是待生成的句子token序列向后错一位的序列
预测
- decoder端输入一个序列,预测的下一个token就是decoder输出的最后一个embedding
- encoder只需要编码一次,然后把encoder的各层输出给decoder端。 decoder需要计算N次
《attention is all you need》