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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【深度学习篇】--神经网络中解决梯度弥散问题

發布時間:2025/3/21 pytorch 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习篇】--神经网络中解决梯度弥散问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?一、前述

在梯度下降中,隨著算法反向反饋到前面幾層,梯度會越來越小,最終,沒有變化,這時或許還沒有收斂到比較好的解,這就是梯度消失問題,深度學習遭受不穩定的梯度,不同層學習在不同的速度上

?

二、解決梯度彌散和消失方法一,初始化權重使用he_initialization

1、舉例

如果我們看邏輯激活函數,當輸入比較大,不管正負,將會飽和在0或1,這樣梯度就是0,因此當反向傳播開始,它幾乎沒有梯度傳播回神經網絡,所以就會導致只更改高的幾層,低的幾層不會變化,這就是為什么替代Relu函數的原因。

?

2、初始化

我們需要每層輸出的方差等于它的輸入的方差,并且我們同時需要梯度有相同的方差,當反向傳播進入這層時和離開這層,方差也一樣。

上面理論不能同時保證,除非層有相同的輸入連接和輸出連接,

但是有一個不錯的妥協在實際驗證中,連接權重被隨機初始化,n_inputs和n_outputs是輸入和輸出的連接,也叫fan_in和fan_out,
這種初始化的策略叫Xaiver initialization

?

3、具體應用

?

?

看輸入和輸出的連接數找到對應公式計算半徑來隨機初始化權重,是最合理的,是最不容易產生梯度彌散的初始化權重。

?

4、He Initialization(變形的Relu激活函數)

初始化策略對應ReLU激活函數或者它的變形叫做He initialization

fully_connected()函數默認使用Xavier初始化對應uniform distribution(full_connected默認會初始化參數和bias)
我們可以改成He initialization使用variance_scaling_initializer()函數,如下

?

三、解決梯度彌散問題方法二,使用不飽和激活函數解決單邊抑制

1、場景

選擇ReLU更多因為對于正數時候不飽和,同時因為它計算速度快
但是不幸的是,ReLU激活函數不完美,有個問題是dying ReLU,在訓練的時候一些神經元死了。

?

2、解決方法

當它們輸出小于0,去解決這個,使用leaky ReLU,max(a*z,z),a=0.01,在乎運行性能速度,可以試試

?

?

3、常用不飽和激活函數

leaky ReLU a是一個固定的值,需要手動實現

RReLU,Random,a是一個在給定范圍內隨機取值的數在訓練時,在測試的時候取a得平均值,過擬合
可以試試
PReLU,Parametric,a是一個在訓練過程中需要學習的超參數,它會被修改在反向傳播中,適合
大數據集
ELU,exponential,計算梯度的速度會慢一些,但是整體因為沒有死的神經元,整體收斂快,超參
數0.01(實際中用的不多),解決零點不可導的問題,ELU可以直接使用。


選擇激活函數結論:

ELU > leaky ReLU > ReLU > tanh > logistic

?

四、解決梯度彌散方法三,利用Batch Normalization

1、場景

盡管使用He initialization和ELU可以很大程度減少梯度彌散問題在一開始訓練,但是不保證在訓練的后面不會發生
Batch Normalization可以更好解決問題。它應用于每層激活函數之前,就是做均值和方差歸一化,對于每一批次數據并且還做放大縮小,平移,為了梯度下降的時候收斂的時候速度更快。

相當于把數據都拉到中間的位置了,有這個就不需要Dropout,Relu等等

2、本質

本質就是均值,歸一化,放大,縮小

3、具體使用原理

在測試時,使用全部訓練集的均值、方差,在Batch Normalization層,總共4個超參數被學習,
scale,offset,mean,standard deviation。

scale,offset,如下

?

mean,standard deviation。如下,B是每一批次

利用Batch Normalization即使是用飽和的激活函數,梯度彌散問題也可以很好減輕
利用Batch Normalization對權重初始化就不那么敏感了,用不用he_initlinze無所謂了,但最好用
利用Batch Normalization可以使用大一點的學習率來提速了。
利用Batch Normalization同樣的準確率,4.9% top-5錯誤率,速度減少14倍
利用Batch Normalization也是一種正則化,就沒必要使用dropout了或其他技術了

3、具體使用代碼

4、代碼優化

真正運行的時候代碼如下:

?

轉載于:https://www.cnblogs.com/LHWorldBlog/p/8664726.html

總結

以上是生活随笔為你收集整理的【深度学习篇】--神经网络中解决梯度弥散问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。