目录
一、背景引入
全连接神经网络和卷积神经网络在运行时每次处理的都是独立的输入数据,没有记忆功能。
有些应用需要神经网络具有记忆能力, 典型的是输入数据为时间序列的问题, 时间序列可以抽象地表示为一个向量序列:。
其中, 是向量, 下标 i 为时刻。 各个时刻的向量之间存在相关。 例如, 在说话时当前要说的词和之前已经说出去的词之间存在关系, 依赖于上下文语境。算法需要根据输入序列来产生输出值, 这类问题称为序列预测问题, 需要注意的是输入序列的长度可能不固定。
语音识别和自然语言处理是序列预测问题的典型代表。 语音识别的输入是一个语音信号序列, 自然语言处理的输入是文字序列。 下面用一个实际例子来说明序列预测问题, 假设神经网络要用来完成汉语填空, 考虑下面这个句子:
现在已经下午 2 点了, 我们还没有吃饭, 非常饿, 赶快去餐馆_____ 。
根据上下文的理解, 这个空的最佳答案是“吃饭”, 如果没有上下文, 去参观可以喝咖啡或者歇一会, 但结合前面的饿了, 最佳答案显然是“吃饭”。 为了完成这个预测, 神经网络需要依次输入前面的每一个词, 最后输入“餐馆” 这个词时, 得到预测结果。
神经网络的每次输入为一个词, 最后要预测出这个空的内容, 这需要神经网络能够理解语义, 并记住之前输入的信息, 即语句上下文。 神经网络要根据之前的输入词序列计算出当前使用哪个词的概率最大。
二、网络介绍
循环神经网络(Recurrent Neural Network, 简称 RNN) 是一种能够处理序列数据的神经网络模型。 RNN 具有记忆功能, 它会记住网络在上一时刻运行时产生的状态值, 并将该值用于当前时刻输出值的生成。
RNN 由输入层、 循环层和输出层构成, 也有可能还包含全连接层。 输入层和输出层与前馈型神经网络类似, 唯一不同的是循环层。
2.1 输入层
输入值通常是一个时间序列。每个输入样本由一系列按时间顺序排列的数据点组成,每个数据点可以是向量、标量或其他形式的数据。例如,在自然语言处理中,一个句子可以被视为一个时间序列,其中每个单词或字符代表一个时间步的输入。
2.2 循环层
循环神经网络的输入为向量序列, 每个时刻接收一个输入 , 网络会产生一个输出
, 而这个输出是由之前时刻的输入序列
共同决定的。
假设 t 时刻的状态值为 , 它由上一时刻的状态值
以及当前时刻的输入值
共同决定, 即:
是输入层到隐藏层的权重矩阵
是隐藏层内的权重矩阵,可以看作状态转移权重。其并不会随着时间变化, 在每个时刻进行计算时使用的是同一个矩阵。 这样做的好处是一方面减少了模型参数, 另一方面也记住了之前的信息。
为偏置向量
一个神经元更形象的表示如下:
循环神经网络中循环层可以只有一层, 也可以有多个循环层。
2.3 输出层
输出层以循环层的输出值作为输入并产生循环神经网络最终的输出, 它不具有记忆功能。 输出层实现的变换为:
为权重矩阵
为偏置向量
为激活函数。对于分类任务,
一般选用 softmax 函数, 输出各个类的概率。
2.4 举例
一个简单的循环神经网络, 这个网络有一个输入层、 一个循环层和一个输出层。其中输入层有 2 个神经元, 循环层有 3 个神经元, 输出层有 2 个神经元。
- 循环层的输出
,其中输入向量是二维的, 输出向量是三维的
- 输出层的输出
,其中输入向量是三维的, 输出向量是二维的
递推:
按照时间轴进行展开, 当输入为 时, 网络的输出为:
当输入为 时, 网络的输出为:
输出值与都有关。 依此类推, 可以得到
时网络的输出值,
时的输出值与
都有关。
可以看出循环神经网络通过递推方式实现了记忆功能。
2.5 深层网络
可以构建含有多个隐藏层的网络,有3种方案
- Deep Input-to-Hidden Function:它在循环层之前加入多个全连接层, 将输入向量进行多层映射之后再送入循环层进行处理。
- Deep Hidden-to-Hidden Transition:它使用多个循环层, 这与前馈型神经网络类似, 唯一不同的是计算隐含层输出的时候需要利用本隐含层上一时刻的值。
- Deep Hidden-to-Output Function:它在循环层到输出层之间加入多个全连接层。
三、网络的训练
循环神经网络(RNN)处理序列数据,每个训练样本是一个时间序列,包含多个相同维度的向量。训练使用BPTT算法(Back Propagation Through Time 算法),先对序列中每个时刻的输入进行正向传播,再通过反向传播计算梯度并更新参数。每个训练样本的序列长度可以不同,前后时刻的输入值有关联。
3.1 训练过程举例
网络结构如下:
有一个训练样本, 其序列值为:。其中,
为输入向量,
为标签向量。 循环层状态的初始值设置为 0。
在 t=1 时刻, 网络的输出为: