【深度学习】循环神经网络(RNN)简易教程

机器学习初学者

共 3048字,需浏览 7分钟

 ·

2020-07-26 12:14

文章来源于磐创AI,作者VK

5d2e6a4ca1d74ad46e643506e67ef35d.webp


  磐创AI分享  

作者 | Renu Khandelwal 编译 | VK 来源 | Medium

我们从以下问题开始

  • 循环神经网络能解决人工神经网络和卷积神经网络存在的问题。
  • 在哪里可以使用RNN?
  • RNN是什么以及它是如何工作的?
  • 挑战RNN的消梯度失和梯度爆炸
  • LSTM和GRU如何解决这些挑战

假设我们正在写一条信息“Let’s meet for___”,我们需要预测下一个单词是什么。下一个词可以是午餐、晚餐、早餐或咖啡。我们更容易根据上下文作出推论。假设我们知道我们是在下午开会,并且这些信息一直存在于我们的记忆中,那么我们就可以很容易地预测我们可能会在午餐时见面。

当我们需要处理需要在多个时间步上的序列数据时,我们使用循环神经网络(RNN)

传统的神经网络和CNN需要一个固定的输入向量,在固定的层集上应用激活函数产生固定大小的输出。

例如,我们使用128×128大小的向量的输入图像来预测狗、猫或汽车的图像。我们不能用可变大小的图像来做预测

现在,如果我们需要对依赖于先前输入状态(如消息)的序列数据进行操作,或者序列数据可以在输入或输出中,或者同时在输入和输出中,而这正是我们使用RNNs的地方,该怎么办。

在RNN中,我们共享权重并将输出反馈给循环输入,这种循环公式有助于处理序列数据。

RNN利用连续的数据来推断谁在说话,说什么,下一个单词可能是什么等等。

RNN是一种神经网络,具有循环来保存信息。RNN被称为循环,因为它们对序列中的每个元素执行相同的任务,并且输出元素依赖于以前的元素或状态。这就是RNN如何持久化信息以使用上下文来推断。

e5e4e9c09017b094d6cc7f2d86504e65.webp

RNN是一种具有循环的神经网络

RNN在哪里使用

前面所述的RNN可以有一个或多个输入和一个或多个输出,即可变输入和可变输出。

RNN可用于

  • 分类图像
  • 图像采集
  • 机器翻译
  • 视频分类
  • 情绪分析
227ce1f5d12b96e67211b7505bb85f01.webp

RNN是如何工作的?

先解释符号。

  • h是隐藏状态
  • x为输入
  • y为输出
  • W是权重
  • t是时间步长

当我们在处理序列数据时,RNN在时间步t上取一个输入x。RNN在时间步t-1上取隐藏状态值来计算时间步t上的隐藏状态h并应用tanh激活函数。我们使用tanh或ReLU来表示输出和时间t的非线性关系。

64a13cbcc1e8c4d737914b5bb92a497c.webp

将RNN展开为四层神经网络,每一步共享权值矩阵W。

隐藏状态连接来自前一个状态的信息,因此充当RNN的记忆。任何时间步的输出都取决于当前输入以及以前的状态。

与其他对每个隐藏层使用不同参数的深层神经网络不同,RNN在每个步骤共享相同的权重参数。

我们随机初始化权重矩阵,在训练过程中,我们需要找到矩阵的值,使我们有理想的行为,所以我们计算损失函数L。损失函数L是通过测量实际输出和预测输出之间的差异来计算的。用交叉熵函数计算L。

85269d4ad8d223e7077e99e22c840f09.webp

RNN,其中损失函数L是各层所有损失的总和

为了减少损失,我们使用反向传播,但与传统的神经网络不同,RNN在多个层次上共享权重,换句话说,它在所有时间步骤上共享权重。这样,每一步的误差梯度也取决于前一步的损失。

在上面的例子中,为了计算第4步的梯度,我们需要将前3步的损失和第4步的损失相加。这称为通过Time-BPPT的反向传播。

我们计算误差相对于权重的梯度,来为我们学习正确的权重,为我们获得理想的输出。

因为W在每一步中都被用到,直到最后的输出,我们从t=4反向传播到t=0。在传统的神经网络中,我们不共享权重,因此不需要对梯度进行求和,而在RNN中,我们共享权重,并且我们需要在每个时间步上对W的梯度进行求和。

在时间步t=0计算h的梯度涉及W的许多因素,因为我们需要通过每个RNN单元反向传播。即使我们不要权重矩阵,并且一次又一次地乘以相同的标量值,但是时间步如果特别大,比如说100个时间步,这将是一个挑战。

如果最大奇异值大于1,则梯度将爆炸,称为爆炸梯度。

如果最大奇异值小于1,则梯度将消失,称为消失梯度。

5719de16b9420bb8f15b564d5dc371bb.webp

权重在所有层中共享,导致梯度爆炸或消失

对于梯度爆炸问题,我们可以使用梯度剪裁,其中我们可以预先设置一个阈值,如果梯度值大于阈值,我们可以剪裁它。

为了解决消失梯度问题,常用的方法是使用长短期记忆(LSTM)或门控循环单元(GRU)。

在我们的消息示例中,为了预测下一个单词,我们需要返回几个时间步骤来了解前面的单词。我们有可能在两个相关信息之间有足够的差距。随着差距的扩大,RNN很难学习和连接信息。但这反而是LSTM的强大功能。

d585bbed0fb0034043fa97ca990022f9.webp

长短时记忆网络(LSTM)

LSTMs能够更快地学习长期依赖关系。LSTMs可以学习跨1000步的时间间隔。这是通过一种高效的基于梯度的算法实现的。

为了预测消息中的下一个单词,我们可以将上下文存储到消息的开头,这样我们就有了正确的上下文。这正是我们记忆的工作方式。

让我们深入了解一下LSTM架构,了解它是如何工作的

5fc225769edb2f9a217e3c61ba03b2e8.webp

LSTMs的行为是在很长一段时间内记住信息,因此它需要知道要记住什么和忘记什么。

LSTM使用4个门,你可以将它们认为是否需要记住以前的状态。单元状态在LSTMs中起着关键作用。LSTM可以使用4个调节门来决定是否要从单元状态添加或删除信息。

这些门的作用就像水龙头,决定了应该通过多少信息。

27df871e248284a9b4762d84370d9ada.webpb9875cfd4050c9cf8650f2fb0aa1103a.webp
  1. LSTM的第一步是决定我们是需要记住还是忘记单元的状态。遗忘门使用Sigmoid激活函数,输出值为0或1。遗忘门的输出1告诉我们要保留该值,值0告诉我们要忘记该值。
467095f83618f010921a2f816ece799a.webp
  1. 第二步决定我们将在单元状态中存储哪些新信息。这有两部分:一部分是输入门,它通过使用sigmoid函数决定是否写入单元状态;另一部分是使用tanh激活函数决定有哪些新信息被加入。
c0e2425ed2655ed7cb1058173f12ba6a.webp
  1. 在最后一步中,我们通过组合步骤1和步骤2的输出来创建单元状态,步骤1和步骤2的输出是将当前时间步的tanh激活函数应用于输出门的输出后乘以单元状态。Tanh激活函数给出-1和+1之间的输出范围

  2. 单元状态是单元的内部存储器,它将先前的单元状态乘以遗忘门,然后将新计算的隐藏状态(g)乘以输入门i的输出。

98d0563ee1ec8dca7f643a906cd17a90.webp

最后,输出将基于单元状态

2ab40251e4546556c30697ff5549f2c1.webp

从当前单元状态到前一单元状态的反向传播只有遗忘门的单元相乘,没有W的矩阵相乘,这就利用单元状态消除了消失和爆炸梯度问题

135c85dc89ccb8f546f04bb41fba8192.webp

LSTM通过决定忘记什么、记住什么、更新哪些信息来决定何时以及如何在每个时间步骤转换记忆。这就是LSTMs如何帮助存储长期记忆。

以下LSTM如何对我们的消息进行预测的示例

edfda70e0acefc9211bf6d7d379882f0.webp

GRU,LSTM的变体

GRU使用两个门,重置门和一个更新门,这与LSTM中的三个步骤不同。GRU没有内部记忆

重置门决定如何将新输入与前一个时间步的记忆相结合。

更新门决定了应该保留多少以前的记忆。更新门是我们在LSTM中理解的输入门和遗忘门的组合。

GRU是求解消失梯度问题的LSTM的一个简单变种

原文链接:https://medium.com/datadriveninvestor/recurrent-neural-network-rnn-52dd4f01b7e8

✄------------------------------------------------

看到这里,说明你喜欢这篇文章,请点击「在看」或顺手「转发」「点赞」。


往期精彩回顾





获取一折本站知识星球优惠券,复制链接直接打开:

https://t.zsxq.com/yFQV7am

本站qq群1003271085。

加入微信群请扫码进群:

浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报