目录
LSTM(Long Short Term Memory)长短期记忆网络
GRU(Gated Recurrent Unit)门控循环单元
前言
Stay hungry. Stay Foolish.
RNN(循环神经网络)
上一篇介绍到深度学习最经典的CNN,这一篇来研究一下深度学习同样经典的RNN。首先先研究清楚为什么我们有了CNN这么好用的神经网络后还需要循环神经网络。
为什么要用循环神经网络(RNN)?
首先上图是一张普通的神经网络模型,卷积神经网络也是这样的,输入一张图片,中间经过一个神经网络,输出他的类别。
但是上面的输入是固定输入固定输出的,比如输入一张图片,输出一个类别,那么如果拿来做输入不固定,或者输出不固定,又或者二者都不固定的任务,是不是就没辙了,比如输入是一个句子,或者要求输出是一个句子,而且输出的句子长度也不固定。循环神经网络就是用于应对这样的序列式问题,所以为了处理这一类变长的数据和序列式的问题,我们需要使用循环神经网络。
循环神经网络(RNN)可以处理什么类型的任务?
它一般可以处理三种类型的任务:1. 输入不固定,输出固定单一(多对一问题)2. 输入固定单一,输出不固定(一对多问题) 3. 输入和输出都不固定(多对多问题)
多对一问题
这样的问题的模型结构一般是这样的:
输入可能是一句话,输出是一个固定的输出,这种情况下卷积神经网络可能是无法处理的,这就需要循环神经网络,这样的问题对应到任务上有:文本分类、情感分析(给一句评论输出这句话的情感态度)
一对多问题
一对多问题的模型结构一般是这样的:
这种问题可能输入是一张图片,输出是一句话对吧,常见任务很经典的就是:Image Caption(当然输入前也是要加一层CNN抽特征的)
多对多问题
对于这种多对多的问题我们也称为序列到序列的问题(Seq2Seq),最经典的毫无疑问就是机器翻译了,输入一个源语言的句子,输出一个目标语言的句子。
循环神经网络结构
单层网络情况
下图就是循环神经网络的一个结构,可以看到有一个自指向的一个箭头,它代表一个中间状态,从头到尾的输出通过维持一个中间状态来记录之前输出的情况(也就是上下文信息),该状态和下一步的输入一起作为输入。
正向传播
===>
===>
代表当前输入,
代表上一步输出的隐藏状态,他们通过F函数这样的非线性变换得到这一步输出的隐藏状态。W、U、V均为参数矩阵
损失函数就是每一步的输出计算一个损失,然后求和作为损失
最终通过softmax归一化算出最终概率,正向传播的过程也就是序列从头到尾的一个过程。
反向传播
其过程是序列的尾部到头部的过程,设E为Loss的值,梯度下降现在E要对每个参数进行求偏导,保证每个方向都成下降趋势。
可以看到参数矩阵都是共享的,每一步的W都是一样的,可以看成是一个变量。
我们计算对W的偏导计算梯度 :
通过一个变换:
但对W求偏导是比较困难的,通过上面的公式可以知道
是
的函数:
(正向传播中的公式)
那么,知道这一点我们的公式可以变换为:
当 j = 0的时候,对W求偏导是比较容易的,那么我们的反向传播的机制就会变成如下的一个流程:
它会从当前时间的损失,一直反向传播到最开始的状态,影响到最开始的节点。
存在问题
梯度消失,或者说较远的步骤对梯度下降贡献小。
来看看这个激活函数:tanh
可以看到激活函数的导数的范围是在 [0 , 1] 之间的,那么我们上面这条公式的中间求偏导假如步骤拉的很长的话,中间有十几步连乘,那么每一个 的值都在[ 0,