RNN记忆特性

来源:互联网 发布:js怎么把数字变成汉字 编辑:程序博客网 时间:2024/06/04 19:13

RNN与语义分析

RNN的祖先是1982年提出的Hopfield网络。

Hopfield网络因为实现困难,外加没有合适应用,被86年后的前馈网络取代。

90年代恰逢神经网络衰落期,前馈MLP在Optimization上被揪出种种弊端,又被SVM取代。

在Represention上,CV界老一辈还在用着hand-made特征,Speech&NLP也偏重Statistics的特征。

1990年提出的两种变种RNN,Elman&Jordan SRN同样因为没有合适的实际应用,很快又被无视。

过了十几年,遇上了DL热潮,RNN被研究出具有挖掘语义信息的Distrubuted Represention能力。

终于被拿来做Speech和Language Model方面语义分析相关任务。

3.1 记忆特性

一个时长为T的Simple RNN,unfold(展开)后实质是一个深度为T的前馈网络。

序列上所有的输入信息、non-linearity变换的隐态信息从开始时刻,一直保留至当前时刻。

从生物神经学角度,就是长期记忆(Long-Term Memory)特性。

前馈网络不是万能的,尽管在CV上大放光彩,但确实不适合解决逻辑问题。

Prolog曾经大放光彩,很多人坚信概率解决不了逻辑智能问题,但被RNN打脸了,比如下面这个问题:

RNN就能够通过长记忆,向前搜索出输入中的关键信息。

3.2 Gradient Vanish

深度神经网络的头号问题就是Gradient Vanish,尤其是比MLP还要深多少倍的RNN。

★数学角度:[Bengio94]给出了Simple RNN出现Gradient Vanish的原因:

tj=p+1bjhbj1h(βWβh)tpwhereβ=UpperBound|∏j=p+1t∂bhj∂bhj−1|⩽(βW⋅βh)t−pwhereβ=UpperBound

W、h两个参数矩阵,先积后幂,导致上界突变速度飞快,要么0→0,要么→∞

如若引入大量的饱和Non-Linearity,如Sigmoid(Logistic|Tanh),那么最普遍的情况就是Gradient0Gradient→0

★生物学角度:

术语称之为Long-Term Memory退化到Short-Term Memory,只能记忆短期记忆。

3.3 RNNLM

尽管Simple RNN有诸多缺陷,但Short-Term Memory毕竟聊胜于无。

[Mikolov10]最先提出用RNN来做LM,不过并没有用Word Embedings。

RNNLM从sentence-level切入,把一个sentence看成是一个sequence,逐个跑word推动时序。

3.4 RNN For Speech Understanding

[Mesnil13]则又将RNN同最近比较火的Word Embedings结合起来。

这篇paper是Bengio组Mesnil和在微软实习的时候和Redmond研究院语音领域两位大牛Xiaodong He、Li Deng合作的。

目测是在MS传播导师的Theano。(OS:看你们还在公式推Gradient,啊哈哈哈)

3.4.1 Word embeddings

回过头来再看[Mikolov13]的Word2Vec,13年开始真是全民玩起了词向量。

[Mesnil13]总结了词向量的几点好处:

★以较小的维度向量,提纯出Word的N维的欧几里得空间信息,俗称降维。

★可以先在Wiki之类的大型Corpus上Pre-Training出部分语义语法信息,

然后根据实际任务Fine-Tuning,符合深度学习原则。

★大幅度提升Generalization。

3.4.2 Context Window

另一个流行起来的Trick就是Context Window,Word2Vec的核心之一。

不同的是,Word2Vec丢弃了窗口词的空间排列信息,而正常方法则选择将窗口词合并。

[Bengio03]中的词向量,是在词典里直接取整个Dim长度的向量,设Dim=350。

而做了Context Window之后,单个词的Dim变小,通常为(50|100),窗口大小通常为(3~19):

[Mesnil13]给出Context Window的唯一作用:

强化短期记忆(Short-Term)

看起来不是很有说服力,从Word2Vec来看,起码还有这些作用:

★强化上下文信息捕捉能力

★强化语义、语法信息捕捉能力

Long-Short Memory Network(LSTM长短期记忆网络)

