延续上一篇的一些关于深度学习的自己浅薄理解的学习笔记。
注意力评分函数
从计算量上来看,相比于点积操作,距离计算量更大,所以我们可以考虑使用点积操作来表示。之后再使用softmax激活函数使得注意力权重非负。 假设所有查询和键中的元素都是独立同分布的(均值为0,方差是一个定值d),为了使点积的方差为1,均值为0,我们可以采用缩放的策略,即缩放为原来的。
这样我们就得到了一个常用的(transformer的)注意力评分函数:
自注意力机制
自注意力(self-attention)顾名思义,是一种根据自身信息来学习和调整注意力分布的机制。
要是说自注意力机制就不得不提到它的前身——循环神经网络(RNN)。在Seq2seq模型中,编码器将源Sources编码成状态State输入给解码器,其中状态State是唯一在编码器和解码器之间交流的信息。
然而,传统的RNN在长序列处理时可能会遇到梯度消失或爆炸的问题。为了解决这一问题,我们需要探索是否可以将RNN的网络结构与注意力机制相结合,以提升模型的性能和效果。
答案是肯定的。我们可以把上一个阶段解码器隐藏层的状态当作是查询Query,把编码器隐藏层的状态作为键Key和值Value。这种方法允许解码器在生成每个输出时,动态地关注输入序列的不同部分,从而有效地捕捉到长距离依赖关系。
由此我们得到注意力输出为:
多头注意力机制
Multi-head attention。
仅仅依靠自身的信息循环产生注意力似乎过于单薄,研究人员由此思考能否将更多种类的信息结合用于生成注意力呢?这样我们能够提高模型的泛化性与感知能力。
简单来说Queries,Keys,Values可以传送给多个互补干扰(独立学习的)注意力头(heads),实现注意力并行池化,再将得到的结果结合在一起得到最终的注意力权重,进行使用。
用数学公式可以表示为: 其中表示第i个头得到的注意力输出。
参考文献
Attention is all you need. 动手学深度学习
欢迎交流讨论,斧正。