【深度学习】RNN与LSTM

1.循环神经网络RNN

  Recurrent Neural Network是一种有记忆力的神经网络。为什么说有记忆力呢?因为它的隐藏层输出会被保存起来,在下一次计算隐藏层输出的时候,会考虑到先前保存的值。
  对于普通的BP神经网络,第k层的隐藏层的输出是
a k ( x ) = w k x a_k(x)=w_kx ak(x)=wkx
  对于RNN循环神经网络来说,第k层的隐藏层的输出是
h k ( x ) = U x + h k − 1 h_k(x)=Ux+h_{k-1} hk(x)=Ux+hk1
  当然,更普遍的做法是,给 a k − 1 a_{k-1} ak1添加一个权重W,则有
h k ( x ) = U x + W h k − 1 h_k(x)=Ux+Wh_{k-1} hk(x)=Ux+Whk1
  假如我们需要开发一个智能订票系统,需要从一段文本中提取出目的地,时间等词汇,对于普通的神经网络来说,我们将"leave GuangZhou on March 14th",和"arrive GuangZhou on March 14th"输入神经网络,由于普通的神经网络并没有记忆性,所以当我们将词汇用one-hot的形式输入的时候,对于GuangZhou这个词汇的输出,并不会考虑到前面的arrive或者leave,所以会输出相同的输出,而两句语句明显意思是不同的。而如果使用RNN的情况下,由于先输入了不同词汇arrive和leave,因此保存在内存中的隐藏层输出不同,所以在计算GuangZhou的时候,考虑到了先前不同的隐藏层输出,所以最后的输出也会不一样。
在这里插入图片描述
  RNN的架构展开图如图所示,RNN实际上是一个自反馈网络,时刻t的输入 x t x^t xt,会对之后t+1时刻,t+2时刻的输出产生影响,而这通过一种自反馈的机制实现。
  令a表示隐藏层的激励值,h表示隐藏层的输出,o表示输出层的输出, y ^ \hat y y^表示最终的输出,则RNN的模型如下:
a ( t ) = W h ( t − 1 ) + U x ( t ) + b h ( t ) = t a n h ( a ( t ) ) o ( t ) = V h ( t ) + c y ^ ( t ) = s o f t m a x ( o ( t ) ) \begin{aligned} &a^{(t)}=Wh^{(t-1)}+Ux^{(t)}+b \\ &h^{(t)}=tanh(a^{(t)}) \\ &o^{(t)}=Vh^{(t)}+c\\ &\hat y^{(t)}=softmax(o^{(t)}) \end{aligned} a(t)=Wh(t1)+Ux(t)+bh(t)=tanh(a(t))o(t)=Vh(t)+cy^(t)=softmax(o(t))
  使用一种叫做BPTT(Back-Propagation-Through-Time)的算法,可以训练RNN,实际上就是对循环网络的展开图使用反向传播算法求偏导进行计算。需要注意的是,在训练的时候,我们使用样本正确的输出 y ( t ) y^{(t)} y(t)输入到下一时点,反馈到 h ( t + 1 ) h^{(t+1)} h(t+1)中。而模型部署后,由于不知道实际的输出,所以用模型的输出 o ( t ) o^{(t)} o(t)近似正确的输出 y ( t ) y^{(t)} y(t)

2.双向RNN

  双向RNN (Bidirectional RNN)在产生输出的时候,看的范围比较广。比如我们知道有些名字是分前后两个词汇的,如果第一个词汇可以有很多种意思的话,那么单向的RNN可能并不会将其判断成人名,而是其他某种词性。而如果是采用双向RNN的话,我们在判断这个词汇的时候,就会考虑到后面的姓氏,从而知道当前的词汇是个人名。
  因此双向RNN是看完整个句子才对当前的词汇进行判断,它的做法是这样的:将第t个词汇,正向时得到的隐藏层输出和逆向时得到的隐藏层输出,一起丢给输出层产生一个输出 y t y_t yt
在这里插入图片描述

3.RNN的缺点

