导航:首页 > 源码编译 > lstm注意力机制应用源码

lstm注意力机制应用源码

发布时间:2022-09-05 13:57:31

❶ 多图+公式全面解析RNN,LSTM,Seq2Seq,Attention注意力机制

我们知道人类并不是从零开始思考东西,就像你读这篇文章的时候,你对每个字的理解都是建立在前几个字上面。你读完每个字后并不是直接丢弃然后又从零开始读下一个字,因为你的思想是具有持续性的,很多东西你要通过上下文才能理解。

然而传统的神经网络并不能做到持续记忆理解这一点,这是传统神经网络的主要缺点。举个例子,你打算使用传统的神经网络去对电影里每个时间点发生的事情进行分类的时候,传统的神经网络先让不能使用前一个事件去推理下一个事件。

RNN(递归神经网络)可以解决这个问题。他们是带有循环的神经网络,允许信息在其中保留。

这些循环让递归神经网络看起来有点神秘,然而如果你再思考一下,RNN其实和传统的神经网络并没有太多的不同。RNN可以看作是一个网络的多次拷贝,其中每次网络的输出都是下一次的输入。我们可以思考一下我们如果展开这个循环结构会是什么样的:

这种像是链状的网络结构表明RNN和序列以及列表有着天然的联系,他们是处理这些序列数据的天然的神经网络。而且很明显我们可以看出,输入输出的序列是具有相同的时间长度的,其中的每一个权值都是共享的(不要被链式形状误导,本质上只有一个cell)。

在最近的几年,RNN在很多问题上都取得了成功:比如语音识别,语音模型,翻译,图片注释等等,但是RNN存在着梯度消息/爆炸以及对长期信息不敏感的问题,所以LSTM就被提出来了。现在很多问题的成功都必须归功于LSTM,它是递归神经网络的一种,它在许多的任务中表现都比普通的RNN更好,所以接下来我们来探索一下这个神奇的网络。

人们希望RNN可以将一些之前的信息连接到当前的任务中来,比如使用之前的视频帧来帮助理解当前帧。如果RNN可以做到将会非常有用。那实际RNN能做到吗?这要视情况而定。

有时候,我们只需要当前的信息来完成当前的任务。举个例子,一个语音模型试图基于之前的单词去预测下一个单词。如果我们尝试预测“the clouds are in the sky”,我们不需要太多的上下文信息——很明显最后一个单词会是sky。在像这样不需要太多的相关信息的场合下,RNN可以学习到之前使用的信息。

但是我们要注意,也有很多场景需要使用更多的上下文。当我们试图去预测“I grew up in France… I speak fluent French”这句话的最后一个单词,最近的信息会表明这应该是一种语言的名字,但是如果我们需要知道具体是哪一种语语言,我们需要France这个在句子中比较靠前的上下文信息,相关信息和需要预测的点的间隔很大的情况是经常发生的。

不幸的是,随着间隔变大,RNN变得无法连接到太前的信息。

理论上RNN完全可以处理这种长期依赖(long-term dependencies)的问题。人们可以通过小心地选择参数来解决这个问题。令人悲伤的是,实践表明RNN并不能很好地解决这个问题,Hochreiter (1991) [German] and Bengio, et al. (1994)发现了RNN为什么在这些问题上学习很困难的原因。

而LSTM则没有这个问题。

长期短期记忆网络-通常叫做LSTM-是一种特殊结构的RNN,它能够学习长期依赖。它在大量的问题有惊人的效果,现在已经被广泛使用。

LSTM被明确设计来避免长期依赖问题,记住长时间的信息对LSTM来说只是常规操作,不像RNN那样费力不讨好。

所有的RNN都有不断重复网络本身的链式形式。在标准的RNN中,这个重复复制的模块只有一个非常简单的结果。例如一个tanh层:

LSTM也有这样的链式结构,但是这个重复的模块和上面RNN重复的模块结构不同:LSTM并不是只是增加一个简单的神经网络层,而是四个,他们以一种特殊的形式进行交互:

在上图中,每条线表示一个向量,从一个输出节点到其他节点的输入节点。粉红色的圆圈表示逐点式操作,就像向量加法。黄色的盒子是学习好的神经网络层。线条合代表联结,线条分叉则表示内容被复制到不同的地方。

LSTM的核心之处就是它的cell state(神经元状态),在下图中就是那条贯穿整个结果的水平线。这个cell state就像是一个传送带,他只有很小的线性作用,但却贯穿了整个链式结果。信息很容易就在这个传送带上流动但是状态却不会改变。cell state上的状态相当于长期记忆,而下面的 则代表短期记忆。

门限是一种让信息选择性通过的方式,它们是由sigmoid神经网络层和逐点相乘器做成的。

sigmoid层输出0和1之间的数字来描述一个神经元有多少信息应该被通过。输出0表示这些信息全部不能通过,而输出1则表示让所有信息都通过。

一个LSTM有三个这样的门限,去保护和控制神经元的状态。

LSTM的第一步就是决定什么信息应该被神经元遗忘。这是一个被称为“遗忘门层”的sigmod层组成。他输入 和 (上一次的输出以及这轮的输入),然后在 的每个神经元状态输出0和1之间的数字。同理1表示完全保留这些信息,0表示完全遗忘这个信息。

让我们再次回到一开始举的例子:根据之前的词语去预测下一个单词的语言模型。在这个问题中,cell state或许包括当前主语中的性别信息,所以我们可以使用正确的代词。而当我们看到一个新的主语(输入),我们会去遗忘之前的性别信息。我们使用下图中的公式计算我们的“遗忘系数”

在那个语言模型例子中,我们想给cell state增加主语的性别,来替换我们将要遗忘的旧的主语。

我们给旧的状态乘一个遗忘系数 ,来遗忘掉我们之前决定要遗忘的信息,然后我们增加 。这是新的候选值,由我们想多大程度更新每个状态的值决定。

在语言模型中,就像上面描述的,这是我们实际上要丢弃之前主语的性别信息,增加新的主语的性别信息的地方。

最后,我们需要决定我们要输出什么。这个输出是建立在我们的cell state的基础上,但是这里会有一个滤波器。首先,我们使用sigmoid层决定哪一部分的神经元状态需要被输出;然后我们让cell state经过tanh(让输出值变成-1到1之间)层并且乘上sigmod门限的输出,这样我们就只输出我们想要输出的。

对于那个语言模型的例子,当我们看到一个新的主语的时候,或许我们想输出相关动词的信息,因为动词是跟在主语后面的。例如,它或许要输出主语是单数还是复数的,然后我们就知道主语后动词的语态了。

上面讲的都是一些常规的LSTM,但并不是所有的LSTM都是上面这种形式。实际上现在很多包含LSTM的论文都有小的差异,但是它值得一提。

Gers & Schmidhuber (2000) 引入了一个流行的LSTM变体,它增加了一个窥视孔连接。这意味着我们让门限层监视cell state的状态。

另外一个变体是使用组合遗忘和输入门,而不是分开决定哪些神经元需要遗忘信息,哪些需要增加新的信息,我们组合起来决定。我们只遗忘那些需要被放入新信息的状态,同样我们旨在旧信息被遗忘之后才输入新的信息。

一个更神奇的LSTM变体是门递归单元(也就是大家常说的GRU),它组合遗忘门和输入门为一个更新门,它合并了cell state和隐层状态,并且做了一些其他的改变。最终这个模型比标准的LSTM更简单,并且变得越来越流行。

我们一开始提到人们使用RNN取得了卓越的成果,但其实本质上都是使用LSTM取得的,他们的确在多数任务上表现得更好。

