暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【RNN】认识循环神经网络(二)

端茶送水杂货铺 2020-03-24
1365


点击蓝字关注我们

应用之道

存乎一心



本文承接《【RNN】认识循环神经网络(一)》,以下简称“文一”。为了改善循环神经网络的长程依赖问题,一种非常好的解决方案是引入门控机制来控制信息的累积速度,包括有选择地加入新的信息,并有选择地遗忘之前累积的信息。这一类网络可以称为基于门控的循环神经网络(Gated RNN)。本文主要介绍两种基于门控的循环神经网络:长短期记忆网络和门控循环单元网络。本文中如有错误,欢迎大佬们指正!


01

回顾RNN


在正式开始介绍基于门控的循环神经网络前,我们先来回顾下循环神经网络的运作方式。假设我们有一串序列,我们需要将这些序列处理成机器可读的向量(Vector),然后再由循环神经网络逐个处理。



处理过程中,循环神经网络单元会将隐状态(Hiden State)传入下一步的序列处理过程。隐状态就像是循环神经网络的记忆单元,它保持着循环神经网络先前处理的数据结果。



循环神经网络单元可以通过以下两步计算其隐状态:

  1. 输入向量和前一隐状态结合成一个新的联合向量,这个联合向量既包含当前的输入信息又包含之前输入的信息。

  2. 联合向量通过一个 Tanh 激活函数输出一个新的隐状态。



样例一:Tanh 函数


Tanh 函数的功能是将输入映射输出一个-1到1之间的数值。但这种操作有何意义呢?



我们知道输入向量在神经网络内需要经历一系列变换,现在假设有一组输入向量 [5, 0.01, -0.5],循环四次通过一个神经网络单元,该神经网络单元的作用是放大输入数据3倍。



循环四次后的输出为 [405, 0.81, -40.5],可见各维数据之间的差距非常之大,导致小数据(0.81)与大数据(405)相比变得无足轻重。



假设我们在单元中引入Tanh 函数作为激活函数,每次输入向量通过神经网络单元后的输出数值均维持在-1到1之间。循环四轮后之后的输出仍然介于-1到1之间,从而消除奇异样本数据导致的不良影响。


02

认识LSTM


长短期记忆网络(Long Short-Term Memory Network,LSTM)是循环神经网络的一个变体,可以有效地解决简单循环神经网络的梯度爆炸或消失问题。


「插点题外话」专用小卡片


循环神经网络中的隐状态存储了历史信息,可以看作一种记忆(Memory)。在简单循环网络中,隐状态每个时刻都会被重写,因此可以看作一种短期记忆(Short-Term Memory)。在神经网络中,长期记忆(Long-Term Memory)可以看作网络参数,隐含了从训练数据中学到的经验,其更新周期要远远慢于短期记忆。


在 LSTM 网络中,我们新增一个记忆单元(Memory Cell),记为 𝒄。记忆单元 𝒄 可以在某个时刻捕捉到某个关键信息,并有能力将此关键信息保存一定的时间间隔。它保存信息的生命周期要长于短期记忆 ,但又远远短于长期记忆,因此将其称为长短期记忆(Long Short-Term Memory)。Long Short-Term Memory 中的“-”应该在Short-Term中间,其含义是长时间的“短期记忆”。


LSTM 网络在简单循环神经网络的基础上主要有以下两个方面的改进:

  • 新的内部状态(internal state) LSTM 网络引入一个新的内部状态用于更新记忆的信息。

  • 门控机制(Gating Mechanism)。在数字电路中,门(Gate)为一个二值变量 {0, 1}。其中0代表关闭状态即不许任何信息通过,而1代表开放状态即允许所有信息通过。LSTM 网络的门控机制与之相似。


新的内部状态

LSTM 网络通过引入一个新的记忆单元 𝒄𝑡 (即 t 时刻的内部状态)专门进行线性的循环信息传递,同时(利用 Tanh 函数非线性地)输出信息给隐状态 𝒉𝑡。其计算公式如下:



其中𝒇𝑡 ∈ [0, 1]、𝒊𝑡 ∈ [0, 1] 和 𝒐𝑡 ∈ [0, 1] 为三个门,它们被用来控制内部信息传递。⊙ 为向量元素乘积,𝒄 (𝑡−1) 为上一时刻的记忆单元。𝒄̃𝑡 则是通过非线性 Tanh 函数后得到的候选状态(Candidate State),其计算过程如下:



