【深度学习】梯度下降算法和随机梯度下降算法
導(dǎo)語(yǔ)
梯度是神經(jīng)網(wǎng)絡(luò)中最為核心的概念,在介紹梯度之前我們要先知道數(shù)學(xué)中的導(dǎo)數(shù)以及偏微分的理論概念。導(dǎo)數(shù)
這里套用維基百科上的介紹,導(dǎo)數(shù)描述了函數(shù)在某一點(diǎn)附件的變化率,導(dǎo)數(shù)的本質(zhì)是通過(guò)極限對(duì)函數(shù)進(jìn)行局部的線性逼近,當(dāng)函數(shù)\(f\)的自變量在一點(diǎn)\(x_0\)上產(chǎn)生一個(gè)增量\(△x\)時(shí),則函數(shù)值的增量\(△y\)與自變量的增量\(△x\)的比值在\(△x\)趨于0時(shí)的極限存在,即為\(f\)在\(x_0\)處的導(dǎo)數(shù),記為\(f'(x_0)\)、\(\frac{df}{dx}(x_0)\)或\(\frac{\textze8trgl8bvbqy}{\textze8trgl8bvbqy}\mid_{x = x_0}\)。
當(dāng)函數(shù)定義域和取值都在實(shí)數(shù)域中的時(shí)候,函數(shù)在某一點(diǎn)的導(dǎo)數(shù)就是該函數(shù)所代表的曲線在這一點(diǎn)上的切線斜率。如下圖所示,設(shè)\({P_0}\)為曲線上的一個(gè)定點(diǎn),\(P\)為曲線上的一個(gè)動(dòng)點(diǎn)。當(dāng)\(P\)沿曲線逐漸趨向于點(diǎn)\({P_0}\)時(shí),并且割線\(P P_0\)的極限位置\(P_0 T\)存在,則稱\(P_0 T\)為曲線在\(P_0\)處的切線。
偏導(dǎo)數(shù)
在數(shù)學(xué)中,一個(gè)多變量的函數(shù)的偏導(dǎo)數(shù)是它關(guān)于其中一個(gè)變量的導(dǎo)數(shù),而保持其他變量恒定。
假設(shè)f是一個(gè)多元函數(shù)\(z=f(x,y)=y^2-x^2\),如圖所示,則函數(shù)z關(guān)于x和y的偏導(dǎo)數(shù)分別為\(\frac{\partial z}{\partial x}=-2x\)、\(\frac{\partial z}{\partial y}=2y\)梯度
而梯度則是多元函數(shù)中所有關(guān)于自變量偏導(dǎo)數(shù)的向量:\(\bigtriangledown f=(\frac{\partial f}{\partial x_1};\frac{\partial f}{\partial x_2};...;\frac{\partial f}{\partial x_n})\)梯度是一個(gè)向量,指向函數(shù)值上升最快的方向,顯然,梯度的反方向當(dāng)然就是函數(shù)值下降最快的方向了,這也是梯度下降算法的主要思想。
損失函數(shù)
對(duì)于監(jiān)督學(xué)習(xí),由訓(xùn)練樣本的特征\(X\),label實(shí)際值\(y\),根據(jù)模型\(h(x)\)計(jì)算得出預(yù)測(cè)值\(\hat{y}\),一個(gè)好的計(jì)算模型當(dāng)然是\(\hat{y}\)和\(y\)越接近越好,數(shù)學(xué)上有很多方法來(lái)表示\(\hat{y}\)和\(y\)的接近程度,在深度學(xué)習(xí)中,主要以損失函數(shù)(loss)這個(gè)概念來(lái)表示預(yù)測(cè)值\(\hat{y}\)與實(shí)際值\(y\)的差距。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的目的是要損失誤差函數(shù)盡可能的小,即求解weights使誤差函數(shù)盡可能小。首先隨機(jī)初始化weights,然后不斷反復(fù)更新weights使得誤差函數(shù)減小。通過(guò)改變神經(jīng)網(wǎng)絡(luò)中所有的參數(shù)(尋找最優(yōu)權(quán)重參數(shù)),使得損失函數(shù)不斷減小,從而訓(xùn)練出更高準(zhǔn)確率的神經(jīng)網(wǎng)絡(luò)模型。
常見(jiàn)的損失函數(shù)有均方誤差和交叉熵誤差,損失函數(shù)一個(gè)以權(quán)重參數(shù)為自變量的函數(shù)。線性模型
輸出\(y=h(x)=w^Tx\),類似這樣的就是線性模型,輸出\(y\)就是輸入特征\(x_1,x_2,...\)的線性組合。下面介紹的三種梯度下降都是以線性回歸算法來(lái)進(jìn)行比較的。均方誤差
\(\frac{1}{2}\)是為了求導(dǎo)方便。
梯度下降算法
對(duì)于神經(jīng)網(wǎng)絡(luò)模型來(lái)說(shuō),如何能達(dá)到高準(zhǔn)確率的效果,其關(guān)鍵在于不斷優(yōu)化目標(biāo)損失函數(shù),找到近似最優(yōu)權(quán)重參數(shù),使得預(yù)測(cè)估計(jì)值不斷逼近真實(shí)值。
在數(shù)學(xué)中,我們可以求得函數(shù)\(y=f(x)\)的極值點(diǎn),也就求它的導(dǎo)數(shù)\(f'(x)=0\)的那個(gè)點(diǎn)。因此可以通過(guò)解方程\(f'(x)=0\),求得函數(shù)的極值點(diǎn)\((x_0,y_0)\)
但是計(jì)算機(jī)不想人腦一樣,可以解方程。但是它可以憑借強(qiáng)大的計(jì)算能力,一步一步的把函數(shù)的極值點(diǎn)試出來(lái)。如下圖所示,首先隨機(jī)選擇一點(diǎn)開(kāi)始比如\(x_0\),然后通過(guò)步長(zhǎng)不斷迭代修改\(x\)后達(dá)到\(x_1,x_2,x_3,....\),經(jīng)過(guò)數(shù)次迭代后會(huì)達(dá)到函數(shù)的最小值點(diǎn)。
像上面找到最小值點(diǎn),在神經(jīng)網(wǎng)絡(luò)中也就是通過(guò)梯度的相反方向來(lái)修改\(x\),而每次修改的幅度也就是移動(dòng)步長(zhǎng)也需要選擇合適,如果選擇小了,那么就會(huì)迭代很多輪才能走到最小值附近;如果選擇大了,那可能就會(huì)越過(guò)最小值很遠(yuǎn),收斂不到一個(gè)好的點(diǎn)上。
批梯度下降(Batch Gradient Descent)算法
因此,經(jīng)過(guò)上面的討論,可以寫(xiě)出梯度下降算法的公式:
\[W_{new}=W_{old}-\eta \nabla E(w) \]其中\(\nabla\)是梯度算子;\(\nabla f(x)\)就是指\(f(x)\)的梯度;\(\eta\)是步長(zhǎng),也稱作學(xué)習(xí)速率,表示每次向著函數(shù)最陡峭方向邁步。
這里為了推導(dǎo)方便,神經(jīng)網(wǎng)絡(luò)模型使用的是最簡(jiǎn)單的一種\(y=wx\),沒(méi)有偏置也沒(méi)有激活函數(shù)。
下面詳細(xì)推導(dǎo) 梯度\(\nabla E(w)\)的過(guò)程。由于公式打完可能會(huì)吐血,我就上傳手寫(xiě)筆記了(-字有點(diǎn)丑)。
所以,最后梯度下降算法的最終呈現(xiàn)形式:
每次參數(shù)更新的偽代碼如下:
repeat{\(W_{new_i}=W_{old_i}+\eta \sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})x^{(i)}\)
(for every j=0,...,n)
}隨機(jī)梯度下降收斂圖如下:
從圖中可以看出SGD迭代的次數(shù)較多,在解空間的搜索過(guò)程看起來(lái)很盲目,但是大體上是往著最優(yōu)值方向移動(dòng)。
根據(jù)上面的式子訓(xùn)練模型,每次更新迭代參數(shù)\(w\),要遍歷訓(xùn)練計(jì)算數(shù)據(jù)中的所有樣本(\(\sum\)),這種算法叫做批梯度下降(Batch Gradient Descent)。但如果樣本數(shù)量十分龐大,則會(huì)造成計(jì)算量異常巨大,這時(shí)候就推薦使用隨機(jī)梯度下降算法(Stochastic Gradient Descent, SGD)。批梯度下降的收斂圖如下:
從圖中,可以得到BGD的迭代次數(shù)相對(duì)較少。
隨機(jī)梯度下降算法(Stochastic Gradient Descent, SGD)
由于批梯度下降每跟新一個(gè)參數(shù)的時(shí)候,要用到所有的樣本數(shù),所以訓(xùn)練速度會(huì)隨著樣本數(shù)量的增加而變得非常緩慢。隨機(jī)梯度下降正是為了解決這個(gè)辦法而提出的。
具體而言,在算法的每一步,我們從訓(xùn)練集中均勻抽出一 小批量( minibatch) 樣本\(B = fx(1); : : : ; x(m′)g\)。 小批量的數(shù)目 m′ 通常是一個(gè)相對(duì)較小的數(shù),從一到幾百。重要的是,當(dāng)訓(xùn)練集大小 m 增長(zhǎng)時(shí), m′ 通常是固定的。我們可能在擬合幾十億的樣本時(shí),每次更新計(jì)算只用到幾百個(gè)樣本。
這時(shí)的梯度估計(jì)可以表示為:
pytorch關(guān)于梯度的相關(guān)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
總結(jié)
以上是生活随笔為你收集整理的【深度学习】梯度下降算法和随机梯度下降算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 柯尼卡美能达打印机c226使用说明_96
- 下一篇: 2011年最新企业offer(待遇)比较