赞
踩
为什么需要RNN网络?
用于解决带有时间序列的场景任务,如语音翻译,文本翻译,段落评价等。
为什么不用标准的神经网络?
- 输入和输出数据在不同例子中的长度可能不同
- 一个单纯的神经网络结构,它并不共享从文本,语音等不同位置上学习到的特征
- 参数量大 ,输入网络的特征,往往是one hot或者embedding向量,维度大。或者输入网络的特征是一段序列,当序列很长的时候,输入向量是巨大的
- 不能体现前因后果
RNN网络是一个串行结构,基本结构如下图所示,下面给出的是一个多输入多输出的结构:
每个结构的具体实现如下:
通过上面的图可以看出输入有两部分,一部分来自前面网络的输出吗,一部分为自己当前的输入,权重共享。可以根据实际任务的需求定义输出函数,如多分类可以使用softmax,二分类可以直接使用sigmoid函数。
我们再来看下RNN网络模型的特点:
问:共享权重的好处是什么?
答:
- 面对不同的输入,能够学习到不同的相应结果
- 极大地减少了训练参数
- 输入和输出在不同的例子中可以有不同的长度,比如上面是三个输入,可以再加任意个或者减少任意个都没影响,用的都是一套权重.
前向传播就是上面的网络结构的特征流向,按照输入特征和权重计算最终的输出就行了,很容易理解。
损失函数分为两部分:单个时间步的损失函,整个时间序的损失函数,下面我们一一来看。
一上面的多输入多输出为例,每个输入都会对应一个输出,这个损失函数可以自定义,比如说我们做的是一个二分类任务(是不是正面评价),输出是0或1,那么上面的softmax就可以直接使用sigmoid函数代替,那么损失函数就可以使用最经典的交叉熵函数损失。
还是以上面的二分类为例,那么整个序列的损失就是把每一步的损失给加一块,也很好理解。
虽然RNN是解决时序问题的一个不错的算法,但是也会有以下问题:
- 当时序比较长的时候,容易出现梯度消失或者梯度爆炸,在反向传播求导的时候会出现非常多的连乘项,从而引起梯度消失或者梯度爆炸,后面的节点会受到前面的节点的影响。不管是梯度消失还是梯度爆炸的核心都是因为连乘项的权重系数导致的,权重系数随机初始化的,未知的。
- 参数更新只能捕捉到局部依赖关系,没法捕捉到序列之间的长期的依赖关系
举个栗子看一下:
这对应着吴恩达老师讲的那个例子: The cat, which ate already, …, was full。就是后面的was还是were, 要看前面是cat,还是cats.但是一旦中间的这个which 句子很长,cat的信息根本传不到was这里来。对was的更新没有任何帮助,这是RNN一个很大的不足之处。
梯度爆炸的解决方案:
出现了梯度爆炸可以用进行解决,梯度修剪的意思就是观察你的梯度向量,如果它大于某个闻值,缩放梯度向量,保证它不会太大。
梯度消失的解决方案:
LSTM,下一篇博文介绍:传送门。
再举一个栗子:
假设t=20的时候
t=3的节点,由于连乘过多导致梯度消失,无法将信息传回给t=20因此t=20的更新,无法引入t=3时的信息认为t=20节点跟t=3的节点无关联,这个时候可能只跟18,19,20这些节点有关了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。