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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

optimizer

發(fā)布時(shí)間:2023/12/20 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 optimizer 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在很多機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的應(yīng)用中,我們發(fā)現(xiàn)用的最多的優(yōu)化器是 Adam,為什么呢?

下面是 TensorFlow 中的優(yōu)化器,?
https://www.tensorflow.org/api_guides/python/train?

在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等:?
https://keras.io/optimizers/

我們可以發(fā)現(xiàn)除了常見的梯度下降,還有 Adadelta,Adagrad,RMSProp 等幾種優(yōu)化器,都是什么呢,又該怎么選擇呢?

在 Sebastian Ruder 的這篇論文中給出了常用優(yōu)化器的比較,今天來(lái)學(xué)習(xí)一下:?
https://arxiv.org/pdf/1609.04747.pdf

本文將梳理:

  • 每個(gè)算法的梯度更新規(guī)則和缺點(diǎn)
  • 為了應(yīng)對(duì)這個(gè)不足而提出的下一個(gè)算法
  • 超參數(shù)的一般設(shè)定值
  • 幾種算法的效果比較
  • 選擇哪種算法

優(yōu)化器算法簡(jiǎn)述?

首先來(lái)看一下梯度下降最常見的三種變形 BGD,SGD,MBGD,?
這三種形式的區(qū)別就是取決于我們用多少數(shù)據(jù)來(lái)計(jì)算目標(biāo)函數(shù)的梯度,?
這樣的話自然就涉及到一個(gè) trade-off,即參數(shù)更新的準(zhǔn)確率和運(yùn)行時(shí)間。

1. Batch gradient descent
  • 1
  • 2

梯度更新規(guī)則:?
BGD 采用整個(gè)訓(xùn)練集的數(shù)據(jù)來(lái)計(jì)算 cost function 對(duì)參數(shù)的梯度:?

θ=θ?α?θJ(θ)

?

缺點(diǎn):?
由于這種方法是在一次更新中,就對(duì)整個(gè)數(shù)據(jù)集計(jì)算梯度,所以計(jì)算起來(lái)非常慢,遇到很大量的數(shù)據(jù)集也會(huì)非常棘手,而且不能投入新數(shù)據(jù)實(shí)時(shí)更新模型

我們會(huì)事先定義一個(gè)迭代次數(shù) epoch,首先計(jì)算梯度向量 params_grad,然后沿著梯度的方向更新參數(shù) params,learning rate 決定了我們每一步邁多大。

Batch gradient descent 對(duì)于凸函數(shù)可以收斂到全局極小值,對(duì)于非凸函數(shù)可以收斂到局部極小值。

2. Stochastic gradient descent
  • 1
  • 2

梯度更新規(guī)則:?
和 BGD 的一次用所有數(shù)據(jù)計(jì)算梯度相比,SGD 每次更新時(shí)對(duì)每個(gè)樣本進(jìn)行梯度更新, 對(duì)于很大的數(shù)據(jù)集來(lái)說,可能會(huì)有相似的樣本,這樣 BGD 在計(jì)算梯度時(shí)會(huì)出現(xiàn)冗余, 而 SGD 一次只進(jìn)行一次更新,就沒有冗余,而且比較快,并且可以新增樣本。

缺點(diǎn):?
SGD 因?yàn)楦卤容^頻繁,會(huì)造成 cost function 有嚴(yán)重的震蕩,此外SGD對(duì)噪聲比較敏感。

BGD 可以收斂到局部極小值,當(dāng)然 SGD 的震蕩可能會(huì)跳到更好的局部極小值處。

當(dāng)我們稍微減小 learning rate,SGD 和 BGD 的收斂性是一樣的。

3. Mini-batch gradient descent
  • 1
  • 2

梯度更新規(guī)則:?
MBGD 每一次利用一小批樣本,即 n 個(gè)樣本進(jìn)行計(jì)算, 這樣它可以降低參數(shù)更新時(shí)的方差,收斂更穩(wěn)定, 另一方面可以充分地利用深度學(xué)習(xí)庫(kù)中高度優(yōu)化的矩陣操作來(lái)進(jìn)行更有效的梯度計(jì)算。?
和 SGD 的區(qū)別是每一次循環(huán)不是作用于每個(gè)樣本,而是具有 n 個(gè)樣本的Batch。

超參數(shù)設(shè)定值:?
n 一般取值在 50~200

缺點(diǎn):?
Mini-batch gradient descent 不能保證很好的收斂性,

①learning rate 如果選擇的太小,收斂速度會(huì)很慢,如果太大,loss function 就會(huì)在極小值處不停地震蕩甚至偏離。

