为了便于描述,将attention机制的三元组定义为 ,并且通常情况下 与 等价。整个计算过程可分为三步:
1. 计算 与每个 的相关性 ;
2. 权重归一化 ;
3. 加权求和 .
其中, 为标量, 为序列长度, 为相关性函数。常见的相关性函数有:
Multiplicative:
Additive: MLP:
单纯的从attention机制计算上来看,介绍到这里其实核心的东西都阐明了,attention无非就是想捕捉到序列中最相关 的信息。
但是,如果仅仅到这里的话,那也不值得深夜码字了。说好的抛砖引玉,还没抛呢,接下来才是本文的重点!
2. 抛砖
注:本小节仅为个人观点,如有好的想法,欢迎讨论交流。
注意到,上节在总结attention机制的时候,用了最相关 这个词,我们可以思考一下这个最相关是怎么来的?
首先,直观上看,相关性函数计算得分越高,则该位置的信息越重要。
其次,由于相关性函数 同时也是 的函数,这也就意味著,相关性得分与 联系紧密。而这正是本文所要深入探讨的点。
砖一:在attention机制三元组 中, 类似于一个监督信号 ,并且一个有意义的 是attention机制的关键;
砖二:从概率论的角度出发,attention的权重 可以看作是给定监督信号 下的条件概率分布 ,加权求和的输出 即为条件期望 。
第二条相对容易理解,下面简要分析下第一条:
首先,对于机器翻译,decoder中每前一时刻的隐状态 作为监督信号 。对于问答场景,question本身即是天然的监督信号 。它们的核心思想都是通过 的作用 ,去捕捉最相关的信息;
其次,对于文本分类和匹配等任务,由于不存在类似上述的天然监督信号 ,那么如何去寻找 成为attention机制能否奏效的关键所在。
读过相关论文的同学都知道,既然没有这样的天然监督信号,那我就随机初始化定义一个 ,随著样本一起训练,接下来把时间交给神经网路就好啦。
这肯定是个好想法,充分利用神经网路的学习能力,尝试去拟合任务内在的监督信号 。但是这种做法存在两个问题:
鲁棒性和泛化能力有待考究。训练完, 是一个固定的表征,模型推理时对于任意的输入,该监督信号是否都能够get到关键信息;
单个监督信号表征的信息不充分。单个static监督信号无法cover整个特征空间,只能捕捉到某一层面的信息。
3. Basic-Attention的变体
既然上面讲了那么多Basic-Attention存在的问题,那么接下来就得讲讲该如何缓解这些问题。主要介绍两个思路。
其一,定义单个监督信号 所能表征的信息不够充分,那么最直接的做法就是定义多个监督信号,期望每个监督信号都能捕捉到不同层面的信息。这块工作的经典论文为「A STRUCTURED SELF-ATTENTIVE SENTENCE EMBEDDING」,文中还顺带提出一个有意思的正则项,用来迫使每个监督信号分别attention到不同信息。
A Structured Self-attentive Sentence Embedding ?
arxiv.org
其二,可训练的监督信号训练结束后是固定的,我们期望可以根据具体的输入文本,动态的调整监督信号,提高模型的鲁棒性和泛化能力。这个方向还没有出现较为成熟的方案,此处给大家推荐一篇dynamic self-attention作为参考。作者结合multi-head的形式取得了较好的结果,链接如下。
Dynamic Self-Attention : Computing Attention over Words Dynamically for Sentence Embedding ?
arxiv.org
延续前文思路,个人认为attention机制后续发展的关键还是在于如何去定义或者生成动态自适应的监督信号 。
最后,有同学可能会有疑惑,谈attention,怎么能不提到Transformer中的attention结构呢?简单说两句我个人的理解,Transformer中的 三者都来自其自身的表征 ,舍弃LSTM,转而利用「self-attention」来表征每个词与其上下文的联系。encoder中的多个block可以看作是多层级联的BiLSTM。
推荐阅读: