人工智能學(xué)習(xí)Pytorch梯度下降優(yōu)化示例詳解
一、激活函數(shù)
1.Sigmoid函數(shù)
函數(shù)圖像以及表達(dá)式如下:
通過該函數(shù),可以將輸入的負(fù)無窮到正無窮的輸入壓縮到0-1之間。在x=0的時(shí)候,輸出0.5
通過PyTorch實(shí)現(xiàn)方式如下:
2.Tanh函數(shù)
在RNN中比較常用,由sigmoid函數(shù)變化而來。表達(dá)式以及圖像如下圖所示:
該函數(shù)的取值是-1到1,導(dǎo)數(shù)是:1-Tanh**2。
通過PyTorch的實(shí)現(xiàn)方式如下:
3.ReLU函數(shù)
該函數(shù)可以將輸入小于0的值截?cái)酁?,大于0的值保持不變。因此在小于0的地方導(dǎo)數(shù)為0,大于0的地方導(dǎo)數(shù)為1,因此求導(dǎo)計(jì)算非常方便。
通過PyTorch的實(shí)現(xiàn)方式如下:
二、損失函數(shù)及求導(dǎo)
通常,我們使用mean squared error也就是均方誤差來作為損失函數(shù)。
1.autograd.grad
torch.autograd.grad(loss, [w1,w2,...])
輸入的第一個(gè)是損失函數(shù),第二個(gè)是參數(shù)的列表,即使只有一個(gè),也需要加上中括號(hào)。
我們可以直接通過mse_loss的方法,來直接創(chuàng)建損失函數(shù)。
在torch.autograd.grad中輸入損失函數(shù)mse,以及希望求導(dǎo)的對(duì)象[w],可以直接求導(dǎo)。
注意:我們需要在創(chuàng)建w的時(shí)候,需要添加requires_grad=True,我們才能對(duì)它求導(dǎo)。
也可以通過w.requires_grad_()的方法,為其添加可以求導(dǎo)的屬性。
2.loss.backward()
該方法是直接在損失函數(shù)上面調(diào)用的
這個(gè)方法不會(huì)返回梯度信息,而是將梯度信息保存到了參數(shù)中,直接用w.grad就可以查看。
3.softmax及其求導(dǎo)
該函數(shù)將差距較大的輸入,轉(zhuǎn)換成處于0-1之間的概率,并且所有概率和為1。
對(duì)softmax函數(shù)的求導(dǎo):
設(shè)輸入是a,通過了softmax輸出的是p
注意:當(dāng)i=j時(shí),偏導(dǎo)是正的,i != j時(shí),偏導(dǎo)是負(fù)的。
通過PyTorch實(shí)現(xiàn)方式如下:
三、鏈?zhǔn)椒▌t
1.單層感知機(jī)梯度
單層感知機(jī)其實(shí)就是只有一個(gè)節(jié)點(diǎn),數(shù)據(jù)*權(quán)重,輸入這個(gè)節(jié)點(diǎn),經(jīng)過sigmoid函數(shù)轉(zhuǎn)換,得到輸出值。根據(jù)鏈?zhǔn)椒▌t可以求得梯度。
通過PyTorch可以輕松實(shí)現(xiàn)函數(shù)轉(zhuǎn)換以及求導(dǎo)。
2. 多輸出感知機(jī)梯度
輸出值變多了,因此節(jié)點(diǎn)變多了。但求導(dǎo)方式其實(shí)是一樣的。
通過PyTorch實(shí)現(xiàn)求導(dǎo)的方式如下:
3. 中間有隱藏層的求導(dǎo)
中間加了隱藏層,只是調(diào)節(jié)了輸出節(jié)點(diǎn)的輸入內(nèi)容。原本是數(shù)據(jù)直接輸給輸出節(jié)點(diǎn),現(xiàn)在是中間層的輸出作為輸入,給了輸出節(jié)點(diǎn)。使用PyTorch實(shí)現(xiàn)方式如下:
4.多層感知機(jī)的反向傳播
依舊是通過鏈?zhǔn)椒▌t,每一個(gè)結(jié)點(diǎn)的輸出sigmoid(x)都是下一個(gè)結(jié)點(diǎn)的輸入,因此我們通過前向傳播得到每一個(gè)結(jié)點(diǎn)的sigmoid函數(shù),以及最終的輸出結(jié)果,算出損失函數(shù)后,即可通過后向傳播依次推算出每一個(gè)結(jié)點(diǎn)每一個(gè)參數(shù)的梯度。
下面的DELTA(k)只是將一部分內(nèi)容統(tǒng)一寫作一個(gè)字母來表示,具體推導(dǎo)不再詳述。
四、優(yōu)化舉例
通過以下函數(shù)進(jìn)行優(yōu)化。
優(yōu)化流程:初始化參數(shù)→前向傳播算出預(yù)測值→得到損失函數(shù)→反向傳播得到梯度→對(duì)參數(shù)更新→再次前向傳播→......
在此案例中,優(yōu)化流程有一些不同:
優(yōu)化之前先選擇優(yōu)化器,并直接把參數(shù),以及梯度輸入進(jìn)去。
①pred = f(x)根據(jù)函數(shù)給出預(yù)測值,用以后面計(jì)算梯度。
②optimizer.zero_grad()梯度歸零。因?yàn)榉聪騻鞑ブ?,梯度?huì)自動(dòng)帶到參數(shù)上去(上面有展示,可以調(diào)用查看)。
③pred.backward()用預(yù)測值計(jì)算梯度。
④pred.step()更新參數(shù)。
以上步驟循環(huán)即可。
以上就是人工智能學(xué)習(xí)Pytorch梯度下降優(yōu)化示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Pytorch梯度下降優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽基礎(chǔ)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽基礎(chǔ)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03使用Python構(gòu)建Hopfield網(wǎng)絡(luò)的教程
這篇文章主要介紹了使用Python構(gòu)建Hopfield網(wǎng)絡(luò)的教程,本文來自于IBM官方網(wǎng)站的技術(shù)文檔,需要的朋友可以參考下2015-04-04簡單介紹Python中的filter和lambda函數(shù)的使用
這篇文章主要簡單介紹了Python中的filter和lambda函數(shù)的使用,是Python學(xué)習(xí)中的基礎(chǔ),同時(shí)lambda匿名函數(shù)的使用也是經(jīng)常被用來對(duì)比各種編程語的重要特性,言需要的朋友可以參考下2015-04-04Python+pyplot繪制帶文本標(biāo)注的柱狀圖方法
今天小編就為大家分享一篇Python+pyplot繪制帶文本標(biāo)注的柱狀圖方法,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python OpenCV利用筆記本攝像頭實(shí)現(xiàn)人臉檢測
這篇文章主要為大家詳細(xì)介紹了Python OpenCV利用筆記本攝像頭實(shí)現(xiàn)人臉檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04OpenCV實(shí)戰(zhàn)之實(shí)現(xiàn)手勢虛擬縮放效果
本篇將會(huì)以HandTrackingModule為模塊,實(shí)現(xiàn)通過手勢對(duì)本人的博客海報(bào)進(jìn)行縮放。文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-11-11