深度学习-RNN

一.背景

与传统的前向神经网络和卷积神经网络 (CNN) 不同,循环神经网络 (Recurrent Neural Networks,RNN)是一种擅于处理序列数据的模型,例如文本、时间序列、股票市场等。本文主要介绍循环神经网络中的几种重要模型 RNN 的发展过程,并详细推导了 RNN 中的梯度爆炸与梯度消失的原因。

前向神经网络和 CNN 在很多任务中都取得不错的效果,但是这些网络结构的通常比较适合用于一些不具有时间或者序列依赖性的数据,接受的输入通常与上一时刻的输入没有关系。但是序列数据不同,输入之间存在着先后顺序当前输入的结果通常与前后的输入都有关

二.结构

RNN结构图如下:

RNN结构图

图中 xhy 分别代表 RNN 神经元的输入、隐藏状态、输出。

UWV 是对向量 xhy 进行线性变换的矩阵。


在 RNN 中每一时刻都共用同一个神经元,将神经元展开之后如下图所示:


RNN结构展开图

X_{t} 表示t时刻的输入向量(例如第t个单词的词向量)

h_{t} 表示t时刻的隐藏向量 (包含了从开始一直到t时刻的相关信息)

y_{t} 表示t时刻的输出向量 (通常是预测的结果)。

可以看到 RNN 在t时刻的神经元接收的输入包括:当前时刻的输入X_{t} 以及上一时刻的隐藏状态h_{t-1} 。输出包括:当前时刻的隐藏状态h_{t} 和当前时刻的输出y_{t}

因此在 RNN 中输入X_{t} 只包含t时刻信息,不包含顺序信息;而h_{t} 是根据X_{t} h_{t-1} 计算得到的,包含了历史信息与当前输入信息。h_{t} y_{t} 的计算方法如下,计算h_{t} 时激活函数通常采用 tanh,计算输出y_{t} 时激活函数通常是 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 个输入数据的序列,如上图所示。此时我们的隐藏层 h_{1} 、h_{2} 、h_{3} 和输出y_{1} 、y_{2} 、y_{3} 的计算公式:

RNN 在时刻t的损失函数为L_{t} (其为一个关于输出y的函数),总的损失函数为 L=L_{1} +L_{2}+L_{3}

t=3时刻的损失函数L_{3} 对于网络参数 UWV 的梯度如下:

可以看到对于参数矩阵V(对应输出y_{t} ) 的梯度并没有长期依赖,只与t=3时刻的序列相关。但是参数矩阵U(对应输入x_{t} ) 和参数矩阵W(对应隐藏状态h_{t} ) 的梯度均有长期依赖,依赖于之前的隐藏层状态h_{1} 、h_{2}。可以推导出时刻t的损失函数L_{t} 对于UW的梯度如下:

其中的连乘项就是导致 RNN 出现梯度消失与梯度爆炸的罪魁祸首,连乘项可以如下变换:

tanh' 表示 tanh 的导数,可以看到 RNN 求梯度的时候,实际上用到了 (tanh' × W) 的连乘。当 (tanh' × W) > 1 时,多次连乘容易导致梯度爆炸;当 (tanh' × W) < 1 时,多次连乘容易导致梯度消失。

参考:https://zhuanlan.zhihu.com/p/28687529

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容