写在前面:此文只记录了下本人感觉需要注意的地方,不全且不一定准确。详细内容可以参考文中帖的链接,比较好!!!
attention详解
self attention & transformer
参考3
1 Attention原理
其计算公式为:s i = f ( s i − 1 , y i − 1 , c i ) s_{i} = f\left ( s_{i-1}, y_{i-1}, c_i \right )si=f(si−1,yi−1,ci)其中,s i s_isi 为decoder在 i ii 时刻的隐状态,$ y_{i-1}$ 为在 i − 1 i-1i−1 时刻decoder的输出,c i c_ici 为context信息。
c i = ∑ j = 1 J a i j h j c_{i} = \sum_{j=1}^{J}\text{a}_{ij}h_{j}ci=j=1∑Jaijhj
其中,h j h_{j}hj 表示encode中的第j个词的隐状态,a i j \text{a}_{ij}aij 为根据decode当前隐状态 s i s_isi 给予 h j h_{j}hj 的权重。
其中,a i j \text{a}_{ij}aij 是一个softmax模型输出,概率值的和为1。eij表示一个对齐模型,用于衡量encoder端的位置j个词,对于decoder端的位置i个词的对齐程度(影响程度),换句话说:decoder端生成位置i的词时,有多少程度受encoder端的位置j的词影响。
2 Attention分类
2.1 soft & hard attention
- soft attention:上文介绍
- hard attention:只关注到某一个位置上的信息。
- 硬性注意力有两种实现方式:(1)一种是选取最高概率的输入信息;(2)另一种硬性注意力可以通过在注意力分布式上随机采样的方式实现。
- 缺点:最终的损失函数与注意力分布之间的函数关系不可导,因此无法使用在反向传播算法进行训练。
2.2 global & local attention
- global attention:上文介绍
- 缺点:每次encoder端的所有hidden 都需要参与计算,计算开销较大,特别是输入较长,效率低。
- local attention:将decoder当前位置,预测到encoder端某个位置,然后选择一个窗口,来类似global一样计算,这样可以在输入较长的情况下,节约计算开支。
- 缺点:
1、当encoder句子不是很长时,相对Global Attention,计算量并没有明显减小。
2、位置向量的预测并不非常准确,这就直接影响到的local Attention的准确率。
2.3 self attention &Transformer结构
- self attention:
对于self-attention来讲,Q(Query), K(Key), V(Value)三个矩阵均来自同一输入,分别由n个单词嵌入的特征[x1, x2, …, xn],分别乘以 W Q , W K , W V W^{Q},W^{K},W^{V}WQ,WK,WV 得到。首先我们要计算Q与K之间的点乘,然后为了防止其结果过大,会除以一个尺度标度 d k \sqrt[]{d_{k}}dk ,其中 d k d_kdk 为一个query和key向量的维度。然后是Mask模块,这里encoder阶段没有,decoder阶段有,作用是忽略还未预测到部分(设置为0)。再利用Softmax操作将其结果归一化为概率分布,然后再乘以矩阵V就得到权重求和的表示。该操作可以表示为
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt[]d_k})VAttention(Q,K,V)=softmax(dkQKT)V
这里操作可能比较抽象,接下来举个具体例子,请参考
2.Transformer结构1中介绍的就是基本的Multihead Attention单元。
- 对于encoder来说就是利用这些基本单元叠加,其中key, query, value均来自前一层encoder的输出,即encoder的每个位置都可以注意到之前一层encoder的所有位置。
- 对于decoder来讲,我们注意到有两个与encoder不同的地方,一个是第一级的Masked Multi-head,另一个是第二级的Multi-Head Attention不仅接受来自前一级的输出,还要接收encoder的输出,下面分别解释一下是什么原理。
- 第一级decoder的key, query, value均来自前一层decoder的输出,但加入了Mask操作,即我们只能attend到前面已经翻译过的输出的词语,因为翻译过程我们当前还并不知道下一个输出词语,这是我们之后才会推测到的。
- 第二级decoder也被称作encoder-decoder attention layer,即它的query来自于之前一级的decoder层的输出,但其key和value来自于encoder的输出,这使得decoder的每一个位置都可以attend到输入序列的每一个位置。
- 总结一下,k和v的来源总是相同的,q在encoder及第一级decoder中与k,v来源相同,在encoder-decoder attention layer中与k,v来源不同。
版权声明:本文为weixin_42028608原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。