上式中 的 𝑾∗ , 𝑼 ∗ , 𝒃 ∗ 均为可学习的网络参数,其中∗ ∈ {𝑖,𝑓,𝑜,𝑐}。在每个时刻 𝑡,LSTM 网络的记忆单元 𝒄𝑡 都记录了截至当前的历史信息。


门控机制

相比简单循环神经网络,LSTM 网络的单元结构要复杂得多。LSTM 单元包含三个控制门:

  • 输入门(Input Gate)。当外界某个数据想要被写入记忆单元里时,必须通过一个输入门。若输入门打开,数据才能被允许写到记忆单元里面去。反之,如果输入门关闭,则数据无法写入记忆单元。而输入门的开合状态需要由循环神经网络自己学习。

  • 输出门(Output Gate)。输出数据也需经过相应的输出门。若输出门打开,数据才能被其它神经元读取。反之,如果输出门关闭,则数据无法被其它神经元读取。而输出门的开合状态也需要由循环神经网络自己学习。

  • 遗忘门(Forget Gate)。遗忘门决定记忆单元何时清楚记忆单元中暂存的数据。遗忘门的开合状态同样需要由循环神经网络自己学习。



从上图可知,LSTM 单元可以看成由四个输入(Input)和 一个输出(Output)构成。这四个输入分别是想要存入记忆单元的值(但它不一定存的进去)、操控输入门的讯号、操控输出门的讯号,操控遗忘门的讯号。但四个输入信号只会产生一个对外的输出信号。


事实上 LSTM 网络中的门是一种“软”门,它的取值在 (0, 1) 之间。这个数值代表了这个门被打开的程度即表示以一定的比例允许信息通过(如果门控信号数值为1表示为门被打开,反之门控信号数值为0代表这个门关闭)。此处用 𝒊𝑡、𝒇𝑡 和 𝒐𝑡分别表示输入门、遗忘门和输出门,三个门信号数值的计算方式为:



其中 𝜎(⋅) 为 Sigmoid 函数,其输出值所在区间为(0, 1)。𝒙𝑡 为当前时刻的输入,𝒉 (𝑡−1) 为上一时刻的隐状态。



上图给出了 LSTM 网络的单元内部结构,其计算过程分为以下三步:

  1. 利用上一时刻的隐状态 𝒉 (𝑡−1) 和当前时刻的输入 𝒙𝑡 计算出三个门信号值以及候选状态值 𝒄 ̃ 。

  2. 结合遗忘门 𝒇 的信号数值和输入门 𝒊 的信号数值来更新记忆单元 𝒄。

  3. 结合输出门 𝒐 的信号,将记忆单元的信息传递给隐状态 𝒉𝑡。


我们可以综合上述的新状态和门控机制,进一步审视 LSTM 单元内部构造。假设 LSTM 单元的输入为 Z,输出为 a,操控输入门的数值为 Zi,操控遗忘门的数值为 Zf,操控输出门的数值为 Zo,其中的记忆单元已存储值 c。如下图所示:



Z 通过激活函数 g 后得到 g(Z),Zi、Zo 和 Zf 分别通过另外一个激活函数 f 后分别得到 f(Zi) 、f(Zo) 和 f(Zf),f(Zi) 、f(Zo)、f(Zf) ∈ [0,1],激活函数 f 通常是 Sigmoid 函数,它可以将输入值映射输出一个介于0和1之间的数值,其工作效果如下图:



