優化與訓練
梯度裁剪(gradient clipping)
/ GRAY-dee-ent KLIP-ing /
梯度裁剪,是訓練時的一條安全帶。有時梯度——那個告訴每個權重該怎麼變的信號——傳回來大得嚇人,單單一次更新就會讓模型劇烈一躥,一步糟糕的更新就把之前的進展全毀了。裁剪所做的,不過是給這次更新能有多大設個上限:如果梯度太大,就在施加它之前把它縮回一個安全的尺寸,保住方向,卻馴服幅度。
最常見的形式是「按範數裁剪」。你量出整個梯度的總體大小(範數);如果它超過了選定的閾值,就把整個梯度按比例縮小,讓它的大小正好等於閾值。這樣既保住了模型想走的方向,又防住了那一下失控的暴跳。還有一種更簡單的變體,是把每個單獨的數值裁到一個最大值,但人們通常更偏愛範數裁剪,因為它不會扭曲方向。
這在梯度爆炸常見的地方最要緊:隨時間訓練的循環網路,以及非常深的網路。在這些場景裡,一個偶發的巨大梯度,可能把損失躥到無窮大,或產出毀掉整次訓練的「NaN」值。裁剪是防範這種災難的廉價保險。不過,它並不是底層問題的修復——如果你一直在裁剪,那多半是你的學習率太高,或模型尺度沒設好,而裁剪只是把它掩蓋了起來。
閾值設為5。大多數步裡梯度的範數在2左右——原封不動。可有一步它躥到了80;裁剪把它按比例縮到範數5,方向不變。要是沒有這次裁剪,單單這一步就可能把損失送到無窮大,讓訓練崩潰。
保住方向,封住大小——防的是那一步毀滅性的更新。
裁剪治的是症狀,而非病根。它能可靠地防住爆炸,但如果它在大多數步裡都觸發,那就該去降學習率或修架構,而不是指望裁剪。
又稱
另見