从RNN到LSTM剖析

来源:互联网 发布:什么是nosql数据库 编辑:程序博客网 时间:2024/06/05 03:54

从RNN到LSTM剖析

 (2017-10-23 09:05:32)
转载
标签: 

rnn

 

lstm

 

原理

 

剖析

分类: 机器学习
       RNN是循环神经网络,主要处理和时序相关的网络。而LSTM是RNN的进化版本,解决了RNN中存在的梯度爆炸或者梯度消失的问题。
       本文参考:https://yq.aliyun.com/articles/169880?spm=5176.100239.blogcont174256.26.QQ6ccJ
 一、啥是循环神经网络?
       RNN利用环路(即上一层的输出)来当作本层的部分输入,其机制与动物大脑的工作机制非常类似。人们常说,“读书百遍,其义自见”。书读很多遍,这是一种强化记忆的动作。啥是强化呢?就是在前期留下记忆的基础上再和本次重新输入的“读书”叠加起来,逐渐沉淀下来,最终成为我们的经验知识。
       在很多实际应用中,我们会发现数据之间都是相互依赖的。就像上面所说的,我们在思考问题时,都是在已有经验和知识的基础之上,再结合当前实际情况综合给出决策,而不会把过往的经验和记忆都抛弃。
       再举个例子,在《战狼2》中,当那个中美混血的漂亮女主角一出现,后面的情节即使不看,我们大致也能预测到,无非是“英雄救美女,美女爱英雄”。看到最后,果不其然。如果连这都猜不到,只能说明你电影看得太少了。
       再再举一个自然语言处理中的实际例子,如果我们试图预测一下“天空飞过一只__”这句话最后一个词是什么。利用前面输入的一连串的历史信息:“天空飞过一只”,我们就能大致猜出最后一个词可能是“小鸟”或者“蜻蜓”之类的飞行动物,但定然不能是“人”或者“坦克”,当然也不能是“猪”(即使可能是风口中的猪,但量词“只”也把它过滤掉了)。
       由此可见,历史对于我们推测未来,是极有帮助的,不可轻易抛弃。而RNN的核心诉求之一,就是能将以往的信息连接到当前任务中。
       以上说的就是RNN的东西。
      
       如果我问你,遗忘是件好事还是坏事。或许你会说,当然是件坏事,我可羡慕记忆力好的人了。
       可是你会说,如果你到现在还记得,两岁时,隔壁家的小女孩“横刀夺爱”,抢了你的棒棒糖,估计你现在还可能单身。如此“记仇”的人,不孤独也难。
       的确有时候,遗忘是好事,它会让大脑清理无用“内存”,让你能得以重新起航。其实从脑科学的角度来看,记忆是一种生物运算,它需要消耗能量的。从进化论的角度来看,如果大脑一直长时间运算着用不着的“子程序”是极不经济的。在物资并不丰裕的远古时代,这样的生物会被“物竞天择”掉的。因此,遗忘在某种程度上,是生物的一种自我保护机制。
       但是正如前面所说的,记忆有时候也是非常重要的。所以,过犹不及,我们既需要记忆,也需要遗忘。我们既需要短期记忆,必要时还要将这些短记忆拉长,留存下来,以备后用。
       长短期记忆(Long Short-Term Memory,简称LSTM)。这个名字有点怪,难道是又长又短的记忆?当然不是,请注意“Short-term”中间有一个短横线“-”连接。这表明,在本质上,LSTM还是短期记忆(short-term memory),只是它历经的时序较长而已。
       以上说的就是LSTM的东西。
   
二、RNN递归神经网络
       循环神经网络之所以被称为“循环”,就是因为它的网络表现形式有循环结构,从而使得过去输出的信息作为记忆而被保留下来,并可应用于当前输出的计算中。也就是说,RNN的同一隐层之间的节点是有连接的。下面分别是循环图和展开图。
从RNN到LSTM剖析

       X向量表示输入层的值,O向量表示输出层的值,其他参数还有U、V和W。假设输入层神经元个数为n个,隐层的神经元个数为m个,输出层的神经元个数为r,那么U是输入层到隐藏层的权重矩阵,大小为(n*m)维,V是隐层到输出层的权重矩阵,大小为(m*r)维。那么,W是什么?RNN中隐层从RNN到LSTM剖析的值,不仅仅取决于当前输入x,还取决于上一层隐层的值从RNN到LSTM剖析。如此一来,W表示的就是隐藏层上一次输入值而作为本次输入的权重矩阵,大小为(m*m)维。
       下面对RNN网络的结构和符号进行形式化定义。我们先用一个函数从RNN到LSTM剖析表示经过t步展开后的循环,如下公式所示:
