简介

首先,我们从一个问题看:
你是否能理解下面这句话的意思吗?“肉喜欢如此我的吃是”,显然很难理解。那这句话呢?“我是如此的喜欢吃肉”,句子通顺了就很好理解了!从这里可以看出,一些词顺序的颠倒就使得整个句子不通顺。
在日常生活中也有许许多多这样的问题。例如:
+ 之前的那个句子——词语的顺序决定了它们的意义
+ 时间序列数据——事件的发生顺序由时间决定
+ 基因组序列数据——每个序列都有不同的含义

它们共同之处就是:序列的信息决定事件本身。传统的神经网络并不能很好地学习数据的先前知识(prior knowledge),来理解这些数据。因此,便有了循环神经网络(RNN)。

一个用于处理序列的神经网络可以实现什么任务:

RNN的优点在于其应用的多样性,他有强大的处理各种输入和输出类型的能力。例如:
+ 情感分析——这是可以把一段文字分成正负两种情绪。输入时任意长度的句子,输出是固定长度固定类型。
“这一场电影真不错。” ——> +
“这人演的真是烂啊。” ——> -
+ 图像标注——假设我们有一张图片,我们需要描述这张图片。所以,我们的输入是单一的图像,输出是单词或句子。这里图像可能是固定大小的,但是输出是不同长度的文字描述。
一个基本的循环神经网络(RNN)
+ 语言翻译——如下图,英文翻译成法语。每种语言都有自己的语义,对同一句话有不同的长度。因此,这次的输入和输出是不同长度的。
一个基本的循环神经网络(RNN)
因此,RNNs可用于将输入映射到不同类型、长度的输出,并根据实际应用泛化。让我们看看RNN的架构是怎样的。

什么是循环神经网络

RNN因为具有“记忆”功能,所以很擅于处理自然语言和其他序列任务。它可以一次读取一个输入xt(例如单词),并且从一个时间步到另一个时间步可以通过隐藏层的**函数记住一些信息/内容。这一点允许一个单向RNN从过去获取信息来处理稍后的输入。

接下来要用到的符号:
- 上标 [l] 表示与第 lth 层相关联的对象。
- 例如: a[4] 是第 4th 层的**函数。 W[5]b[5] 是第 5th 层的参数。

  • 上标 (i) 表示与第 ith 样本相关联的对象。

    • 例如: x(i) 是第 ith 训练样本的输入。
  • 上标 t 在第 tth 个时间步的对象。

    • 例如: xt 是在第 tth 时间步输入的 x 。 x(i)t 是样本 i 在第 tth 时间步的输入。
  • 下标 i 表示向量的第 ith 个条目。

    • 例如: ai[l] 表示在 l 层的第 ith 个**函数。

如下是一个RNN,有一个输入层(X),一个隐藏层(RNN)和一个输出层(Y),其中隐藏层RNN做一个自循环。

一个基本的循环神经网络(RNN)

我们对该图进行展开,得到如下结构,其中分为T个时间步:
一个基本的循环神经网络(RNN)

我们先来看单个RNN cell:
一个基本的循环神经网络(RNN)
一个RNN可以看做是单个RNN-cell的循环。我们先来看单个时间步是怎么实现的。
其中:
+ xt 为当前输入。
+ at1 为之前的隐藏状态,包含来自上一个RNN-cell的信息,其中第一个隐藏状态由我们随机初始化。
+ at 为当前RNN-cell的隐藏状态,作为下一个RNN-cell 的输入。
+ yt则是根据输入和之前隐藏状态得到的预测值。

其计算步骤:
1. 用tanh作为**函数计算隐藏状态:at=tanh(Waaat1+Waxxt+ba)。(其中Wax表示at的权值矩阵Wxt相乘的权值矩阵,Waa同理)。
2. 使用上一步的得到的隐藏状态 at, 计算预测值 y^t=softmax(Wyaat+by)

你可以把RNN看做RNN-cell的重复,如果输入的数据序列超过10个时间步,那么将重复十个RNN-cell,也就是下图的T=10。其中每个RNN-cell将前一个时间步的RNN-cell的隐藏状态 at1 和当前时间步的输入数据 xt1 作为输入。在这个时间步它输出一个隐藏状态 at 和一个预测 yt

一个基本的循环神经网络(RNN)
其中输入序列x=(x1,x2,...,xTx)可以是一个词的one-hot编码。例如”我喜欢这个东西”的one-hot编码序列为[1,0,0,0……,1,0,……,1],其中 x1 就对应序列中的 1,x2 对应其中序列中的第二个数0,以此类推。

以上就是一个最基本的RNN。

本文参考自Fundamentals of Deep Learning – Introduction to Recurrent Neural Networks和吴恩达的深度学习。