深度学习常用模型(三):LSTM
1.什么是RNN
在了解LSTM之前,我们先来简单回顾一下什么吗是RNN
人类针对每个问题的思考,一般不会是完全的从头开始思考。正如当你阅读这篇译文的时候,你会根据已经阅读过的内容来对后面的内容进行理解,你不会把之前的东西都丢掉从头进行思考,你对内容的理解是贯穿的。
传统的神经网络做不到这一点,而这似乎是一个主要的缺点。 例如,假设您想对电影中的每个事件进行分类。我们无法想象传统神经网络如何能够利用前面的场景去干预后面的预测。
幸好循环神经网络解决了这个问题, 它们是具有循环的网络,允许信息持续存在,示意图如下。
在上图中,一组神经网络 A接收某些输入xt,并输出一个值ht。 循环允许信息从网络的一个步骤传递到下一个。
这些循环使得循环神经网络看起来很神秘。 然而,如果你再多考虑一下,你就会发现其实它和传统的神经网络并不是完全不同。 一个循环神经网络可以被认为是同一个网络的多个副本,每一个都传递一个消息给后继者。 我们考虑一下如果将循环展开会发生什么:(示意如下)
这种链状特征揭示了循环神经网络与序列和列表密切相关。 它们是用于此类数据的自然神经网络结构。
他们肯定是有用的! 在过去的几年里,RNN应在语音识别、语言建模、翻译,图像字幕等各种问题上取得了巨大成功。在Andrej Karpathy的这篇博文——RNN的难以理解的有效性(The Unreasonable Effectiveness of Recurrent Neural Networks)中讨论了RNN取得的惊人成果,他们真的很神奇。
长依赖存在的问题(短时记忆)
RNN显著的魅力是将以前的信息连接到当前任务的这种思路,例如使用先前的视频帧可以有助于对当前帧的理解。 如果RNN可以做到这一点,这将非常有用。 但他可以吗?这要看情况。
有时,为了处理当前的任务,我们只需要查看最近的信息。 例如,考虑一种语言模型,该模型根据前面的词语来预测下一个单词。 如果我们试图预测““the clouds are in the sky”的最后一个单词,我们不需要任何其他的语境信息——下一个单词显然是sky。 在相关信息和需要该信息的距离较近的时候,RNN能够学会去利用历史信息。
但也有需要更多上下文的情况。 考虑尝试预测文本中的最后一个单词“I grew up in France… I speak fluent French.”。最近的信息表明,下一个单词可能是一种语言的名称,但如果我们想缩范围确定那种语言,我们需要从前面获取法国的背景。 相关信息和需要该信息的地方的距离变得非常大的情况是很可能的。
不幸的是,随着距离的增加,RNN无法有效的利用历史信息。
在理论上,RNN绝对有能力处理这样的“长依赖”问题。人们可以仔细挑选参数来解决这种形式的问题。 可悲的是,在实践中,RNN似乎无法学习到这些特征。Hochreiter和Bengio,曾经深入的研究过这个问题,他们发现一些根本性的原因,能够解释RNN为什么不work。
公众号:AI科技用很过直观的动图描述了RNN的工作流程,以及为什么RNN要是用激活函数Tanh
用简单的话来描述短时记忆的原因:
在反向传播期间,RNN 会面临梯度消失的问题。 梯度是用于更新神经网络的权重值,消失的梯度问题是当梯度随着时间的推移传播时梯度下降,如果梯度值变得非常小,就不会继续学习。
因此,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN 可以忘记它在较长序列中看到的内容,因此具有短时记忆。
作为短时记忆的解决方案,LSTM和GRU出现了。
2.LSTM和GRU是什么
LSTM 和 GRU 是解决短时记忆问题的解决方案,它们具有称为“门”的内部机制,可以调节信息流。
这些“门”可以知道序列中哪些重要的数据是需要保留,而哪些是要删除的。 随后,它可以沿着长链序列传递相关信息以进行预测,几乎所有基于递归神经网络的技术成果都是通过这两个网络实现的。
LSTM 和 GRU 可以在语音识别、语音合成和文本生成中找到,你甚至可以用它们为视频生成字幕。对 LSTM 和 GRU 擅长处理长序列的原因,到这篇文章结束时你应该会有充分了解。
下面我将通过直观解释和插图进行阐述,并避免尽可能多的数学运算。
LSTM
LSTM 的控制流程与 RNN 相似,它们都是在前向传播的过程中处理流经细胞的数据,不同之处在于 LSTM 中细胞的结构和运算有所变化。
这一系列运算操作使得 LSTM具有能选择保存信息或遗忘信息的功能。咋一看这些运算操作时可能有点复杂,但没关系下面将带你一步步了解这些运算操作。
核心概念
LSTM 的核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲,细胞状态能够将序列处理过程中的相关信息一直传递下去。
因此,即使是较早时间步长的信息也能携带到较后时间步长的细胞中来,这克服了短时记忆的影响。信息的添加和移除我们通过“门”结构来实现,“门”结构在训练过程中会去学习该保存或遗忘哪些信息。
Sigmoid
门结构中包含着 sigmoid 激活函数。Sigmoid 激活函数与 tanh 函数类似,不同之处在于 sigmoid 是把值压缩到 0~1 之间而不是 -1~1 之间。这样的设置有助于更新或忘记信息,因为任何数乘以 0 都得 0,这部分信息就会剔除掉。同样的,任何数乘以 1 都得到它本身,这部分信息就会完美地保存下来。这样网络就能了解哪些数据是需要遗忘,哪些数据是需要保存。
接下来了解一下门结构的功能。LSTM 有三种类型的门结构:遗忘门、输入门和输出门。
遗忘门
遗忘门的功能是决定应丢弃或保留哪些信息。来自前一个隐藏状态的信息和当前输入的信息同时传递到 sigmoid 函数中去,输出值介于 0 和 1 之间,越接近 0 意味着越应该丢弃,越接近 1 意味着越应该保留。
输入门
输入门用于更新细胞状态。首先将前一层隐藏状态的信息和当前输入的信息传递到 sigmoid 函数中去。将值调整到 0~1 之间来决定要更新哪些信息。0 表示不重要,1 表示重要。
其次还要将前一层隐藏状态的信息和当前输入的信息传递到 tanh 函数中去,创造一个新的侯选值向量。最后将 sigmoid 的输出值与 tanh 的输出值相乘,sigmoid 的输出值将决定 tanh 的输出值中哪些信息是重要且需要保留下来的。
细胞状态
下一步,就是计算细胞状态。首先前一层的细胞状态与遗忘向量逐点相乘。如果它乘以接近 0 的值,意味着在新的细胞状态中,这些信息是需要丢弃掉的。然后再将该值与输入门的输出值逐点相加,将神经网络发现的新信息更新到细胞状态中去。至此,就得到了更新后的细胞状态。
输出门
输出门用来确定下一个隐藏状态的值,隐藏状态包含了先前输入的信息。首先,我们将前一个隐藏状态和当前输入传递到 sigmoid 函数中,然后将新得到的细胞状态传递给 tanh 函数。
最后将 tanh 的输出与 sigmoid 的输出相乘,以确定隐藏状态应携带的信息。再将隐藏状态作为当前细胞的输出,把新的细胞状态和新的隐藏状态传递到下一个时间步长中去。
让我们再梳理一下。遗忘门确定前一个步长中哪些相关的信息需要被保留;输入门确定当前输入中哪些信息是重要的,需要被添加的;输出门确定下一个隐藏状态应该是什么。
代码示例
对于那些懒得看文字的人来说,代码也许更好理解,下面给出一个用 python 写的示例。
1.首先,我们将先前的隐藏状态和当前的输入连接起来,这里将它称为 combine;
2.其次将 combine 丢到遗忘层中,用于删除不相关的数据;
3.再用 combine 创建一个候选层,候选层中包含着可能要添加到细胞状态中的值;
4.combine 同样要丢到输入层中,该层决定了候选层中哪些数据需要添加到新的细胞状态中;
5.接下来细胞状态再根据遗忘层、候选层、输入层以及先前细胞状态的向量来计算;
6.再计算当前细胞的输出;
7.最后将输出与新的细胞状态逐点相乘以得到新的隐藏状态。
是的,LSTM 网络的控制流程就是几个张量和一个 for 循环。你还可以使用隐藏状态进行预测。结合这些机制,LSTM 能够在序列处理中确定哪些信息需要记忆,哪些信息需要遗忘。
GRU
知道了 LSTM 的工作原理之后,来了解一下 GRU。GRU 是新一代的循环神经网络,与 LSTM 非常相似。与 LSTM 相比,GRU 去除掉了细胞状态,使用隐藏状态来进行信息的传递。它只包含两个门:更新门和重置门。
更新门
更新门的作用类似于 LSTM 中的遗忘门和输入门。它决定了要忘记哪些信息以及哪些新信息需要被添加。
重置门
重置门用于决定遗忘先前信息的程度。
这就是 GRU。GRU 的张量运算较少,因此它比 LSTM 的训练更快一下。很难去判定这两者到底谁更好,研究人员通常会两者都试一下,然后选择最合适的。
原文链接:https://mp.weixin.qq.com/s/aV9Rj-CnJZRXRm0rDOK6gg
这里GRU介绍的比较粗糙,其实理解起来GRU并不比LSTM简单,虽然少了一个门的参数,但是相应的细胞结构也变得相对难了。想要深入了解可以看看知乎上这篇高赞回答。人人都能看懂GRU