3.1梯度消失/爆炸

  • 多层神经网络通常存在像悬崖一样的斜率较大区域,我们在反向传播的时候,随着层数的增多,梯度不仅可能指数型的下降,也可能指数型的上升。事实上梯度消失在训练 RNN 时是首要的问题,尽管梯度爆炸也是会出现,但是梯度爆炸很明显,因为指数级大的梯度会让你的参数变得极其大,以至于你的网络参数崩溃。所以梯度爆炸很容易发现,因为参数会大到崩溃,你会看到很多 NaN,或者不是数字的情况,这意味着你的网络计算出现了数值溢出。如果你发现了梯度爆炸的问题,一个解决方法就是用梯度修剪(clipping)。梯度修剪的意思就是观察你的梯度向量,如果它大于某个阈值,缩放梯度向量,保证它不会太大,这就是通过一些最大值来修剪的方法。所以如果你遇到了梯度爆炸,如果导数值很大,或者出现了 NaN,就用梯度修剪,这是相对比较鲁棒的,这是梯度爆炸的解决方法。梯度爆炸基本上用梯度修剪就可以应对,但梯度消失比较棘手。我们下节会介绍 GRU,门控循环单元网络,这个网络可以有效地解决梯度消失的问题,并且能够使你的神经网络捕获更长的长期依赖。
      但是RNN的梯度消失问题并不是跟其他深层网络一样来源于Sigmoid函数,而是跟RNN自身的结构有关。因为RNN处理的是序列,如果我们有一篇长度为1000的文章,不停地喂给RNN,长期时间序列会产生大量相乘,比如大于1的参数,参数只要修改一点,就会产生爆炸式的影响,从而使得损失函数的梯度出现“悬崖”区域。而大于0小于1的参数,无论怎么修改,累乘之后都接近于0,使得损失函数的梯度出现“平原”区域。

3.2长期依赖

  • 不擅长捕捉长期依赖,比如“The cat, which already ate ……, was full.”,前后应该保持一致,因为 cat 是单数,所以应该用 was。“The cats, which ate ……, were full.”,cats 是复数,所以用were。这个例子中的句子有长期的依赖,最前面的单词对句子后面的单词有影响。因为同样的梯度消失的问题,后面层的输出误差很难影响前面层的计算。这并不意味着这是不可能学习的,由于长期依赖关系的信号很容易被短期相关性产生的最小波动隐藏,因而学习长期依赖可能需要很长的时间。这就意味着,实际上很难让一个神经网络能够意识到它要记住看到的是单数名词还是复数名词,然后在序列后面生成依赖单复数形式的 was 或者 were。

4.长短期记忆网络LSTM

  LSTM,即Long Short-term Memory,是一个比较长的短期记忆网络。LSTM可以处理梯度消失的问题,使得损失函数的梯度不会出现平原,但是悬崖仍然会有。LSTM在RNN的基础上,添加了三个gate,即

  • input gate输入门:当输入门打开的时候,才能够将隐藏层的输出写入到记忆单元中。
  • output gate输出门:当输出门打开的时候,才能够让记忆单元保存的值参与下一时点的计算。
  • forget gate遗忘门:当遗忘门打开的时候,道路畅通,会将将隐藏层输出保存起来。当遗忘门关闭的时候,道路阻塞,会将记忆单元保存的值清空。

  LSTM是一种很符合人类的记忆模型。对于生活中发生的事情,我们不会每一件都去记住,而是选择性的记忆,于是有了“输入门”,它使得LSTM能够少记住些东西,不会对每个来的信息都接受。对于我们来说,大部分时刻的信息没过几天就忘了,于是有了“遗忘门”,这样每个时刻到来的时候,记忆要先通过遗忘门忘掉一些事情再考虑要不要接受这个时刻的新信息。又因为我们不会时刻动用我们的记忆,我们只会让其中一部分跟当前任务当前时刻相关的记忆输出,于是有了“输出门”。
  因此LSTM的一个单元存在4个输入,1个输出。4个输入分别是,样本输入,操作输入门的信号,操作输出门的信号,操作遗忘门的信号。

在这里插入图片描述
  为什么说LSTM可以缓解梯度消失呢?可以看一下c’的公式
c ′ = g ( z ) f ( z i ) + c f ( z f ) c'=g(z)f(z_i)+cf(z_f) c=g(z)f(zi)+cf(zf)
  c‘对c求导,有
