李宏毅老师课程链接
对于seq2seq的问题,可以选择用RNN或者CNN来解决,但是RNN无法做到平行的处理一个序列,也很难处理一个很长的序列。而CNN则需要多层才能看到比较多的信息。
而self-attention可以解决这些问题。
构建self-attention,首先将输入x转化成a,再把a分别转化成q,k,v,分别是匹配项,被匹配项和提炼信息。
将1个q和每个k一次做attention计算(点乘除以维数的根)得到a1i
然后把所有a1i做一次softmax。
把每个结果乘上vi,再把所有乘积相加得到b1.
b1就表示了a1与所有其他项之间的注意力关系。
以此类推,可以计算出所有的bi。
当然前面只叙述a1的操作是为了清晰,实际计算为了提高效率是把所有的ai并列5起来做矩阵运算的。
self-attention还可以做一种变形,称为multi-head。简单来说就是把q,k,v分成平行的多项,分别计算,这样一来平行的bi可能可以实现不同的功能。
在self-attention里序列之间的关系主要是平行的,为了强调序列的顺序性,我们也可以在ai中加上位置向量。
下图可以表示self-attention的作用。两个句子只是改变了一个单词,但是其中’it’指代的对象已经发生了变化,我们看到self-attention模型再看’it’的时候注意力也发生了变化。