神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下:
将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特定的y,那么既然有了这么强大的模型,为什么还需要RNN(循环神经网络)呢?
为什么需要RNN(循环神经网络)
他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。
比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列; 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
以nlp的一个最简单词性标注任务来说,将我 吃 苹果 三个单词标注词性为 我/nn 吃/v 苹果/nn。
那么这个任务的输入就是:
我 吃 苹果 (已经分词好的句子)
这个任务的输出是:
我/nn 吃/v 苹果/nn(词性标注好的句子)
对于这个任务来说,我们当然可以直接用普通的神经网络来做,给网络的训练数据格式了就是我-> 我/nn 这样的多个单独的单词->词性标注好的单词。
但是很明显,一个句子中,前一个单词其实对于当前单词的词性预测是有很大影响的,比如预测苹果的时候,由于前面的吃是一个动词,那么很显然苹果作为名词的概率就会远大于动词的概率,因为动词后面接名词很常见,而动词后面接动词很少见。
所以为了解决一些这样类似的问题,能够更好的处理序列的信息,RNN就诞生了。
RNN结构
1. 普通RNN
先简单介绍一下一般的RNN。
其主要形式如下图所示(图片均来自台大李宏毅教授的PPT):
以下是对RNN前向传播的过程。仔细看数据之间的一个传播过程可以很好地理解循环神经网络的运行过程。
总结
好了,到这里大概讲解了RNN最基本的几个知识点,能够帮助大家直观的感受RNN和了解为什么需要RNN,后续总结它的反向求导知识点。
最后给出RNN的总括图:、
注意:为了简单说明问题,偏置都没有包含在公式里面。
下一篇讲GRU以及LSTM
面试补充:
RNN关键的两个点:
1、RNN的结构公式:
2、RNN为什么会有梯度消失/梯度爆炸的问题,产生的原因?
- 梯度消失现象:累乘会导致激活函数导数的累乘,如果取tanh或sigmoid函数作为激活函数的话,那么必然是一堆小数在做乘法,结果就是越乘越小。随着时间序列的不断深入,小数的累乘就会导致梯度越来越小直到接近于0,这就是“梯度消失“现象。
- 实际使用中,会优先选择tanh函数,原因是tanh函数相对于sigmoid函数来说梯度较大,收敛速度更快且引起梯度消失更慢。
RNN在前向传播的过程中,hj和hj-1会有依赖关系,那么在反向传播过程中,也有这种依赖关系,那么反向传播过程中,RNN的连乘部分为:累乘会导致梯度越来越接近0,也就是梯度消失现象。
而sigmoid的导数取值范围在[0,0.25]之间,很容易产生梯度消失/梯度爆炸的问题。若想让RNN中梯度更新的导数没有梯度消失/梯度爆炸,需要控制Wh,使得相乘保持在1左右。
而LSTM的连乘部分如下:
sigmoid取值范围在[0,1]之间,且可以通过控制xt来使得梯度保持在1左右。因此能够缓解梯度消失/梯度爆炸。
3、如何解决RNN中的梯度消失问题?
- 1.选取更好的激活函数,如Relu激活函数。ReLU函数的左侧导数为0,右侧导数恒为1,这就避免了“梯度消失“的发生。但恒为1的导数容易导致“梯度爆炸“,但设定合适的阈值可以解决这个问题。
- 2.加入BN层,其优点:加速收敛.控制过拟合,可以少用或不用Dropout和正则。降低网络对初始化权重不敏感,且能允许使用较大的学习率等。
- 3.改变传播结构,LSTM结构可以有效解决这个问题。
RNN常见面试题
4、RNN核心思想,与传统ANN的最大区别:
像人一样拥有记忆能力。用以往的记忆和当前的输入,生成输出。
RNN 和 传统神经网络 最大的区别:
在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。
RNN应用场景:
1.文本生成 2.语音识别 3.机器翻译 4.生成图像描述 5.视频标记
缺点:
RNN 有短期记忆问题,无法处理很长的输入序列
训练 RNN 需要投入极大的成本
RNN 是一种死板的逻辑,越晚的输入影响越大,越早的输入影响越小,且无法改变这个逻辑。
5、 RNNs训练和传统ANN训练异同点?
- 相同点:都使用BP误差反向传播算法。
- 不同点:
RNNs网络参数W,U,V是共享的,而传统神经网络各层参数间没有直接联系。
对于RNNs,在使用梯度下降算法中,每一步的输出不仅依赖当前步的网络,还依赖于之前若干步的网络状态。
6、为什么RNN 训练的时候Loss波动很大?
- 由于RNN特有的memory会影响后期其他的RNN的特点,梯度时大时小,lr没法个性化的调整,导致RNN在train的过程中,Loss会震荡起伏,为了解决RNN的这个问题,在训练的时候,可以设置临界值,当梯度大于某个临界值,直接截断,用这个临界值作为梯度的大小,防止大幅震荡。
7、CNN VS RNN
不同点
1.CNN空间扩展,神经元与特征卷积;RNN时间扩展,神经元与多个时间输出计算
2.RNN可以用于描述时间上连续状态的输出,有记忆功能,CNN用于静态输出。