Transformer特别的地方是在seq2seq上大量用到了self-attention
传统的seq2seq,内部是RNN,输入是一个序列,输出是一个序列,在输出序列b1-b4均考虑了a1-a4,因此不能被平行化。
使用CNN来处理,每一个filter的输入是sequence中的一小段,然后使用filter扫过整个sequence
当我们使用多个filter扫过这个sequence,可以得到和RNN相同的输入和输出,但是CNN只能考虑部分输入。
解决:叠很多层CNN就可以考虑全部输入。
CNN可以平行化,每个filter都可以单独计算。
缺点:一定要叠很多层。
解决:使用self-attention layer可以(输入是一个sequence输出是sequence)
使用self-attention layer来取代RNN。
self-attention
相同的输入乘以三个不同的矩阵得到三个不同的向量。
简单来说:Q就是词的查询向量(最适合查找目标的),K是“被查”向量(适合接收查找的),V是内容向量。这三者不一定要一致,所以网络设置了三个向量,然后学习出最适合的Q, K, V,以此增强网络的能力。
这里使用搜索的过程来理解Q和K:
当我们想要查找一篇文章,我们会搜索该文章的关键字,如果我们通过该关键字搜不到要找的文章,我们会换另一个关键字,直到搜索到我们想要的文章,那么这个可以让我们搜到的关键字就是最适合查找目标的关键字,也就是Q。
搜索引擎拿到我们输入的关键字后Q后,会将该关键字与数据库里的文章进行对比,搜索引擎在检索一篇文章的时候会提前把数据库里的文章进行处理,比如提取关键信息,而关键信息也很多(比如一篇文章有很多关键词),那么那个关键信息能使搜索命中率最高,那个就是最适合接收查找信息的关键信息,这个最适合接收查找的关键信息就是K。
之后我们使用Q和K进行点乘也就是计算相似度之后得到一个分数,这就是相似度评分,之后有了相似度评分,就可以把内容V加权回去了。
由于计算Q、K、V的矩阵是可以学习的,因此网络可以自己学习出要怎么样安排Q、K、V。
计算过程:
q和k点乘得到权重
然后经过softmax层
之后和v相乘
矩阵运算
Multi-head self-attention
不同的head关注不同的资讯
Wp是人为设置的
将seq2seq中的RNN替换为self-attention。
Batch Normalization是以一个batch为基本单位,对每个神经元做归一化处理。(对同一个batch中不同数据的同一纬度做normalization)
Layer Normalization不需要考虑batch,给一笔data我们希望各个不同纬度的μ=0,σ=0
feed forward将输出吧b1-b4进行处理,然后进入另一个add&norm
原始论文中attention,每两个单词之间做一个attention。attention的权重越大,线条越粗
第一个句子,机器可以自动学到it要和animal做attention。
第二个句子,机器可以自动学到it要attention到street。
在multi-head attention中,每一组q、k、v做不同的事情。
不同的qkv得到不同的attention,左边的attention每个单词只考虑附近的几个单词,右边的attention中每个单词都考虑其余的所有单词。
universal transformer:每一层都是一样的transformer,深度上是RNN
为什么需要universal transformer:
主要的出发点是原版Transformer不是图灵完备的,有些很简单的任务表现很差,比如字符串拷贝。对于这个问题,谷歌给出了他的解决方案,也就是Universal Transformer。序列任务还是比较偏好于迭代和递归变换,RNN正好满足了这一点,而Transformer不满足。
1,引入了时间步step,从而实现了循环递归。除了第一次是原始信息作为输入,之后都是由前一个step的输出作为后一个的输入。
2,Feed-forward换成了Transition函数。根据task不同,可选择separable convolution分解卷积和fully-connected neural network全连接神经网络。
3,时间和位置编码,TimeStep embedding和Position embedding,新引入了TimeStep embedding,二者的编码公式和Transformer中的位置编码很像。