∂ c ′ ∂ c = f ( z f ) + ∂ f ( z f ) ∂ c × c + . . . \frac{\partial c'}{\partial c}=f(z_f)+\frac{\partial f(z_f)}{\partial c}\times c+... cc=f(zf)+cf(zf)×c+...
  这里只对第二项进行了展开,由于 f ( z f ) f(z_f) f(zf)是遗忘门的输出,因此我们只需要让遗忘门的值接近1,那么偏导数就会接近1,可以缓解梯度消失问题。由于这个性质,遗忘门同时也解决了RNN长期依赖的问题,可以记住很久前发生的信息。之所以是缓解是因为只有c’到c的路径解决了梯度消失问题,其他路径仍没有解决。
  LSTM需要的参数量是一般神经网络的4倍,因为它除了输入之外,还需要多操作三个gate。我们将输入 x ( t ) x^{(t)} x(t)乘以4个不同的权重矩阵,得到4个不同的输入 z f , z i , z , z o z^f,z^i,z,z^o zf,zi,z,zo,这些输入到LSTM单元,得到一个输出。LSTM的一个单元如下图所示
在这里插入图片描述
  但是实际使用的时候不会只有一个LSTM单元,而是会将他们连起来,并且将前一时点的隐藏层的输出和记忆单元的值考虑进来, h ( t − 1 ) h^{(t-1)} h(t1)会和当前的 x ( t ) x^{(t)} x(t)一起用于生成LSTM单元的4个输入。前一时点的隐藏层的输出可以看做是短时记忆,而记忆单元的值 c ( t − 1 ) c^{(t-1)} c(t1)可以看成是长时记忆,如图所示

在这里插入图片描述

5.GRU网络

  GRU将忘记门和输入门合成了一个单一的更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。
在这里插入图片描述

  其中,

  • z t z_t zt是update gate,更新 activation 时的逻辑门
  • r t r_t rt是 reset gate,决定candidate activation时,是否要放弃以前的activation h t h_t ht
  • h ^ t \hat h_t h^t 是candidate activation,接收 [ x t x_t xt, h t − 1 h_{t−1} ht1]
  • h t h_t ht是activation,是GRU的隐层,接收 [ h t − 1 h_{t−1} ht1, h ^ t \hat h_t h^t]

   h t h_t ht h t − 1 h_{t-1} ht1求导,得到
∂ h t ∂ h t − 1 = ( 1 − z t ) + . . . . \frac{\partial h_t}{\partial h_{t-1}}=(1-z_t)+.... ht1ht=(1zt)+....

  可知我们可以通过控制 z t z_t zt来控制梯度,达到缓解梯度消失问题的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度学习是一种机器学习的方法论,通过构建多层神经网络,可以从大量数据中学习并理解复杂的模式和关系。RNN(循环神经网络)和LSTM(长短期记忆网络)是深度学习中常用的一类神经网络结构,特别适用于处理序列数据。 唐诗是中国文学的瑰宝,具有深厚的文化底蕴和艺术价值。利用深度学习中的RNNLSTM网络原理,我们可以构建一个模型,通过学习唐诗的序列数据,实现自动生成新的唐诗。 首先,我们需要收集大量的唐诗作品作为训练数据。这些数据将被用作模型的输入,通过多层的RNNLSTM网络逐字逐词地学习唐诗的结构和语法规律。神经网络将学习到不同的词汇和诗句的概率分布,并根据概率分布生成新的唐诗。 在训练过程中,我们可以使用反向传播算法来调整神经网络的参数,以最大限度地提高生成唐诗的质量。可以通过设置合适的超参数,例如学习率和迭代次数,来优化模型的性能。 通过进一步优化模型,我们可以使生成的唐诗更具有创新性和独特性。例如,可以引入一些文学规则和约束,以保证生成的唐诗符合一定的文学规范。此外,还可以加入一些外部的条件信息,如主题或情感,来指导生成唐诗的内容。 将这一深度学习实战项目制作成视频课程,有助于学习者理解和掌握深度学习中的RNNLSTM网络原理。通过实际的代码演示和案例讲解,学习者可以亲自动手实践,培养实战能力。同时,视频课程还可以提供一些调优技巧和经验分享,帮助学习者在实际应用中取得良好的效果。 这个项目不仅有助于学习者的技术提升,也为文学创作提供了一种新的方式。通过深度学习生成的唐诗可以为文学创作者提供灵感和思路,也可以作为艺术创作的一种实验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值