论文链接:
背景
attention is all you need
论文标题写法
应用:使用注意力机制在机器翻译中得到了不错的效果。
结论
1.把之前所有的循环层,全部换成了multi-headed self -attention
2.在机器翻译工作中,transformer模型的训练比其他模型架构快很多,而且测试效果比较好。
3.对于纯注意力机制的模型这一发现的优点及扩展,例如图片,语音,使得生成不那么时序化
4.代码放在了tensor2tensor库中
在当前的写作中,如果有代码的话,应该把代码描述放在摘要的最后一句话,神经网络的文章细节比较多,文章不容易把细节写清楚,第一时间公布自己的代码,让别人能够方便重复文章,扩大文章的影响力。
粗读
导言
当前时序模型:lstm、gru。(语言模型、编码-解码架构)
RNN的缺点:从左到右顺序处理,把之前的词的信息放到一个隐藏状态ht中,和当前的词做一些计算得到输出。
问题在于难以并行,信息步步传递,之前的信息在较长的后续传播中丢失太多。
attention在RNN上的应用:attention已经成功用于编码器和解码器中,主要是把编码器中的内容有效的传给解码器,是和RNN一起使用的
transformer:不再使用循环神经层RNN,而是纯基于注意力机制,解决了纯时序的缺点,可以完全并行,在较短的时间内得到更好的结果。
背景
对比:
卷积神经网络:
1.卷积的时候,尤其是长序列,很难将距离较远的像素融合
2.一个输出通道可以识别一个模式
transformer:
1.可以之间看完一层的序列
2.多头注意力机制模拟多输出通道的效果
相关工作:
自注意力机制、memory networks:借鉴了前人的工作
transformer是第一个只依赖于自注意力机制的
模型
自回归:在过去时刻的输出也可以作为当前时刻的输入。
如果引用了别人的文章,最好能在自己的文章里花几句话简单地讲清楚,因为读者并不一定了解那些东西。
编码器
batchnorm:行为样本batch,列为特征feature,将列特征feature在一个mini-batch中均值变为0,方差变为1。
此外batchnorm还会学一个 λ, β。可以将向量变为均值变为任意值,方差变为任意值。
Z-Score :将数据变换为均值μ为0,标准差σ为1的分布(减去均值,除以标准差)
**Z-Score的解释见[附1](# 附1)
layernorm和batchnorm区别:layernorm对每个样本(行)做normalization(标准化)。即把数据转置一下,放到batchnorm中计算一下,再转置回去。
在三维结构中,layernorm应用更加普遍一些:因为样本的特征长短不一,使用batchnorm切割的时候需要补0,算均值和方差的时候0的部分有影响,波动较大。而layernorm中均值和方差是针对各自的样本来做的,因为是在样本自身里面来算的,样本的长短不受影响。
解码器
比编码器多使用了第三个子层,是一个多头的注意力机制。
使用了layernorm,使用了自回归,只使用之前的输出作为输入。
因为注意力机制会观察全局,为了避免解码器看到之后的那些时刻的输出,通过一个带掩码的注意力机制。不会看到之后的输入,保证训练和预测的时候行为的一致性。
注意力层
将一个query和一些key-value对映射为一个输出函数。
query、key、value、output(value的加权和,和value维度一样)都是一些向量。
权:每个value的权重是每个value对应的key和查询的query的相似度算出来的
相似度:不同的注意力机制有不同的算法
最简单的注意力机制Scaled Dot-Product Attention
query和key-value的个数可能是不一样的,但是长度是一样的,才能做内积。
query和key等长的注意力机制:计算相似度的时候,用query和key做内积,这个内积作为相似度,内积值越大,两个向量的相似度就越高。算出来之后为了缓解梯度消失问题(将点积的值限制在一个较小的范围内有助于减少数值上的不稳定性,并使得梯度在反向传播时更加稳定)再除以√dk (向量的长度)
注意力机制
注意力计算中的mask,避免看到后面的东西。但是注意力机制会自动的计算出后面所有的值,怎么办?后面的值可以算,但是要保证计算权重的时候不要用到后面的东西。例如把后面的值都换成一个很大的负数,在softmax中都会变成0。从而避免了后面值的影响。
multi-head
先将VKQ投影到低维,其中投影的w是可以学的(给h次机会可以学到不一样的投影的方法)。使得在投影进去的度量空间中可以匹配不同的模式所需要的相似函数,最后把这些东西回来再做一次投影。类似于卷积神经网络中有多个输出通道的感觉。
还是之前的QKV,输出是不同头的concat()再投影到一个Wo里面。对每个头中的QKV通过一个不同的可以学习的Wq、Wk、Wv投影到一个dv上,再做注意力函数。其中h是几,就把原始维度分为几份。
transformer模型中的三个attention:
自注意力:同一个东西复制三次,既作为key、又作为value、又作为query。输出的输入的加权和(一句话中某个词与其他词之间的关联程度)
带musk的注意力
key和value来自编码器的输出,query来自解码器下一个attention的输入:编码器中的一些输出,根据解码器想要的东西拎出来(英文翻译中文,自动去注意自身比较感兴趣的词,不感兴趣的词可以忽略掉)
Position-wise Feed-Forward Networks
全连接的前馈网络:由两个线性变换组成,在两个线性变换之间有一个重新激活。
position-wise:把一个多层感知机(MLP)对每一个词作用一次,对每个词作用是同样的多层感知机(MLP)。是多层感知机(MLP)作用在最后一个维度。
先将维度扩大4倍,输出的时候,再回到原来的维度:单隐藏层MLP,中间隐藏层把输入扩大四倍,最后输出的时候回到输入的大小。
**MLP解释见[附2](# 附2)
和RNN的区别:RNN和transformer一样都是用一个线性层(或MLP)来做一个语义空间的转换。
不同的地方在于如何传递序列的信息。RNN是把上一个时刻的输出传入下一个时候做输入。transformer通过一个attention层在全局中拿到整个序列的信息,然后再用MLP做语义的转换。
关注点都在如何有效的使用序列的信息。
positional encoding
将一个词的位置i编码,加入到输入中。
实验
例子是英语翻译为德语
模型复杂,但是大多数参数的可以推算出来的,只有少量参数需要调参
评论
写作简单,没有多余的写作技巧。
写作启发:写文章的时候,可以把内容介绍减少一点,把不重要的东西放到附录中,在正文中最好讲过故事,说明自己为什么做这个事情,自己的设计理念是怎么样的,以及对文章的思考的怎么样的,会让文章显得更有深度,给读者的代入感也更强烈。
附1
解释D(x*):
由方差的性质:
进行如下推导:
附2
多层感知机(MLP)原理简介
多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即三层的结构,如下图:
从上图可以看到,多层感知机层与层之间是全连接的(全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接)。多层感知机最底层是输入层,中间是隐藏层,最后是输出层。
输入层没什么好说,你输入什么就是什么,比如输入是一个n维向量,就有n个神经元。
隐藏层的神经元怎么得来?首先它与输入层是全连接的,假设输入层用向量X表示,则隐藏层的输出就是
f(W1X+b1),W1是权重(也叫连接系数),b1是偏置,函数f 可以是常用的sigmoid函数或者tanh函数:
最后就是输出层,输出层与隐藏层是什么关系?其实隐藏层到输出层可以看成是一个多类别的逻辑回归,也即softmax回归,所以输出层的输出就是softmax(W2X1+b2),X1表示隐藏层的输出f(W1X+b1)。
MLP整个模型就是这样子的,上面说的这个三层的MLP用公式总结起来就是,函数G是softmax
因此,MLP所有的参数就是各个层之间的连接权重以及偏置,包括W1、b1、W2、b2。对于一个具体的问题,怎么确定这些参数?求解最佳的参数是一个最优化问题,解决最优化问题,最简单的就是梯度下降法了(SGD):首先随机初始化所有参数,然后迭代地训练,不断地计算梯度和更新参数,直到满足某个条件为止(比如误差足够小、迭代次数足够多时)。这个过程涉及到代价函数、规则化(Regularization)、学习速率(learning rate)、梯度计算等。