JavaEE鸿蒙应用开发HTML&JS+前端Python+大数据开发人工智能开发AI+设计软件测试新媒体+短视频直播运营产品经理集成电路应用开发(含嵌入式)Linux云计算+运维开发C/C++拍摄剪辑+短视频制作PMP项目管理认证电商运营Go语言与区块链大数据PHP工程师Android+物联网iOS.NET

循环神经⽹络(RNN)介绍

来源:黑马程序员

浏览45930人

2019.08.30

什么是RNN?

RNN的思想是利⽤序列化的信息。在传统的神经⽹络中,我们假设所有输⼊和输出彼此独⽴。 但对于 许多任务⽽⾔,这个假设有问题。例如你想预测句⼦中的下⼀个单词,就需要知道它前⾯有哪些单词。 RNN被称为循环,因为它对序列的每个元素执⾏相同的任务,并且基于先前的计算进⾏输出。RNN的另 ⼀个优点是它具有“记忆”,它可以收集到⽬前为⽌已经计算的信息。 理论上,RNN可以在任意⻓的序列 中使⽤信息,但实际使⽤中仅仅往回记录⼏步。这是典型的RNN的样⼦:

1.jpg

这个图是循环是循环神经⽹络正向计算时按时间顺序展开。这⾥展开意味着把完整的序列的⽹络展示出 来。例如,如果我们关⼼的序列是5个单词的句⼦,则⽹络将展开为5层神经⽹络,每个单词⼀层。途中 的表达式解释如下:

22.jpg

这⾥有⼏点需要注意:

你可以把隐藏状态 看作⽹络记忆下来的信息。 捕获前⾯所有步骤中发⽣事件的信息。步骤 的输出仅基于 时刻的隐藏状态即 。如上所述,在实践中它有点复杂,因为 通常⽆法从前⾯太 多的步骤中捕获信息。

与在每层使⽤不同参数的传统深度神经⽹络不同,RNN在所有步骤中共享相同的参数 , , 。这反映了我们在每个步骤执⾏相同任务的事实,只是使⽤不同的输⼊。这⼤⼤减少了我们需要学 习的参数总数。

上图在每个时刻都有输出,但是不同的任务,可能会有不同的输出形式。例如,在预测句⼦的情绪 时,我们可能只关⼼最终的输出,⽽不是每个单词之后的情绪。同样,我们可能不需要每个时刻都 有输⼊。RNN的主要特征是其隐藏状态,它捕获序列的某些信息。

RNN可以做什么?

RNN在许多NLP任务中取得了巨⼤成功。 在这个领域最常⽤的RNN类型是LSTM,它在捕获⻓期依赖⽅ ⾯要⽐普通的RNN好得多。但不要担⼼,LSTM和RNN基本相同,它们只是采⽤不同的⽅式来计算隐藏 状态。以下是RNP在NLP中的⼀些示例应⽤。

语⾔模型和⽣成⽂本

给定⼀个单词的序列,我们想要根据给出的前⼀个词预测出下⼀个词的概率。根据语⾔模型我们可以计 算句⼦的可能性,这是机器翻译的重要输⼊(因为概率⾼的句⼦通常是正确的)。能够预测下⼀个单词 的副作⽤是我们得到⼀个⽣成模型,⽣成模型是的我们可以通过从输出概率中抽样来⽣成新⽂本。根据 我们的训练数据,我们可以⽣成各种各样的东⻄。在语⾔模型中,我们的输⼊通常是⼀系列单词(编码 成one-hot),我们的输出是预测单词的序列。在训练⽹络时,我们设置 ,因为我们希望 时 刻的输出是下⼀个时刻的输⼊。

机器翻译

机器翻译类似于语⾔模型,因为我们的输⼊是源语⾔中的⼀系列单词(例如德语)。我们希望输出⽬标 语⾔的⼀系列单词(例如英语)。关键的区别是只有输⼊完整之后才会进⾏输出,因为我们翻译的句⼦ 的第⼀个单词可能需要从完整的输⼊序列中获取信息。

222.jpg

机器翻译的RNN

语⾳识别

给定来⾃声波的声学信号作为输⼊序列,我们可以预测⼀系列语⾳⽚段及其概率。 

⽣成图像描述

RNN作为模型的⼀部分与卷积神经⽹络⼀起⽣成未标记图像的描述。这个组合模型⾮常令⼈惊讶的,结 果很不错。 组合模型甚⾄可以把⽣成的单词与图像中找到的特征对应起来。

333.jpg

训练RNN

训练RNN类似于训练传统的神经⽹络。我们也使⽤反向传播算法,但有点调整。由于参数由⽹络中的所 有步骤共享,因此每个输出的梯度不仅取决于当前时刻的计算结果,还取决于先前的步骤的计算结果。 例如,为了计算 处的梯度,我们需要反向传播3步并把梯度相加,这种被称为基于时间的反向传播 算法(BPTT)。由于存在梯度消失/梯度爆炸的问题,⽤BPTT训练的普通RNN难以学习⻓期依赖(例如 相距很远的步骤之间的依赖性)。但是存在⼀些处理这些问题的⽅法,并且某些类型的RNN(如 LSTM)是专⻔为解决这些问题⽽设计的。

RNN扩展

多年来,研究⼈员开发了更复杂的RNN来解决普通RNN模型的⼀些缺点。这⾥会简要概述,以便您熟悉 模型的分类。 双向RNN基于以下思想:时间t处的输出可能不仅取决于序列中的先前元素,还取决于未来元素。 例 如,要预测序列中缺少的单词,您需要查看左侧和右侧上下⽂。 双向RNN⾮常简单。 它们只是两个堆 叠在⼀起的RNN。 然后基于两个RNN的隐藏状态计算输出。


相关阅读