深度学习之循环神经网络(7)梯度裁剪
深度學習之循環神經網絡(7)梯度裁剪
- 1. 張量限幅
- 2. 限制范數
- 3. 全局范數裁剪
- 梯度彌散
?梯度爆炸可以通過 梯度裁剪(Gradient Clipping)的方式在一定程度上的解決。梯度裁剪與張量限幅非常類似,也是通過將梯度張量的數值或者范數限制在某個較小的區間內,從而將遠大于1的梯度值減少,避免出現梯度爆炸。
?在深度學習中,有3種常用的梯度裁剪方式。
1. 張量限幅
?直接對張量的數值進行限幅,使得張量W\boldsymbol WW的所有元素wij∈[min,max]w_{ij}\in[\text{min},\text{max}]wij?∈[min,max]。在TensorFlow中,可以通過tf.clip_by_value()函數來實現。例如:
import tensorflow as tfa = tf.random.uniform([2, 2]) # print(a) print(tf.clip_by_value(a, 0.2, 0.6)) # 梯度值裁剪
運行結果如下所示:
2. 限制范數
?通過限制梯度張量W\boldsymbol WW的范數來實現梯度裁剪。比如對W\boldsymbol WW的二范數∥W∥2\|\boldsymbol W\|_2∥W∥2?約束在[0,max][0,\text{max}][0,max]之間,如果∥W∥2\|\boldsymbol W\|_2∥W∥2?大于max\text{max}max值,則按照
W′=W∥W∥2?max\boldsymbol W'=\frac{\boldsymbol W}{\|\boldsymbol W\|_2} \cdot \text{max}W′=∥W∥2?W??max
方式將∥W∥2\|\boldsymbol W\|_2∥W∥2?約束在max\text{max}max內??梢酝ㄟ^tf.clip_by_norm函數方便地實現梯度張量W\boldsymbol WW裁剪。例如:
運行結果如下所示:
可以看到,對于大于max\text{max}max的L2范數的張量,通過裁剪后范數值縮減為5。
3. 全局范數裁剪
?神經網絡的更新方向是由所有參數的梯度張量W\boldsymbol WW共同表示的,前兩種方式只考慮單個梯度張量的限幅,會出現網絡更新方向發生變動的情況。如果能夠考慮所有參數的梯度W\boldsymbol WW的范數,實現等比例的縮放,那么就能既很好地限制網絡的梯度值,同時不改變網絡的更新方向。這就是第三種梯度裁剪的方式:全局范數裁剪。在TensorFlow中,可以通過tf.clip_by_global_norm函數快捷地縮放整體網絡梯度W\boldsymbol WW的范數。
令W(i)\boldsymbol W^{(i)}W(i)的表示網絡參數的第iii個梯度張量,首先通過
global_norm=∑i∥W(i)∥22\text{global\_norm}=\sqrt{\sum_i\|\boldsymbol W^{(i)} \|_2^2 }global_norm=i∑?∥W(i)∥22??
計算網絡的總范數global_norm\text{global\_norm}global_norm,對第III個參數W(i)\boldsymbol W^{(i)}W(i),通過
W(i)=W(i)?max_normmax?(global_norm,max_norm)\boldsymbol W^{(i)}=\frac{\boldsymbol W^{(i)}\cdot \text{max\_norm}}{\text{max?(global\_norm,max\_norm)}}W(i)=max?(global_norm,max_norm)W(i)?max_norm?
進行裁剪,其中max_norm\text{max\_norm}max_norm是用戶指定的全局最大范數值。例如:
運行結果如下所示:
可以看到,通過裁剪后,網絡參數的梯度組的總范數縮減到max_norm=2\text{max\_norm}=2max_norm=2。需要注意的是,tf.clip_by_global_norm返回裁剪后的張量List和global_norm這兩個對象,其中global_norm表示裁剪前的梯度總范數和。
?通過梯度裁剪,可以較大程度地抑制梯度爆炸現象。如下圖所示,圖中曲面表示的J(w,b)J(w,b)J(w,b)函數在不同網絡參數www和bbb下的誤差值JJJ,其中有一塊區域J(w,b)J(w,b)J(w,b)函數的梯度變化較大,一旦網絡參數進入此區域,很容易出現梯度爆炸的現象,使得網絡狀態迅速惡化。下圖右側演示了添加梯度裁剪后的優化軌跡,由于對梯度進行了有效限制,使得每次更新的步長得到有效控制,從而防止網絡突然惡化。
?在網絡訓練時,梯度裁剪一般在計算出梯度后,梯度更新之前進行。例如:
梯度彌散
?對于梯度彌散現象,可以通過增大學習率、減少網絡深度、增加Skip Connection等一系列的措施抑制。
?增大學習率ηηη可以在一定程度上防止梯度彌散現象,當出現梯度彌散時,網絡的梯度?θL?_θ\mathcal L?θ?L接近于0,此時若學習率ηηη也較小,如η=1e?5η=1\text{e}-5η=1e?5,則梯度更新步長更加微小。通過增大學習率,如令η=1e?2η=1\text{e}-2η=1e?2,有可能使得網絡的狀態得到快速更新,從而逃離梯度彌散區域。
?對于深層次的神經網絡,梯度由最末層逐漸向首層傳播,梯度彌散一般更有可能出現在網絡的開始數層。在深度殘差網絡出現之前,幾十上百層的深層網絡訓練起來非常困難,前面數層的物流梯度極容易出現梯度離散現象,從而使得網絡參數長時間得不到更新。深度殘差網絡較好地克服了梯度彌散現象,從而讓神經網絡層數達到成百上千層。一般來說,減少網絡深度可以減輕梯度彌散現象,但是網絡層數減少后,網絡表達能力也會偏弱,需要用戶自行平衡。
總結
以上是生活随笔為你收集整理的深度学习之循环神经网络(7)梯度裁剪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10激活码怎么看 win10激活码
- 下一篇: win10数字键盘被锁定怎么办 win1