李宏毅机器学习:RNN(下)
RNN的Learning
当RNN应用于Learning任务时,在构建损失函数方面有哪些具体方法?以slot filling任务为例,在每个输入样本中,其输出与对应的参考向量之间的交叉熵计算出来后相加即为损失函数。
在训练过程中,在每一步都应该确保word序列保持完整性,并应先通过前向传播获取当前状态信息, 再通过后向传播获取误差信息。
建立好损失函数后采用梯度下降算法进行优化。
该优化算法逐渐演变为Backpropagation Through Time(BPTT)算法。
然而,在这种情况下进行梯度下降优化可能会出现不稳定现象。相对于其他模型而言,RNN的训练难度较大。其error surface通常呈现出两种情况:较为平缓或者非常陡峭。在进行梯度下降优化时,在这种情况下可能会导致优化路径出现剧烈波动,并且可能导致损失急剧上升或者参数估计出现不稳定性(NAN现象)。解决这一问题的方法是引入梯度裁剪机制:当单个梯度的模长大于设定阈值时,则将该梯度缩放至该阈值。

The reasons behind the rough error surface in RNNs are intriguing. It is not merely due to the gradient vanish issue, as similar problems persist when ReLU is employed.
其本质在于:由于RNN处理的是temporal sequence, 相同的权重在不同时间点被反复应用

(gradient在w=1处很大,在w=0.99处很小)
为了解决这一问题,请问采用最广泛的技术是什么? LSTM 是一种非常流行的解决方案。 为何选择将一般的 RNN 升级为 LSTM? 因为 LSTM 具有独特的机制来应对梯度消失的问题:它通过调整误差表面使其更加平坦,在一定程度上缓解了梯度消失的问题。 虽然 LSTM 并未完全消除梯度爆炸的风险(这个问题仍需其他方法解决),但其设计使得这种现象的影响相对较小。 那么,请问 LSTM 具体是如何实现这一效果的呢? 在一般的 RNN 中,在每一时间点上神经元的输出会被存储到记忆中去。 在这种情况下,在每一个时间点上神经元的记忆都会被重置(即洗掉)。 相比之下,在 LSTM 中,则是将记忆中原有的值乘以一个系数后再与输入结合在一起(即 memory 和 input 是一种加法关系)。 因此,在 LSTM 中如果 weight 影响到了 memory 的值的话(假设 forget gate 未将其关闭),这种影响将会永久保留下来(除非 forget gate 设定较大的偏置使其通常处于开启状态)。 而 SimpleRNN 则会像这样不断冲刷掉所有的记忆信息。 如果采用 LSTM 时出现过拟合现象,则可以考虑尝试使用 GRU 模型替代。 GRU 的核心思想是“去除旧信息的同时保留新信息”,它通过输入门控和遗忘门控的工作机制实现了这一目标:当输入门开启时(即 input gate 打开),遗忘门则关闭(即 forget gate 关闭),从而实现对旧信息的有效抑制和新信息的有效纳入。
其它处理gradient descent的技巧还有clockwise RNN, SCRN……
如果对网络随机权重进行初始化的一般Recurrent Neural Network (RNN),则其采用ReLU激活函数的表现会劣于采用sigmoid激活函数的表现。然而[Quoc V. Le, arXiv'15]指出:如果采用单位矩阵对一般RNN的权重进行初始化,则其采用ReLU激活函数的表现会优于LSTM模型的表现。

