什么是RNN?
RNN的思想是利用序列化的信息。在传统的神经网络中,我们假设所有输入和输出彼此独立。但对于许多任务而言,这个假设有问题。例如你想预测句子中的下一个单词,就需要知道它前面有哪些单词。
RNN被称为循环,因为它对序列列的每个元素执行相同的任务,并且基于先前的计算进行输出。RNN的另一个优点是它具有“记忆”,它可以收集到目前为止已经计算的信息。理论上,RNN可以在任意长的序列中使用信息,但实际使用中仅仅往回记录几步。这是典型的RNN的样子:
RNN可以做什么?
RNN在许多NLP任务中取得了巨大成功。
在这个领域最常用的RNN类型是LSTM,它在捕获长期依赖方面要比普通的RNN好得多。但不要担心,LSTM和RNN基本相同,它们只是采用不同的方式来计算隐藏状态。以下是RNP在NLP中的一些示例应用。
机器翻译
机器翻译类似于语言模型,因为我们的输入是源语言中的一系列单词(例如德语)。我们希望输出目标语言的一系列单词(例如英语)。关键的区别是只有输入完整之后才会进行输出,因为我们翻译的句子的第一个单词可能需要从完整的输入序列中获取信息。
语音识别
给定来自声波的声学信号作为输入序列,我们可以预测一系列语音片段及其概率。
生成图像描述
RNN作为模型的一部分与卷积神经网络一起生成未标记图像的描述。这个组合模型非常令人惊讶的,结果很不不错。
组合模型甚至可以把生成的单词与图像中找到的特征对应起来。
训练RNN
训练RNN类似于训练传统的神经网络。我们也使用反向传播算法,但有点调整。由于参数由⽹络中的所有步骤共享,因此每个输出的梯度不仅取决于当前时刻的计算结果,还取决于先前的步骤的计算结果。例如,为了计算t=4处的梯度,我们需要反向传播3步并把梯度相加,这种被称为基于时间的反向传播算法(BPTT)。由于存在梯度消失/梯度爆炸的问题,用BPTT训练的普通RNN难以学习期依赖(例如相距很远的步骤之间的依赖性)。但是存在一些处理这些问题的方法,并且某些类型的RNN(如
LSTM)是专门为解决这些问题而设计的。
RNN扩展
多年来,研究人员开发了更复杂的RNN来解决普通RNN模型的一些缺点。这里会简要概述,以便您熟悉模型的分类。
双向RNN基于以下思想:时间t处的输出可能不仅取决于序列中的先前元素,还取决于未来元素。
例如,要预测序列中缺少的单词,您需要查看左侧和右侧上下文。双向RNN非常简单。它们只是两个堆叠在一起的RNN。然后基于两个RNN的隐藏状态计算输出。
深度(双向)RNN类似于双向RNN,只是我们现在每个时间步有多个层。在实践中,这为我们提供了更高的学习能力(但需要大量的训练数据)。
猜你喜欢: