2019-08-27 15:42:00
问题描述:循环神经网路为什么会出现梯度消失或者梯度爆炸的问题,有哪些改进方案。
问题求解:
循环神经网络模型的求解可以采用BPTT(Back Propagation Through Time,基于时间的反向传播)算法实现,BPTT实际上是反向传播算法的简单变种。如果将循环神经网络按照时间展开成T层的前馈神经网络来理解,就和普通的反向传播算法没有什么区别了。循环神经网络的设计初衷之一是能够捕获长距离输入之间的依赖。
从结构上来看,循环神经网络也理应能够做到这一点。然而实践发现,使用BPTT算法学习的循环神经网络并不能成功捕捉到长距离输入之间的依赖关系,这一现象主要源于神经网络中的梯度消失。
传统神经网络梯度可以表示成连乘的形式:
由于这里是循环神经网络,所以这里的w的值是一样的,那么如果w > 1,随着输出越来越远,每层的梯度大小会呈现指数增长,导致梯度爆炸;反之,如果w < 1,随着输出越来越远,每层的梯度大小会呈现指数下降,产生梯度消失。
对于前馈神经网络来说,梯度消失意味着无法通过加深网络层来改善网络的预测效果,因为无论如何加深网络,只有靠近输出层的若干层真正起到学习的作用。这使得循环神经网络模型很难学习到输入序列中的长距离依赖关系。
梯度爆炸的问题可以通过梯度剪裁来缓解,即当梯度的范式大于某个给定的值时,对梯度进行等比收缩。
梯度消失的问题相对比较棘手,需要通过模型本身进行改进。循环神经网络往往会采用GRU/LSTM网络来进行替换,很大程度上可以弥补梯度消失带来的损失。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:循环神经网络梯度消失/梯度爆炸问题 - Python技术站