写下来一系列等式以后,LSTM看起来挺吓人,但在文中一步步解释后它变得可以理解了。我们不禁想问:是否有比LSTM更好的模型?学者一致认为:那就是attention注意力机制。核心观点就是让RNN每一步都监视一个更大的信息集合并从中挑选信息。例如:如果你使用RNN去为一个图像生成注释,它会从图像中挑选一部分去预测输出的单词。接下来在讲解attention之前,我们会先聊聊Seq2Seq。

我将会结合一个机器翻译的例子来给大家形象地介绍Seq2Seq。

在这个例子中,我们试图将英语转换为德语,这里要注意这里是一个多对多的模型,而且输入和输出的长度都不固定。

Seq2Seq有一个编码器和一个解码器,编码器一般是LSTM或者其他模型用于提取特征,它的最后一个输出就是从这句话得出的最后的特征,而其他的隐层输出都被丢弃。

同样,我们先把句子输入到我们的Encoder里面,Encoder会输入最后状态 ,作为这句话的特征送给Decoder。

Seq2Seq模型有一个encoder网络和一个Decoder网络,在我们的例子中encoder的输入是英语句子,每输入一个词RNN就会更新状态并记录下来,encoder最后一个状态就是这个句子的特征,并把之前的状态丢弃。把这个状态作为decoder的初始状态,初始化后decoder就知道这个句子了,首先把起始符作为decoder的输入,然后一步步更新,输出状态和概率分布预测下一个字符,再把预测的字符作为下一个输入,重复这个过程,最后直到预测终止符就返回输出的这个序列。

我们的encoder和decoder都是LSTM,encoder把所有句子的特征压缩到最后一个状态,理想情况下encoder最后一个状态包含完整的信息,假如句子很长,那么句子有些信息就会被遗忘,那么Decoder就没有完整的句子信息,那decoder输出的德语句子就不完整。

一种简单方法就是使用双向LSTM,双向LSTM简单来说就是用两条链,从左到右这条链可能会遗忘最左边的信息,而从右往左的这条链可能会遗忘右边的信息,这样结合起来就不容易遗忘句子信息,这里要注意只是encoder用双向LSTM,decoder是单向LSTM,他要生成正确顺序的序列。

另外一种方法改进就是multi-Task learning,我们还可以多加入几个任务,比如让英语句子让他自己翻译成英语句子,这样encoder只有一个但是数据多了一倍,这样encoder就能被训练的更好,当然你还可以添加其他语言的任务,通过借助其他语言更好训练encoder,这样虽然decoder没有变得更好,但是因为encoder提取的更好最后效果也会变好。

当然还有一个方法就是使用注意力机制,这个对机器翻译提高作用很大,我们接下来就讲解这个注意力机制。

我们知道Seq2Seq模型有一个缺点就是句子太长的话encoder会遗忘,那么decoder接受到的句子特征也就不完全,我们看一下下面这个图,纵轴BLUE是机器翻译的指标,横轴是句子的单词量,我们可以看出用了attention之后模型的性能大大提升。

用了注意力机制,Decoder每次更新状态的时候都会再看一遍encoder所有状态,还会告诉decoder要更关注哪部分,这也是attention名字的由来。但是缺点就是计算量很大。

在encoder结束之后,attention和decoder同时工作,回忆一下,decoder的初始状态 是encoder最后一个状态,不同于常规的Seq2Seq,encoder所有状态都要保留,这里需要计算 与每个状态的相关性,我使用 这个公式表示计算两者相关性,把结果即为 ,记做Weight,encoder有m个状态,所以一共有m个 ,这里所有的值都是介于0和1的实数,全部加起来为1。

这张图下面是encoder,上面是decoder,attention会把decoder所有状态与encoder所有状态计算相似性,也就是 .在这张图中每条线就对应一个 ,线越粗说明相关性越高。

这次仅仅是从机器翻译的角度介绍了attention的一个应用,还有一些比如self-attention,Transformer应用,希望以此为印子能够打开读者attention的大门。

1.colah's blog http://colah.github.io/posts/2015-08-Understanding-LSTMs/

2.CS583 https://github.com/wangshusen/DeepLearning

❷ 注意力机制加在什么位置

注意力机制可以加在编码层和解码层之间,甚至可以加在Auto-Encoder里面。

此外,深度残差收缩网络是一种特殊的注意力机制算法,实现了注意力机制下的软阈值化;把注意力机制嵌入到了残差模块里面。

视觉注意力机制:

视觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。

这是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。

❸ 一文看懂 Attention(本质原理+3大优点+5大类型)

Attention(注意力)机制如果浅层的理解,跟他的名字非常匹配。他的核心逻辑就是“ 从关注全部到关注重点 ”。

Attention 机制很像人类看图片的逻辑,当我们看一张图片的时候,我们并没有看清图片的全部内容,而是将注意力集中在了图片的焦点上。大家看一下下面这张图:

我们一定会看清“锦江饭店”4个字,如下图:

但是我相信没人会意识到“锦江饭店”上面还有一串“电话号码”,也不会意识到“喜运来大酒家”,如下图:

所以,当我们看一张图片的时候,其实是这样的:

上面所说的,我们的视觉系统就是一种 Attention机制, 将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。

AI 领域的 Attention 机制

Attention 机制最早是在计算机视觉里应用的,随后在 NLP 领域也开始应用了,真正发扬光大是在 NLP 领域,因为 2018 年 BERT 和 GPT 的效果出奇的好,进而走红。而 Transformer 和 Attention 这些核心开始被大家重点关注。

如果用图来表达 Attention 的位置大致是下面的样子:

这里先让大家对 Attention 有一个宏观的概念,下文会对 Attention 机制做更详细的讲解。在这之前,我们先说说为什么要用 Attention。

之所以要引入 Attention 机制,主要是3个原因:

参数少

模型复杂度跟 CNN、RNN 相比,复杂度更小,参数也更少。所以对算力的要求也就更小。

速度快

Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。

效果好

在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。

Attention 是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。下图红色的预期就是被挑出来的重点。

Attention 经常会和 Encoder-Decoder 一起说,之前的文章《 一文看懂 NLP 里的模型框架 Encoder-Decoder 和 Seq2Seq 》 也提到了 Attention。

下面的动图演示了attention 引入 Encoder-Decoder 框架下,完成机器翻译任务的大致流程。

但是,Attention 并不一定要在 Encoder-Decoder 框架下使用的,他是可以脱离 Encoder-Decoder 框架的。

下面的图片则是脱离 Encoder-Decoder 框架后的原理图解。

小故事讲解

上面的图看起来比较抽象,下面用一个例子来解释 attention 的原理:

图书管(source)里有很多书(value),为了方便查找,我们给书做了编号(key)。当我们想要了解漫威(query)的时候,我们就可以看看那些动漫、电影、甚至二战(美国队长)相关的书籍。

为了提高效率,并不是所有的书都会仔细看,针对漫威来说,动漫,电影相关的会看的仔细一些(权重高),但是二战的就只需要简单扫一下即可(权重低)。

当我们全部看完后就对漫威有一个全面的了解了。

Attention 原理的3步分解:

第一步: query 和 key 进行相似度计算,得到权值

第二步:将权值进行归一化,得到直接可用的权重

第三步:将权重和 value 进行加权求和

想要了解更多技术细节,可以看看下面的文章或者视频:

“文章” 深度学习中的注意力机制

“文章” 遍地开花的 Attention,你真的懂吗?

“文章” 探索 NLP 中的 Attention 注意力机制及 Transformer 详解

“视频” 李宏毅 - transformer

“视频” 李宏毅 - ELMO、BERT、GPT 讲解

Attention 有很多种不同的类型:Soft Attention、Hard Attention、静态Attention、动态Attention、Self Attention 等等。下面就跟大家解释一下这些不同的 Attention 都有哪些差别。

由于这篇文章《 Attention用于NLP的一些小结 》已经总结的很好的,下面就直接引用了:

本节从计算区域、所用信息、结构层次和模型等方面对Attention的形式进行归类。

1. 计算区域

根据Attention的计算区域,可以分成以下几种:

1) Soft Attention,这是比较常见的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。

2) Hard Attention,这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbel softmax之类的)

3) Local Attention,这种方式其实是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。

2. 所用信息

假设我们要对一段原文计算Attention,这里原文指的是我们要做attention的文本,那么所用信息包括内部信息和外部信息,内部信息指的是原文本身的信息,而外部信息指的是除原文以外的额外信息。

1) General Attention,这种方式利用到了外部信息,常用于需要构建两段文本关系的任务,query一般包含了额外信息,根据外部query对原文进行对齐。

比如在阅读理解任务中,需要构建问题和文章的关联,假设现在baseline是,对问题计算出一个问题向量q,把这个q和所有的文章词向量拼接起来,输入到LSTM中进行建模。那么在这个模型中,文章所有词向量共享同一个问题向量,现在我们想让文章每一步的词向量都有一个不同的问题向量,也就是,在每一步使用文章在该步下的词向量对问题来算attention,这里问题属于原文,文章词向量就属于外部信息。

2) Local Attention,这种方式只使用内部信息,key和value以及query只和输入原文有关,在self attention中,key=value=query。既然没有外部信息,那么在原文中的每个词可以跟该句子中的所有词进行Attention计算,相当于寻找原文内部的关系。

还是举阅读理解任务的例子,上面的baseline中提到,对问题计算出一个向量q,那么这里也可以用上attention,只用问题自身的信息去做attention,而不引入文章信息。

3. 结构层次

结构方面根据是否划分层次关系,分为单层attention,多层attention和多头attention:

1)单层Attention,这是比较普遍的做法,用一个query对一段原文进行一次attention。

2)多层Attention,一般用于文本具有层次关系的模型,假设我们把一个document划分成多个句子,在第一层,我们分别对每个句子使用attention计算出一个句向量(也就是单层attention);在第二层,我们对所有句向量再做attention计算出一个文档向量(也是一个单层attention),最后再用这个文档向量去做任务。

3)多头Attention,这是Attention is All You Need中提到的multi-head attention,用到了多个query对一段原文进行了多次attention,每个query都关注到原文的不同部分,相当于重复做多次单层attention:

最后再把这些结果拼接起来:

4. 模型方面

从模型上看,Attention一般用在CNN和LSTM上,也可以直接进行纯Attention计算。

1)CNN+Attention

CNN的卷积操作可以提取重要特征,我觉得这也算是Attention的思想,但是CNN的卷积感受视野是局部的,需要通过叠加多层卷积区去扩大视野。另外,Max Pooling直接提取数值最大的特征,也像是hard attention的思想,直接选中某个特征。

CNN上加Attention可以加在这几方面:

a. 在卷积操作前做attention,比如Attention-Based BCNN-1,这个任务是文本蕴含任务需要处理两段文本,同时对两段输入的序列向量进行attention,计算出特征向量,再拼接到原始向量中,作为卷积层的输入。

b. 在卷积操作后做attention,比如Attention-Based BCNN-2,对两段文本的卷积层的输出做attention,作为pooling层的输入。

c. 在pooling层做attention,代替max pooling。比如Attention pooling,首先我们用LSTM学到一个比较好的句向量,作为query,然后用CNN先学习到一个特征矩阵作为key,再用query对key产生权重,进行attention,得到最后的句向量。

2)LSTM+Attention

LSTM内部有Gate机制,其中input gate选择哪些当前信息进行输入,forget gate选择遗忘哪些过去信息,我觉得这算是一定程度的Attention了,而且号称可以解决长期依赖问题,实际上LSTM需要一步一步去捕捉序列信息,在长文本上的表现是会随着step增加而慢慢衰减,难以保留全部的有用信息。

LSTM通常需要得到一个向量,再去做任务,常用方式有:

a. 直接使用最后的hidden state(可能会损失一定的前文信息,难以表达全文)

b. 对所有step下的hidden state进行等权平均(对所有step一视同仁)。

c. Attention机制,对所有step的hidden state进行加权,把注意力集中到整段文本中比较重要的hidden state信息。性能比前面两种要好一点,而方便可视化观察哪些step是重要的,但是要小心过拟合,而且也增加了计算量。

3)纯Attention

Attention is all you need,没有用到CNN/RNN,乍一听也是一股清流了,但是仔细一看,本质上还是一堆向量去计算attention。

5. 相似度计算方式

在做attention的时候,我们需要计算query和某个key的分数(相似度),常用方法有:

5)用多层感知机也可以:

❹ LSTM与GRU数学推导

RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果 RNN 可以做到这个,他们就变得非常有用。但是真的可以么?答案是,还有很多依赖因素。

有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。

但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France... I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。

不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。

在理论上,RNN 绝对可以处理这样的 长期依赖 问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。Bengio, et al. (1994)等人对该问题进行了深入的研究,他们发现一些使训练 RNN 变得非常困难的相当根本的原因。

然而,幸运的是,LSTM 并没有这个问题!

Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。

LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!

所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

不必担心这里的细节。我们会一步一步地剖析 LSTM 解析图。现在,我们先来熟悉一下图中使用的各种元素的图标。

在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。

LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。

细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。

Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”!

LSTM 拥有三个门,来保护和控制细胞状态。

在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取h_{t-1}和x_t,输出一个在 0 到 1 之间的数值给每个在细胞状态C_{t-1}中的数字。1 表示“完全保留”,0 表示“完全舍弃”。

让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量,\tilde{C}_t,会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。

在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。

现在是更新旧细胞状态的时间了,C_{t-1}更新为C_t。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。

我们把旧状态与f_t相乘,丢弃掉我们确定需要丢弃的信息。接着加上i_t * \tilde{C}_t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。

最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。

我们到目前为止都还在介绍正常的 LSTM。但是不是所有的 LSTM 都长成一个样子的。实际上,几乎所有包含 LSTM 的论文都采用了微小的变体。差异非常小,但是也值得拿出来讲一下。

其中一个流形的 LSTM 变体,就是由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是说,我们让 门层 也会接受细胞状态的输入。

上面的图例中,我们增加了 peephole 到每个门上,但是许多论文会加入部分的 peephole 而非所有都加。

另一个变体是通过使用 coupled 忘记和输入门。不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态 。

另一个改动较大的变体是 Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。

这里只是部分流行的 LSTM 变体。当然还有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决长期依赖的问题,如Koutnik, et al. (2014) 提出的 Clockwork RNN。

要问哪个变体是最好的?其中的差异性真的重要吗?Greff, et al. (2015) 给出了流行变体的比较,结论是他们基本上是一样的。Jozefowicz, et al. (2015) 则在超过 1 万种 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。

刚开始,我提到通过 RNN 得到重要的结果。本质上所有这些都可以使用 LSTM 完成。对于大多数任务确实展示了更好的性能!

由于 LSTM 一般是通过一系列的方程表示的,使得 LSTM 有一点令人费解。然而本文中一步一步地解释让这种困惑消除了不少。

LSTM 是我们在 RNN 中获得的重要成功。很自然地,我们也会考虑:哪里会有更加重大的突破呢?在研究人员间普遍的观点是:“Yes! 下一步已经有了——那就是注意力!” 这个想法是让 RNN 的每一步都从更加大的信息集中挑选信息。例如,如果你使用 RNN 来产生一个图片的描述,可能会选择图片的一个部分,根据这部分信息来产生输出的词。实际上,Xu, et al. (2015)已经这么做了——如果你希望深入探索注意力可能这就是一个有趣的起点!还有一些使用注意力的相当振奋人心的研究成果,看起来有更多的东西亟待探索……

注意力也不是 RNN 研究领域中唯一的发展方向。例如,Kalchbrenner, et al. (2015) 提出的 Grid LSTM 看起来也是很有前途。使用生成模型的 RNN,诸如Gregor, et al. (2015) Chung, et al. (2015) 和 Bayer & Osendorfer (2015) 提出的模型同样很有趣。在过去几年中,RNN 的研究已经相当的燃,而研究成果当然也会更加丰富!

先看一下比较典型的BPTT一个展开的结构,如下图,这里只考虑了部分图,因为其他部分不是这里要讨论的内容。

对于t时刻的误差信号计算如下:

这样权值的更新方式如下:

上面的公式在BPTT中是非常常见的了,那么如果这个误差信号一直往过去传呢,假设任意两个节点u, v他们的关系是下面这样的:

那么误差传递信号的关系可以写成如下的递归式:

n表示图中一层神经元的个数,这个递归式的大概含义不难理解,要求t-q时刻误差信号对t时刻误差信号的偏导,就先求出t-q+1时刻对t时刻的,然后把求出来的结果传到t-q时刻,递归停止条件是q = 1时,就是刚开始写的那部分计算公式了。将上面的递归式展开后可以得到:

论文里面说的是可以通过归纳来证明,我没仔细推敲这里了,把里面连乘展开看容易明白一点:

整个结果式对T求和的次数是n^(q-1), 即T有n^(q-1)项,那么下面看问题出在哪儿。

如果|T| > 1, 误差就会随着q的增大而呈指数增长,那么网络的参数更新会引起非常大的震荡。

如果|T| < 1, 误差就会消失,导致学习无效,一般激活函数用simoid函数,它的倒数最大值是0.25, 权值最大值要小于4才能保证不会小于1。

误差呈指数增长的现象比较少,误差消失在BPTT中很常见。在原论文中还有更详细的数学分析,但是了解到此个人觉的已经足够理解问题所在了。

为了克服误差消失的问题,需要做一些限制,先假设仅仅只有一个神经元与自己连接,简图如下:

根据上面的,t时刻的误差信号计算如下:

为了使误差不产生变化,可以强制令下式为1:

根据这个式子,可以得到:

这表示激活函数是线性的,常常的令fj(x) = x, wjj = 1.0,这样就获得常数误差流了,也叫做CEC。

但是光是这样是不行的,因为存在输入输出处权值更新的冲突(这里原论文里面的解释我不是很明白),所以加上了两道控制门,分别是input gate, output gate,来解决这个矛盾,图如下:

图中增加了两个控制门,所谓控制的意思就是计算cec的输入之前,乘以input gate的输出,计算cec的输出时,将其结果乘以output gate的输出,整个方框叫做block, 中间的小圆圈是CEC, 里面是一条y = x的直线表示该神经元的激活函数是线性的,自连接的权重为1.0

最初lstm结构的一个缺点就是cec的状态值可能会一直增大下去,增加forget gate后,可以对cec的状态进行控制,它的结构如下图:

这里的相当于自连接权重不再是1.0,而是一个动态的值,这个动态值是forget gate的输出值,它可以控制cec的状态值,在必要时使之为0,即忘记作用,为1时和原来的结构一样。

上面增加遗忘门一个缺点是当前CEC的状态不能影响到input gate, forget gate在下一时刻的输出,所以增加了Peephole connections。结构如下:

这里的gate的输入部分就多加了一个来源了,forget gate, input gate的输入来源增加了cec前一时刻的输出,output gate的输入来源增加了cec当前时刻的输出,另外计算的顺序也必须保证如下:

                      1. input gate, forget gate的输入输出

                      2. cell的输入

                      3. output gate的输入输出

                      4. cell的输出(这里也是block的输出)

我记得当时看论文公式推导的时候很多地方比较难理解,最后随便谷歌了几下,找到一个写的不错的类似课件的PDF,但是已经不知道出处了,很容易就看懂LSTM的前向计算,误差反传更新了。把其中关于LSTM的部分放上来,首先网络的完整结构图如下:

这个结构也是rwthlm源码包中LSTM的结构,下面看一下公式的记号:

前向的计算:

误差反传更新:

此外,还有GRU结构同样是解决RNN的缺点,这里将LSTM和GRU进行对比。

LSTM与GRU:

1) LSTM:

2)GRU:

3)概括的来说,LSTM和GRU都能通过各种Gate将重要特征保留,保证其在long-term 传播的时候也不会被丢失;还有一个不太好理解,作用就是有利于BP的时候不容易vanishing:

实验用了三个unit,传统的tanh,以及LSTM和GRU:

可以发现LSTM和GRU的差别并不大,但是都比tanh要明显好很多,所以在选择LSTM或者GRU的时候还要看具体的task data是什么, 不过在收敛时间和需要的epoch上,GRU应该要更胜一筹:

相关博客和教程:

https://zybuluo.com/hanbingtao/note/581764

http://www.jianshu.com/p/9dc9f41f0b29

http://www.csdn.net/article/2015-06-05/2824880

http://blog.csdn.net/zdy0_2004/article/details/49977423

http://blog.csdn.net/a635661820/article/details/45390671

http://deeplearning.net/tutorial/lstm.html

https://www.hu.com/question/29411132

原文参考:http://www.cnblogs.com/taojake-ML/p/6272605.html

❺ 问答系统介绍

       这是我的第一篇技术博客,也是对近期学习的问答系统进行一个小结,方便回顾所学。文章难免有错误之处,欢迎大家批评指正,不胜感激。

下面将从两个方面对问答系统进行小结:

一、常见的问答系统种类及介绍

二、问答系统中的常用技术

1.根据问题所属的知识领域来分类:

(1) 开放域闲聊性。        举例:微软小冰

(2)  面向FAQ和任务型。举例:京东JIMI、苹果Siri

(3)限定域知识型。         举例:左手医生(问答模型、信息检索)

2.根据答案生成阶段的技术分类:

(1)检索式                    (2)生成式

3.依据答案来源分类:

(1)基于知识图谱问答系统

(2)机器阅读理解的问答系统

(3)基于问答对的问答系统

        定义:给定自然语言处理问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。对事实性问答任务而言(如政策问题)这种做法依赖于知识图谱,准确率比较高。要求知识图谱是比较大规模的,因为KB-QA无法给出在知识图谱之外的答案。下面给出常见分类:

(1)基于符号表示的KB-QA(传统的语义解析方法)

(2)基于向量表示的KB-QA(知识表示学习的方法)

评价标准:召回率(Recall)、精确率(Precision)、F1

常用数据集:WebQuestion、SimpleQuestion、NLPCC KBQA数据集(中文)

(1)基于符号表示的KB-QA(传统的语义解析方法)

        定义:该方法是一种偏语言学的方法,主体思想是将自然语言转化为一系列形式化的逻辑形式,通过对逻辑形式进行自底向上的解析,得到一种可以表达整个问题语义的逻辑形式,通过相应的查询语句在知识库中进行查询,从而得出答案。

语义解析传统方法:

               问题->短语检测->资源映射->语义组合->逻辑表达式

