理解
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。
递归神经网络(RNN)相对于MLP和CNN的主要优点是,它能够处理序列数据,在传统神经网络或卷积神经网络中,样本(sample)输入与输出是没有“顺序”概念的,可以理解为,如果把输入序列和输出序列重新排布,对整体模型的理论性能不会有影响。RNN则不同,它保证了输入和输出至少有一端是有序列特征的。
传统的神经网络结构可以归纳为下图左边的形式,隐藏层 h 的状态是不保存的,而在RNN中,每一个时间步的隐藏层状态都是由上一层的输入和上一个时间的状态共同计算得到。
为什么循环神经网络可以往前看任意多个输入值呢?
来看下面的公式,即 RNN 的输出层 o 和隐藏层 s 的计算方法:
如果反复把式 2 带入到式 1,将得到:
RNN 的训练算法为:BPTT
BPTT 的基本原理和 BP 算法是一样的,同样是三步:
1、前向计算每个神经元的输出值;
2、反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数;
3、计算每个权重的梯度。
最后再用随机梯度下降算法更新权重。
模型参数
W_xh: 状态-输入权重
W_hh: 状态-状态权重
W_hq: 状态-输出权重
b_h: 隐藏层的偏置
b_q: 输出层的偏置
循环神经网络的参数就是上述的三个权重和两个偏置,并且在沿着时间训练(参数的更新),参数的数量没有发生变化,仅仅是上述的参数的值在更新。循环神经网络可以看作是沿着时间维度上的权值共享
在卷积神经网络中,一个卷积核通过在特征图上滑动进行卷积,是空间维度的权值共享。在卷积神经网络中通过控制特征图的数量来控制每一层模型的复杂度,而循环神经网络是通过控制W_xh和W_hh中h的维度来控制模型的复杂度。
随机采样时:每次迭代都需要重新初始化隐藏状态(每个epoch有很多词迭代,每次迭代都需要进行初始化,因为对于随机采样的样本中只有一个批量内的数据是连续的)
相邻采样时:如果是相邻采样,则说明前后两个batch的数据是连续的,所以在训练每个batch的时候只需要更新一次(也就是说模型在一个epoch中的迭代不需要重新初始化隐藏状态)
相邻采样为什么在每次迭代之前都需要将参数detach
我们知道相邻采样的前后两个批量的数据在在时间步上是连续的,所以模型会使用上一个批量的隐藏状态初始化当前的隐藏状态,表现形式就是不需要在一个epoch的每次迭代时随机初始化隐藏状态,那么根据上面所说的。假如没有detach的操作,每次迭代之后的输出是一个叶子节点,并且该叶子节点的requires_grad = True(从上面的计算图就可以看出),也就意味着两次或者说多次的迭代,计算图一直都是连着的,因为没有遇到梯度计算的结束位置,这样将会一直持续到下一次隐藏状态的初始化。所以这将会导致计算图非常的大,进而导致计算开销非常大。而每次将参数detach出来,其实就是相当于每次迭代之后虽然是使用上一次迭代的隐藏状态,只不过我们希望重新开始,具体的操作就是把上一次的输出节点的参数requires_grad设置为False的叶子节点。
我们知道循环神经网络的梯度反向传播是沿着时间进行反向传播的,而时间是不会停止的,所以我们会每隔一段时间、进行一次反向传播,而我们这里的一段时间其实指的就是时间步,我们希望每间隔时间步之后进行一次反向传播,这样来减小在梯度反向传播时带来的计算开销以及一定程度上缓解梯度消失或者爆炸的问题。
RNN的缺点在于,误差反向传播时,由于时间步 t 的梯度是由 t 时的状态 h 分别对前面所有时间步的状态求导,再相乘得到,在状态权重的模大于1时,若时间步 t 较长,梯度就会消失(趋近于0),即长期的依赖很小;相反,在状态权重的模小于1时,若时间步 t 较短,梯度就会爆炸(趋近于∞),即短期的依赖很大。具体分析请【参考(http://ARXIV.org/pdf/1211.5063.pdf)】,解决这一问题有两个主要的方法:
1、截断的时间反向传播法(TBPTT):将梯度限制在某个范围,这种做法简单粗暴,却能解决梯度爆炸和消失的问题,但是限制了梯度的传播;
2、长短期记忆(LSTM)。
LSTM最先是被引入来解决梯度小时问题,LSTM在神经网络中是一个特殊的隐藏层,他将时间步 t 的隐藏层状态更新结构表示如下:
LSTM由三个门来控制细胞状态,这三个门分别称为遗忘门、输入门和输出门。
遗忘门:允许记忆单元在有限增长的情况下重置信元状态。遗忘门类似于一个过滤器,决定上一个时间步的信元状态 C 能否通过。
输入门:负责根据输入值和遗忘门的输出,来更新信元状态 C 。
输出门:更新隐藏单元的值。
来源:CSDN
作者:赠与你的歌
链接:https://blog.csdn.net/weixin_43148500/article/details/104381372