PyTorch——開(kāi)源的Python機(jī)器學(xué)習(xí)庫(kù)
一、前言
??用了Matlab搭建神經(jīng)網(wǎng)絡(luò)才愈發(fā)感覺(jué)"人生苦短,我用PyTorch“是多么正確。畢竟新的神經(jīng)網(wǎng)絡(luò)架構(gòu)還是得自己一點(diǎn)點(diǎn)敲,現(xiàn)在是一點(diǎn)都笑不出來(lái)了,指望Matlab提供的老框架和訓(xùn)練算法也做不出什么算法方法的突破,頂多就是在實(shí)現(xiàn)功能上方便點(diǎn)罷了。
??本博文要求讀者有一定的Python編程基礎(chǔ)!,對(duì)機(jī)器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)有一定的了解!。如果是零基礎(chǔ)學(xué)習(xí)人群,請(qǐng)參看我之前的Python基礎(chǔ)語(yǔ)法博文和人工智能相關(guān)博文。讀完它們不會(huì)花費(fèi)你太多的時(shí)間,并且如果你能做到簡(jiǎn)單地閱覽完這些博文,就完全有足夠的知識(shí)儲(chǔ)備來(lái)徹底搞懂這篇博文的全部?jī)?nèi)容了。
??以下貼上我之前寫(xiě)的關(guān)于神經(jīng)網(wǎng)絡(luò)相關(guān)的博文,Python相關(guān)的也可以去我的博客主頁(yè)去找。
[深度學(xué)習(xí)入門]基于Python的理論與實(shí)現(xiàn)[感知機(jī)、神經(jīng)網(wǎng)絡(luò)、誤差反向傳播法及相關(guān)技巧]
[深度學(xué)習(xí)入門]什么是神經(jīng)網(wǎng)絡(luò)?[神經(jīng)網(wǎng)絡(luò)的架構(gòu)、工作、激活函數(shù)]
二、深度學(xué)習(xí)框架——PyTorch
2.1 PyTorch介紹
??PyTorch是 Facebook 發(fā)布的一款深度學(xué)習(xí)框架,和Tensorflow,Keras,Theano等其他深度學(xué)習(xí)框架都不同。作為動(dòng)態(tài)計(jì)算圖模式,其應(yīng)用模型支持在運(yùn)行過(guò)程中根據(jù)運(yùn)行參數(shù)動(dòng)態(tài)改變,而其他幾種框架都是靜態(tài)計(jì)算圖模式,其模型在運(yùn)行之前就已經(jīng)確定。
??Python模塊可以通過(guò)pip安裝,臨時(shí)使用時(shí)可以使用下述命令:
pip install pythonModuleName -i
https://pypi.douban.com/simple
??也可以永久更改:/root/.pip/pip.conf:
[global]
index-url = https://pypi.douban.com/simple
2.2 Python安裝詳解
??安裝Python就略去不寫(xiě)了,都是可視化界面也沒(méi)什么可說(shuō)的。安裝后查看當(dāng)前版本:
[root@iZ25ix41uc3Z ~]# python --version
Python 3.10.9
??下載 setuptools:
wget --no-check-certificate
http://pypi.python.org/packages/source/s/setuptools/setuptools-
解壓之后進(jìn)入目錄setuptools-0.6c11
安裝python setup.py install
??安裝 pip,和 setuptools 過(guò)程類似:
wget --no-check-certificate
https://github.com/pypa/pip/archive/1.5.5.tar.gz
解壓之后進(jìn)入目錄pip-1.5.5
安裝python setup.py install
??看看 pip 安裝是否成功,執(zhí)行:
pip list
??如果顯示的不是上方的畫(huà)面,則我們先安裝 openssl:
yum install openssl openssl-devel -y
??然后再重新安裝 python,別的不用重新安裝了。
[root@iZ25ix41uc3Z Python-3.10.9]# pip list
pip (1.5.4)
setuptools (27.3.0)
wsgiref (0.1.2)
??最后我們就可以安裝 numpy,scipy 等科學(xué)計(jì)算庫(kù)了。
pip install numpy
pip install scipy
??最后驗(yàn)證一下 numpy:
??大功告成,如此一來(lái)我們已經(jīng)成功安裝 numpy。
2.3 PyTorch安裝詳解
??先試試看 pip 安裝能不能成功。輸入命令 pip install pytorch,顯示結(jié)果如下:
??看來(lái)PyTorch不支持pip安裝,這里提示到 pytorch.org 下載安裝,同時(shí),瀏覽器自動(dòng)打開(kāi)網(wǎng)址:
http://pytorch.org/#pip-install-pytorch
??跟著上面的安裝步驟安裝就是了,這里也可以去網(wǎng)上找找安裝教程。因?yàn)檫@里不是我們的重點(diǎn),講多了也沒(méi)什么意思。
??安裝完成后,我們輸入命令 python,進(jìn)入 python 交互環(huán)境,寫(xiě)一段 pytorch 程序驗(yàn)證一下是不是安裝成功了,這段代碼調(diào)用 torch 的ones 方法,看看能不能正常顯示結(jié)果:
??看來(lái)沒(méi)什么問(wèn)題,安裝成功了。下面,我們來(lái)一步步學(xué)習(xí) pytorch 吧。
三、變量
??先看看 Tensor,pytorch 中的數(shù)據(jù)都是封裝成 Tensor 來(lái)引用的,Tensor實(shí)際上就類似于 numpy 中的數(shù)組,兩者可以自由轉(zhuǎn)換。
??我們先生成一個(gè)3*4維的數(shù)組:
import torch
x = torch.Tensor(3,4)
print("x Tensor: ",x)
??可以看到 torch.Tensor() 方法生成制定維度的隨機(jī)數(shù)。
??下面看看 Variable 的基本操作,引用 Variable:
import torch
from torch.autograd import Variable
x=Variable(torch.Tensor(2,2))
print("x variable: ",x)
??Variable 不光包含了數(shù)據(jù),還包含了其他東西,那么,還包含什么東西呢?
??默認(rèn) Variable 是有導(dǎo)數(shù) grad 的,x.data 是數(shù)據(jù),這里 x.data 就是 Tensor。x.grad 是計(jì)算過(guò)程中動(dòng)態(tài)變化的導(dǎo)數(shù)。
print ("x.data: ",x.data, ",x.grad: ",x.grad)
??此時(shí) Variable 還未進(jìn)行計(jì)算,因此 x.grad 為 None。
四、求導(dǎo)
??神經(jīng)網(wǎng)絡(luò)中的求導(dǎo)的作用是用導(dǎo)數(shù)對(duì)神經(jīng)網(wǎng)絡(luò)的權(quán)重參數(shù)進(jìn)行調(diào)整。
??Pytorch 中為求導(dǎo)提供了專門的包,包名叫autograd。如果用autograd.Variable 來(lái)定義參數(shù),則 Variable 自動(dòng)定義了兩個(gè)變量:data代表原始權(quán)重?cái)?shù)據(jù);而 grad 代表求導(dǎo)后的數(shù)據(jù),也就是梯度。每次迭代過(guò)程就用這個(gè) grad 對(duì)權(quán)重?cái)?shù)據(jù)進(jìn)行修正。
import torch
from torch.autograd import Variable
x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)
??輸出為:
y=x+2
print(y)
??輸出為:
z = y * y * 3
out = z.mean()
print(z, out)
??輸出為:
out.backward()
??反向傳播,也就是求導(dǎo)數(shù)的意思。輸出 out 對(duì) x 求導(dǎo):
print(x.grad)
??4.5 是怎么算出來(lái)的呢,從前面的公式可以看出 z=(x+2) * (x+2) * 3,它的導(dǎo)數(shù)是 3 * (x+2) / 2,當(dāng) x=1 時(shí)導(dǎo)數(shù)的值就是 3 * (1+2) / 2=4.5,和 pytorch 計(jì)算得出的結(jié)果是一致的。
??權(quán)值更新方法:
weight = weight + learning_rate * gradient
learning_rate = 0.01
for f in model.parameters():
f.data.sub_(f.grad.data * learning_rate)
??learning_rate 是學(xué)習(xí)速率,多數(shù)時(shí)候就叫做 lr,是學(xué)習(xí)步長(zhǎng),用步長(zhǎng) * 導(dǎo)數(shù)就是每次權(quán)重修正的 delta 值,lr 越大表示學(xué)習(xí)的速度越快,相應(yīng)的精度就會(huì)降低。
五、損失函數(shù)
??損失函數(shù),又叫目標(biāo)函數(shù),是編譯一個(gè)神經(jīng)網(wǎng)絡(luò)模型必須的兩個(gè)參數(shù)之一。另一個(gè)必不可少的參數(shù)是優(yōu)化器。
??損失函數(shù)是指用于計(jì)算標(biāo)簽值和預(yù)測(cè)值之間差異的函數(shù),在機(jī)器學(xué)習(xí)過(guò)程中,有多種損失函數(shù)可供選擇,典型的有距離向量,絕對(duì)值向量等。
??上圖是一個(gè)用來(lái)模擬線性方程自動(dòng)學(xué)習(xí)的示意圖。粗線是真實(shí)的線性方程,虛線是迭代過(guò)程的示意,w1 是第一次迭代的權(quán)重,w2 是第二次迭代的權(quán)重,w3 是第三次迭代的權(quán)重。隨著迭代次數(shù)的增加,我們的目標(biāo)是使得 wn 無(wú)限接近真實(shí)值。
??那么怎么讓 w 無(wú)限接近真實(shí)值呢?其實(shí)這就是損失函數(shù)和優(yōu)化器的作用了。圖中 1/2/3 這三個(gè)標(biāo)簽分別是 3 次迭代過(guò)程中預(yù)測(cè) Y 值和真實(shí) Y 值之間的差值(這里差值就是損失函數(shù)的意思了,當(dāng)然了,實(shí)際應(yīng)用中存在多種差值計(jì)算的公式),這里的差值示意圖上是用絕對(duì)差來(lái)表示的,那么在多維空間時(shí)還有平方差,均方差等多種不同的距離計(jì)算公式,也就是損失函數(shù)了。
??這里示意的是一維度方程的情況,擴(kuò)展到多維度,就是深度學(xué)習(xí)的本質(zhì)了。
??下面介紹幾種常見(jiàn)的損失函數(shù)的計(jì)算方法,pytorch 中定義了很多類型的預(yù)定義損失函數(shù),需要用到的時(shí)候再學(xué)習(xí)其公式也不遲。
??我們先定義兩個(gè)二維數(shù)組,然后用不同的損失函數(shù)計(jì)算其損失值。
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2))
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a)
??sample 的值為:[[1,1],[1,1]]。
??target 的值為:[[0,1],[2,3]]。
5.1 nn.L1Loss
??L1Loss 計(jì)算方法很簡(jiǎn)單,取預(yù)測(cè)值和真實(shí)值的絕對(duì)誤差的平均數(shù)即可。
criterion = nn.L1Loss()
loss = criterion(sample, target)
print(loss)
??最后的結(jié)果為1,計(jì)算步驟為:
??先計(jì)算絕對(duì)差總和:|0-1|+|1-1|+|2-1|+|3-1|=4;
??然后再平均:4/4=1。
5.2 nn.SmoothL1Loss
??SmoothL1Loss 也叫作 Huber Loss,誤差在 (-1,1) 上是平方損失,其他情況是 L1 損失。
criterion = nn.SmoothL1Loss()
loss = criterion(sample, target)
print(loss)
??最后結(jié)果是:0.625。
5.3 nn.MSELoss
??平方損失函數(shù)。其計(jì)算公式是預(yù)測(cè)值和真實(shí)值之間的平方和的平均數(shù)。
criterion = nn.MSELoss()
loss = criterion(sample, target)
print(loss)
??最后結(jié)果是:1.5。
5.4 nn.BCELoss
??二分類用的交叉熵,其計(jì)算公式較復(fù)雜,這里主要是有個(gè)概念即可,一般情況下不會(huì)用到。
criterion = nn.BCELoss()
loss = criterion(sample, target)
print(loss)
??最后結(jié)果是:-50。
5.5 nn.CrossEntropyLoss
??交叉熵?fù)p失函數(shù)
??該公式用的也較多,比如在圖像分類神經(jīng)網(wǎng)絡(luò)模型中就常常用到該公式。
criterion = nn.CrossEntropyLoss()
loss = criterion(sample, target)
print(loss)
??最后結(jié)果是:2.0794。
??看文檔我們知道 nn.CrossEntropyLoss 損失函數(shù)是用于圖像識(shí)別驗(yàn)證的,對(duì)輸入?yún)?shù)有各式要求,這里有這個(gè)概念就可以了,在后續(xù)的圖像識(shí)別方向中會(huì)有正確的使用方法。
5.6 nn.NLLLoss
??負(fù)對(duì)數(shù)似然損失函數(shù)(Negative Log Likelihood)
??在前面接上一個(gè) LogSoftMax 層就等價(jià)于交叉熵?fù)p失了。注意這里的xlabel 和上個(gè)交叉熵?fù)p失里的不一樣,這里是經(jīng)過(guò) log 運(yùn)算后的數(shù)值。
??這個(gè)損失函數(shù)一般也是用在圖像識(shí)別模型上。
criterion = F.nll_loss()
loss = criterion(sample, target)
print(loss)
loss=F.nll_loss(sample,target)
??最后結(jié)果為報(bào)錯(cuò),看來(lái)不能直接調(diào)用。
??Nn.NLLLoss 和 nn.CrossEntropyLoss 的功能是非常相似的。通常都是用在多分類模型中,實(shí)際應(yīng)用中我們一般用 NLLLoss 比較多。
5.7 nn.NLLLoss2d
??和上面類似,但是多了幾個(gè)維度,一般用在圖片上。
input, (N, C, H, W)
target, (N, H, W)
??比如用全卷積網(wǎng)絡(luò)做分類時(shí),最后圖片的每個(gè)點(diǎn)都會(huì)預(yù)測(cè)一個(gè)類別標(biāo)簽。
??最后結(jié)果報(bào)錯(cuò),看來(lái)不能直接這么用。
六、優(yōu)化器Optim
??優(yōu)化器用通俗的話來(lái)說(shuō)就是一種算法,是一種計(jì)算導(dǎo)數(shù)的算法。
??各種優(yōu)化器的目的和發(fā)明它們的初衷其實(shí)就是能讓用戶選擇一種適合自己場(chǎng)景的優(yōu)化器。
??優(yōu)化器的最主要的衡量指標(biāo)就是優(yōu)化曲線的平穩(wěn)度,最好的優(yōu)化器就是每一輪樣本數(shù)據(jù)的優(yōu)化都讓權(quán)重參數(shù)勻速的接近目標(biāo)值,而不是忽上忽下跳躍的變化。因此損失值的平穩(wěn)下降對(duì)于一個(gè)深度學(xué)習(xí)模型來(lái)說(shuō)是一個(gè)非常重要的衡量指標(biāo)。
??pytorch 的優(yōu)化器都放在 torch.optim 包中。常見(jiàn)的優(yōu)化器有:SGD,Adam,Adadelta,Adagrad,Adamax 等。如果需要定制特殊的優(yōu)化器,pytorch 也提供了定制化的手段,不過(guò)這里我們就不去深究了,畢竟預(yù)留的優(yōu)化器的功能已經(jīng)足夠強(qiáng)大了。
?6.1 SGD
??SGD 指stochastic gradient descent,即隨機(jī)梯度下降,隨機(jī)的意思是隨機(jī)選取部分?jǐn)?shù)據(jù)集參與計(jì)算,是梯度下降的 batch 版本。SGD 支持動(dòng)量參數(shù),支持學(xué)習(xí)衰減率。SGD 優(yōu)化器也是最常見(jiàn)的一種優(yōu)化器,實(shí)現(xiàn)簡(jiǎn)單,容易理解。
??6.1.1 用法
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
??6.1.2 參數(shù)
??lr:大于 0 的浮點(diǎn)數(shù),學(xué)習(xí)率。
??momentum:大于 0 的浮點(diǎn)數(shù),動(dòng)量參數(shù)。
??parameters:Variable 參數(shù),要優(yōu)化的對(duì)象。
??對(duì)于訓(xùn)練數(shù)據(jù)集,我們首先將其分成 n 個(gè) batch,每個(gè) batch 包含 m 個(gè)樣本。我們每次更新都利用一個(gè) batch 的數(shù)據(jù) ,而非整個(gè)訓(xùn)練集,即:
??xt+1=xt+Δxt
??Δxt=-ηgt
??其中,η 為學(xué)習(xí)率,gt 為 x 在 t 時(shí)刻的梯度。
??6.1.3 好處
??這么做的好處在于:
??(1)當(dāng)訓(xùn)練數(shù)據(jù)太多時(shí),利用整個(gè)數(shù)據(jù)集更新往往時(shí)間上不現(xiàn)實(shí)。batch的方法可以減少機(jī)器的壓力,并且可以更快地收斂。
??(2)當(dāng)訓(xùn)練集有很多冗余時(shí)(類似的樣本出現(xiàn)多次),batch 方法收斂更快。以一個(gè)極端情況為例,若訓(xùn)練集前一半和后一半梯度相同,那么如果前一半作為一個(gè) batch,后一半作為另一個(gè) batch,那么在一次遍歷訓(xùn)練集時(shí),batch 的方法向最優(yōu)解前進(jìn)兩個(gè) step,而整體的方法只前進(jìn)一個(gè) step。
6.2 RMSprop
??RMSProp 通過(guò)引入一個(gè)衰減系數(shù),讓 r 每回合都衰減一定比例,類似于Momentum 中的做法,該優(yōu)化器通常是面對(duì)遞歸神經(jīng)網(wǎng)絡(luò)時(shí)的一個(gè)良好選擇。
??6.2.1 具體實(shí)現(xiàn)
??需要:全局學(xué)習(xí)速率 ?,初始參數(shù) θ,數(shù)值穩(wěn)定量 δ,衰減速率 ρ。
??中間變量:梯度累計(jì)量 r(初始化為 0)。
??6.2.2 每步迭代過(guò)程
??(1)從訓(xùn)練集中的隨機(jī)抽取一批容量為 m 的樣本 {x1,…,xm} 以及相關(guān)的輸出 yi 。
??(2)計(jì)算梯度和誤差,更新 r,再根據(jù) r 和梯度計(jì)算參數(shù)更新量 。
??6.2.3 用法
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)
??6.2.4 參數(shù)
??lr:大于 0 的浮點(diǎn)數(shù),學(xué)習(xí)率。
??rho:大于 0 的浮點(diǎn)數(shù)。
??epsilon:大于 0 的小浮點(diǎn)數(shù),防止除 0 錯(cuò)誤。
6.3 Adagrad
??AdaGrad 可以自動(dòng)變更學(xué)習(xí)速率,只是需要設(shè)定一個(gè)全局的學(xué)習(xí)速率 ?,但是這并非是實(shí)際學(xué)習(xí)速率,實(shí)際的速率是與以往參數(shù)的模之和的開(kāi)方成反比的。也許說(shuō)起來(lái)有點(diǎn)繞口,不過(guò)用公式來(lái)表示就直白的多:
??其中 δ 是一個(gè)很小的常量,大概在 10-7,防止出現(xiàn)除以 0 的情況.。
??6.3.1 具體實(shí)現(xiàn)
??需要:全局學(xué)習(xí)速率 ?,初始參數(shù) θ,數(shù)值穩(wěn)定量 δ 。
??中間變量:梯度累計(jì)量 r(初始化為 0) 。
??6.3.2 每步迭代過(guò)程
??(1) 從訓(xùn)練集中的隨機(jī)抽取一批容量為 m 的樣本 {x1,…,xm} 以及相關(guān)。
??(2)計(jì)算梯度和誤差,更新r,再根據(jù) r 和梯度計(jì)算參數(shù)更新量 。
??6.3.3 優(yōu)點(diǎn)
??能夠實(shí)現(xiàn)學(xué)習(xí)率的自動(dòng)更改。如果這次梯度大,那么學(xué)習(xí)速率衰減的就快一些;如果這次梯度小,那么學(xué)習(xí)速率衰減的就慢一些。
??6.3.4 缺點(diǎn)
??仍然要設(shè)置一個(gè)變量 ? 。
??經(jīng)驗(yàn)表明,在普通算法中也許效果不錯(cuò),但在深度學(xué)習(xí)中,深度過(guò)深時(shí)會(huì)造成訓(xùn)練提前結(jié)束。
??6.3.5 用法
keras.optimizers.Adagrad(lr=0.01, epsilon=1e-06)
??6.3.6 參數(shù)
??lr:大于 0 的浮點(diǎn)數(shù),學(xué)習(xí)率。
??epsilon:大于 0 的小浮點(diǎn)數(shù),防止除 0 錯(cuò)誤。
6.4 Adadelta
??Adagrad 算法存在三個(gè)問(wèn)題:
??(1)其學(xué)習(xí)率是單調(diào)遞減的,訓(xùn)練后期學(xué)習(xí)率非常小。
??(2)其需要手工設(shè)置一個(gè)全局的初始學(xué)習(xí)率。
??(3)更新 xt 時(shí),左右兩邊的單位不統(tǒng)一。
??Adadelta 針對(duì)上述三個(gè)問(wèn)題提出了比較漂亮的解決方案。
??首先,針對(duì)第一個(gè)問(wèn)題,我們可以只使用 adagrad 的分母中的累計(jì)項(xiàng)離當(dāng)前時(shí)間點(diǎn)比較近的項(xiàng),如下式:
??這里ρ 是衰減系數(shù) ,通過(guò)這個(gè)衰減系數(shù),我們令每一個(gè)時(shí)刻的 gt 隨時(shí)間按照 ρ 指數(shù)衰減,這樣就相當(dāng)于我們僅使用離當(dāng)前時(shí)刻比較近的gt信息,從而使得還很長(zhǎng)時(shí)間之后,參數(shù)仍然可以得到更新。
??針對(duì)第三個(gè)問(wèn)題,其實(shí) sgd 跟 momentum 系列的方法也有單位不統(tǒng)一的問(wèn)題。sgd、momentum 系列方法中:
??類似的,adagrad 中,用于更新 Δx 的單位也不是 x 的單位,而是 1。
??而對(duì)于牛頓迭代法:
??其中 H 為 Hessian 矩陣,由于其計(jì)算量巨大,因而實(shí)際中不常使用。其單位為:
??注意,這里f 無(wú)單位 。因而,牛頓迭代法的單位是正確的。
??所以,我們可以模擬牛頓迭代法來(lái)得到正確的單位。注意到:
??這里,在解決學(xué)習(xí)率單調(diào)遞減的問(wèn)題的方案中,分母已經(jīng)是 ?f/?x 的一個(gè)近似了。這里我們可以構(gòu)造 Δx 的近似,來(lái)模擬得到 H-1 的近似,從而得到近似的牛頓迭代法。具體做法如下:
??可以看到,如此一來(lái)adagrad 中分子部分需要人工設(shè)置的初始學(xué)習(xí)率也消失了 ,從而順帶解決了上述的第二個(gè)問(wèn)題。
??6.4.1 用法
keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-06)
建議保持優(yōu)化器的默認(rèn)參數(shù)不變。
??6.4.2 參數(shù)
??lr:大于 0 的浮點(diǎn)數(shù),學(xué)習(xí)率。
??rho:大于 0 的浮點(diǎn)數(shù)。
??epsilon:大于 0 的小浮點(diǎn)數(shù),防止除 0 錯(cuò)誤。
6.5 Adam
??Adam 是一種基于一階梯度來(lái)優(yōu)化隨機(jī)目標(biāo)函數(shù)的算法。
??Adam 這個(gè)名字來(lái)源于 adaptive moment estimation,自適應(yīng)矩估計(jì)。概率論中矩的含義是:如果一個(gè)隨機(jī)變量 X 服從某個(gè)分布,X 的一階矩是E(X),也就是樣本平均值,X 的二階矩就是 E(X^2),也就是樣本平方的平均值。
??Adam 算法根據(jù)損失函數(shù)對(duì)每個(gè)參數(shù)的梯度的一階矩估計(jì)和二階矩估計(jì)動(dòng)態(tài)調(diào)整針對(duì)于每個(gè)參數(shù)的學(xué)習(xí)速率。Adam 也是基于梯度下降的方法,但是每次迭代參數(shù)的學(xué)習(xí)步長(zhǎng)都有一個(gè)確定的范圍,不會(huì)因?yàn)楹艽蟮奶荻葘?dǎo)致很大的學(xué)習(xí)步長(zhǎng),參數(shù)的值比較穩(wěn)定。
??Adam(Adaptive Moment Estimation)本質(zhì)上是帶有動(dòng)量項(xiàng)的 RMSprop,它利用梯度的一階矩估計(jì)和二階矩估計(jì)動(dòng)態(tài)調(diào)整每個(gè)參數(shù)的學(xué)習(xí)率。Adam 的優(yōu)點(diǎn)主要在于經(jīng)過(guò)偏置校正后,每一次迭代學(xué)習(xí)率都有個(gè)確定范圍,使得參數(shù)比較平穩(wěn)。
6.5.1 具體實(shí)現(xiàn)
??需要:步進(jìn)值 ?,初始參數(shù) θ,數(shù)值穩(wěn)定量 δ,一階動(dòng)量衰減系數(shù) ρ1,二階動(dòng)量衰減系數(shù) ρ2 。
??其中幾個(gè)取值一般為:δ=10-8,ρ1=0.9,ρ2=0.999 。
??中間變量:一階動(dòng)量 s,二階動(dòng)量 r,都初始化為 0 。
6.5.2 每步迭代過(guò)程
??(1)從訓(xùn)練集中的隨機(jī)抽取一批容量為 m 的樣本 {x1,…,xm} 以及相關(guān)的輸出 yi 。
??(2)計(jì)算梯度和誤差,更新 r 和 s,再根據(jù) r 和 s 以及梯度計(jì)算參數(shù)更新量 。
??6.5.3 用法
keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
??6.5.4 參數(shù)
??lr:大于 0 的浮點(diǎn)數(shù),學(xué)習(xí)率。
??beta_1/beta_2:浮點(diǎn)數(shù), 0<beta<1,通常很接近 1。
??epsilon:大于 0 的小浮點(diǎn)數(shù),防止除0錯(cuò)誤。
6.6 Adamax
keras.optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
??Adamax 優(yōu)化器的方法是基于無(wú)窮范數(shù)的 Adam 方法的變體。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-581963.html
??6.6.1 參數(shù)
??lr:大于 0 的浮點(diǎn)數(shù),學(xué)習(xí)率。
??beta_1/beta_2:浮點(diǎn)數(shù), 0<beta<1,通常很接近 1。
??epsilon:大于 0 的小浮點(diǎn)數(shù),防止除 0 錯(cuò)誤。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-581963.html
到了這里,關(guān)于[深度學(xué)習(xí)實(shí)戰(zhàn)]基于PyTorch的深度學(xué)習(xí)實(shí)戰(zhàn)(上)[變量、求導(dǎo)、損失函數(shù)、優(yōu)化器]的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!