语义解析目前一般做法:

               建图->主题词链接->确定核心推导链->增加约束和聚合函数

  将语义解析简化为查询图生成,将其表述为具有分阶段状态和动作的搜索问题。

(2)基于向量表示的KB-QA(基于表示学习的方法)

        定义:把知识库问答看做一个语义匹配过程。通过表示学习知识库以及用户问题的语义表示,得到低维空间的数值向量,再通过数值计算,直接匹配与用户问句语义最相似的答案。即问答任务就可以看成问句语义向量与知识库中实体、边的语义向量相似度计算的过程。

         随着深度学习的发展,基于表示学习的知识库问答取得了较好的效果。

一般做法:

问题和答案映射向量->向量匹配->计算问题-答案score->优化问题->候选答案选择

详细过程:

问题和答案映射向量:

         如何学习问题向量:把问题用LSTM进行建模

         如何学习答案向量:答案不能简单映射成词向量,一般是利用到答案实体,答案类型,答案路径,答案关系,答案上下文信息。分别和问句向量做相似度计算,最终的相似度为几种相似度之和。代表性的论文  [1]Dong, ACL. Question answering over freebase with multi-column convolutional neural networks.2015提出Multi-column CNN,在答案端加入了更多信息,答案类型、答案路径以及答案周围的实体和关系三种特征向量分别和问句向量做相似度计算,最终的相似度为三种相似度之和。

向量匹配、计算问题-答案score:把这些特征分别映射成不同的向量,作为答案的其中一个向量(而不是直接拼接起来),最后用这些特征向量依次和问题做匹配,把score加起来作为总的score。

优化问题、候选答案选择:一般用Margin Loss,极大化问题对正确答案的score,同时极小化问题对错误答案的score。当模型训练完成后,通过score进行筛选,取最高分的作为最终答案。

        早期方法使用记忆网络来做,论文:Bordes, arXiv. Large-scale simple question answering with memory networks.2015.首先通过Input模块来处理问题,加入知识库信息,将三元组通过输入模块变换为一条一条的记忆向量,再通过匹配主语获得候选记忆,进行cos匹配来获取最终记忆,将最终记忆中的宾语输出作为答案。在WebQuestions上得到了42.4的F1-score,在SimpleQuestions上得到了63.9的Accuracy。

         接着,又有很多位学者提出了其他基于知识表示学习的方法。其中论文[Xie.2018]提出一种基于深度学习的主题实体抽取模型,结合了问句单词级别和字符级别的嵌入表示来学习问题的序列表示,并利用双向LSTM对单词序列编码,最后使用CNN网络根据单词的上下文信息预测单词是否为主题词。在答案选择部分,文章提出一种基于自注意力机制的深度语义表示模型。使用双向LSTM和CNN网络来构建深度语义模型,并提出一种基于局部和全局上下文的自注意力机制用于计算单词的注意力权重。考虑语义表示学习和实体抽取任务之间的具有相互辅助作用,文章提出深度融合模型,将基于自注意力机制的深度语义表示模型与主题实体抽取模型结合,用多任务学习的方式进行联合训练。在NLPCC-ICCPOL 2016数据集上得到了83.45的F1-score。

         今年,Huang, WSDM. Knowledge graph embedding based question answering.2019 提出KEQA模型,不同于以往的直接计算问句和答案语义相似度的方法,本文尝试通过关系和实体学习模型从问句分别重构出实体和关系的知识表示,并进一步重构出三元组的知识表示,最终答案为知识库中与重构三元组最接近的三元组。同时文章也评估了不同的知识表示学习方法TransE,TransH, TransR对KEQA模型精度的影响。

1)基于符号的方法,缺点是需要大量的人工规则,构建难度相对较大。优点是通过规则可以回答更加复杂的问题,有较强的可解释性.

2)基于向量的方法,缺点是目前只能回答简单问题,可解释性差。优点是不需要人工规则,构建难度相对较小。

1)复杂问句,目前End2End的模型只能解决简单问答。

2)多源异构知识库问答。对于开放域问答,单一的知识库不能完全回答所有问题。

3)训练语料,知识库中有实体和关系,除此之外还可能有描述实体的文本信息,或许可以结合结构化知识和非结构化文本。

4)对话中的自然语言形式回复。传统的自动问答都是采用一问一答的形式。然而在很多场景下,需要提问者和系统进行多轮对话交互,实现问答过程。这时,需要系统返回用户的答案不再只是单一实体、概念、关系的形式,而是需要是以自然语言的形式返回答案。这就需要自动生成自然语言的回复。现有方法多利用 sequence-to-sequence 模型进行自然语言生成,在这一过程中,如何与知识库相结合,将知识库问答的答案加入自然语言回复中,仍是亟待解决的问题。

         机器阅读理解在 NLP 领域近年来备受关注,自 2016 年 EMNLP 最佳数据集论文 SQuAD 发表后,各大企业院校都加入评测行列。利用机器阅读理解技术进行问答即是对非结构化文章进行阅读理解得到答案,可以分成匹配式QA,抽取式QA和生成式QA,目前绝大部分是抽取式QA。阅读理解花样很多,但是基本框架差异不大。

         SQuAD(斯坦福问答数据集):这是一个阅读理解数据集,由众包人员基于一系列维基网络文章的提问和对应的答案构成,其中每个问题的答案是相关文章中的文本片段或区间。SQuAD 一共有 107,785 个问题,以及配套的 536 篇文章。

(1)匹配式QA

         给定文章、问题和一个候选答案集(一般是实体或者单词),从候选答案中选一个score最高的作为答案。这种形式比较像选择题型,已经基本上没人做了。

(2)抽取式 QA

          让用户输入若干篇非结构化文本及若干个问题,机器自动在阅读理解的基础上,在文本中自动寻找答案来回答用户的问题。抽取式 QA 的某个问题的答案肯定出现在某篇文章中。抽取式 QA 的经典数据集是 SQuAD。

(3)生成式QA

    目前只有MSRA的MS MARCO数据集,针对这个数据集,答案形式是这样的:

1)答案完全在某篇原文

2)答案分别出现在多篇文章中

3)答案一部分出现在原文,一部分出现在问题中

4)答案的一部分出现在原文,另一部分是生成的新词

5)答案完全不在原文出现(Yes / No 类型)

         随着互联网技术的成熟和普及, 网络上出现了常问问题(frequent asked questions, FAQ)数据, 特别是在 2005 年末以来大量 的社区问答(community based question answering, CQA)数据(例如 Yahoo!Answer)出现在网络上, 即有了大量的问题答案对数据, 问答系统进入了开放领域、基于问题答案对时期。

一般过程:问题分析 ->信息检索->答案抽取

问题分析阶段:和基于自由文本的问答系统的问题分析部分基本一样, 不过还多了几个不同的研究点:

(1)问题主客观的判断   

(2)问题的紧急性(通常在CQA数据中)

信息检索阶段:该阶段目标是如何根据问题的分析结果去缩小答案 可能存在的范围,其中存在两个关键问题:

(1)检索模型(找到和问题类似的问题)

(2)两个问题相似性判断(返回答案或返回相似问题列表)

答案抽取部分:在答案抽取部分, 由于问题答案对已经有了答案, 答案抽取最重要的工作就是判断答案的质量.研究怎么从问题的众多答案中选择一个最好的答案.

下面网址给出了一些论文和近期研究成果:

https://blog.csdn.net/class_guy/article/details/81535287

参考文献:

[1]Berant.EMNLP.Semantic parsing on freebase from question-answer pairs.2013

[2]Yih.ACL.Semantic Parsing via Staged Query Graph Generation:Question Answering with Knowledge Base.2015