从RNN到LSTM剖析
       函数从RNN到LSTM剖析将过去的所有序列从RNN到LSTM剖析作为输入,从而生成当前的状态,其中θ表示激活函数σ中所有的参数集合。从RNN到LSTM剖析表示序列中的第t时刻或第t时间步的输入数据,它通常也是一个向量。向量从RNN到LSTM剖析表示的是隐层的值。如下图所示:(下面的图非常重要,是RNN的精髓
从RNN到LSTM剖析
上面的图非常重要,是RNN的精髓
      从上图可以看到,第t时间的记忆信息是由前(t-1)个时间步累计而成的结果从RNN到LSTM剖析和当前的输出从RNN到LSTM剖析共同决定的。这些信息保存在隐层中,不断向后传递,跨越多个时间步,共同影响每个输入新信息的处理结果。
      
      怎么循环RNN网络?
       循环RNN的算法叫做时间反向传播(简称BPTT)。它和传统的反向传播算法BP有类似之处,他们的核心任务都是利用反向传播调参,从而使得损失函数最小化。
       由于RNN中采用的激活函数是sigmoid,其导数值域锁定在[0, 1/4]范围之内。故此,每一层反向传播过程,梯度都会以前一层1/4的速度递减。可以想象,随着传递时间步数的不断增加,梯度会呈现指数级递减趋势,直至梯度消失。如下图所示,假设当前时刻为t,那么在(t-3)时刻,梯度将递减至(1/4)**3=1/64,以此类推。
从RNN到LSTM剖析
       一旦梯度消失(或梯度趋近于0),参数调整就没了方向感,从而BPTT的最优解也就无从获得,因此RNN的应用受到了局限。所以我们需要LSTM等的解决方案。
       再啰嗦一下梯度消失和梯度爆炸:
       梯度消失:如果梯度较小的话(<1),多层迭代以后,指数相乘,梯度很快就会下降到对调参几乎就没有影响了。(0.99)^100是不是趋近于0。
       梯度爆炸也是同一个意思,只是反过来说。(1.01)^100是不是很大。
 
三、LSTM神经网络
      由上面所述,第一代RNN的问题出在神经元的功能不健全上,它把该记住的遗忘了,又把该遗忘的记住了。那如何改造它?LSTM的核心本质在于:通过引入巧妙的可控自循环,以产生让梯度能够得以长时间可持续流动的路径。我们在原有神经元的基础上再增加一个状态即c,让它“合理地”保存长期的状态不就解决问题了。
从RNN到LSTM剖析
       假设新增加的状态c,称为记忆单元态(cell state),也称为“记忆块(memory block)”,用以取代传统的隐含神经元节点。它负责把记忆信息从序列的初始位置,传递到序列的末端。如下图所示:
从RNN到LSTM剖析
       从上图可以看出,在LSTM结构中,在t时刻,当前神经元(粗红线)的输入有三个:当前时刻输入值x(t)、前一时刻s(t-1)和前一时刻的记忆单元状态c(t-1)。输出有两个:当前时刻LSTM输出值s(t)和当前时刻的记忆单元状态c(t)。注意:这里的x,s和c都是向量,里面都包含多个参数值
       如何有效控制这个长期状态c而为我们所用?LSTM的设计思路是设计3把控制门开关(gate),从而打造一个可控记忆神经元。
从RNN到LSTM剖析

       第一把门开关,就是负责决定前一个长期记忆c(t-1)在多大程度上保留到c(t)中,它可选择性地遗忘部分之前积累的信息,这个是“遗忘门”;第二把门开关,就是负责控制以多大程度把当前即时状态存入到长期记忆状态c(t)中,这个是“输入门”;第三把开关,负责控制是否把长期状态c,作为当前LSTM的输出,这个是“输出门”。记忆就如是酒保手中的酒,是“勾兑”可调的,这个叫“候选门”,它控制着以多大比例融合历史信息和当下刺激。
       上面的“门开关”,实际上就是一个全连接网络层,它的输入是一个负责的矩阵向量,而输出是一个0到1之间的实数向量。
       假设W是门的权重向量,b为偏置向量,这个“门”可表示为公式:
从RNN到LSTM剖析
        这里,激活函数σ可用sigmoid函数的输出来控制门的开与关。由于sigmoid函数的值域被控制在0和1之间,那么,激活函数输出为0时,任何向量与之相乘结果为0,这就相当于“门”关上了;如果输出为1时,任何向量与之相乘都不会改变,这就相当于“门”完全开启。当输出值在0至1之间时,这相当于门是半掩半开的,就可以调控“记忆”的留存程度。
 
1、遗忘门
       遗忘门的目的在于,控制从前面的记忆中,丢弃多少信息,或者说要继承过往多大程度的记忆。以音乐个性化推荐为例,用户对某位歌手或某个流派的歌曲感兴趣,那么诸如“点赞”、“转发”和“收藏”等这样的正向操作,作为“记忆”,就需要得到加强。反之,如果发生了删除、去掉点赞或收藏等这类负向操作,对于推荐功能来说,它的信息就应该被“遗忘”得多一些。
从RNN到LSTM剖析
       在公式中,σ标识激活函数,通常为sigmoid。从RNN到LSTM剖析表示遗忘门权重矩阵,从RNN到LSTM剖析是遗忘门输入层和隐层之间的权重矩阵,b(f)表示遗忘门的偏置,这里的下标f是“遗忘(forget)”的首字母,为了增强可读性而已,下同。从公式可看出,遗忘门是通过将前一隐层的输出s(t-1)与当前的输入x(t)进行了线性组合,然后利用激活函数,将其输出值压缩到0到1的区间之内。当输出值越靠近1,表明记忆体(cell block)保留的信息就越多;反之,越靠近0,表明保留的就越少。记忆门的工作过程如下表示:
从RNN到LSTM剖析

2、输入门
       输入门的作用在于,它决定了当前时刻的输入信息X(t)以多大程度添加至记忆信息流中,它的计算公式几乎和遗忘门完全一致(除了下标和标识不同外),激活函数σ也使用sigmoid如下所示:
从RNN到LSTM剖析
     
       由于和遗忘门功能类似,因此它们的示意图也是类似的,结合遗忘门在一起如下:
从RNN到LSTM剖析


3、候选门
       候选门可视为一个“勾兑门”,它主要负责“勾兑”当前输入信息和过去记忆信息,也就是候选门负责计算当前输入的单元状态如下所示:
从RNN到LSTM剖析
       在这里激活函数换成了tanh,它可以把输出值规整到-1和1之间,如下图所示:

从RNN到LSTM剖析
       接下来,我们需要把记忆体中的状态从C(t-1)更新到C(t)。记忆的更新可由两部分组成:(1)通过遗忘门过滤掉不想保留的部分记忆,大小可记为从RNN到LSTM剖析 ;(2)添加当前新增的信息,添加的比例由输入门控制,大小可记为:从RNN到LSTM剖析。然后将着这两个部分线性组合,得到更新后的记忆信息C(t),公式如下:
从RNN到LSTM剖析
       
       输入门与候选门的组合示意图如下:

从RNN到LSTM剖析

       由于遗忘门的存在,它可以控制保存多久之前的信息。由于输入门的存在,它又可以避免当前无关紧要的内容进入到记忆门中。这样一来,该忘记的把它遗忘,该记住的把它记牢,二者相得益彰。
 
四、输出门
       内容的记忆状态更新完毕之后,下面就要决定是不是输出了。输出门的作用在于,它控制着有多少记忆可以用于下一层网络的更新中。输出门的计算可用公式表示:
从RNN到LSTM剖析
        这里激活函数依然是sigmoid。sigmoid会把O(t)规则化为一个0到1之间权重值。有道是,“话不能说得太满,满了难以圆通;调不能定得太高,高了难以和声”。这里的输出,也需要“悠着点”,不能太“任性”的输出,因此还要用激活函数tanh把记忆值变换一下,将其变换为-1至+1之间的数。负值区间表示不但不能输出,还得压制一点,正数区间表示合理的输出。这样有张有弛,方得始终。最终输出门的公式为: 

从RNN到LSTM剖析
          最后,结合前面的门路设计,完整的记忆神经元如图所示:
从RNN到LSTM剖析
       上面是LSTM的结构,实际上只是讨论了它的前向传播工作原理。LSTM的参数训练算法,依然是我们熟悉的反向传播算法。对于这类反向传播算法,它们遵循的流程都是类似的,主要有如下三个步骤:
(1)前向计算每个神经元的输出值。对于LSTM而言,依据前面介绍的流程,按部就班地分别计算出f(t)、i(t)、c(t)、o(t)和s(t)
(2)确定优化目标函数。在训练早期,输出值和预期值会不一致,于是可计算每个神经元的误差项值,借此构造出损失函数。
(3)根据损失函数的梯度指引,更新网络权值参数。与传统RNN类似,LSTM误差项的反向传播包括两个层面:一个是空间上层面的,将误差项向网络的上一层传播。另一个是时间层面上的,沿时间反向传播,即从当前t时刻开始,计算每个时刻的误差。
原创粉丝点击