自剪枝神经网络

Simple RNN从理论上来看,具有全局记忆能力,因为T时刻,递归隐层一定记录着时序为1的状态

但由于Gradient Vanish问题,T时刻向前反向传播的Gradient在T-10时刻可能就衰减为0。

从Long-Term退化至Short-Term。

尽管ReLU能够在前馈网络中有效缓解Gradient Vanish,但RNN的深度过深,替换激活函数治标不治本。

tj=p+1bjhbj1h(βWβh)tpwhereβ=UpperBound|∏j=p+1t∂bhj∂bhj−1|⩽(βW⋅βh)t−pwhereβ=UpperBound

上式中指明的根源所在,由于W和h两个矩阵多次幂导致受数值影响敏感,简而言之就是深度过大。

大部分Long-Term情况下,不需要提供路径上完整的信息,但反向传播还是循规蹈矩地穿过这些冗深度。

解决方案之一是,设置可自主学习的参数来屏蔽掉这些无用的信息,与"降维"相似,这种方法叫"降层"

神经网络的剪枝策略很简单,就是添加参数矩阵,经过一定周期的学习,选择性屏蔽掉输入,精简网络。

从结构上来看,类似“树套树”,就是”神经网络套神经网络“。

动态门结构

简单概括:

★LSTM将RNN的输入层、隐层移入Memory Cell加以保护

★Input Gate、Forget Gate、Output Gate,通过训练参数,将Gate或开(置1)或闭(置0),保护Cell。

在时序展开图上则更加清晰:

 

公式定义

原版LSTM最早在[Hochreiter&Schmidhuber 97]提出。

今天看到的LSTM是[Gers 2002]改良过的 extended LSTM。

extended LSTM扩展内容:

★Forget Gate,用于屏蔽t-1以及之前时序信息。

在时序展开图上,由左侧锁住以保护Cell。

★三态门控:

97年提出的Gate输入类似RNN,分为两态Weight矩阵:

Wx——序列输入信息

Wh——递归隐态输入信息

2002年补充了第三态:

Wc——递归Cell态输入信息

将Cell的时序状态引入Gate,称为Peephole Weights。

唯一作用似乎是提升LSTM精度,Alex Graves的博士论文中这么说:

The peephole connections,meanwhile, improved the LSTM’s ability to learn tasks that require precise
timing and counting of the internal states.

具体实现的时候,为了增加计算效率,可以忽视:

Theano的Tutorial中这么说道:

The model we used in this tutorial is a variation of the standard LSTM model.

In this variant, the activation of a cell’s output gate does not depend on the memory cell’s state .

This allows us to perform part of the computation more efficiently (see the implementation note, below, for details).

而CS224D Lecture8中压根就没提。

所以双态Gate可能是更为主流的LSTM变种。

2.1 前向传播

输入门:

it=Sigmoid(Wixt+Uiht1+ViCt1)it=Sigmoid(Wixt+Uiht−1+ViCt−1)      ①

遗忘门:

ft=Sigmoid(Wfxt+Ufht1+VfCt1)ft=Sigmoid(Wfxt+Ufht−1+VfCt−1)    ②

输出门:

Ot=Sigmoid(Woxt+Uoht1+VoCt)Ot=Sigmoid(Woxt+Uoht−1+VoCt)    ③

原始Cell(RNN部分):

Ct~=Tanh(Wcxt+Ucht1)Ct~=Tanh(Wcxt+Ucht−1)                  ④

门套Cell:

Ct=itCt~+ftCt1Ct=it⋅Ct~+ft⋅Ct−1         (输入门+遗忘门)        ⑤

ht=OtTanh(Ct)whereht=FinalOutputht=Ot⋅Tanh(Ct)whereht=FinalOutput       (输出门)       ⑥

————————————————————————————————————————————————————

仔细观察①②③④,发现除了Peephole Weights引入的VV阵,这四个式子是一样的。

Theano中为了GPU能够一步并行计算,没有使用Peephole Weights,这样①②③④就是一个基本并行模型:

以相同的代码,运算数据集在空间中的不同部分。


递归神经网络

