递归神经网络问题整理

来源:互联网 发布:php mvc demo 编辑:程序博客网 时间:2024/06/03 20:45

问题一:LSTM如何避免梯度弥散和梯度爆炸

LSTM只能避免RNN的梯度消失(gradient vanishing);梯度膨胀(gradient explosion)不是个严重的问题,一般靠裁剪后的优化算法即可解决,比如gradient clipping(如果梯度的范数大于某个给定值,将梯度同比收缩)。下面简单说说LSTM如何避免梯度消失.

RNN的本质是在网络内部维护了一个状态S_t,其中t表示时间且S_t可递归计算。
  • 传统的RNN总是用“覆写”的方式计算状态:S_t = f(S_{t-1}, x_t),其中f(\cdot)表示仿射变换外面在套一个Sigmoid,x_t表示输入序列在时刻t的值。根据求导的链式法则,这种形式直接导致梯度被表示为连成积的形式,以致于造成梯度消失——粗略的说,很多个小于1的项连乘就很快的逼近零。
  • 现代的RNN(包括但不限于使用LSTM单元的RNN)使用“累加”的形式计算状态:S_t = \sum_{\tau=1}^t \Delta S_{\tau},其中的\Delta S_{\tau}显示依赖序列输入x_t. 稍加推导即可发现,这种累加形式导致导数也是累加形式,因此避免了梯度消失。

以上解释来自于文献[1]的第2节以及文献[2]的3.3节,希望对题主有帮助。


参考文献:
[1] Rafa Jozefowicz et al. An Empirical Exploration of Recurrent Network Architectures.
[2] Junyoung Chung et al. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling.


问题二:LSTM中为什么不推荐使用relu

lstm使用relu可能intuitively doesn't make sense. lstm中非线性单元的输出在[0,1]之间,然后会与其它信号做乘积,模拟“cut off”信号和“let go”信号这两种状态,起到开关的作用;如果改用relu做非线性单元,输出 [0, +inf],这除了能"cut off"信号,还能"scale/expand"信号(梯度爆炸)

0 0