Transformer 初学习
Self-attention
为什么提出Self-attention
我们现在有a1, a2, a3, a4四个输入,先来看一下RNN是怎么做的
对于这个结构来说,必须要计算完前一个RNN,才能开始不断更新下一个RNN。也就是说,我们必须按照a1–>a2–>a3–>a4的顺序最终得到b4,不能够平行运算(Hard to parallel !)
那么就有人提出了用CNN来取代RNN的想法,让我们来一起看看CNN怎么解决这个问题:
对于输入a1, a2, a3, a4 可以通过多个filter同时得到 b1, b2, b3, b4;但是这时候又遇到一个问题,这里每个CNN都只能考虑有限的内容,不像RNN可以考虑整个句子(a1-a4)的内容;因此我们要使用多层CNN。可以看到上图中蓝色的三角,它可以看到这个句子所有的内容。但是问题就来了,如果你要看到长期的资讯,就需要叠很多层的CNN,如果你想要在第一个filter就看到长期的资讯,是做不到的。*因此self-attention就被提出,有效地解决了这个问题 *
我们先来大概的看一下,什么是Self-attention:
这里我们先大致的了解一下Self-attention做了什么事情,简单来说,就是输入a1-a4,可以通过平行运算,得到b1-b4。
Self-attention如何平行运算
我们清楚了Self-attention在做什么之后,一起来看看它是如何做到平行运算的:
从上图可以看到,我们在计算 Q, K, V 矩阵时,都可以通过 Wq, Wk, Wv 实现平行运算;(W矩阵是训练得到的,随机初始化)
从上图看到,我们可以通过这种方式,平行运算得到我们的注意力矩阵A,再通过softmax可以得到之后的矩阵。
最后以同样的形式可以平行运算得到输出矩阵O: