为什么转换器不使用多头注意力层之后的激活函数?

人工智能 变压器 注意力
2021-11-04 09:29:38

我希望有人可以向我解释为什么在“Attention is all you need”论文的转换器模型中,在多头注意力层和残差连接之后都没有应用激活。在我看来,连续有多个线性层,我一直认为你应该在线性层之间进行激活。

例如,当我查看不同风格的 resnet 时,它们总是在线性层之后应用某种非线性。例如,残差块可能看起来像......

Input -> Conv -> BN -> Relu -> Conv -> (+ Input) -> BN -> Relu

或者在预激活的情况下......

输入 -> BN -> Relu -> Conv -> BN -> Relu -> Conv -> (+ 输入)

在我见过的所有 resnet 风格中,它们绝不允许在没有 relu 的情况下连接两个线性层。

然而在变压器...

Input -> Multihead-Attn -> Add/Norm -> Feed Forward(Dense Layer -> Relu -> Dense Layer) -> Add/Norm

在多头注意力层中,它执行注意力机制,然后应用一个全连接层来投影回其输入的维度。然而,它和前馈网络之间没有非线性关系(除了可能在部分注意力中使用的 softmax。)像这样的模型对我来说更有意义......

Input -> Multihead-Attn -> Add/Norm -> Relu -> Feed Forward(Dense Layer -> Relu -> Dense Layer) -> Add/Norm -> Relu

或类似预激活的 resnet...

Input -> Relu -> Multihead-Attn -> Add/Norm -> Input2 -> Relu -> Feed Forward(Dense Layer -> Relu -> Dense Layer) -> Add/Norm(Input2)

谁能解释一下为什么变压器是这样的?

当我在另一个论坛上查看wavenet 的架构时,我曾问过类似的问题,但我从未真正得到明确的答案。在那种情况下,为什么没有对剩余连接应用激活对我来说再次没有意义。https://www.reddit.com/r/MachineLearning/comments/njbjfb/d_is_there_a_point_to_have_layers_with_just_a/

1个回答

这又回到了自我关注的目的。

词向量之间的度量通常通过余弦相似度来计算,因为在维度中存在词标记,即使两个词被训练为相似的值更接近,两个词也极不可能共线。但是,如果两个经过训练的标记在语义上比两个完全不相关的词更接近,则它们将具有更高的余弦相似度。

自注意机制利用了这一事实;经过几次这样的矩阵乘法,不相似的词会因为它们之间的点积而归零或变为负数,相似的词会在结果矩阵中脱颖而出。

需要考虑的重要一点是,在自注意力机制中,没有参数;这些线性运算只是为了通过使用用于表示它们的向量的属性来捕获不同向量之间的关系。

阅读Peter Bloem的这篇博文,更深入地解释 self-attention。


编辑

我应该补充一点,考虑到 Transformer 似乎也适用于没有学习嵌入的任务,例如时间序列预测,这种解释不太令人满意。我不知道为什么会这样。然而,该模型最初用于 NLP,并且他们确实使用了学习嵌入。所以,我敢打赌,这就是为什么那个特定的架构看起来像它的样子。

Bloem 在上面的博客文章中确实讨论了自注意力的数学特性,但没有提出原始架构确实已经学习嵌入的事实。

所有这些都表明,学习嵌入并不重要。多头注意力之后的层将学习向量之间的关系。关于被利用的点积属性的一般观点确实成立。