人类并不是从混沌状态开始他们的思考。就像你读这篇文章时,你是建立在你之前对文字的理解上。你并不是学习结束之后就丢弃掉你学到的东西,然后再从混沌状态开始。因为你的思想有持续性。 
然而,传统的神经网络并不能做到持续记忆,这应该是传统神经网络的一个缺陷。假想一下,你想让神经网络对电影中每个时间点的事件进行分类,很明显,传统神经网络不能使用前一个事件去推理下一个事件。 
递归神经网络可以解决这个问题。它们是带有循环的神经网络,允许信息保留一段时间。 
递归神经网络 
在上图中,A 代表神经网络主体, xt 是网络输入,ht是网络输出,循环结构允许信息从当前输出传递到下一次的网络输入。 
这些循环让递归神经网络看起来有点神秘,然而,如果你再进一步思考一下,它与传统神经网络并没有太多不同。一个递归神经网络可以看多是一个网络的多次拷贝,每次把信息传递给他的继任者。让我们把网络展开,你会看到发生了什么。 
递归神经网络展开

这种链型的自然结构表明递归神经网络与序列和列表有着天然的联系,他们是处理这些序列数据天然的神经网络架构。 
当前,它们已经被应用了!最近的几年中,RNNs在很多问题上取得了惊人的成功:语音识别,语言模型,翻译,图像注释。。。这个名单还在继续延长。我将讨论一下Andrej Karpathy在他的博文The Unreasonable Effectiveness of Recurrent Neural Network中提到的RNNs令人惊奇的特性。 它们实在是太让人惊奇了! 
这些成功必须要归功于它们使用了“LSTMs”, 递归神经网络的一种,它在许多任务中得到了比标准版本的RNN更好的结果。几乎所有建立的递归神经网络上的,令人惊喜的结果,都是使用LSTMs得到的。这篇文章将会探索这个神奇的神经网络。

长期依赖的问题

人门希望RNNs能够连接之前的信息到当前的任务中,例如,使用之前的图像帧信息去辅助理解当前的帧。如果RNNs可以做到这个,它们将会特别的有用,但是它们可以做到吗?这要视情况而定。 
有时,我们仅仅需要使用当前的信息去执行当前的任务。例如, 一个语言模型试图根据之前的单词去预测下一个单词。如果我们试图去预测“the clouds are in the sky”,我们不需要更多的上下文信息–很明显下一个单词会是sky。在类似这种相关信息和需要它的场合并不太多的情景下,RNNs可以学习使用之前的信息。 
RNN-shorttermdepdencies

但是,也有很多场景需要使用更多的上下文。当我们去尝试预测“I grew up in France…I speak fluent French”的最后一个单词,最近的信息表明下一个单词应该是语言的名字,但是如果我们想缩小语言的范围,看到底是哪种语言,我们需要France这个在句子中比较靠前的上下文信息。相关信息和需要预测的点的间隔很大的情况是经常发生的。 
不幸的事,随着间隔的增大,RNNs连接上下文信息开始力不从心了、. 
RNN-longtermdependencies
理论上RNNs完全有能力处理这种“长期依赖(Long-term dependencies)”问题。人们可以精心的选择参数去接着这类问题。令人沮丧的是,实践表明RNNs不能完美的学习“长期依赖(Long-term dependencies)”。Hochreiter(1991)和Bengio,et al,(1994)发现了一些为什么RNNs在这些问题上学习相当困难的根本原因。 
谢天谢地,LSTMs没有这些问题。

LSTM 网络

长短期记忆网络–通畅叫做”LSTMs”–是一种特殊的RNNs, 它能够学习长期依赖。LSTM由Hochreiter&Schmidhuber(1997)引入,后来在很多人的努力下变得越来越精炼和流行。它们在大量的问题上有惊人的效果,现在被广泛的使用。 
LSTMs被明确的设计用来解决长期依赖问题,记住长时间段的信息是他们的必备技能,不像RNNs那么费力去做还做不好。 
所有的递归神经网络都有重复神经网络本身模型的链式形式。在标准的RNNs, 这个复制模块只有一个非常简单的结构,例如一个双极性(tanh)层。 
The repeating module in a standard RNN contains a single layer.
LSTMs 也有这种链式结构,但是这个重复模块与上面提到的RNNs结构不同:LSTMs并不是只增加一个简单的神经网络层,而是四个,它们以一种特殊的形式交互。 
The repeating module in an LSTM contains four interacting layers.
别担心中间到底发生了什么。我们接下来会一步一步的理解这个LSTM图。首先,我们要首先适应一下我们将会使用的符号表示方法。 
这里写图片描述
在上图中,每条线表示一个向量,从一个输出节点到其他节点的输入节点。这个粉红色圆圈表示逐点式操作,就像向量加法。黄色的盒子是学习好的神经网络的层。线条合表示联结,相反,线条分叉表示内容被复制到不同位置。

