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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

普通RNN的缺陷—梯度消失和梯度爆炸

發(fā)布時(shí)間:2025/3/12 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 普通RNN的缺陷—梯度消失和梯度爆炸 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前的RNN,無法很好地學(xué)習(xí)到時(shí)序數(shù)據(jù)的長(zhǎng)期依賴關(guān)系。因?yàn)锽PTT會(huì)發(fā)生梯度消失和梯度爆炸的問題。

RNN梯度消失和爆炸

對(duì)于RNN來說,輸入時(shí)序數(shù)據(jù)xt時(shí),RNN 層輸出ht。這個(gè)ht稱為RNN 層的隱藏狀態(tài),它記錄過去的信息。

語(yǔ)言模型的任務(wù)是根據(jù)已經(jīng)出現(xiàn)的單詞預(yù)測(cè)下一個(gè)將要出現(xiàn)的單詞。

學(xué)習(xí)正確解標(biāo)簽過程中,RNN層通過向過去傳遞有意義的梯度,能夠?qū)W習(xí)時(shí)間方向上的依賴關(guān)系。如果這個(gè)梯度在中途變?nèi)?#xff08;甚至沒有包含任何信息),權(quán)重參數(shù)將不會(huì)被更新,也就是所謂的RNN層無法學(xué)習(xí)長(zhǎng)期的依賴關(guān)系。梯度的流動(dòng)如下圖綠色箭頭。

隨著時(shí)間增加,RNN會(huì)產(chǎn)生梯度變小(梯度消失)或梯度變大(梯度爆炸)。

RNN 層在時(shí)間方向上的梯度傳播,如下圖。

反向傳播的梯度流經(jīng)tanh、+、MatMul(矩陣乘積)運(yùn)算。

+的反向傳播,將上游傳來的梯度原樣傳給下游,梯度值不變。

tanh的計(jì)算圖如下。它將上游傳來的梯度乘以tanh的導(dǎo)數(shù)傳給下游。

y=tanh(x)的值及其導(dǎo)數(shù)的值如下圖。導(dǎo)數(shù)值小于1,x越遠(yuǎn)離0,值越小。反向傳播梯度經(jīng)過tanh節(jié)點(diǎn)要乘上tanh的導(dǎo)數(shù),這就導(dǎo)致梯度越來越小。

如果RNN層的激活函數(shù)使用ReLU,可以抑制梯度消失,當(dāng)ReLU輸入為x時(shí),輸出是max(0,x)。x大于0時(shí),反向傳播將上游的梯度原樣傳遞到下游,梯度不會(huì)退化。

對(duì)于MatMul(矩陣乘積)節(jié)點(diǎn)。僅關(guān)注RNN層MatMul節(jié)點(diǎn)時(shí)的梯度反向傳播如下圖。每一次矩陣乘積計(jì)算都使用相同的權(quán)重Wh。

N = 2 # mini-batch的大小 H = 3 # 隱藏狀態(tài)向量的維數(shù) T = 20 # 時(shí)序數(shù)據(jù)的長(zhǎng)度dh = np.ones((N, H))#初始化為所有元素均為 1 的矩陣,dh是梯度np.random.seed(3)Wh = np.random.randn(H, H)#梯度的大小隨時(shí)間步長(zhǎng)呈指數(shù)級(jí)增加,發(fā)生梯度爆炸 #Wh = np.random.randn(H, H) * 0.5 #梯度的大小隨時(shí)間步長(zhǎng)呈指數(shù)級(jí)減小,發(fā)生梯度消失,權(quán)重梯度不能被更新,模型無法學(xué)習(xí)長(zhǎng)期的依賴關(guān)系 norm_list = [] for t in range(T):dh = np.dot(dh, Wh.T)#根據(jù)反向傳播的 MatMul 節(jié)點(diǎn)的數(shù)量更新 dh 相應(yīng)次數(shù)norm = np.sqrt(np.sum(dh**2)) / N#mini-batch(N)中的平均L2 范數(shù),L2 范數(shù)對(duì)所有元素的平方和求平方根.norm_list.append(norm)#將各步的 dh 的大小(范數(shù))添加到 norm_list 中print(norm_list)# 繪制圖形 plt.plot(np.arange(len(norm_list)), norm_list) plt.xticks([0, 4, 9, 14, 19], [1, 5, 10, 15, 20]) plt.xlabel('time step') plt.ylabel('norm') plt.show()

如果Wh是標(biāo)量,由于Wh被反復(fù)乘了T次,當(dāng)Wh大于1時(shí),梯度呈指數(shù)級(jí)增加;當(dāng) Wh 小于1時(shí),梯度呈指數(shù)級(jí)減小。

如果wh是矩陣,矩陣的奇異值表示數(shù)據(jù)的離散程度,根據(jù)奇異值(多個(gè)奇異值中的最大值)是否大于1,可以預(yù)測(cè)梯度大小的變化。奇異值比1大是梯度爆炸的必要非充分條件。

梯度裁剪gradients clipping

梯度裁剪(gradients clipping)是解決解決梯度爆炸的一個(gè)方法。

將神經(jīng)網(wǎng)絡(luò)用到的所有參數(shù)的梯度整合成一個(gè),用g表示,將閾值設(shè)置為threshold,如果梯度g的L2范數(shù)大于等于該閾值,就按如下方式修正梯度。

dW1 = np.random.rand(3, 3) * 10 dW2 = np.random.rand(3, 3) * 10 grads = [dW1, dW2] max_norm = 5.0#閾值def clip_grads(grads, max_norm):total_norm = 0for grad in grads:total_norm += np.sum(grad ** 2)total_norm = np.sqrt(total_norm)#L2 范數(shù)對(duì)所有元素的平方和求平方根rate = max_norm / (total_norm + 1e-6)if rate < 1:#如果梯度的L2范數(shù)total_norm大于等于閾值max_norm,rate是小于1的,此時(shí)就需要修正梯度for grad in grads:grad *= rateprint('before:', dW1.flatten()) clip_grads(grads, max_norm) print('after:', dW1.flatten()) before: [7.14418135 3.58857143 7.82910303 8.04057218 8.8617387 1.899638863.0606848 8.14163088 5.25490409] after: [1.43122195 0.71891263 1.56843501 1.61079946 1.77530697 0.380562130.61315903 1.63104494 1.05273561]

解決梯度消失

為了解決梯度消失,需要從根本上改變 RNN 層的結(jié)構(gòu)。

LSTM 和GRU中增加了一種門結(jié)構(gòu),可以學(xué)習(xí)到時(shí)序數(shù)據(jù)的長(zhǎng)期依賴關(guān)系。

總結(jié)

以上是生活随笔為你收集整理的普通RNN的缺陷—梯度消失和梯度爆炸的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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