②有一種措施是先設(shè)定大一點(diǎn)的學(xué)習(xí)率,當(dāng)兩次迭代之間的變化低于某個(gè)閾值后,就減小 learning rate,不過這個(gè)閾值的設(shè)定需要提前寫好,這樣的話就不能夠適應(yīng)數(shù)據(jù)集的特點(diǎn)。此外,這種方法是對(duì)所有參數(shù)更新時(shí)應(yīng)用同樣的 learning rate,如果我們的數(shù)據(jù)是稀疏的,我們更希望對(duì)出現(xiàn)頻率低的特征進(jìn)行大一點(diǎn)的更新

③另外,對(duì)于非凸函數(shù),還要避免陷于局部極小值處,或者鞍點(diǎn)處,因?yàn)榘包c(diǎn)周圍的error 是一樣的,所有維度的梯度都接近于0,SGD 很容易被困在這里。

鞍點(diǎn):一個(gè)光滑函數(shù)的鞍點(diǎn)鄰域的曲線,曲面,或超曲面,都位于這點(diǎn)的切線的不同邊。?
例如這個(gè)二維圖形,像個(gè)馬鞍:在x-軸方向往上曲,在y-軸方向往下曲,鞍點(diǎn)就是(0,0)

為了應(yīng)對(duì)上面的三點(diǎn)挑戰(zhàn)就有了下面這些算法。

[應(yīng)對(duì)挑戰(zhàn) 1]

4. Momentum(動(dòng)量法)
  • 1
  • 2

SGD 在?ravines?的情況下容易被困住,?ravines就是曲面的一個(gè)方向比另一個(gè)方向更陡,這時(shí) SGD 會(huì)發(fā)生震蕩而遲遲不能接近極小值:

梯度更新規(guī)則:?
Momentum 通過加入?γvt?1?,可以加速 SGD, 并且抑制震蕩?

vt=γvt?1+α?θJ(θ)

?

θ=θ?vt


當(dāng)我們將一個(gè)小球從山上滾下來(lái)時(shí),沒有阻力的話,它的動(dòng)量會(huì)越來(lái)越大,但是如果遇到了阻力,速度就會(huì)變小。?
加入的這一項(xiàng),可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂并減小震蕩。

?

超參數(shù)設(shè)定值:?
一般?γ取值 0.9 左右。

缺點(diǎn):?
這種情況相當(dāng)于小球從山上滾下來(lái)時(shí)是在盲目地沿著坡滾,如果它能具備一些先知,例如快要上坡時(shí),就知道需要減速了的話,適應(yīng)性會(huì)更好。

5. Nesterov accelerated gradient(NAG)
  • 1
  • 2

梯度更新規(guī)則:?
用?θ?γvt?1來(lái)近似當(dāng)做參數(shù)下一步會(huì)變成的值,則在計(jì)算梯度時(shí),不是在當(dāng)前位置,而是未來(lái)的位置上?

vt=γvt?1+α?θJ(θ?γvt?1)


θ=θ?vt


超參數(shù)設(shè)定值:?
γ仍然取值 0.9 左右。

?

效果比較:?

藍(lán)色是 Momentum 的過程,會(huì)先計(jì)算當(dāng)前的梯度,然后在更新后的累積梯度后會(huì)有一個(gè)大的跳躍。?
而 NAG 會(huì)先在前一步的累積梯度上(brown vector)有一個(gè)大的跳躍,然后衡量一下梯度做一下修正(red vector),這種預(yù)期的更新可以避免我們走的太快。

NAG 可以使 RNN 在很多任務(wù)上有更好的表現(xiàn)。

目前為止,我們可以做到,在更新梯度時(shí)順應(yīng) loss function 的梯度來(lái)調(diào)整速度,并且對(duì) SGD 進(jìn)行加速。

我們還希望可以根據(jù)參數(shù)的重要性而對(duì)不同的參數(shù)進(jìn)行不同程度的更新。

[應(yīng)對(duì)挑戰(zhàn) 2]

6. Adagrad
  • 1
  • 2

這個(gè)算法就可以對(duì)低頻的參數(shù)做較大的更新,對(duì)高頻的做較小的更新,也因此,對(duì)于稀疏的數(shù)據(jù)它的表現(xiàn)很好,很好地提高了 SGD 的魯棒性,例如識(shí)別 Youtube 視頻里面的貓,訓(xùn)練 GloVe word embeddings,因?yàn)樗鼈兌际切枰诘皖l的特征上有更大的更新。

梯度更新規(guī)則:?

θt+1,i=θt,i?αGt,ii+????????√gt,i

?

其中gt,i為:t 時(shí)刻參數(shù)?θi的梯度;Gt是個(gè)對(duì)角矩陣, (i,i) 元素就是 t 時(shí)刻參數(shù)?θi?的梯度gt,i的平方和。

Adagrad 的優(yōu)點(diǎn)是減少了學(xué)習(xí)率的手動(dòng)調(diào)節(jié)

