RNN原理理解
参考博客
https://zybuluo.com/hanbingtao/note/541458
语言模型
语言模型:语言模型是对一种语言的特征进行建模,例如给定一个一句话前面的部分,预测接下来最有可能的一个词是什么。让神经网络输出概率:softmax层作为输出层。
N-Gram:假设一个词出现的概率只与前面N个词相关。模型的大小和N的关系是指数级的。
RNN:理论上可以往前(或者往后)看任意多个词。
循环神经网络
循环神经网络(Recurrent Neural Network,RNN),能够更好的处理序列的信息,在NLP中有很多应用。RNN有很多种类。
基本RNN(只是单向的)
输入层+一个隐藏层(RNN的核心结构)+一个输出层(全连接层)
x是一个向量,它表示输入层的值, s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同),o也是一个向量,它表示输出层的值。
U是输入层到隐藏层的权重矩阵,V是隐藏层到输出层的权重矩阵。
循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵W就是隐藏层上一次的值作为这一次的输入的权重。
注意RNN有时刻的概念,与输入有关,在t时刻接收到输入xt之后,隐藏层的值是st,输出值是ot。关键一点是,st的值不仅仅取决于xt,还取决于st-1。
公式如下:
f和g都是激活函数,f对应着隐藏层(循环层),g对应着输出层(是一个全连接层)
循环层和全连接层的区别就是循环层多了一个权重矩阵 W。
双向RNN
既考虑前面的词,也考虑后面的词。
双向卷积神经网络的隐藏层要保存两个值,一个A参与正向计算,另一个值A'参与反向计算。
正向计算时,隐藏层的值与有关;反向计算时,隐藏层的值与有关;最终的输出取决于正向和反向计算的加和。
计算公式如下:
正向和反向计算权值不共享,有不同的权重矩阵。
深度RNN
深度RNN:两个及以上的隐藏层就是深度RNN。
计算公式如下:
RNN循环层的训练方法:BPTT(Back Propagation through Time)
BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤:
- 前向计算每个神经元的输出值
- 反向计算每个神经元的误差项
- 计算每个权重的梯度
最后再用随机梯度下降法(SGD)更新权重。
循环层如下图所示:
循环层的公式为:
用矩阵表示为:
误差项的计算:
BTPP算法将第l层t时刻的误差项值沿两个方向传播,一个方向是其传递到输入层,这部分只和权重矩阵U有关;另一个是方向是将其沿时间线传递到上一个时刻,这部分只和权重矩阵W有关。
具体计算和推导见:https://zybuluo.com/hanbingtao/note/541458
权重梯度的推导见:https://zybuluo.com/hanbingtao/note/541458
RNN的梯度爆炸和梯度消失问题
产生梯度爆炸和梯度消失问题的原因: