注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影。所以,了解注意力机制的工作原理对于关注深度学习技术发展的技术人员来说有很大的必要。
1 人类的视觉注意力
从注意力模型的命名方式看,很明显其借鉴了人类的注意力机制,因此,我们首先简单介绍人类视觉的选择性注意力机制。
图1 人类的视觉注意力
视觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。
这是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。
图1形象化展示了人类在看到一副图像时是如何高效分配有限的注意力资源的,其中红色区域表明视觉系统更关注的目标,很明显对于图1所示的场景,人们会把注意力更多投入到人的脸部,文本的标题以及文章首句等位置。
深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息。
2 Encoder-Decoder框架(seq2seq)
要了解深度学习中的注意力模型,就不得不先谈Encoder-Decoder框架,因为目前大多数注意力模型附着在Encoder-Decoder框架下,当然,其实注意力模型可以看作一种通用的思想,本身并不依赖于特定框架,这点需要注意。
Encoder-Decoder框架可以看作是一种深度学习领域的研究模式,应用场景异常广泛。图2是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示。
图2 抽象的文本处理领域的Encoder-Decoder框架
文本处理领域的Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对<Source,Target>,我们的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。Source和Target可以是同一种语言,也可以是两种不同的语言。而Source和Target分别由各自的单词序列构成:
Encoder顾名思义就是对输入句子Source进行编码,将输入句子通过非线性变换转化为中间语义表示C:
对于解码器Decoder来说,其任务是根据句子Source的中间语义表示C和之前已经生成的历史信息生成 i 时刻要生成的单词
:
每个 yi 都依次这么产生,那么看起来就是整个系统根据输入句子Source生成了目标句子Target。如果Source是中文句子,Target是英文句子,那么这就是解决机器翻译问题的Encoder-Decoder框架;如果Source是一篇文章,Target是概括性的几句描述语句,那么这是文本摘要的Encoder-Decoder框架;如果Source是一句问句,Target是一句回答,那么这是问答系统或者对话机器人的Encoder-Decoder框架。由此可见,在文本处理领域,Encoder-Decoder的应用领域相当广泛。
Encoder-Decoder框架不仅仅在文本领域广泛使用,在语音识别、图像处理等领域也经常使用。比如对于语音识别来说,图2所示的框架完全适用,区别无非是Encoder部分的输入是语音流,输出是对应的文本信息;而对于“图像描述”任务来说,Encoder部分的输入是一副图片,Decoder的输出是能够描述图片语义内容的一句描述语。一般而言,文本处理和语音识别的Encoder部分通常采用RNN模型,图像处理的Encoder一般采用CNN模型。
3 Attention机制
首先Attention机制到底是什么,这个概念上不难理解,其实就是对输入的东西做一个权重,比如一段序列文本中,哪一段的作用大一点,权重就大一些,哪一段作用小一点,权重就小一些。在图像中就是哪个区域范围作用大一些,权重就大一些,作用小的权重就小一些。Attention机制的主要原理可以用四个字来形容:加权求和。
图3 编码器-解码器体系结构:(a)传统(b)注意模型
Attention的使用:
具有注意模型的相应编码器-解码器体系结构如图2(b)所示。网络结构中的注意力模块负责自动学习注意力权重,它可以自动捕获
(编码器隐藏状态,我们称之为候选状态)和 sj(解码器隐藏状态,我们称之为查询状态)之间的相关性。然后,这些注意力权重用于构建内容向量C,该向量作为输入传递给解码器。在每个解码位置j,内容向量 cj 是编码器所有隐藏状态及其相应注意权重的加权和。
3.1 Encoder阶段具体的流程
如下图:
图4
比如我们是Source是:“我是中国人",我们的Target是:”I am Chinese“。通过此图我们由下往上走,首先我们将句子切词,然后输入到我们的神经网络中,这时候通过神经网络我们会得到每个词的一个向量矩阵,然后我们将这些向量矩阵通过加权求和就得到了一个语义向量Ci.,这就是Encoder阶段需要做的事。
Attention机制与Seq区别在哪呢,就是语义向量 Ci 了,seq是直接得到一个不变的语义向量C,而Attention机制则是在每一个时刻中的语义向量Ci是出于动态改变的过程,这样做的好处是什么呢,通过一个动态的改变的语义向量Ci,我们可以知道在Target中的每一个词是Source中的哪个字或者词对它的影响比较大,比如Source中的“是”对Target中的“am”影响比较大,那么Encoder中的a2权重会大一些。具体这个权重是怎么算的呢,接下来就讲。
3.2 Decoder阶段具体流程
如图:
图5
从下往上看,每一时刻的输入都包含了前一时刻的输出的向量 Yi 和 当前时刻的语义向量Ci,Yi 在作为下一时刻的输入时需要进行一次embedding,即将One-hot编码给压缩。图中的 Si 指的是前一个神经网络的输出状态(还可以是本层神经网络的输出状态),我们通过一个sorce函数来计算每一个时刻的权重aij,sorce函数具体有三种实现方式,分别为:
①si转置矩阵*Yi得出a在此时刻的权重值
②针对①的弊端,若两个矩阵无法相乘,比如1*3的矩阵和4*1的矩阵,此时我们可添加一个中间的矩阵,如3*4的矩阵,此矩阵中每一个值都是si与yi有关联性的值,这个具体问题具体定义
③是最常用的办法,是通过一个或者多个全连接层的网络最后通过softmax得到权重a
综上,在Decoder阶段,每一时刻的神经网络(除第一时刻)输入的是语义向量Ci、St-1、Yt-1。通过socre函数将St-1、Yt-1计算出此时刻的Encode的权重aij,再通过此时刻的 aij 进行加权求和得到此时刻的语义向量Ci。然后将前面时刻的输出Y1...Yt-1与Ci一同输出到此时刻的神经网络中得出此时的Yi。
按注意力的可微性,可分为:
- Hard-Attention,就是0/1问题,某个区域要么被关注,要么不关注,这是一个不可微的注意力;
- Soft-Attention,[0,1]间连续分布问题,用0到1的不同分值表示每个区域被关注的程度高低,这是一个可微的注意力。
按注意力的关注域,可分为:
- 空间域(spatial domain)
- 通道域(channel domain)
- 层域(layer domain)
- 混合域(mixed domain)
- 时间域(time domain)
4 Soft Attention
图2中展示的Encoder-Decoder框架是没有体现出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。为什么说它注意力不集中呢?请观察下目标句子Target中每个单词的生成过程如下:
其中 f 是Decoder的非线性变换函数。从这里可以看出,在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子Source的语义编码C都是一样的,没有任何区别。
而语义编码C是由句子Source的每个单词经过 Encoder 编码产生的,这意味着不论是生成哪个单词,y1, y2 还是y3,其实句子Source中任意单词对生成某个目标单词 yi 来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。这类似于人类看到眼前的画面,但是眼中却没有注意焦点一样。
如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解,比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。
在翻译“杰瑞”这个中文单词的时候,分心模型里面的每个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“Jerry”对于翻译成“杰瑞”更重要,但是分心模型是无法体现这一点的,这就是为何说它没有引入注意力的原因。
没有引入注意力的模型在输入句子比较短的时候问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。
上面的例子中,如果引入Attention模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:
(Tom,0.3)(Chase,0.2) (Jerry,0.5)
每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小。这对于正确翻译目标语单词肯定是有帮助的,因为引入了新的信息。
同理,目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词 yi 的时候,原先都是相同的中间语义表示C会被替换成根据当前生成单词而不断变化的Ci。理解Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci。增加了注意力模型的Encoder-Decoder框架理解起来如 图6 所示。
图6 引入注意力模型的Encoder-Decoder框架
即生成目标句子单词的过程成了下面的形式:
而每个Ci 可能对应着不同的源语句子单词的注意力分配概率分布,比如对于上面的英汉翻译来说,其对应的信息可能如下:
其中,f2 函数代表 Encoder 对输入英文单词的某种变换函数,比如如果 Encoder 是用的RNN模型的话,这个 f2 函数的结果往往是某个时刻输入 xi 后隐层节点的状态值;g 代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和,即下列公式:
其中,Lx 代表输入句子Source的长度,aij 代表在 Target 输出第 i 个单词时 Source 输入句子中第 j 个单词的注意力分配系数,而 hj 则是 Source 输入句子中第 j 个单词的语义编码。假设下标 i 就是上面例子所说的“汤姆” ,那么Lx就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分别是输入句子每个单词的语义编码,对应的注意力模型权值则分别是0.6,0.2,0.2,所以 g 函数本质上就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示Ci的形成过程类似图7。
图7 Attention的形成过程
这里还有一个问题:生成目标句子某个单词,比如“汤姆”的时候,如何知道Attention模型所需要的输入句子单词注意力分配概率分布值呢?就是说“汤姆”对应的输入句子Source中各个单词的概率分布:(Tom,0.6)(Chase,0.2)(Jerry,0.2) 是如何得到的呢?
为了便于说明,我们假设对图2的非Attention模型的Encoder-Decoder框架进行细化,Encoder 采用RNN模型,Decoder 也采用RNN模型,这是比较常见的一种模型配置,则图2的框架转换为图8。
图8 RNN作为具体模型的Encoder-Decoder框架
那么用图9可以较为便捷地说明注意力分配概率分布值的通用计算过程。
图9 注意力分配概率计算
对于采用RNN的Decoder来说,在时刻 i,如果要生成 yi 单词,我们是可以知道 Target 在生成 Yi 之前的时刻 i-1 时,隐层节点 i-1 时刻的输出值 Hi-1 的,而我们的目的是要计算生成 Yi 时输入句子中的单词“Tom”、“Chase”、“Jerry”对 Yi 来说的注意力分配概率分布,那么可以用Target输出句子 i-1 时刻的隐层节点状态 Hi-1 去一一和输入句子Source中每个单词对应的RNN隐层节点状态 hj 进行对比,即通过函数 F(hj,Hi-1) 来获得目标单词 yi 和每个输入单词对应的对齐可能性,这个 F 函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。
绝大多数Attention模型都是采取上述的计算框架来计算注意力分配概率分布信息,区别只是在F的定义上可能有所不同。图10可视化地展示了在英语-德语翻译系统中加入Attention机制后,Source和Target两个句子每个单词对应的注意力分配概率分布。
图10 英语-德语翻译的注意力概率分布
上述内容就是经典的Soft Attention模型的基本思想,那么怎么理解Attention模型的物理含义呢?一般在自然语言处理应用里会把Attention模型看作是输出Target句子中某个单词和输入Source句子每个单词的对齐模型,这是非常有道理的。
目标句子生成的每个单词对应输入句子单词的概率分布可以理解为输入句子单词和这个目标生成单词的对齐概率,这在机器翻译语境下是非常直观的:传统的统计机器翻译一般在做的过程中会专门有一个短语对齐的步骤,而注意力模型其实起的是相同的作用。
图11 Google 神经网络机器翻译系统结构图
图11所示即为Google于2016年部署到线上的基于神经网络的机器翻译系统,相对传统模型翻译效果有大幅提升,翻译错误率降低了60%,其架构就是上文所述的加上Attention机制的Encoder-Decoder框架,主要区别无非是其Encoder和Decoder使用了8层叠加的LSTM模型。
5 Attention机制的本质思想
如果把Attention机制从上文讲述例子中的Encoder-Decoder框架中剥离,并进一步做抽象,可以更容易看懂Attention机制的本质思想。
图12 Attention机制的本质思想
我们可以这样来看待Attention机制(参考图12):将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。即可以将其本质思想改写为如下公式:
其中,Lx=||Source||代表Source的长度,公式含义即如上所述。上文所举的机器翻译的例子里,因为在计算Attention的过程中,Source中的Key和Value合二为一,指向的是同一个东西,也即输入句子中每个单词对应的语义编码,所以可能不容易看出这种能够体现本质思想的结构。
当然,从概念上理解,把Attention仍然理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息,这种思路仍然成立。聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。
从图9可以引出另外一种理解,也可以将Attention机制看作一种软寻址(Soft Addressing):Source可以看作存储器内存储的内容,元素由地址Key和值Value组成,当前有个Key=Query的查询,目的是取出存储器中对应的Value值,即Attention数值。通过Query和存储器内元素Key的地址进行相似性比较来寻址,之所以说是软寻址,指的不像一般寻址只从存储内容里面找出一条内容,而是可能从每个Key地址都会取出内容,取出内容的重要性根据Query和Key的相似性来决定,之后对Value进行加权求和,这样就可以取出最终的Value值,也即Attention值。所以不少研究人员将Attention机制看作软寻址的一种特例,这也是非常有道理的。
至于Attention机制的具体计算过程,如果对目前大多数方法进行抽象的话,可以将其归纳为两个过程:第一个过程是根据Query和Key计算权重系数,第二个过程根据权重系数对Value进行加权求和。而第一个过程又可以细分为两个阶段:第一个阶段根据Query和Key计算两者的相似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理;这样,可以将Attention的计算过程抽象为如图13展示的三个阶段。
图13 三阶段计算Attention过程
在第一个阶段,可以引入不同的函数和计算机制,根据Query和某个Key_i,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:
第一阶段产生的分值根据具体产生的方法不同其数值取值范围也不一样,第二阶段引入类似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。即一般采用如下公式计算:
第二阶段的计算结果 a_i 即为 value_i 对应的权重系数,然后进行加权求和即可得到Attention数值:
通过如上三个阶段的计算,即可求出针对Query的Attention数值,目前绝大多数具体的注意力机制计算方法都符合上述的三阶段抽象计算过程。
6 Self Attention模型(自注意力)
self-attention是attention机制的一种。一个self-attention
模块输入为 n,输出也为 n。那么在这个模块内部发生了什么?用门外汉的术语来说,self-attention
机制允许输入彼此之间进行交互(“self”)并找出它们应该更多关注的区域(“Attention”)。输出是这些交互作用和注意力得分的总和。
上面所讲的attention是输入对输出的权重,例如我们正在做机器翻译,将“I am a student”翻译成中文“我是一个学生”,attention机制 是"I am a student"对"学生"的权重。self-attention则是自己对自己的权重,例如 "I am a student" 分别对"am"的权重、对"student"的权重。之所以这样做,是为了充分考虑句子之间不同词语之间的语义及语法联系。
步骤
例子分为以下步骤:
- 准备输入
- 初始化权重
- 导出
key
,query
andvalue
的表示 - 计算输入1 的注意力得分(
attention scores
) - 计算softmax
- 将
attention scores
乘以value
- 对加权后的
value
求和以得到输出1 - 对输入2重复步骤4–7
Note: 实际上,数学运算是向量化的,即所有输入都一起进行数学运算。
6.1 准备输入
我们从3个输入开始,每个输入的size为4。
6.2 初始化权重
每个输入必须具有三个表示形式(请参见下图)。这些表示称为key
(橙色),query(红色)和
value(紫色)。在此示例中,假设我们希望这些表示的尺寸为3。由于每个输入的尺寸均为4,这意味着每组权重的形状都必须为4×3。
Note: 稍后我们将看到value
的维度也就是输出的维度。
为了获得这些表示,将每个输入(绿色)乘以一组用于key
的权重,另一组用于query
的权重和一组value
的权重。在我们的示例中,我们如下初始化三组权重。
key
的权重
[[0, 0, 1],
[1, 1, 0],
[0, 1, 0],
[1, 1, 0]]
query
的权重
[[1, 0, 1],
[1, 0, 0],
[0, 0, 1],
[0, 1, 1]]
value
的权重
[[0, 2, 0],
[0, 3, 0],
[1, 0, 3],
[1, 1, 0]]
Note:
在神经网络的设置中,这些权重通常是很小的数,使用适当的随机分布(如高斯,Xavie 和 Kaiming 分布)随机初始化。初始化在训练之前完成一次。*
6.3 从每个输入中导出key
, query
and value
的表示
现在我们有了三组值的权重,让我们实际查看每个输入的键,查询和值表示形式。
6.3.1 从每个输入中导出key
的表示
输入 1 的 key
的表示形式
[0, 0, 1]
[1, 0, 1, 0] x [1, 1, 0] = [0, 1, 1]
[0, 1, 0]
[1, 1, 0]
使用相同的权重集获得输入 2 的key
的表示形式:
[0, 0, 1]
[0, 2, 0, 2] x [1, 1, 0] = [4, 4, 0]
[0, 1, 0]
[1, 1, 0]
使用相同的权重集获得输入 3 的key
的表示形式:
[0, 0, 1]
[1, 1, 1, 1] x [1, 1, 0] = [2, 3, 1]
[0, 1, 0]
[1, 1, 0]
一种更快的方法是对上述操作进行矩阵运算:
[0, 0, 1]
[1, 0, 1, 0] [1, 1, 0] [0, 1, 1]
[0, 2, 0, 2] x [0, 1, 0] = [4, 4, 0]
[1, 1, 1, 1] [1, 1, 0] [2, 3, 1]
6.3.2 获得每个输入的value
表示形式
[0, 2, 0]
[1, 0, 1, 0] [0, 3, 0] [1, 2, 3]
[0, 2, 0, 2] x [1, 0, 3] = [2, 8, 0]
[1, 1, 1, 1] [1, 1, 0] [2, 6, 3]
6.3.3 获得每个输入的value
表示形式
[1, 0, 1]
[1, 0, 1, 0] [1, 0, 0] [1, 0, 2]
[0, 2, 0, 2] x [0, 0, 1] = [2, 2, 2]
[1, 1, 1, 1] [0, 1, 1] [2, 1, 3]
Notes: 实际上,可以将偏差向量 添加到矩阵乘法的乘积中。(译者注:
)
6.4 计算输入的注意力得分(attention scores
)
为了获得注意力分数,我们首先在输入1的query
(红色)与所有key
(橙色)(包括其自身)之间取点积。由于有3个key
表示(因为我们有3个输入),因此我们获得3个注意力得分(蓝色)。
[0, 4, 2]
[1, 0, 2] x [1, 4, 3] = [2, 4, 4]
[1, 0, 1]
请注意,在这里我们仅使用输入1的query
。稍后,我们将对其他查询重复相同的步骤。
Note: 上面的操作被称为" 点积注意力",是几种sorce之一。其他评分功能包括 缩放的点积和 拼接。
6.5 计算softmax
将attention scores
通过 softmax 函数(蓝色)得到概率
softmax([2, 4, 4]) = [0.0, 0.5, 0.5]
6.6 将attention scores
乘以value
(紫色)
每个输入的softmax注意力得分(蓝色)乘以其相应的value
(紫色)。这将得到3个对齐的向量(黄色)。在本教程中,我们将它们称为"加权值"。
1: 0.0 * [1, 2, 3] = [0.0, 0.0, 0.0]
2: 0.5 * [2, 8, 0] = [1.0, 4.0, 0.0]
3: 0.5 * [2, 6, 3] = [1.0, 3.0, 1.5]
6.7 对加权后的value
求和以得到output #1
对所有加权值
(黄色)按元素求和:
[0.0, 0.0, 0.0]
+ [1.0, 4.0, 0.0]
+ [1.0, 3.0, 1.5]
-----------------
= [2.0, 7.0, 1.5]
得到的向量[2.0, 7.0, 1.5] (深绿)是output #1 , 它是基于“输入1”的“query
表示的形式” 与所有其他key
(包括其自身)进行的交互。
6.8 对输入2重复步骤4–7
现在我们已经完成了输出1,我们将对输出2和输出3重复步骤4至7。我相信我可以让您自己进行操作 。
Notes: 因为点积得分函数 query
和key
的维度必须始终相同。但是value
的维数可能与query
和key
的维数不同。因此输出结果将遵循value
的维度。
6.9 示例
你我都知道“The”指的是“animal”,因此应该与这个词有很强的联系。如图中的颜色编码所示,该系统知道“animal”、“cross”、“street”和“the”之间存在某种联系,因为它们都与句子的主语“animal”有关。这是通过Self-Attention来实现的。
7 吴恩达视频中的attention(应该是soft attention)
我们有一个很平常的句子:(法语)Jane visite l'Afrique en Septembre。假定我们使用 双向的 RNN(a bidirectional RNN),为了计算每个输入单词的的特征集(set of features),必须要理解输出到
一直到
的双向 RNN。
但是我们并不是只翻译一个单词,让我们先去掉上 面的𝑌,就用双向的 RNN。我们要对单词做的就是,对于句子里的每五个单词,计算一个句子中单词的特征集,也有可能是周围的词,生成英文翻译。我们将使用另一个 RNN 生成英文翻译,这是我平时用的 RNN 记号。我不用𝐴来表示感知机(the activation), 这是为了避免和这里的感知机(the activations)混淆。我会用另一个不同的记号,我会用 𝑆 来表示 RNN 的隐藏状态(the hidden state in this RNN),不用,而是用
。
当你尝试生成第一个词,即输出,那么我们应该看输入的法语句子的哪个部分? 似乎你应该先看第一个单词,或者它附近的词。但是你别看太远了,比如说看到句尾去了。
所以注意力模型就会计算注意力权重(a set of attention weights),我们将用来表示当你生成第一个词时你应该放多少注意力在这个第一块信息处。然后我们算第二个,
告诉我们当你尝试去计算第一个词 Jane 时,我们应该花多少注意力在输入的第二个词上面。同理
,这些将会告诉我们,我们应该花 多少注意力在记号为𝐶的内容上。
对于 RNN 的第二步,我们将有一个新的隐藏状态,我们也会用一个新的注意力权值集(a new set of the attention weights),我们将用
来告诉我们什么时候生成第二个词, 那么 visits 就会是第二个标签了(the ground trip label)。我们应该花多少注意力在输入的第一个法语词上。然后同理
,接下去也同理,我们应该花多少注意力在 visite 词上,我们应该花多少注意在词 l'Afique 上面。 当然我们第一个生成的词 Jane 也会输入到这里,于是我们就有了需要花注意力的上下文。
让我们来到第三步,这是输入, 我们再有上下文 C,它取决于在不同的时间集(time sets),上面的
。这个告诉了我们我 们要花注意力在不同的法语的输入词上面。 然后同理。
注意力模型参考:
8 怎么找到注意力权重(a set of attention weights)(吴恩达)
回忆一下,是你应该花费在
上的注意力的数量,当你尝试去生成第𝑡个输出 的翻译词,让我们先把式子写下来,再讨论它是怎么来的。这个式子你可以用来计算
, 在此之前我们要先计算
,关键要用 softmax,来确保这些权重加起来等于 1。如果你对𝑡′求和,然后优先使用 softmax, 确保这些值加起来等于 1。
现在我们如何计算这些𝑒项,一种我们可以用的方式是用右下面这样的小的神经网络,于是就是神经网络在上个时间步的状态,于是这里我们有一个神经网络,如果你想要生成
,那么
就是上一时间步的隐藏状态。这是给小神经网络的其中一个输 入,也就是在神经网络中的一个隐藏层,然后是
,即上个时间步的的特征,是另一个输入。
直观来想就是,如果你想要决定要花多少注意力在 𝑡′ 的激活值上。 于是,似乎它会很大程度上取决于你上一个时间步的的隐藏状态的激活值。你还没有当前状态的激活值,因为上下文会输入到这里,所以你还没计算出来,但是看看你生成上一个翻译 的 RNN 的隐藏状态,然后对于每一个位置,每一个词都看向他们的特征值,这看起来很自 然,即和
应该取决于这两个量。
但是我们不知道具体函数是什么,所以我们可以做的事情就是训练一个很小的神经网络,去学习这个函数到底是什么。相信反向传播算法, 相信梯度下降算法学到一个正确的函数。这表示,如果你应用这整个的模型,然后用梯度下降来训练它,这是可行的。这个小型的神经网络做了一件相当棒的事情,告诉你应该花 多少注意力在
上面,然后这个式子确保注意力权重加起来等于 1,于是当你持续地一次 生成一个词,这个神经网络实际上会花注意力在右边的这个输入句子上,它会完全自动的通 过梯度下降来学习。
这个算法的一个缺点就是它要花费2次方的时间,就是说这个算法的复杂是𝑂(𝑛2)的, 如果你有个输入单词和
个输出单词,于是注意力参数的总数就会是
,所以这个算 法有着2次方的消耗。但是在机器翻译的应用上,输入和输出的句子一般不会太长,可能三 次方的消耗是可以接受,但也有很多研究工作,尝试去减少这样的消耗。
动手推导Self-attention-译文:https://zhuanlan.zhihu.com/p/137578323
深度学习中的注意力模型(2017版):https://zhuanlan.zhihu.com/p/37601161
白话Attention,Soft Attention以及Self Attention原理及数学推导:
https://blog.csdn.net/weixin_44287209/article/details/105406706
注意力机制最新综述解读:https://blog.csdn.net/shenziheng1/article/details/89323074
自注意力机制(Self-Attention)的基本知识:https://baijiahao.baidu.com/s?id=1671155676541288434&wfr=spider&for=pc