[3]Dong, ACL. Question answering over freebase with multi-column convolutional neural networks.2015

[4]Hao, ACL. An end-to-end model for question answering over knowledge base with cross-attention combining global knowledge.

[5]Bordes, arXiv. Large-scale simple question answering with memory networks.2015

[6]Huang, WSDM. Knowledge graph embedding based question answering.2019

[8]Susht.知乎.一份关于问答系统的小结.2018

❻ 目前主流的attention方法都有哪些

首先是Object Recognition。是因为模型结合了CNN,RNN 和 Reinforcement Learning,来解决问题。并且在其上对它进行很大程度了改进,并引入了weakly supervised的因素;然后是Image Caption。Xu在ICML上的 Show, Attend and Tell: Neural Image Caption Generation with Visual Attention可谓应用Attetion来解image caption的经典。再是NLP中的MachinTranslation. 前面的工作都是用时序地进行Attention来关注一幅图像的不同位置区域。类比sequence问题,也就顺理成章地用在Machine Translation上了。划重点来说attention机制听起来高达上,其实就是学出一个权重分布,再拿这个权重分布施加在原来的特征之上,就可以叫attention。当然这个加权可以是保留所有分量均做加权(即soft attention);也可以是在分布中以某种采样策略选取部分分量(即hard attention)。

❼ 注意力机制详解

Attention机制在近几年来在图像,自然语言处理等领域中都取得了重要的突破,被证明有益于提高模型的性能。Attention机制本身也是符合人脑和人眼的感知机制,这里我们主要以计算机视觉领域为例,讲述Attention机制的原理,应用以及模型的发展。

所谓Attention机制,便是聚焦于局部信息的机制,比如图像中的某一个图像区域。随着任务的变化,注意力区域往往会发生变化。

面对上面这样的一张图,如果你只是从整体来看,只看到了很多人头,但是你拉近一个一个仔细看就了不得了,都是天才科学家。

图中除了人脸之外的信息其实都是无用的,也做不了什么任务, Attention机制便是要找到这些最有用的信息 ,可以想见最简单的场景就是从照片中检测人脸了。

和注意力机制相伴而生的一个任务便是显着目标检测,即salient object detection。它的输入是一张图,输出是一张概率图,概率越大的地方,代表是图像中重要目标的概率越大,即人眼关注的重点,一个典型的显着图如下:

右图就是左图的显着图,在头部位置概率最大,另外腿部,尾巴也有较大概率,这就是图中真正有用的信息。

显着目标检测需要一个数据集,而这样的数据集的收集便是通过追踪多个实验者的眼球在一定时间内的注意力方向进行平均得到,典型的步骤如下:

于是就能得到下面这样的图,第二行是眼球追踪结果,第三行就是显着目标概率图。

上面讲述的都是空间上的注意力机制,即关注的是不同空间位置,而在CNN结构中,还有不同的特征通道,因此不同特征通道也有类似的原理,下面一起讲述。

注意力机制的本质就是定位到感兴趣的信息,抑制无用信息,结果通常都是以概率图或者概率特征向量的形式展示,从原理上来说,主要分为 空间注意力模型,通道注意力模型,空间和通道混合注意力模型 三种, 这里不区分soft和hard attention

不是图像中所有的区域对任务的贡献都是同样重要的,只有任务相关的区域才是需要关心的,比如分类任务的主体,空间注意力模型就是寻找网络中最重要的部位进行处理。

我们在这里给大家介绍两个具有代表性的模型,第一个就是Google DeepMind提出的STN网络(Spatial Transformer Network[1])。它通过学习输入的形变,从而完成适合任务的预处理操作,是一种基于空间的Attention模型,网络结构如下:

这里的Localization Net用于生成仿射变换系数,输入是C×H×W维的图像,输出是一个空间变换系数,它的大小根据要学习的变换类型而定,如果是仿射变换,则是一个6维向量。

这样的一个网络要完成的效果如下图:

即定位到目标的位置,然后进行旋转等操作,使得输入样本更加容易学习。这是一种一步调整的解决方案,当然还有很多迭代调整的方案,感兴趣可以去有三知识星球星球中阅读。

相比于Spatial Transformer Networks 一步完成目标的定位和仿射变换调整,Dynamic Capacity Networks[2]则采用了两个子网络,分别是低性能的子网络(coarse model)和高性能的子网络(fine model)。低性能的子网络(coarse model)用于对全图进行处理,定位感兴趣区域,如下图中的操作fc。高性能的子网络(fine model)则对感兴趣区域进行精细化处理,如下图的操作ff。两者共同使用,可以获得更低的计算代价和更高的精度。

由于在大部分情况下我们感兴趣的区域只是图像中的一小部分,因此空间注意力的本质就是定位目标并进行一些变换或者获取权重。

对于输入2维图像的CNN来说,一个维度是图像的尺度空间,即长宽,另一个维度就是通道,因此基于通道的Attention也是很常用的机制。

SENet(Sequeeze and Excitation Net)是2017届ImageNet分类比赛的冠军网络,本质上是一个基于通道的Attention模型,它通过建模各个特征通道的重要程度,然后针对不同的任务增强或者抑制不同的通道,原理图如下。

在正常的卷积操作后分出了一个旁路分支,首先进行Squeeze操作(即图中Fsq(·)),它将空间维度进行特征压缩,即每个二维的特征图变成一个实数,相当于具有全局感受野的池化操作,特征通道数不变。

然后是Excitation操作(即图中的Fex(·)),它通过参数w为每个特征通道生成权重,w被学习用来显式地建模特征通道间的相关性。在文章中,使用了一个2层bottleneck结构(先降维再升维)的全连接层+Sigmoid函数来实现。

得到了每一个特征通道的权重之后,就将该权重应用于原来的每个特征通道,基于特定的任务,就可以学习到不同通道的重要性。

将其机制应用于若干基准模型,在增加少量计算量的情况下,获得了更明显的性能提升。作为一种通用的设计思想,它可以被用于任何现有网络,具有较强的实践意义。而后SKNet等方法将这样的通道加权的思想和Inception中的多分支网络结构进行结合,也实现了性能的提升。

通道注意力机制的本质,在于建模了各个特征之间的重要性,对于不同的任务可以根据输入进行特征分配,简单而有效。

前述的Dynamic Capacity Network是从空间维度进行Attention,SENet是从通道维度进行Attention,自然也可以同时使用空间Attention和通道Attention机制。

CBAM(Convolutional Block Attention Mole)是其中的代表性网络,结构如下:

通道方向的Attention建模的是特征的重要性,结构如下:

空间方向的Attention建模的是空间位置的重要性,结构如下:

首先将通道本身进行降维,分别获取最大池化和均值池化结果,然后拼接成一个特征图,再使用一个卷积层进行学习。

这两种机制,分别学习了通道的重要性和空间的重要性,还可以很容易地嵌入到任何已知的框架中。

除此之外,还有很多的注意力机制相关的研究,比如 残差注意力机制,多尺度注意力机制,递归注意力机制 等。

从原理上来说,注意力机制在所有的计算机视觉任务中都能提升模型性能,但是有两类场景尤其受益。

我们知道细粒度分类任务中真正的难题在于如何定位到真正对任务有用的局部区域,如上示意图中的鸟的头部。Attention机制恰巧原理上非常合适,使用了注意力机制,对模型的提升效果很明显。

我们又回到了开头,没错,Attention的本质就是重要/显着区域定位,所以在目标检测领域是非常有用的。

上图展示了几个显着目标检测的结果,可以看出对于有显着目标的图,概率图非常聚焦于目标主体,在网络中添加注意力机制模块,可以进一步提升这一类任务的模型。

