Transformer与注意力机制解析II | 豆包MarsCode AI 刷题

9 阅读2分钟

延续上一篇的一些关于深度学习的自己浅薄理解的学习笔记。

注意力评分函数

从计算量上来看,相比于点积操作,距离计算量更大,所以我们可以考虑使用点积操作来表示α(x,xi)\alpha (x,x_i)。之后再使用softmax激活函数使得注意力权重非负。 假设所有查询qRdq \in R^d和键kiRdk_i \in R^d中的元素都是独立同分布的(均值为0,方差是一个定值d),为了使点积的方差为1,均值为0,我们可以采用缩放的策略,即缩放为原来的1/(d)1/\sqrt{(d)}

这样我们就得到了一个常用的(transformer的)注意力评分函数: softmax(QKT(d))VRn×vsoftmax(\frac{QK^T}{\sqrt{(d)}})V\in R^{n \times v}

自注意力机制

自注意力(self-attention)顾名思义,是一种根据自身信息来学习和调整注意力分布的机制。

要是说自注意力机制就不得不提到它的前身——循环神经网络(RNN)。在Seq2seq模型中,编码器将源Sources编码成状态State输入给解码器,其中状态State是唯一在编码器和解码器之间交流的信息。

然而,传统的RNN在长序列处理时可能会遇到梯度消失或爆炸的问题。为了解决这一问题,我们需要探索是否可以将RNN的网络结构与注意力机制相结合,以提升模型的性能和效果。

答案是肯定的。我们可以把上一个阶段解码器隐藏层的状态当作是查询Query,把编码器隐藏层的状态作为键Key和值Value。这种方法允许解码器在生成每个输出时,动态地关注输入序列的不同部分,从而有效地捕捉到长距离依赖关系。

由此我们得到注意力输出为:

ct=α(st1,ht)htc_{t'}=\sum \alpha(s_{t'-1},h_t)h_t

多头注意力机制

Multi-head attention。

仅仅依靠自身的信息循环产生注意力似乎过于单薄,研究人员由此思考能否将更多种类的信息结合用于生成注意力呢?这样我们能够提高模型的泛化性与感知能力。

简单来说Queries,Keys,Values可以传送给多个互补干扰(独立学习的)注意力头(heads),实现注意力并行池化,再将得到的结果结合在一起得到最终的注意力权重,进行使用。

用数学公式可以表示为: MultiHead(Q,K,V)=Concat(head1,head2,,headh)W0MultiHead(Q,K,V)=Concat(head_1,head_2,…,head_h)W^0 其中headihead_i表示第i个头得到的注意力输出。

参考文献

Attention is all you need. 动手学深度学习

欢迎交流讨论,斧正。