LSTMs背后的核心思想

LSTMs的核心之处就是它的神经元状态,如下图中所示,上面那条贯穿整个结构的水平线。 
神经元状态就像是一个传送带。它的线性作用很小,贯穿整个链式结构。信息很容易在传送带上传播,状态却并不会改变。 
这里写图片描述
LSTM有能力删除或者增加神经元状态中的信息,这一机制是由被称为门限的结构精心管理的。 
门限是一种让信息选择性通过的方式,它们是由Sigmoid神经网络层和逐点相乘器做成的。 
这里写图片描述

Sigmod层输出0~1之间的数字,描述了一个神经元有多少信息应该被通过。输出“0”意味着“全都不能通过”,输出“1”意味着“让所有都通过”。 
一个LSTM有三个这样的门限,去保护和控制神经元状态。

一步一步的推导LSTM

LSTM的第一步就是决定什么信息应该被神经元遗忘。这是一个被称为“遗忘门层”的Sigmod层组成的。它输入 ht1xt,然后在Ct1 的每个神经元状态输出0~1之间的数字。“1”表示“完全保留这个”,“0”表示“完全遗忘这个”。 
让我们再次回到那个尝试去根据之前的词语去预测下一个单词的语言模型。在这个问题中,神经元状态或许包括当前主语中的性别信息,所以可以使用正确的代词。当我们看到一个新的主语,我们会去遗忘之前的性别信息。 
这里写图片描述
下一步就是决定我们要在神经元细胞中保存什么信息,这包括两个部分。首先,一个被称为“遗忘门层”的Sigmod层决定我们要更新的数值。然后,一个tanh层生成一个新的候选数值,Ct˜,它会被增加到神经元状态中。在下一步中中,我们会组合这两步去生成一个更新状态值。 
在那个语言模型例子中,我们想给神经元状态增加新的主语的性别,替换我们将要遗忘的旧的主语。 
这里写图片描述
是时候去更新旧的神经元状态Ct1到新的神经元状态Ct了。之前的步骤已经决定要做什么,下一步我们就去做。 
我们给旧的状态乘以一个ft,遗忘掉我们之前决定要遗忘的信息,然后我们增加itCt˜。这是新的候选值,是由我们想多大程度上更新每个状态的值来度量的。 
在语言模型中,就像上面描述的,这是我们实际上要丢弃之前主语的性别信息,增加新的主语的性别信息的地方。 
这里写图片描述
最后,我们要决定要输出什么。这个输出是建立在我们的神经元状态的基础上的,但是有一个滤波器。首先,我们使用Sigmod层决定哪一部分的神经元状态需要被输出;然后我们让神经元状态经过tanh(让输出值变为-1~1之间)层并且乘上Sigmod门限的输出,我们只输出我们想要输出的。 
对于那个语言模型的例子,当我们看到一个主语的时候,或许我们想输出相关动词的信息,因为动词是紧跟在主语之后的。例如,它或许要输出主语是单数还是复数的,然后我们就知道主语联结的动词的语态了。 
这里写图片描述

长短期记忆神经网络的变体

