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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【机器学习】详解 BackPropagation 反向传播算法!

發布時間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】详解 BackPropagation 反向传播算法! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先介紹一下鏈式法則

假如我們要求z對x1的偏導數,那么勢必得先求z對t1的偏導數,這就是鏈式法則,一環扣一環

BackPropagation(BP)正是基于鏈式法則的,接下來用簡單的前向傳播網絡為例來解釋。里面有線的神經元代表的sigmoid函數,y_1代表的是經過模型預測出來的,y_1 = w1 * x1 + w2 * x2,而y^1代表的是實際值,最后是預測值與實際值之間的誤差,l_1 = 1/2 * (y_1 - y^1)^2,l_2同理。總的錯誤是E = l_1 + l_2。

在神經網絡中我們采用梯度下降(Gradient Descent)來進行參數更新,最終找到最優參數。可是離E最近的不是w1,首先我們需要求出E對l_1的偏導,接著求l_1對于最近神經元sigmoid中變量的導數,最后再求y_0對于w1的偏導,進行梯度更新。

這便是神經網絡中的BP算法,與以往的正向傳播不同,它應該是從反向的角度不斷優化

這里只是用了一層隱含層,可以看的出來一個參數的梯度往往與幾個量產生關系:

  • 最終y被預測的值。這往往取決于你的激活函數,如這里采用sigmoid

  • 中間對激活函數進行求導的值

  • 輸入的向量,即為x

推廣到N層隱含層,只是乘的東西變多了,但是每個式子所真正代表的含義是一樣的。

換個角度說,在深度學習梯度下降的時候會出現比較常見的兩類問題,梯度消失以及梯度爆炸很可能就是這些量之間出了問題,對模型造成了影響。

1、梯度消失(Gradient Vanishing)。意思是梯度越來越小,一個很小的數再乘上幾個較小的數,那么整體的結果就會變得非常的小。那么導致的可能原因有哪些呢?我們由靠近E的方向向后分析。

  • 激活函數。y_1是最后經過激活函數的結果,如果激活函數不能很好地反映一開始輸入時的情況,那么就很有可能出問題。sigmoid函數的性質是正數輸出為大于0.5,負數輸出為小于0.5,因為函數的值域為(0,1),所以也常常被用作二分類的激活函數,用以表示概率。但是,當x比較靠近原點的時候,x變化時,函數的輸出也會發生明顯的變化,可是,當x相當大的時候,sigmoid幾乎已經是無動于衷了,x相當小的時候同理。這里不妨具體舉個二分類的例子,比如說用0,1代表標簽,疊了一層神經網絡,sigmoid函數作為激活函數。E對l_1的偏導極大程度將取決于y_1,因為標簽就是0,1嘛。就算輸入端的x,w都比較大,那么經過sigmoid壓縮之后就會變得很小,只有一層的時候其實還好,但是當層數變多之后呢,sigmoid函數假如說每一層都當做是激活函數,那么最后E對l_1的偏導將是十分地小,盡管x,w代表著一些信息,可經過sigmoid壓縮之后信息發生了丟失,梯度無法完成真正意義上的傳播,乘上一個很小的數,那么整個梯度會越來越小,梯度越小,說明幾乎快收斂了。換句話說,幾乎沒多久就已經收斂了。

另一種思路是從公式(4)出發,無論y_0取何值,公式(4)的輸出值總是介于(0,1/4](當然具體邊界處是否能取到取決于具體變量的取值),證明:

因為不斷乘上一個比較小的數字,所以層數一多,那么整個梯度的值就會變得十分小,而且這個是由sigmoid本身導致,應該是梯度消失的主因。

解決方法可以是換個激活函數,比如RELU就不錯,或者RELU的變種。

2、梯度爆炸(Gradient Exploding)。意思是梯度越來越大,更新的時候完全起不到優化的作用。其實梯度爆炸發生的頻率遠小于梯度消失的頻率。如果發生了,可以用梯度削減(Gradient Clipping)。

  • 梯度削減。首先設置一個clip_gradient作為梯度閾值,然后按照往常一樣求出各個梯度,不一樣的是,我們沒有立馬進行更新,而是求出這些梯度的L2范數,注意這里的L2范數與嶺回歸中的L2懲罰項不一樣,前者求平方和之后開根號而后者不需要開根號。如果L2范數大于設置好的clip_gradient,則求clip_gradient除以L2范數,然后把除好的結果乘上原來的梯度完成更新。當梯度很大的時候,作為分母的結果就會很小,那么乘上原來的梯度,整個值就會變小,從而可以有效地控制梯度的范圍。

另外,觀察公式可知,其實到底對誰求偏導是看最近的一次是誰作為自變量,就會對誰求,不一定都是對權重參數求,也有對y求的時候。

接著我們用PyTorch來實操一下反向傳播算法,PyTorch可以實現自動微分,requires_grad 表示這個參數是可學習的,這樣我們進行BP的時候,直接用就好。不過默認情況下是False,需要我們手動設置。

import torchx = torch.ones(3,3,requires_grad = True) t = x * x + 2 z = 2 * t + 1 y = z.mean()

接下來我們想求y對x的微分,需要注意這種用法只能適用于y是標量而非向量

y.backward() print(x.grad)

所以當y是向量形式的時候我們可以自己來算,如

x = torch.ones(3,3,requires_grad = True) t = x * x + 2 y = t - 9

如果計算y.backward()會報錯,因為是向量,所以我們需要手動算v,這里就是y對t嘛,全為1,注意v的維度就行。

v = torch.ones(3,3) y.backward(v) print(x.grad)

往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯黃海廣老師《機器學習課程》視頻課

本站qq群851320808,加入微信群請掃碼:

總結

以上是生活随笔為你收集整理的【机器学习】详解 BackPropagation 反向传播算法!的全部內容,希望文章能夠幫你解決所遇到的問題。

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