Self-Attention理论推导
理论推导
Self-Attention的Input,它就是一串的Vector,那这个Vector可能是你整个Network的Input,它也可能是某个Hidden Layer的Output,所以用

Input一排a向量以后,Self-Attention要Output另外一排b向量。每一个b都是考虑了所有的a以后才生成出来的,
关于如何产生

每一个向量跟

计算这个
dot product**:输入的这两个向量分别乘上两个不同的矩阵**,左边这个向量乘上
这个矩阵得到矩阵 ,右边这个向量乘上 这个矩阵得到矩阵 ,再把 跟 做dot product,就是把他们做element-wise 的相乘,再全部加起来以后就得到一个 scalar,这个scalar就是 ,这是一种计算 的方式(Transformer)。 Additive:把同样这两个向量通过
,得到 跟 ,拼接这两个向量,然后输入到Activation Function,再通过一个Transform,然后得到 。
那你就要把这边的


把
计算出

这个Soft-Max跟分类的时候的那个Soft-Max是一模一样的,所以Soft-Max的输出就是一排

首先把
到 这边每一个向量,乘上 得到新的向量,这边分别就是用 来表示 接下来把这边的
到 ,每一个向量都去乘上Attention的分数,都去乘上 然后再把它加起来,得到
如果某一个向量它得到的分数越高,比如说如果
所以谁的那个Attention的分数最大,谁的那个
至此,从一整个Sequence 就得到了

从这一排 vector 得到
怎么计算这个

把
乘上一个 matrix,变成 然后接下来根据
,去对 到 这四个位置,都去计算 attention 的 score - 把
跟 做个这个 dot product - 把
跟 也做个 dot product - 把
跟 也做 dot product - 把
跟 也做 dot product,得到四个分数
- 把
得到这四个分数以后,可能还会做一个 normalization,比如说 softmax,然后得到最后的 attention 的 score,
那我们这边用 表示经过 normalization 以后的attention score 接下来拿这四个数值,分别乘上
- 把
乘上 - 把
乘上 - 把
乘上 - 把
乘上 ,然后全部加起来就是
- 把
同理就可以,由
矩阵形式的Self-Attention
接下来我们从矩阵乘法的角度,再重新讲一次我们刚才讲的,Self-attention 是怎么运作的
我们现在已经知道每一个
如果要用矩阵运算表示这个操作的话,是什么样子呢
我们每一个

一样
接下来产生

所以每一个
下一步是,每一个
那得到 attention 分数这一件事情,如果从矩阵操作的角度来看,它在做什么样的事情呢

你就是把
同理
那这个四个步骤的操作,你其实可以把它拼起来,看作是矩阵跟向量相乘

这四个动作,你可以看作是我们把
那我们刚才讲过说,我们不只是

所以这些 attention 的分数可以看作是两个矩阵的相乘,一个矩阵它的 row,就是
我们会在 attention 的分数,做一下 normalization,比如说你会做 softmax,你会对这边的每一个 column 做 softmax,让每一个 column 里面的值相加是 1,之前有讲过说,其实这边做 softmax不是唯一的选项,你完全可以选择其他的操作,比如说 ReLU 之类的,那其实得到的结果也不会比较差,通过了 softmax 以后,它得到的值有点不一样了,所以我们用
我们已经计算出

把
如果你是用矩阵操作的角度来看它,就是把

就是以此类推,把
所以我们等于就是把
整体回顾Self-attention的矩阵操作

是 Self-attention 的 input,Self-attention 的 input 是一排的vector,这排 vector 拼起来当作矩阵的 column,就是 这个 input 分别乘上三个矩阵,
跟 ,得到 这三个矩阵,接下来
乘上 的 transpose,得到 这个矩阵, 的矩阵你可能会做一些处理,得到 ,那有时候我们会把这个 ,叫做 Attention Matrix,生成 矩阵就是为了得到Attention的score 然后接下来你把
再乘上 ,就得到 , 就是 Self-attention 这个 layer 的输出,生成 是为了计算最后的 ,也就是矩阵
所以 Self-attention 输入是