上面描述的都是常规的LSTM,但并不是所有的LSTMs都是上面这种模式。实际上,几乎每篇包含LSTMs模型的论文中,LSTMs都有一些差异,这些差异非常微小,但是它值得提及一下。 
Gers & Schmidhuber(2000)引入了一个流行的LSTM变体,他增加了一个“窥视孔连接”。这意味着我们让门限层监视神经元状态。 
这里写图片描述
上图中给每个门限增加了窥视孔,但是有些论文,只给一部分门限增加窥视孔,并不是全部都加上。 
另外一个变体是使用组合遗忘和输入门。而不是分开决定哪些神经元需要遗忘信息,哪些需要增加新的信息,我们组合起来决定。我们只遗忘那些需要被放入新信息的状态,同样,我们只在旧的信息被遗忘之后才输入新的信息。 
这里写图片描述
一个更神奇的LSTM变体是门递归单元(Gated Recurrent Unit, GRU),由Cho, et al(2014),它组合遗忘们和输入门为一个“更新门”,它合并了神经元状态和隐层状态,并且还做了一些其他改变。最终这个模型比标准的LSTM模型简单一些,并且变得越来越流行。 
这里写图片描述
这里只介绍了几个最有名的LSTM的变体,还有更多变体没有介绍,就像Yao, et al.(2015)深度门递归神经网络(Depth Gated RNNs)。这里也有一些处理长期依赖问题问题的完全不同的方法,就像Koutnik, et al(2014)提出的时钟机递归神经网络(Clockwork RNNs)。 
这些变体中哪个是最好的?这些差异重要吗?Greff, et al. (2015)做了一个流行LSTM变体的比较,他发现这都是一样的。Jozefowicz, et al. (2015)测试了一万多种RNN结构,发现一些RNN结构在某些特定任务中结果好于LSTMs。

结论

文章开头,我提到了人们使用RNNs取得了卓越的成果,本质上所有的这些结果都是使用LSTMs取得的。他们的确在多数任务上表现的更好。 
写下来一系列等式以后,LSTM s看起来挺吓人的,然而,我们在文中一步一步的解释它以后它看起来可以理解了。LSTMs在我们能够用RNNs取得的结果中取得了更大的进步。我们不禁想问:是否有比LSTMs更好的模型?学者一致认为:“有的!这里有下一步,它就是“注意力”!”(Yes! There is a next step and it’s attention!,这里的”attention”翻译成“注意力”不知道是否合适”?)一个观点是让RNN的每一步都监视一个更大的信息集合,并从中挑选信息。例如:如果你使用 RNN去为一幅图像生成注释,它会从图像中挑选中挑选一部分去预测输出单词。实际上,Xu, et al. (2015) 确实是这样做的–如果你想去探索“注意力”,这或许是一个有趣的起点!这里还有一些使用“注意力”得到的有趣的结果,并且还有更多人在使用这个。 
“注意力”并不是唯一的RNN研究热点。例如, 格点LSTMs(Grid LSTMs),Kalchbrenner, et al. (2015)看起来非常有前途。在生产环境中使用RNNs模型,就像Gregor, et al. (2015), Chung, et al. (2015)或者 Bayer & Osendorfer (2015)–也看起来很有趣。最近几年递归神经网络很流行,从趋势来看,未来还会更流行。

我们来按照下面的步骤理解LSTM结构以及它背后的意义:

  1. 新记忆产生:这个状态和GRUs中的新记忆产生状态是一样的。我们必须使用输入词和过去隐层状态来产生新的记忆,包括了新词.

  2. 输入门:在产生新记忆之前,我们需要判定一下我们当前看到的新词到底重不重要,这就是输入门的作用。输入门根据输入词和过去隐层状态共同判定输入值是否值得保留,从而判定它以何种程度参与生成新的记忆(或者说对新的记忆做一个约束)。因此,它可以作为输入信息更新的一个指标。

  3. 遗忘门:这个门和输入门很类似。但是它不能决定输入词有效,它能对过去记忆单元是否对当前记忆单元的计算有用做出评估。

  4. 最终记忆产生:这个阶段会根据遗忘门的作用结果,合理地忘记部分过去的记忆。再根据输入门的作用结果,产生新记忆。它将这两个结果加融合起来产生了最终的记忆

  5. 输出门:这是一个GRUs里没有显性存在的门。它的目的是从隐层状态分离最终的记忆。最终记忆包含了大量不必需要保存在隐层状态的信息,这个门限能够评估关于记忆哪部分需要显示在隐层状态中。用于评估这部分信息的中间信号叫做,它和的点乘组成最后的



0 0
原创粉丝点击