❽ 为什么说Transformer的注意力机制是相对廉价的注意力机制相对更对于RNN系列及CNN系列算法有何优势

QA形式对自然语言处理中注意力机制(Attention)进行总结,并对Transformer进行深入解析。


二、Transformer(Attention Is All You Need)详解
1、Transformer的整体架构是怎样的?由哪些部分组成?
2、Transformer Encoder 与 Transformer Decoder 有哪些不同?
3、Encoder-Decoder attention 与self-attention mechanism有哪些不同?
4、multi-head self-attention mechanism具体的计算过程是怎样的?
5、Transformer在GPT和Bert等词向量预训练模型中具体是怎么应用的?有什么变化?

一、Attention机制剖析

1、为什么要引入Attention机制?

根据通用近似定理,前馈网络和循环网络都有很强的能力。但为什么还要引入注意力机制呢?

❾ 三不机制是什么

三不机制是什么?三不体制机制指的是不敢腐、不能腐、不想腐。不敢腐是纪律、法治、震慑,侧重于保持高压、持续震慑,是不能、不想的前提;不能腐是制度、监督、约束,侧重于扎紧笼子、堵塞漏洞,是不敢、不想的保障;不想腐是认知、觉悟、文化,侧重于提高思想觉悟、坚定理想信念,是不敢、不能的防线。



一、三不体制机制发布背景

2019年是中华人民共和国成立70周年,是全面建成小康社会、实现第一个百年奋斗目标的关键之年。在党中央坚强领导下,纪检监察工作坚定稳妥、扎实有效,在高质量发展上取得新的成绩。中央纪委国家监委网站与《咬文嚼字》编辑部利用大数据搜索,联合发布2019年度十大反腐热词。

二、三不体制机制内容

2019年1月,党的十九届四中全会将构建一体推进“三不”体制机制作为坚持和完善党和国家监督体系重要内容,单列一条作出部署。一体推进“三不”,凝结着对腐败发生机理、管党治党规律和当前形势任务的深刻洞察,是适用于全面从严治党各方面的科学思路和有效方法。一年来,纪检监察机关在严厉惩治、形成震慑的同时,扎牢制度笼子、规范权力运行,加强党性教育、提高思想觉悟,一体推进不敢腐、不能腐、不想腐,反腐败斗争压倒性胜利不断巩固发展。

一体推进“三不”揭示了标本兼治的基本规律,不仅是反腐败斗争的基本方针,也是新时代全面从严治党的重要方略。一年来,纪检监察机关注重把惩治震慑、制度约束、提高觉悟结合起来,把“三不”要求贯彻落实到正风肃纪反腐各方面,构建一体推进不敢腐、不能腐、不想腐体制机制,不断推动纪检监察工作高质量发展。

❿ BERT - 论文解读

BERT:【 Pre-training of Deep Bidirectional Transformers for
Language Understanding】

将预训练语言模型应用在下游任务中,一般有两种策略:

作者认为影响当前预训练语言模型的 瓶颈是——“模型是单向的” 。如 GPT 选择从左到右的架构,这使得每个 token 只能注意到它前面的 token,这对 sentence 级的任务影响还是次要的,但对于 token 级的任务来说影响就很巨大。例如问答任务,从两个方向结合上下文是至关重要的。

BERT 通过使用受完形填空任务启发的 Mask Language Model (MLM)缓解了先前模型的单向性约束问题。MLM 随机 mask 掉一些输入文本中的 token,然后根据剩下的上下文预测 masked 的 token。除了 Mask Language Model,作者还提出了 Next Sequence Predict 任务,来联合训练文本对表示。

论文中BERT的改进如下:

预训练前的一般语言表征有着悠久历史,本节我们简要回顾一下最广泛使用的方法。

2.1 基于特征的无监督方法
几十年来,学习广泛适用的词汇表征一直是一个活跃的研究领域,包括非神经系统、神经系统方法。预训练的词嵌入是现代NLP系统的一个组成部分,与从头学习的嵌入相比,它提供了显着的改进(Turian等人,2010)。为了预先训练单词嵌入向量,已经使用了从左到右的语言建模目标(Mnih和Hinton,2009),以及在左右上下文中区分正确单词和错误单词的目标(Mikolov等人,2013)。

这些方法已被推广到更粗糙的粒度,例如句子嵌入(Kiros等人,2015;Logeswaran和Lee,2018)或段落嵌入(Le和Mikolov,2014)。为了训练句子表征,之前的工作已经使用了目标对候选下一个句子进行排序(Jernite等人,2017;Logeswaran和Lee,2018),根据前一个句子的表征从左到右生成下一个句子单词(Kiros等人,2015),或去噪自动编码器衍生的目标(Hill等人,2016)。

ELMo 及其前身(Peters等人,20172018a)从不同的维度概括了传统的单词嵌入研究。它们通过从左到右和从右到左的语言模型中提取上下文敏感的特征。每个标记的上下文表示是从左到右和从右到左表示的 串联 。在将上下文单词嵌入与现有任务特定架构相结合时,ELMo推进了几个主要NLP基准(Peters等人,2018a)的最新技术,包括问答(Rajpurkar等人,2016年)、情感分析(Socher等人,2013年)和命名实体识别(Tjong Kim-Sang和De Meulder,2003年)。Melamud等人(2016年)提出通过一项任务来学习语境表征,即使用 LSTM 从左右语境中预测单个单词。与ELMo类似,他们的模型是基于特征的,而不是深度双向的。Fes等人(2018)表明,完形填空任务可以用来提高文本生成模型的 稳健性

2.2 无监督微调方法:

基于特征feature-based 的方法一样,第一种方法只在未标记文本中预先训练单词嵌入参数的情况下才朝这个方向工作。最近,产生上下文标记表示的句子或文档编码器已经从未标记的文本和文本中预训练出来针对受监督的下游任务进行了 微调fine-tuned
这些方法的 优点是 ,很少有参数需要从头学习。至少部分由于这一优势,OpenAI GPT在GLUE基准测试的许多句子级任务上取得了之前的最新成果。从左到右的语言建模和自动编码器目标已用于此类模型的预训练。

注解 :BERT的整体预训练和微调程序。除了输出层之外,在预训练和微调中使用相同的体系结构。相同的预训练模型参数用于初始化不同下游任务的模型。在微调过程中,所有参数都会微调。

2.3 基于监督数据的迁移学习:
也有研究表明,在大数据集的监督任务中,如自然语言推理和机器翻译可以有效地进行转换。计算机视觉研究也证明了 从大型预训练模型中进行迁移学习的重要性 ,其中一个有效的方法是对使用ImageNet预训练模型进行微调。

本节将介绍BERT及其详细实现。在我们的框架中有两个步骤:预训练和微调。

BERT的一个显着特点是其跨不同任务的统一体系结构 。预训练的体系结构和最终的下游体系结构之间的差异最小。

BERT 的模型架构是 一种多层的双向 transformer encoder ,BERT 在实现上与 transformer encoder 几乎完全相同。

定义:transformer block 的个数为 L ; hidden 大小为 H; self-attentions head 的个数为 A. 作者主要展示了两种规模的 BERT 模型:

在这项工作中,我们将层数(即Transformer blocks)表示为L,隐藏大小表示为H,自我注意头的数量表示为A。我们主要报告两种型号的结果:

为了进行比较,选择BERT-base与OpenAI GPT具有相同的模型大小。然而,关键的是, BERT Transformer使用双向自注意力机制self-attention ,而 GPT Transformer使用受限自注意力机制constrained self-attention ,其中每个标记只能关注其左侧的上下文。

