使用self-attention替代RNN

image.png

RNN的每个输出都考虑全局的信息, 但它有个很大的缺点, 他它无法并行计算.
于此同时, CNN能并行计算, 但是它相比RNN不够那么考虑全局的信息. 尽管你可以叠加多层CNN来实现, 全局信息的考虑, 使得CNN能到达到与RNN相同输入和输出的效果, 并且还能做并行计算. 但是, 现在有更好地选择-> self-attention

self-attention如何替代RNN

image.png
self-attention 用于取代RNN

image.png
a : attention

image.png

a = q . k / sqrt(d) . 这里的sqrt原论文没有细说, 但直观地讲是 q.k的dim越大那么输出值越大, 所以这里对输出值的大小做一个”平衡”.

image.png

image.png
如上, 输出b1考虑了a1~a4的信息. 而且也能只考虑局部信息, 只需要使得a1_hat为0.

同理, 计算b2~b4

image.png

image.png

为什么self-attention能并行计算

image.png

image.png

image.png

image.png

image.png

多头注意力(2头为例)

image.png
image.png
image.png
对bi1和bi2 -> bi

对self-attention进行位置编码

之前的self-attention是不考虑位置信息的,而现在, 我们将加上位置编码.
image.png
ei就是位置的信息. 它是手动设置的, 它与ai直接相加. 之后的操作与之前相同. 但是为什么不是concat,而是相加呢? 答: 几乎是等价的, 还不如直接相加.
image.png
如上解释了为什么ei+ai,而不是concat. 如果我们concat的话, 其中wp和pi都是与位置有关的信息, 可以发现输出的 wp + pi可以被ei直接替代.
这里的wp也是手动的, 它的样子如下: image.png

self-attention如何在seq2seq中使用.

image.png
image.png

谷歌给出的transformer介绍

https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html
李宏毅-transformer - 图23
如上,encode和decodeing阶段, 对语言进行翻译工作.

image.png
基于transformer的seq2seq的model. 将中文”机器学习” 翻译为 “machine learning”

image.png
解读 encode子模块.

  1. embeding为向量, 并加上positional encoding
  2. 输入灰色的块中, 重复这个块多次. (结合上面的gif)

解读 decoding子模块.

  1. embeding为向量, 并加上positional encoding
  2. 输入灰色块中, 重复这个块多次.(结合上面的gif)
    1. Masked Muti-head attention 中的masked是指挑选已经生成的sequence们来做attention

Attention Visuazation

image.png
两两之间的attention越强越粗
image.png
如上. 在不同语境下, attention先后给出了it指代animal和it指代street.

Multi-head Attention Visualization

image.png
在多头注意力中, 每一组q和v都做不同的事情. 如上, 绿色和红色是不同组的q和v的注意力结果. 红色的输出是对当前单词的位置的上一个单词进行预测. 绿色的输出就比较复杂了, 是对当前单词的位置之前多个单词进行预测.

transformer能干嘛

image.png

替代seq2seq. (目前transformer已经做了一遍seq2seq这些任务了 ) . 以上是谷歌的一个应用, 对transformer模型输入超级大量的文档, 期望输出类似维基百科的文档.

Universal Transformer

image.png
之前的transformer的每一层结构(在模型深度上或说在时间上)是不一样的. universal Transformer通过在深度上使用Rnn使每一层都做相同的transformer结构.

将transformer用在图像上.

image.png