我们将 g(Z) 乘上 f(Zi) 得到 g(Z) * f(Zi)。再把记忆单元存储的值 c 乘上 f(Zf) 得到 c * f(Zf),然后将其相加可得到新的存储值 c′ = g(Z) * f(Zi) + c *  f(Zf) 。最后 c 通过激活函数 h 后得到 h(c'),乘上 f(Zo) 得到输出 a = h(c′) * f(Zo)。通过这两个式子中我们可以从公式计算层面更进一步理解门控机制:


信号值

0 (关闭)

1 (打开)

f(Zi)

g(Z) * f(Zi) = 0

相当于没有输入

g(Z) * f(Zi) = g(Z)

即 g(Z) 充当输入

f(Zf)

c *  f(Zf) = 0

相当于没有记忆

c *  f(Zf) = c

叠加已存储记忆值

f(Zo) 

h(c′) * f(Zo) = 0

相当于不可输出

h(c′) * f(Zo) = h(c')

可输出 h(c')


LSTM 网络还可以进一步拓展,比如引入 Peephole 连接。引入 Peephole 连接的 LSTM 网络还会把上一时间的输出和记忆单元存储值接进来,当做下一时间输入的一部分。也就说,下一时间点操控三个门的信号值不仅取决于当时的输入信号值还取决于前一时间点的输出信号值和记忆单元存储值。这三个v矢量并在一起乘上不同的变换得到四个不同的新矢量,再用新矢量去操控 LSTM 网络的四个输入。



样例二:LSTM 网络单元内部演示


本例仅仅为了更好解释 LSTM 网络中的单元内部如何工作,如果已经明白上文内容的看官可以忽略本例。下图为一个简单的 LSTM 单元:



对于遗忘门,前一时刻的隐状态会和此刻的输入将结合成一个联合信号。然后联合信号会被 Sigmoid 函数映射输出一个介于0和1的值,该数值称为遗忘门输出。如果遗忘门输出趋近于0表示“遗忘”,数值趋近于1表示“记得”,其运作如下图所示:



对于输入门,联合信号将通过一个 Sigmoid 函数产生一个介于0和1之间的数值,该数值称为输入门输出。输入门输出为0表示输入不重要,反之输入门输出为1表示输入很重要。联合信号同时还会通过另一个 Tanh 函数产生一个介于-1和1之间的数值,该数值称为候选状态。我们将输入门输出和候选状态相乘后进入下一环节。此处的输入门输出可以决定候选状态中的哪些信息可以保留到下一环节,其运作如下图所示:



LSTM 单元内记忆单元的更新分为以下几个步骤:

  1. LSTM单元内部的记忆状态存储值与遗忘门输出点乘。

  2. 上一步的输出与输入门输出乘上候选状态的信号叠加,输出一个新的记忆单元。

其运作如下图所示:



对于输出门,将联合信号通过一个 Sigmoid 函数后的输出值与新的记忆单元通过一个 Tanh 函数后的输出值点乘,并输出一个新的隐状态,其运作如下图所示:



LSTM 单元会在不同时刻会重复上述过程:




03

认识GRU


门控循环单元(Gated Recurrent Unit,GRU)是一种比 LSTM 网络更加简单的循环神经网络。GRU 网络同样引入门控机制来控制信息更新的方式,但它和 LSTM 网络不同的是:GRU 网络不引入额外的记忆单元,而只引入一个更新门。



如上图所示,GRU 网络包含两个门:

  • 更新门(Update  Gate)。更新门的工作效果类似于  LSTM 网络的输入门和遗忘门,它可以用来控制当前状态需要从历史状态中保留多少信息(不经过非线性变换)以及需要从候选状态中接受多少新信息。

  • 重置门(Reset Gate)。重置门可以决定多少过去的信息可以遗忘。它可以用来控制候选状态的计算是否依赖上一时刻的状态。


在 LSTM 网络中,输入门和遗忘门是互补关系,具有一定的冗余性。而 GRU 网络直接使用一个更新门来控制输入和遗忘之间的平衡。将更新门和重置门的功能用表达式概括反而更易懂:



当更新门置0时,当前状态和前一时刻的状态之间为非线性函数关系。反之,当更新门置1时,当前状态和前一时刻的状态之间为线性函数关系。



当重置门置0 时,候选状态只和当前输入相关,和历史状态无关。反之,当重置门置1时,候选状态和当前输入以及历史状态相关,这时的 GRU 网络和简单循环网络一致。


04

解决梯度消失或梯度爆炸


上文已经讲到——为了改善循环神经网络的长程依赖问题,一种非常好的解决方案是引入门控机制。本部分简要解释 LSTM 网络是如何解决长程依赖问题。


RNN 和 LSTM 在面对记忆信息(Memory)时的处理操作并不一样:

  • 对于 RNN,每一时间点记忆单元里存储的值都是会被上一时间点的输出覆盖。

  • 对于 LSTM,每一时间点记忆单元里存储的值更新为原来记忆单元里存储的值乘上一个值后再与输入信号值叠加。


基于上述区别,LSTM 网络的权重一旦改变进而对记忆单元的数值产生影响,其影响将会永远存在,除非遗忘门被置为0即记忆单元的原有存储值被清洗。因此,LSTM 网络不会有梯度消失的问题。在训练 LSTM 网络的时候,往往需要给遗忘门特别大的偏置,以确保遗忘门在多数的情况下保持开启(置为1),从而避免梯度消失现象。


至此,《【RNN】认识循环神经网络》系列全部更新完毕,后续笔者也将进一步介绍循环神经网络的应用与实践,感谢大家的关注!



应用之道

END

存乎一心


 

本文作者:Bingunner


一位头发浓郁的信息安全工程师

爱摄影/爱数码/爱跑步的经济学人死忠粉

文章转载自端茶送水杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论