我目前正在为时间序列预测培训LSTM RNN。我了解,惯例是在RNN超过某个阈值时修剪RNN的梯度。但是,我不清楚它是否包括输出层。
如果我们调用RNN h的隐藏层,则输出为sigmoid(connected_weights * h + bias)。我知道用于确定隐藏层的权重的梯度已被裁剪,但是输出层也一样吗?
换句话说,connected_weights的梯度是否也在梯度修剪中被修剪?
虽然没有什么可以阻止您剪辑它们,但是没有理由这样做。一篇有理由的好论文在这里,我将尽力概述。
我们正在尝试通过梯度裁剪解决的问题是爆炸梯度:假设您的RNN层是这样计算的:
h_t = sigmoid(U * x + W * h_tm1 + b)
所以忘记了非线性一会儿,你可以说,当前状态h_t
取决于一些早期状态h_{t-T}
的h_t = W^T * h_tmT + input
。因此,如果矩阵W
使隐藏状态膨胀,则旧的隐藏状态的影响将随着时间呈指数增长。当您反向传播渐变时,也会发生同样的情况,从而导致渐变很可能使您到达参数空间中的某个无用的点。
另一方面,在向前和向后通过过程中仅应用一次输出层,因此虽然可能会使学习复杂化,但仅取决于“恒定”因素,与时间展开无关。
为了进一步提高技术性:决定是否得到爆炸梯度的关键量是的最大特征值W
。如果它大于1(或小于-1,则很有趣:-)),那么您将得到爆炸的渐变。相反,如果小于1,则梯度会消失,从而难以学习长期依赖关系。您可以在这里找到有关这些现象的精彩讨论,并提供指向古典文学的指导。
如果将S型曲面带回图片中,则爆炸梯度将变得更加困难,因为在通过它反向传播时,梯度会被衰减至少4倍。但是,仍然有一个大于4的特征值,您会冒险:-)仔细初始化非常重要,第二篇文章给出了一些提示。使用时tanh
,几乎没有衰减在零附近,并且ReLU只是通过传播梯度,因此它们很容易发生梯度爆炸,因此对初始化和梯度剪切敏感。
总体而言,LSTM比普通RNN具有更好的学习性能。关于消失的梯度。尽管根据我的经验,通常也需要使用梯度剪切。
编辑:什么时候剪辑?就在权重更新之前,即您不改变反向支撑。事实是,梯度裁剪是一种肮脏的技巧。您仍然希望梯度尽可能精确,因此最好不要在反向传播器的中间使其变形。只是如果您看到渐变变得非常大,就说不,这闻起来。我最好走一小步。剪裁是一种简单的方法(可能只有渐变的某些元素爆炸了,而其他元素仍然表现良好且提供了信息)。对于大多数工具包,您还是没有选择,因为反向传播是原子发生的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句