为了使 BERT 能处理大量不同的下游任务,作者将模型的输入设计成可以输入单个句子或句子对,这两种输入被建模成同一个 token 序列。作者使用了有 30000 个 token 的 vocabulary 词嵌入。

3.1 Pre-training BERT :
我们不使用传统的从左到右或从右到左的语言模型来预训练BERT。相反,我们使用本节所述的两个无监督任务对BERT进行预训练。这一步如图1的左半部分所示。

Task #1: Masked LM
标准的语言模型只能实现从左到右或从右到左的训练,不能实现真正的双向训练,这是因为双向的条件是每个单词能直接“看到自己”,并且模型可以在多层上下文中轻松的预测出目标词。

为了能够实现双向的深度预训练,作者选择 随机 mask 掉一些比例的 token ,然后预测这些被 masked 的 token,在这种设置下,被 masked 的 token 的隐向量表示被输出到词汇表的 softmax 上,这就与标准语言模型设置相同。作者将 这个过程称为“Masked LM”,也被称为“完形填空”

○ Masked LM 预训练任务的缺点
在于由于 [MASK] 标记不会出现在微调阶段,这就造成了预训练和微调阶段的不一致。为了解决该问题,作者提出了 一种折中的方案

○ BERT 的 mask策略:

Task #2: Next Sentence Prediction (NSP)
很多下游任务都是基于对两句话之间的关系的理解,语言模型不能直接捕获这种信息。为了训练模型理解这种句间关系,作者 设计了 next sentence prediction 的二分类任务 。具体来说,就是选择两个句子作为一个训练样本,有 50% 的概率是下一句关系,有 50% 的概率是随机选择的句子对, 预测将 [CLS] 的最终隐状态 C 输入 sigmoid 实现

○ Pre-training data
作者选用了BooksCorpus (800M words) 和 English Wikipedia (2,500M words) 作为预训练的语料库,作者只选取了 Wikipedia 中的文本段落,忽略了表格、标题等。为了获取长的连续文本序列,作者选用了 BIllion Word Benchmark 这样的文档级语料库,而非打乱的句子级语料库。

3.2 Fine-tuning BERT
因为 transformer 中的 self-attention 机制适用于很多下游任务,所以可以直接对模型进行微调。对于涉及文本对的任务,一般的做法是独立 encode 文本对,然后再应用双向的 cross attention 进行交互。Bert 使用 self-attention 机制统一了这两个阶段,该机制直接能够实现两个串联句子的交叉编码。

对于不同的任务,只需要简单地将特定于该任务的输入输出插入到 Bert 中,然后进行 end2end 的fine-tuning。

与预训练相比,微调相对便宜。从完全相同的预训练模型开始,本文中的所有结果最多可以在单个云TPU上复制1小时,或在GPU上复制几个小时。

在本节中,我们将介绍11个NLP任务的BERT微调结果。
4.1 GLUE:
GLUE (General Language Understanding Evaluation) 是多个 NLP 任务的集合。作者设置 batch size 为 32;训练 3 个 epochs;在验证集上从(5e-5, 4e-5, 3e-5, 2e-5)中选择最优的学习率。结果如下:

结果见表1。 BERT-base和BERT-large在所有任务上都比所有系统表现出色,与现有技术相比,平均准确率分别提高了4.5%和7.0% 。请注意,除了注意掩蔽,BERT-base和OpenAI GPT在模型架构方面几乎相同。

对于最大和最广泛报道的GLUE任务MNLI,BERT获得了4.6%的绝对准确率提高。在官方的GLUE排行榜10中,BERT-lagle获得80.5分,而OpenAI GPT在撰写本文之日获得72.8分。我们发现BERT-large在所有任务中都显着优于BERT-base,尤其是那些训练数据很少的任务。

4.2 SQuAD v1.1 :
斯坦福问答数据集(SQuAD v1.1)收集了10万对众包问答对。给出一个问题和一段维基网络中包含答案的文章,任务是预测文章中的答案文本。

如图1所示,在问答任务中,我们将输入的问题和段落表示为单个压缩序列,问题使用A嵌入,段落使用B嵌入。在微调过程,我们只引入一个起始向量S和一个端向量E。单词i作为答案范围开始的概率计算为Ti和S之间的点积,然后是段落中所有单词的softmax:

答案范围结束时使用类似公式。候选人从位置 i 到位置 j 的得分定义为:S·Ti + E·Tj ,最大得分跨度为 j≥ i 被用作预测。训练目标是正确起始位置和结束位置的对数概率之和。我们微调了3个阶段,学习率为5e-5,批量大小为32。

表2显示了顶级排行榜条目以及顶级发布系统的结果。SQuAD排行榜的前几名没有最新的公共系统描述,并且允许在训练系统时使用任何公共数据。因此,在我们的系统中使用适度的数据扩充,首先在TriviaQA上进行微调,然后再对团队进行微调。

我们表现最好的系统在ensembling方面的表现优于排名第一的系统,在ensembling方面的表现优于排名第一的系统+1.5 F1,在单一系统方面的表现优于排名第一的系统+1.3 F1得分。事实上,我们的单BERT模型在F1成绩方面优于顶级合奏系统。如果没有TriviaQA微调数据,我们只会损失0.1-0.4 F1,仍然远远超过所有现有系统。

其他实验:略

在本节中,我们对BERT的许多方面进行了消融实验,以便更好地了解它们的相对重要性。其他消融研究见附录C。

5.1 预训练任务的效果

○ 进行了如下消融测试:

○ 结果如下:

5.2 模型大小的影响

○ 结果如下:

作者证明了 :如果模型经过充分的预训练,即使模型尺寸扩展到很大,也能极大改进训练数据规模较小的下游任务。

5.3 将 Bert 应用于 Feature-based 的方法

○ feature-based 的方法是从预训练模型中提取固定的特征,不对具体任务进行微调
○ 这样的方法也有一定的优点

作者进行了如下实验:在 CoNLL-2003 数据集上完成 NER 任务,不使用 CRF 输出,而是从一到多个层中提取出激活值,输入到 2 层 768 维的 BiLSTM 中,再直接分类。结果如下:

结果说明:无论是否进行微调,Bert 模型都是有效的。

个人认为 Bert 的意义在于:

由于语言模型的迁移学习,最近的经验改进表明,丰富的、无监督的预训练是许多语言理解系统的一个组成部分。特别是,这些结果使得即使是低资源任务也能从深层单向体系结构中受益。我们的主要贡献是将这些发现进一步推广到深层双向体系结构中,使相同的预训练模型能够成功地处理广泛的NLP任务。

阅读全文

与lstm注意力机制应用源码相关的资料

热点内容
卡尔曼滤波算法书籍 浏览:769
安卓手机怎么用爱思助手传文件进苹果手机上 浏览:844
安卓怎么下载60秒生存 浏览:803
外向式文件夹 浏览:240
dospdf 浏览:431
怎么修改腾讯云服务器ip 浏览:392
pdftoeps 浏览:496
为什么鸿蒙那么像安卓 浏览:736
安卓手机怎么拍自媒体视频 浏览:186
单片机各个中断的初始化 浏览:724
python怎么集合元素 浏览:481
python逐条解读 浏览:833
基于单片机的湿度控制 浏览:499
ios如何使用安卓的帐号 浏览:883
程序员公园采访 浏览:812
程序员实战教程要多长时间 浏览:979
企业数据加密技巧 浏览:135
租云服务器开发 浏览:814
程序员告白妈妈不同意 浏览:337
攻城掠地怎么查看服务器 浏览:601