Self Attention 李宏毅
一般用于输入一个序列,经过模型输出一个序列的


如上如图所示,在翻译句子词性的时候,要考虑句子上下文的关系?如何将上下文考虑进去?
采用self attention机制,将输入的向量,经过变化输出一个考虑上下文的新的向量

也可以进行多次self attention

self attention 过程
对于其中一个输入向量,要靠考虑与其他向量的相关性,变换后输出新的向量

如何考虑向量之间的相关性?

将一个向量与 WqW^qWq相乘得到 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 向量相乘,得到新的输出 b1b^1b1

我们可以考虑将 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对应一个位置向量 eie^iei,位置向量两个来源:
- 手动设置
- 从数据中学习到

self-attention v.s. CNN

可以将CNN看作是一种超级简化版的self-attention
- CNN 计算一个位置的信息的时候,只考虑一个卷积核范围内的数据
- self-attention 计算一个位置的信息时,考虑整个数据,并自动设置关系,所有更加复杂。

self-attention v.s. RNN

- RNN 要按照 time step进行计算,前后每一步之间并不能实现并行化计算
- self-attention 可以设计并行化的实现。
2万+

被折叠的 条评论
为什么被折叠?