超參數(shù)設(shè)定值:?
一般 η 就取 0.01。

缺點(diǎn):?
它的缺點(diǎn)是分母會(huì)不斷積累,這樣學(xué)習(xí)率就會(huì)收縮并最終會(huì)變得非常小。

7. Adadelta
  • 1
  • 2

這個(gè)算法是對(duì) Adagrad 的改進(jìn),?

Δθt=?αE[g2]t+?????????√gt


和 Adagrad 相比,就是分母的G換成了過去的梯度平方E[g2]t的衰減平均值。

?

這個(gè)分母相當(dāng)于梯度的均方根?root mean squared (RMS) ,所以可以用 RMS 簡(jiǎn)寫:?

Δθt=?αRMS[g]tgt

?

其中 E 的計(jì)算公式如下,t 時(shí)刻的依賴于前一時(shí)刻的平均和當(dāng)前的梯度:

?

E[g2]t=γE[g2]t?1+(1?γ)g2t

?

梯度更新規(guī)則:

此外,還將學(xué)習(xí)率?α換成了?RMS[Δθ],這樣的話,我們甚至都不需要提前設(shè)定學(xué)習(xí)率了:?

超參數(shù)設(shè)定值:?
γ 一般設(shè)定為 0.9,

7. RMSprop
  • 1
  • 2

RMSprop 是 Geoff Hinton 提出的一種自適應(yīng)學(xué)習(xí)率方法。

RMSprop 和 Adadelta 都是為了解決 Adagrad 學(xué)習(xí)率急劇下降問題的。

梯度更新規(guī)則:?
RMSprop 與 Adadelta 的第一種形式相同:?

E[g2]t=0.9E[g2]t?1+0.1g2t


θt+1=θt?αE[g2]t+?????????√gt

?

超參數(shù)設(shè)定值:?
Hinton 建議設(shè)定?γ為 0.9, 學(xué)習(xí)率?α為 0.001。

8. Adam
  • 1
  • 2

這個(gè)算法是另一種計(jì)算每個(gè)參數(shù)的自適應(yīng)學(xué)習(xí)率的方法。目前在DL領(lǐng)域,是最常見的優(yōu)化器。

除了像 Adadelta 和 RMSprop 一樣存儲(chǔ)了過去梯度的平方?vt?的指數(shù)衰減平均值 ,也像 momentum 一樣保持了過去梯度?mt的指數(shù)衰減平均值:?

如果?mt和?vt?被初始化為 0 向量,那它們就會(huì)向 0 偏置,所以做了偏差校正,?
通過計(jì)算偏差校正后的 mt 和 vt 來(lái)抵消這些偏差:?

梯度更新規(guī)則:?

θt+1=θt?αvt+??????√mt

?

超參數(shù)設(shè)定值:?
建議 β1 = 0.9,β2 = 0.999,? = 10e?8

實(shí)踐表明,Adam 比其他適應(yīng)性學(xué)習(xí)方法效果要好。

效果比較?

下面看一下幾種算法在鞍點(diǎn)和等高線上的表現(xiàn):?
?
?
上面兩種情況都可以看出,Adagrad, Adadelta, RMSprop 幾乎很快就找到了正確的方向并前進(jìn),收斂速度也相當(dāng)快,而其它方法要么很慢,要么走了很多彎路才找到。

由圖可知自適應(yīng)學(xué)習(xí)率方法即 Adagrad, Adadelta, RMSprop, Adam 在這種情景下會(huì)更合適而且收斂性更好。

如何選擇?

如果數(shù)據(jù)是稀疏的,就用自適應(yīng)方法,即 Adagrad, Adadelta, RMSprop, Adam。

RMSprop, Adadelta, Adam 在很多情況下的效果是相似的。

Adam 就是在 RMSprop 的基礎(chǔ)上加了 bias-correction 和 momentum。

隨著梯度變的稀疏,Adam 比 RMSprop 效果會(huì)好。

整體來(lái)講,Adam 是最好的選擇。

很多論文里都會(huì)用 SGD,沒有 momentum 等。SGD 雖然能達(dá)到極小值,但是比其它算法用的時(shí)間長(zhǎng),而且可能會(huì)被困在鞍點(diǎn)。

如果需要更快的收斂,或者是訓(xùn)練更深更復(fù)雜的神經(jīng)網(wǎng)絡(luò),需要用一種自適應(yīng)的算法。

參考:

http://sebastianruder.com/optimizing-gradient-descent/index.html#fn:24?
http://www.redcedartech.com/pdfs/Select_Optimization_Method.pdf?
https://stats.stackexchange.com/questions/55247/how-to-choose-the-right-optimization-algorithm

轉(zhuǎn)載于:https://www.cnblogs.com/alexanderkun/p/8099701.html

總結(jié)

以上是生活随笔為你收集整理的optimizer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。