Self Attention 李宏毅
一般用于输入一个序列,经过模型输出一个序列的
如上如图所示,在翻译句子词性的时候,要考虑句子上下文的关系?如何将上下文考虑进去?
采用self attention机制,将输入的向量,经过变化输出一个考虑上下文的新的向量
也可以进行多次self attention
self attention 过程
对于其中一个输入向量,要靠考虑与其他向量的相关性,变换后输出新的向量
如何考虑向量之间的相关性?
将一个向量与 W q W^q Wq相乘得到 q向量,同理也能得到 k 向量,两个向量进行点积,输出他们的相关性,也可以采用右侧的更复杂的模型计算相关性。 不过dot-product比较常用。
我们使用一个输入的 q 向量,和其他所有输入的 k 向量进行 dot-product,将得到的分数进行归一化 (比如 soft-max),得到的 α 1 , 1 ′ α 1 , 2 ′ α'_{1,1} α'_{1,2} α1,1′α1,2′等,都可以看作生成新向量的权重。
然后让 α 1 , 1 ′ α 1 , 2 ′ α'_{1,1} α'_{1,2} α1,1′α1,2′等分别和对应的 v 向量相乘,得到新的输出 b 1 b^1 b1
我们可以考虑将 self attention 过程进行并化处理。
self attention 矩阵计算过程
计算 q k v 矩阵
计算相关性得分
计算输出
multi-head self-attention
输入的数据可能有多种类型的相关性。
在得到 q k v的基础上,同一个输入计算多个 q k v 向量。
Positional Encoding
在使用 self attention的时候,完全没有考虑位置关心。
比如 q1 与 k1 k2 k3… 之间的计算,并没有什么区别,“天涯若比邻”
向我们的计算过程中添加位置因素:
设置位置向量 e,每一个 position对应一个位置向量
e
i
e^i
ei,位置向量两个来源:
- 手动设置
- 从数据中学习到
self-attention v.s. CNN
可以将CNN看作是一种超级简化版的self-attention
- CNN 计算一个位置的信息的时候,只考虑一个卷积核范围内的数据
- self-attention 计算一个位置的信息时,考虑整个数据,并自动设置关系,所有更加复杂。
self-attention v.s. RNN
- RNN 要按照 time step进行计算,前后每一步之间并不能实现并行化计算
- self-attention 可以设计并行化的实现。