梯度在微積分中,對多元函數(shù)的參數(shù)求偏導(dǎo)數(shù),把求得的各個參數(shù)的偏導(dǎo)數(shù)以向量的形式表示出來,就是梯度。舉個例子,對于函數(shù)f(x, y),我們分別對自變量x和y求偏導(dǎo)數(shù)為?f/?x和?f/?y,那么梯度向量就是(?f/?x, ?f/?y),簡稱grad f(x, y)或者▽f(x, y)。 從幾何上講,梯度其實(shí)就是函數(shù)變化增加最快的地方,沿著梯度向量的方向會更容易找到函數(shù)的最大值,沿著梯度向量的反方向會更容易找到函數(shù)的最小值。 因此,最小化損失函數(shù)就可以通過梯度下降法來進(jìn)行不斷迭代求解,最終得到最小化的損失函數(shù)和模型參數(shù)值。 梯度是微積分中的一個重要概念。
梯度下降法梯度下降是迭代法的一種,可以用于求解最小二乘問題(線性與非線性均可),是一個使損失函數(shù)越來越小的優(yōu)化算法。在無求解機(jī)器學(xué)習(xí)算法的模型參數(shù)問題(約束優(yōu)化問題)中,梯度下降是最常用的方法之一(另一種常用方法是最小二乘法),梯度下降法可以通過一步步的迭代求解得到最小化的損失函數(shù)和模型參數(shù)值。在機(jī)器學(xué)習(xí)中,基于基本的梯度下降法主要有隨機(jī)梯度下降法和批量梯度下降法。 我們可以將梯度下降法比作下山,但是我們并不知道下山的路,只能通過一步一步的試探來下山。假設(shè)下山過程無安全性問題,那么每走到一個位置的時候,我們就會求當(dāng)前位置的梯度,并沿著梯度的負(fù)方向,也就是當(dāng)前最陡峭的位置(這樣走更接近山下)向下走一步。類似這種方法一步一步得走,直到我們感覺已經(jīng)到了山腳。這里為什么說是感覺,那是因?yàn)樯綍卸鄠€峰,這種走法不一定能到正真的山腳,而可能只是到了某個局部山峰的最低處,也就是局部最優(yōu)解。 梯度下降 這個問題在特征較少的情況下可能會導(dǎo)致陷入某個局部最優(yōu)解,但當(dāng)特征足夠時,出現(xiàn)這種情況的概率就幾乎為0了,因此當(dāng)我們有成百上千萬甚至上億的特征時可以忽略這一問題。 在梯度下降法調(diào)優(yōu)中,影響較大的三個因素為步長、初始值和歸一化。
Mini-batch的梯度下降法對整個訓(xùn)練集進(jìn)行梯度下降法時,我們需要處理整個訓(xùn)練數(shù)據(jù)集,然后才能進(jìn)行一步梯度下降,即每走一步梯度下降都需要對整個訓(xùn)練集進(jìn)行一次處理。可以預(yù)見的是,當(dāng)訓(xùn)練數(shù)據(jù)集很大的時候梯度下降處理速度會非常緩慢,并且我們也不可能將龐大的訓(xùn)練數(shù)據(jù)集全部一次性地載入到內(nèi)存或顯存中。基于這種情況,我們考慮將大數(shù)據(jù)集分割成小數(shù)據(jù)集,然后對每個小數(shù)據(jù)集進(jìn)行訓(xùn)練,這個訓(xùn)練子集就稱為Mini-batch,這種梯度下降法也叫小批量梯度下降。 在PyTorch中,使用梯度下降法時就是使用Mini-batch來進(jìn)行訓(xùn)練的,例如在之前章節(jié)中介紹使用DataLoader進(jìn)行數(shù)據(jù)的加載與預(yù)處理中,其中的batch_size參數(shù)其實(shí)就是一個Mini-batch的大小。對于一般的梯度下降法而言,一個epoch只能進(jìn)行一次梯度下降,而對于Mini-batch的梯度下降法而言,有多少個Mini-batch,一個epoch就可以進(jìn)行多少次梯度下降。
PyTorch中的常用優(yōu)化器在PyTorch中有專門提供優(yōu)化器的庫——torch.optim,其中實(shí)現(xiàn)了各種優(yōu)化算法,我們可以直接調(diào)用。
SGD隨機(jī)梯度下降算法,除了模型參數(shù)外,還需要設(shè)置學(xué)習(xí)率lr。此外還可以設(shè)置momentum,表示帶有動量的SGD。 optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) SGD的優(yōu)點(diǎn)是梯度計(jì)算快,缺點(diǎn)是隨機(jī)選擇梯度時會引入噪聲,使權(quán)值更新的方向不一定正確,但只要噪聲不是特別大,SGD還是能夠很好地收斂的。此外,帶有動量的SGD也是主要解決噪聲問題以及收斂過程中和正確梯度相比來回?cái)[動比較大的問題。
RMSprop也是一種可以加快梯度下降的算法,可以減小某些維度更新波動較大的情況,使梯度下降的速度更快。RMSprop已經(jīng)被證明是一種有效且實(shí)用的深度神經(jīng)網(wǎng)絡(luò)優(yōu)化算法,在深度學(xué)習(xí)實(shí)用中非常常用。 optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99)
Adam算法的基本思想就是將動量momentum和RMSprop結(jié)合起來形成的一種適用于不同深度學(xué)習(xí)結(jié)構(gòu)的優(yōu)化算法。在Adam中,動量直接并入了梯度-階矩的估計(jì)。Adam算法在實(shí)際操作中也是很常見的。 optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08) Adam( )函數(shù)中l(wèi)r、betas、eps都可以直接使用默認(rèn)值,因此使用起來會更簡單。 方差與偏差偏差度量了學(xué)習(xí)算法的期望預(yù)測與真實(shí)結(jié)果的偏離程序,即刻畫了學(xué)習(xí)算法本身的擬合能力。 方差度量了同樣大小的訓(xùn)練集的變動所導(dǎo)致的學(xué)習(xí)性能的變換,即模型的泛化能力。 正則化利用正則化可以解決高方差的問題,正則化是成本函數(shù)中加入的一項(xiàng)正則化項(xiàng)。
損失函數(shù)基礎(chǔ)上加上權(quán)重參數(shù)的絕對值。 L1正則化
損失函數(shù)基礎(chǔ)上加上權(quán)重參數(shù)的平方和。 L2正則化 需要注意的是,L1正則化相比于L2正則化更容易獲得稀疏解。 |
|
來自: taotao_2016 > 《AI》