1.RNN
RNN的英文全称是Recurrent Neural Networks,即循环神经网络,它是一种对序列数据进行建模的深度模型。序列的数据不太好用原始的神经网络处理。为了解决处理序列建模的问题,RNN引入了隐态h,h可以对序列数据提取特征,通过一定的转换作为输出。常见的结构如下:
其中是h隐态,X输入,Y是输出,为初始隐态,计算如下:
(1)
(2)
其中,式1中U是输入x的权重矩阵,W是上一次的值作为这一次的输入的权重矩阵,f是激活函数。输出层,是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连,V是输出层的权重矩阵.
当然还有一些其他的结构:
- 多个输入一个输出:
该表示的公式表达为:
其中T代表左后一个隐态单元
- 一个输入多个输出
- 共同一个输入多个输出:
该表示的公式表达为:
这种一个输入对应多个输出,常用在图像生成文字(image caption)或者类别生成语音或音乐。
上面的介绍的单层RNN结构,还有一些其他结构:
- 多层RNN
- Bidirectional RNN(双向卷积神经网络)
双向卷积神经网络的隐藏层要保存两个值,一个参与正向计算,另一个值参与反向计算,最终的输出值取决于这两个值得和。
这里需要说明一点,上面所有的RNN中,那些隐层的权重都是共享的。
2.RNN的反向求导
由上面知道,前向过程中:
假设输入向量x的维度是m,输出向量s的维度是n,则矩阵U的维度是n*m,矩阵W的维度是n*n,具体表述:
表示向量s的第j个元素在t时刻的值。
表示输入层第i个神经元到循环层第j个神经元的权重。
表示循环层第t-1时刻的第i个神经元到循环层第t个时刻的第j个神经元的权重.
由于RNN前向过程有:
因此有:
对向量与向量的求导可以得到:
以及:
将两项合在一起,可得:
上式描述了将沿时间往前传递一个时刻的规律,有了这个规律,我们就可以求得任意时刻k的误差项:
求得了权重矩阵W在t时刻的梯度,最终的梯度是各个时刻的梯度之和:
上面的过程只是对W进行求导得到的结果,对U求导同样能得到类似的结果:
3.RNN的梯度爆炸和消失问题
在上式中,可以得到下面的梯度:
其中和
为矩阵的模,如果t-k很大的话(也就是向前看很远的时候),会导致对应的误差项的值增长或缩小的非常快,这样就会导致相应的梯度爆炸和梯度消失问题(取决于大于1还是小于1)。
在处理梯度爆炸时,一般设置一个阈值,当梯度超过这个阈值,就截取为阈值的大小。
在解决梯度消失时,可进行调节的为和
,对应:a.对W设置好的初始化;b.式中的f一般使用的是sigmod函数,设置更好的激活函数。