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