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

歡迎訪問 生活随笔!

生活随笔

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

pytorch

【深度学习】梯度下降算法和随机梯度下降算法

發布時間:2024/3/24 pytorch 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习】梯度下降算法和随机梯度下降算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

導語

梯度是神經網絡中最為核心的概念,在介紹梯度之前我們要先知道數學中的導數以及偏微分的理論概念。導數
這里套用維基百科上的介紹,導數描述了函數在某一點附件的變化率,導數的本質是通過極限對函數進行局部的線性逼近,當函數\(f\)的自變量在一點\(x_0\)上產生一個增量\(△x\)時,則函數值的增量\(△y\)與自變量的增量\(△x\)的比值在\(△x\)趨于0時的極限存在,即為\(f\)\(x_0\)處的導數,記為\(f'(x_0)\)\(\frac{df}{dx}(x_0)\)\(\frac{\textozvdkddzhkzdy}{\textozvdkddzhkzdy}\mid_{x = x_0}\)。
當函數定義域和取值都在實數域中的時候,函數在某一點的導數就是該函數所代表的曲線在這一點上的切線斜率。如下圖所示,設\({P_0}\)為曲線上的一個定點,\(P\)為曲線上的一個動點。當\(P\)沿曲線逐漸趨向于點\({P_0}\)時,并且割線\(P P_0\)的極限位置\(P_0 T\)存在,則稱\(P_0 T\)為曲線在\(P_0\)處的切線。

偏導數
在數學中,一個多變量的函數的偏導數是它關于其中一個變量的導數,而保持其他變量恒定。
假設f是一個多元函數\(z=f(x,y)=y^2-x^2\),如圖所示,則函數z關于x和y的偏導數分別為\(\frac{\partial z}{\partial x}=-2x\)、\(\frac{\partial z}{\partial y}=2y\)梯度
而梯度則是多元函數中所有關于自變量偏導數的向量:\(\bigtriangledown f=(\frac{\partial f}{\partial x_1};\frac{\partial f}{\partial x_2};...;\frac{\partial f}{\partial x_n})\)梯度是一個向量,指向函數值上升最快的方向,顯然,梯度的反方向當然就是函數值下降最快的方向了,這也是梯度下降算法的主要思想。

損失函數

對于監督學習,由訓練樣本的特征\(X\),label實際值\(y\),根據模型\(h(x)\)計算得出預測值\(\hat{y}\),一個好的計算模型當然是\(\hat{y}\)\(y\)越接近越好,數學上有很多方法來表示\(\hat{y}\)\(y\)的接近程度,在深度學習中,主要以損失函數(loss)這個概念來表示預測值\(\hat{y}\)與實際值\(y\)的差距。在訓練神經網絡的目的是要損失誤差函數盡可能的小,即求解weights使誤差函數盡可能小。首先隨機初始化weights,然后不斷反復更新weights使得誤差函數減小。通過改變神經網絡中所有的參數(尋找最優權重參數),使得損失函數不斷減小,從而訓練出更高準確率的神經網絡模型。
常見的損失函數有均方誤差和交叉熵誤差,損失函數一個以權重參數為自變量的函數。線性模型
輸出\(y=h(x)=w^Tx\),類似這樣的就是線性模型,輸出\(y\)就是輸入特征\(x_1,x_2,...\)的線性組合。下面介紹的三種梯度下降都是以線性回歸算法來進行比較的。均方誤差

\[E(w)=\frac{1}{2}\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})^2 \]

\(\frac{1}{2}\)是為了求導方便。

梯度下降算法

對于神經網絡模型來說,如何能達到高準確率的效果,其關鍵在于不斷優化目標損失函數,找到近似最優權重參數,使得預測估計值不斷逼近真實值。
在數學中,我們可以求得函數\(y=f(x)\)的極值點,也就求它的導數\(f'(x)=0\)的那個點。因此可以通過解方程\(f'(x)=0\),求得函數的極值點\((x_0,y_0)\)
但是計算機不想人腦一樣,可以解方程。但是它可以憑借強大的計算能力,一步一步的把函數的極值點試出來。如下圖所示,首先隨機選擇一點開始比如\(x_0\),然后通過步長不斷迭代修改\(x\)后達到\(x_1,x_2,x_3,....\),經過數次迭代后會達到函數的最小值點。
像上面找到最小值點,在神經網絡中也就是通過梯度的相反方向來修改\(x\),而每次修改的幅度也就是移動步長也需要選擇合適,如果選擇小了,那么就會迭代很多輪才能走到最小值附近;如果選擇大了,那可能就會越過最小值很遠,收斂不到一個好的點上。

批梯度下降(Batch Gradient Descent)算法

因此,經過上面的討論,可以寫出梯度下降算法的公式:

\[W_{new}=W_{old}-\eta \nabla E(w) \]

其中\(\nabla\)是梯度算子;\(\nabla f(x)\)就是指\(f(x)\)的梯度;\(\eta\)是步長,也稱作學習速率,表示每次向著函數最陡峭方向邁步。
這里為了推導方便,神經網絡模型使用的是最簡單的一種\(y=wx\),沒有偏置也沒有激活函數。
下面詳細推導 梯度\(\nabla E(w)\)的過程。由于公式打完可能會吐血,我就上傳手寫筆記了(-字有點丑)。
所以,最后梯度下降算法的最終呈現形式:

\[W_{new_i}=W_{old_i}+\eta \sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})x^{(i)} \]

每次參數更新的偽代碼如下:

repeat{\(W_{new_i}=W_{old_i}+\eta \sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})x^{(i)}\)
(for every j=0,...,n)
}隨機梯度下降收斂圖如下:
從圖中可以看出SGD迭代的次數較多,在解空間的搜索過程看起來很盲目,但是大體上是往著最優值方向移動。

根據上面的式子訓練模型,每次更新迭代參數\(w\),要遍歷訓練計算數據中的所有樣本(\(\sum\)),這種算法叫做批梯度下降(Batch Gradient Descent)。但如果樣本數量十分龐大,則會造成計算量異常巨大,這時候就推薦使用隨機梯度下降算法(Stochastic Gradient Descent, SGD)。批梯度下降的收斂圖如下:
從圖中,可以得到BGD的迭代次數相對較少。

隨機梯度下降算法(Stochastic Gradient Descent, SGD)

由于批梯度下降每跟新一個參數的時候,要用到所有的樣本數,所以訓練速度會隨著樣本數量的增加而變得非常緩慢。隨機梯度下降正是為了解決這個辦法而提出的。
具體而言,在算法的每一步,我們從訓練集中均勻抽出一 小批量( minibatch) 樣本\(B = fx(1); : : : ; x(m′)g\)。 小批量的數目 m′ 通常是一個相對較小的數,從一到幾百。重要的是,當訓練集大小 m 增長時, m′ 通常是固定的。我們可能在擬合幾十億的樣本時,每次更新計算只用到幾百個樣本。
這時的梯度估計可以表示為:

\[W_{new}=W_{old}-\eta \nabla\sum_{i=1}^{m^{'}}E(w_i) \]

pytorch關于梯度的相關API:

  • torch.autograd(loss,[w1,w2,...])
    -[w1 grad, w2 grad...]
  • los.backward()
    -w1.grad
    -w2.grad

參考教程:https://www.zybuluo.com/hanbingtao/note/448086https://zhuanlan.zhihu.com/p/25765735

總結

以上是生活随笔為你收集整理的【深度学习】梯度下降算法和随机梯度下降算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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