优化与训练
梯度裁剪(gradient clipping)
/ GRAY-dee-ent KLIP-ing /
梯度裁剪,是训练时的一条安全带。有时梯度——那个告诉每个权重该怎么变的信号——传回来大得吓人,单单一次更新就会让模型剧烈一蹿,一步糟糕的更新就把之前的进展全毁了。裁剪所做的,不过是给这次更新能有多大设个上限:如果梯度太大,就在施加它之前把它缩回一个安全的尺寸,保住方向,却驯服幅度。
最常见的形式是「按范数裁剪」。你量出整个梯度的总体大小(范数);如果它超过了选定的阈值,就把整个梯度按比例缩小,让它的大小正好等于阈值。这样既保住了模型想走的方向,又防住了那一下失控的暴跳。还有一种更简单的变体,是把每个单独的数值裁到一个最大值,但人们通常更偏爱范数裁剪,因为它不会扭曲方向。
这在梯度爆炸常见的地方最要紧:随时间训练的循环网络,以及非常深的网络。在这些场景里,一个偶发的巨大梯度,可能把损失蹿到无穷大,或产出毁掉整次训练的「NaN」值。裁剪是防范这种灾难的廉价保险。不过,它并不是底层问题的修复——如果你一直在裁剪,那多半是你的学习率太高,或模型尺度没设好,而裁剪只是把它掩盖了起来。
阈值设为5。大多数步里梯度的范数在2左右——原封不动。可有一步它蹿到了80;裁剪把它按比例缩到范数5,方向不变。要是没有这次裁剪,单单这一步就可能把损失送到无穷大,让训练崩溃。
保住方向,封住大小——防的是那一步毁灭性的更新。
裁剪治的是症状,而非病根。它能可靠地防住爆炸,但如果它在大多数步里都触发,那就该去降学习率或修架构,而不是指望裁剪。
又称
另见