RNN 输出层的梯度应该被剪掉吗?

Should The Gradients For The Output Layer of an RNN Clipped?

我目前正在训练用于时间序列预测的 LSTM RNN。我知道当 RNN 超过某个阈值时,通常的做法是剪掉它的梯度。但是,我不完全清楚这是否包括输出层。

如果我们将 RNN 的隐藏层称为 h,则输出为 sigmoid(connected_weights*h + bias)。我知道确定隐藏层的权重梯度被剪裁了,但输出层也是如此吗?

换句话说,connected_weights的渐变是否也在渐变裁剪中裁剪了?

虽然没有什么可以阻止您也剪掉它们,但没有理由这样做。 here 是一篇有原因的好论文,我会尽量给你一个概述。

我们试图通过梯度裁剪解决的问题是梯度爆炸:假设您的 RNN 层是这样计算的:

 h_t = sigmoid(U * x + W * h_tm1 + b)

所以暂时忘记非线性,你可以说当前状态 h_t 依赖于一些更早的状态 h_{t-T} 作为 h_t = W^T * h_tmT + input。因此,如果矩阵 W 使隐藏状态膨胀,则旧隐藏状态的影响会随着时间呈指数增长。当你反向传播梯度时也会发生同样的情况,导致梯度很可能会让你到达参数 space.

中的某个无用点

另一方面,输出层在正向和反向传递过程中只应用一次,因此虽然它可能会使学习复杂化,但它只会受到 'constant' 因素的影响,与展开无关时间。

更技术一点:决定你是否得到爆炸梯度的关键量是W的最大特征值。如果它大于 1(或小于 -1,那么它真的很有趣 :-)),那么你会得到爆炸式的梯度。相反,如果它小于 1,您将遭受 梯度消失 的困扰,从而难以学习长期依赖关系。您可以找到对这些现象的精彩讨论 here,并提供对经典文献的引用。

如果我们将 sigmoid 带回到图片中,就更难获得爆炸梯度,因为在通过它反向传播时梯度至少会衰减 4 倍。但是,如果特征值大于 4,你就会有冒险 :-) 仔细初始化非常重要,第二篇论文给出了一些提示。对于 tanh,零附近几乎没有阻尼,ReLU 只是传播梯度,因此它们很容易发生梯度爆炸,因此对初始化和梯度裁剪很敏感。

总体而言,LSTMs 具有比普通 RNN 更好的学习特性,尤其是。关于消失的梯度。尽管根据我的经验,渐变剪裁通常也是必要的。

编辑:什么时候剪辑? 就在权重更新之前,即你不改变反向传播。问题是渐变裁剪是一种肮脏的技巧。你仍然希望你的渐变尽可能精确,所以你最好不要在 backprop 的中间扭曲它。只是如果你看到梯度变得非常大,你会说 不,这有味道。我最好迈出一小步。 剪裁是一种简单的方法(可能只有渐变的某些元素被分解,而其他元素仍然表现良好且信息丰富)。对于大多数工具包,你别无选择,因为反向传播是自动发生的。