带你深化剖析递归神经网络
递归神经网络(RNN)是一类神经网络,包括一层内的加权衔接(与传统前馈网络相比,衔接仅馈送到后续层)。由于 RNN 包括循环,所以它们可以在处置新输入的同时存储消息。这种记忆使它们十分适宜处置肯定思考事前输入的义务(比如时序数据)。由于这个要素,目前的深度学习网络均以 RNN 为基础。本教程将探求 RNN 面前的思维,并从头成功一个 RNN 来口头序列数据预测。
神经网络是基于高度衔接的处置元件(神经元)的网络将输入映射到输入的计算结构。要极速了解神经网络,请浏览我的另一篇教程“神经网络深化剖析”,其中剖析了感知器(神经网络的构建块)以及具备反向流传学习才干的多层感知器。
在前面的教程中,我讨论了前馈网络拓扑结构。在此拓扑结构中(如下图所示),可以经过暗藏层将输入矢量馈送到网络中,并最终取得一个输入。在这个网络中,输入以确定性的方式映射到输入(每次输入被运行)
然而,咱们假定您在处置时序数据。孤立的繁少数据点并不是齐全有用的,由于它不足关键的属性(例如,数据序列能否在出现变动?是增大?还是增加?)。思考一个人造言语处置运行程序,其中的字母或单词示意网络输入。当您思考了解单词时,字母在高低文中很关键。孤立形态下的这些输入没有什么用,只要将它们放入之前出现的事情的高低文中才有用。
时期序列数据的运行须要一种可以思考输入历史的新型拓扑结构。这时就可以运行 RNN。RNN 能够经过反应来保养外部记忆,所以它支持时期行为。在上方的示例中,会将暗藏层输入运行回暗藏层。网络坚持前馈方式(先将输入运行于暗藏层,而后再运行于输入层),但 RNN 经过高低文节点坚持外部形态(这会影响后续输入上的暗藏层)。
RNN 不是一类网络,而是一个包括处置不同疑问的拓扑结构的汇合。递归网络的一个关键方面在于,借助足够的层和节点,它们是图灵完备的,这象征着它们可以成功任何可计算函数。
RNN 的架构
RNN 是在 20 世纪 80 年代引入的,它们坚持对过去输入记忆的才干为神经网络开启了新的疑问畛域。让咱们看看您可以经常使用的一些架构。
Hopfield 网络是一种联想记忆。给定一种输入形式,它将失掉与该输入最相似的形式。这种联想(输入与输入之间的咨询)相似于人脑的上班方式。给定一段记忆的一部分,人类能齐全回想起该记忆,Hopfield 网络的上班原理与此相似。
Hopfield 网络实质上是二进制的,各个神经元要么关上(激活),要么封锁(未激活)。每个神经元都经过一个加权衔接与其余每个神经元相连(参见下图)。每个神经元同时用作输入和输入。在初始化时,会在网络中载入一个部分形式,而后降级每个神经元,直到该网络收敛(它肯定会收敛)。输入是在收敛(神经元的形态)时提供的。
Hopfield网络能够学习(经过Hebbian学习)多种形式,并且在输入中存在噪声的状况下收敛以回想最凑近的形式。Hopfield 网络不适宜用来处置时域疑问,而是经常性的。
便捷递归网络
便捷递归网络是一类盛行的递归网络,其中包括将形态引入网络的形态层。。形态层影响下一阶段的输入,所以可运行于随时期变动的数据形式。
你可以用不同的方式运行形态,其中两种盛行方法是 Elman 和 Jordan 网络(参见下图)。在 Elman 网络中,暗藏层对保管了过去输入记忆的高低文节点形态层启动馈送。如下图所示,存在一组高低文节点来坚持之前的暗藏层结果的记忆。另一种盛行的拓扑结构是 Jordan 网络。Jordan 网络有所不同,由于它们将输入层存储到形态层中,而不是保管暗藏层的历史记载。
Elman 和 Jordan 网络可经过规范的反向流传来训练,每种网络都已运行到序列识别和人造言语处置中。请留意,这里仅引入了一个形态层,但很容易看出,您可以增加更多形态层,在这些形态层中,形态层输入可充任后续形态层的输入。本教程将在 Elman 网络部分中讨论此概念。
其余网络
递归式网络的钻研并没有中止,如今,递归架构正在设立处置时序数据的规范。深度学习中的长短期记忆 (LSTM) 方法曾经在卷积网络中失掉运行,以便经过生成的言语来形容图像和视频的内容。LSTM 包括一个忘记门,让您能对各个神经元启动“训练”,使其了解哪些消息是关键的,以及这坚持关键性消息的时期。LSTM 可以处置关键事情距离时期较长的数据。
另一种***的架构称为门控递归单元 (GRU)。GRU 是对 LSTM 的一种优化,须要的参数和资源更少。
RNN 训练算法
由于 RNN 具备将历史消息按时序或序列启动兼并的性质,所以它们领有共同的训练算法。梯度降低算法已成功运行到 RNN 权重优化上(经过与权重的误差导数呈肯定比例地调理权重来最小化误差)。一种盛行的技术是时期反向流传 (BPTT),它运行了权重降级,它经过累加序列中每个元素的累积误差的权重降级来运行权重降级,,***降级权重。关于大型的输入序列,此行为或许造成权重隐没或爆炸(称为隐没或爆炸梯度疑问)。要处置此疑问,通常会经常使用混合方法,并联合经常使用 BPTT 与实时递归学习等其余算法。
其余训练方法也能成功运行于不时退化的 RNN。可运前退化算法(比如遗传算法或模拟退火法)来退化候选 RNN 个体,而后将它们从新组合为它们的适宜度(即它们处置给定疑问的才干)的函数。虽然不保障能收敛于一个处置打算,但可以成功地将收敛运行于一系列疑问,包括 RNN 退化。
RNN 的一个有用的运行是预测序列。在下一个示例中,我将构建一个 RNN,用它依据一个小词汇表来预测某个单词的***一个字母。我将单词馈送入 RNN 中,一次性加载一个字母,网络的输入将示意预测的下一个字母。
遗传算法流
检查 RNN 示例之前,让咱们看看遗传算法面前的流程。遗传算法是一种受人造选用环节启示的优化技术。如下图所示,该算法创立了一个随机的候选处置打算(称为染色体)个体,这些处置打算对将要寻觅的处置打算的参数启动编码。创立它们后,针对相应疑问对该个体的每个成员启动测试,并调配一个适宜度值。而后从个体中识别父染色体(***具备更高适宜度的染色体),并为下一代创立一个子染色体。在子染色体这一代中,运行遗传运算符(比如从每个父染色体失掉元素 [称为杂交] 并向子染色体引入随机变动 [称为突变])。而后经常使用新个体再次开局此环节,直到找到适宜的候选处置打算。
用染色体组示意神经网络
一个染色体被定义为个体的一个成员,包括要处置的特定疑问的编码。在退化 RNN 的高低文中,染色体由 RNN 的权重组成,如下图所示。
每个染色体包括每个权重的 16 位值。将该值(介于 0 – 65535 之间)转换为权重,方法是减去该范围的一半,而后乘以 0.001。这象征着该编码可以示意 -32.767 到 32.768 之间增量为 0.001 的值。
关于从个体中失掉染色体并生成 RNN 的环节,只需将其定义为经常使用从染色体转换而来的权重来初始化网络的权重。在本例中,这示意 233 个权重。
经常使用 RNN 预测字母
如今,咱们来讨论字母在神经网络中的运行。神经网络处置的是数字值,所以须要驳回某种示意方式来将字母馈送入网络中。在本例中,我经常使用了独热编码。独热编码将一个字母转换为一个矢量,而且矢量中仅设置一个元素。这种编码发明了一种可在数学上经常使用的共同特色 — 例如,示意的每个字母都会在网络中运行自己的权重。虽然在此成功中,我经过独热编码来示意字母;但人造言语处置运行程序也以相反方式示意单词。下图演示了这个示例中经常使用的独热矢量和用于测试的词汇表。
所以,如今我有一种使我的 RNN 能够处置字母的编码。如今,让咱们看看如何在 RNN 的高低文中处置字母。下图演示了字母预测高低文中的 Elman 式 RNN(馈送示意字母 b 的独热矢量)。关于测试单词中的每个字母,我将该字母编码为独热码,而后将它作为输入馈送给网络。而后,以前馈方式口头该网络,并以胜者全得的方式解析输入,以确定定义独热矢量的获胜元素(在本例中为字母 a)。在此成功中,仅审核了单词的***一个字母,验证中疏忽了其余字母,也没有对它们口头适宜度计算。
便捷的 Elman 式 RNN 成功
让咱们来看一个经过遗传算法训练的 Elman 式 RNN 的样本成功。可以在 GitHub 上找到此成功的 Linux 源代码。该成功由 3 个文件组成:
我将重点引见两个外围函数:遗传算法流程和 RNN 评价函数
RNN 的外围内容可以在 RNN_feed_forward 函数中找到,该函数成功了 RNN 网络的口头(参见以下代码)。该函数被拆分为 3 个阶段,相似于上图中显示的网络。在***阶段,计算暗藏层的输入,暗藏层兼并了输入层和高低文层(每层都有自己的一组权重)。高低文节点已在测试给定单词之前初始化为 0。在第二阶段,我将计算输入层的输入。这一步兼并了每个暗藏层神经元与它们自己的共同权重。***,在第三阶段,我将***个高低文层神经元流传到第二个高低文层神经元,将暗藏层输入流传到***个高低文节点。这一步在网络中成功了两个记忆层。
请留意,在暗藏层中,我经常使用 tan 函数作为激活函数,并经常使用 sigmoid 函数作为输入层中的激活函数。tan 函数在暗藏层中很有用,由于它的范围是 -1 到 1(它还准许经常使用来自暗藏层的正输入和负输入)。在输入层中,我感兴味的是激活独热矢量的***值,我经常使用了 sigmoid,由于它的范围是 0 到 1。
我在上方的代码示例中成功了遗传算法。可以分 3 部分检查此代码。***部分计算个体的总适宜度(在选用环节中经常使用),以及个体中最适宜的染色体。第二部分中经常使用最适宜的染色体,仅将此染色体复制到下一个个体。这是一种精英选用方式,我将保养最适宜的染色体,不时到将其复制到下一个个体中。该个体包括 2,000 个染色体。
在遗传算法的***一部分中,我从个体中随机选用两个父染色体,应用它们为下一个个体创立一个子染色体。选用算法基于所谓的轮盘抽奖选用方法,染色体是随机选用的,但选中更合乎的父染色体的几率更高一些。选用两个父染色体后,将它们从新组分解下一个个体的子染色体。此环节包括杂交(选用一位父亲的基因来流传)和突变(可以随机从新定义一个权重)的或许性。出现杂交和突变的概率很低(每次从新组合对应一次性突变,而杂交次数则更少)。
样本口头
可以在 Linux 中构建 GitHub 上的样根源代码,只需键入 make 并经常使用 ./rnn 来口头。口头时,会随机创立个体,而后对一些代启动人造选用,直到找到准确预测了整个测试词汇表的***一个字符的处置打算,或许直到模拟未能正确地收敛于一个处置打算上。成败与否由平均适宜度来选择;假设平均适宜度到达***适宜度的 80%,那么该个体不足足够的多样性来找到处置打算,并将分开。
假设找到一个处置打算,代码将颁布整个测试词汇表并显示每个单词的预测结果。请留意,染色体适宜度仅基于单词的***一个字母,所以没有预测外部字母。上方的代码提供了一个成功输入的样本。
下图展现了平均和***适宜度的曲线图。请留意,每个曲线图都从约为 13 的适宜度级别开局。12 个单词以 d 开头,所以为任何字母序列颁布 d 的网络都领有这一成功级别。 然而,肯定退化这些权重,以便思考前面的字母,针对给定词汇表启动准确预测。如图所示,在成功运转时,超越一半的世代须要预测成功运转的***一个测试用例。
幽默的是,每个曲线图都演示了退化生物学中的一种称为连续平衡的通常,该现象的特色是,一次性迸发性的退化变异打断了常年的静态平衡(总体稳固性)。在一种状况下,这种迸发性的退化会造成停滞在部分最小值上;在另一种状况下,退化会成功(停滞在部分***值上)。
完结语
传统神经网络能以确定性方式将输入矢量映射到输入矢量。关于许多疑问,这是现实选用,但在肯定思考序列和时序数据时,向网络引入外部记忆使其能够在制订输入决策时思考以前的数据。RNN 在传统前馈网络中引入了反应,使它们能包括一个或多个记忆级别。RNN 代表着一种未来的基础架构,可以在大少数先进的深度学习技术(比如 LSTM 和 GRU)中找到它。