日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > 循环神经网络 >内容正文

循环神经网络

深度学习之循环神经网络(7)梯度裁剪

發(fā)布時(shí)間:2023/12/15 循环神经网络 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习之循环神经网络(7)梯度裁剪 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

深度學(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é)果如下所示:

tf.Tensor( [[0.46144927 0.6 ][0.4977187 0.22363663]], shape=(2, 2), dtype=float32)

2. 限制范數(shù)

?通過(guò)限制梯度張量W\boldsymbol WW的范數(shù)來(lái)實(shí)現(xiàn)梯度裁剪。比如對(duì)W\boldsymbol WW的二范數(shù)∥W∥2\|\boldsymbol W\|_2W2?約束在[0,max][0,\text{max}][0,max]之間,如果∥W∥2\|\boldsymbol W\|_2W2?大于max\text{max}max值,則按照
W′=W∥W∥2?max\boldsymbol W'=\frac{\boldsymbol W}{\|\boldsymbol W\|_2} \cdot \text{max}W=W2?W??max
方式將∥W∥2\|\boldsymbol W\|_2W2?約束在max\text{max}max內(nèi)。可以通過(guò)tf.clip_by_norm函數(shù)方便地實(shí)現(xiàn)梯度張量W\boldsymbol WW裁剪。例如:

import tensorflow as tfa = tf.random.uniform([2, 2]) * 5 # 按范數(shù)方式裁剪 b = tf.clip_by_norm(a, 5) # 裁剪前和裁剪后的張量范數(shù) print(tf.norm(a), tf.norm(b))


運(yùn)行結(jié)果如下所示:

tf.Tensor(6.1878695, shape=(), dtype=float32) tf.Tensor(5.0, shape=(), dtype=float32)


可以看到,對(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ù)值。例如:

import tensorflow as tfw1 = tf.random.normal([3,3]) # 創(chuàng)建梯度張量1 w2 = tf.random.normal([3,3]) # 創(chuàng)建梯度張量2 # 計(jì)算global norm global_norm = tf.math.sqrt(tf.norm(w1)**2+tf.norm(w2)**2) # 根據(jù)global norm和max norm=2裁剪 (ww1, ww2), global_norm = tf.clip_by_global_norm([w1,w2],2) # 計(jì)算裁剪后的張量組的global norm global_norm2 = tf.math.sqrt(tf.norm(ww1)**2+tf.norm(ww2)**2) print(global_norm, global_norm2)


運(yùn)行結(jié)果如下所示:

tf.Tensor(4.220784, shape=(), dtype=float32) tf.Tensor(1.9999999, shape=(), dtype=float32)


可以看到,通過(guò)裁剪后,網(wǎng)絡(luò)參數(shù)的梯度組的總范數(shù)縮減到max_norm=2\text{max\_norm}=2max_norm=2。需要注意的是,tf.clip_by_global_norm返回裁剪后的張量Listglobal_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ù)wwwbbb下的誤差值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ò)突然惡化。

梯度裁剪的優(yōu)化軌跡示意圖


?在網(wǎng)絡(luò)訓(xùn)練時(shí),梯度裁剪一般在計(jì)算出梯度后,梯度更新之前進(jìn)行。例如:

with tf.GradientTape() as tape:logits = model(x) # 前向傳播loss = criteon(y, logits) # 誤差計(jì)算 # 計(jì)算梯度值 grads = tape.gradient(loss, model.trainable_variables) grads, _ = tf.clip_by_global_norm(grads, 25) # 全局梯度裁剪 # 利用裁剪后的梯度張量更新參數(shù) optimizer.apply_gradients(zip(grads, model.trainable_variables))

梯度彌散

?對(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。