一.背景
与传统的前向神经网络和卷积神经网络 (CNN) 不同,循环神经网络 (Recurrent Neural Networks,RNN)是一种擅于处理序列数据的模型,例如文本、时间序列、股票市场等。本文主要介绍循环神经网络中的几种重要模型 RNN 的发展过程,并详细推导了 RNN 中的梯度爆炸与梯度消失的原因。
前向神经网络和 CNN 在很多任务中都取得不错的效果,但是这些网络结构的通常比较适合用于一些不具有时间或者序列依赖性的数据,接受的输入通常与上一时刻的输入没有关系。但是序列数据不同,输入之间存在着先后顺序,当前输入的结果通常与前后的输入都有关。
二.结构
RNN结构图如下:
图中 x、h、y 分别代表 RNN 神经元的输入、隐藏状态、输出。
U、W、V 是对向量 x、h、y 进行线性变换的矩阵。
在 RNN 中每一时刻都共用同一个神经元,将神经元展开之后如下图所示:
表示
时刻的输入向量(例如第
个单词的词向量)
表示
时刻的隐藏向量 (包含了从开始一直到
时刻的相关信息)
表示
时刻的输出向量 (通常是预测的结果)。
可以看到 RNN 在时刻的神经元接收的输入包括:当前时刻的输入
以及上一时刻的隐藏状态
。输出包括:当前时刻的隐藏状态
和当前时刻的输出
。
因此在 RNN 中输入只包含
时刻信息,不包含顺序信息;而
是根据
和
计算得到的,包含了历史信息与当前输入信息。
与
的计算方法如下,计算
时激活函数通常采用 tanh,计算输出
时激活函数通常是 softmax (分类)。
三.类型
1.N vs N - RNN
它是RNN最基础的结构形式, 最大的特点就是: 输入和输出序列是等长的. 由于这个限制的存在, 使其适用范围比较小, 可用于生成等长度的合辙诗句。
2.N vs 1 - RNN
有时候我们要处理的问题输入是一个序列,而要求输出是一个单独的值而不是序列,应该怎样建模呢?我们只要在最后一个隐层输出h上进行线性变换就可以了,大部分情况下,为了更好的明确结果, 还要使用sigmoid或者softmax进行处理. 这种结构经常被应用在文本分类问题上。
3.1 vs N - RNN
如果输入不是序列而输出为序列的情况怎么处理呢?我们最常采用的一种方式就是使该输入作用于每次的输出之上. 这种结构可用于将图片生成文字任务等。
4.N vs M - RNN
这是一种不限输入输出长度的RNN结构,它由编码器和解码器两部分组成,两者的内部结构都是某类RNN,它也被称为seq2seq架构. 输入数据首先通过编码器, 最终输出一个隐含变量c,之后最常用的做法是使用这个隐含变量c作用在解码器进行解码的每一步上,以保证输入信息被有效利用。seq2seq架构最早被提出应用于机器翻译,因为其输入输出不受限制,如今也是应用最广的RNN模型结构。在机器翻译,阅读理解,文本摘要等众多领域都进行了非常多的应用实践。
三.缺陷(梯度消失和梯度爆炸)
我们先看一下只有 3 个输入数据的序列,如上图所示。此时我们的隐藏层 和输出
的计算公式:
RNN 在时刻的损失函数为
(其为一个关于输出
的函数),总的损失函数为
。
时刻的损失函数
对于网络参数 U、W、V 的梯度如下:
可以看到对于参数矩阵V(对应输出) 的梯度并没有长期依赖,只与
时刻的序列相关。但是参数矩阵U(对应输入
) 和参数矩阵W(对应隐藏状态
) 的梯度均有长期依赖,依赖于之前的隐藏层状态
。可以推导出时刻
的损失函数
对于U、W的梯度如下:
其中的连乘项就是导致 RNN 出现梯度消失与梯度爆炸的罪魁祸首,连乘项可以如下变换:
tanh' 表示 tanh 的导数,可以看到 RNN 求梯度的时候,实际上用到了 (tanh' × W) 的连乘。当 (tanh' × W) > 1 时,多次连乘容易导致梯度爆炸;当 (tanh' × W) < 1 时,多次连乘容易导致梯度消失。
参考:https://zhuanlan.zhihu.com/p/28687529