梯度優化演算法Adam

2021-08-10 00:21:20 字數 2824 閱讀 6547

最近讀乙個**發現用了乙個梯度更新方法, 剛開始還以為是什麼奇奇怪怪的梯度下降法, 最後分析一下是用一階梯度及其二次冪做的梯度更新。網上搜了一下, 果然就是稱為adam的梯度更新演算法, 全稱是:自適應矩估計(adaptive moment estimation)

國際慣例, 參考博文:

一文看懂各種神經網路優化演算法:從梯度下降到adam方法

adam:一種隨機優化方法

an overview of gradient descent optimization algorithms

梯度下降優化演算法綜述

hinton的神經網路課程第六課

由於參考部落格介紹的很清晰, 我就直接擼公式了:假設t

時刻, 目標函式對於引數的一階導數是gt

,那麼我們可以先計算 mt

vt=β

1mt−

1+(1

−β1)

gt=β

2vt−

1+(1

−β2)

g2t

接下來計算 mt

^=mt

1−βt

1vt^

=vt1

−βt2

最後我們的梯度更新方法就是 θt

+1=θ

t−η⋅

mt^v

t^−−

√+ϵ

注意幾個量,

η 是學習步長, 剩下的三個引數取值的建議是β1

=0.9,β

2=0.999,ϵ

=10−8

, 分母中的

ϵ 是為了防止除零. 其實這個步長的話,一般來說是建議選η=

0.001

之類的, 注意βt

1,βt

2 中的

t 是參與指數運算的

其實再看一下公式,其實就是當前時刻的梯度更新利用了上一時刻的平方梯度vt

的指數衰減均值vt

^ 和上一時刻的梯度mt

的指數衰減均值mt

^ 以下非乙個神經網路的完整實現, 主要在於看看定義網路引數以後怎麼去使用adam去更新每一時刻的梯度, 在theano中的實現方法如下:

先看看神經網路的引數

self.layers = [

self.w0, self.w1, self.w2,

self.b0, self.b1, self.b2]

self.params = sum([layer.params for layer in self.layers], )

然後初始化一開始時候的mt

,vt ,分別對應**中的m0

para

ms,m

1par

ams

self.params = network.params

self.m0params = [theano.shared(np.zeros(p.shape.eval(), dtype=theano.config.floatx), borrow=true) for p in self.params]

self.m1params = [theano.shared(np.zeros(p.shape.eval(), dtype=theano.config.floatx), borrow=true) for p in self.params]

self.t = theano.shared(np.array([1], dtype=theano.config.floatx))

定義目標函式=損失函式+正則項:

cost = self.cost(network, input, output) + network.cost(input)
計算當前梯度

gparams = t.grad(cost, self.params)
計算m0

para

ms,m

1par

ams

m0params = [self.beta1 * m0p + (1-self.beta1) *  gp     for m0p, gp in zip(self.m0params, gparams)]

m1params = [self.beta2 * m1p + (1-self.beta2) * (gp*gp) for m1p, gp in zip(self.m1params, gparams)]

使用adam梯度更新

params = [p - self.alpha * 

((m0p/(1-(self.beta1**self.t[0]))) /

(t.sqrt(m1p/(1-(self.beta2**self.t[0]))) + self.eps))

for p, m0p, m1p in zip(self.params, m0params, m1params)]

然後更新下一時刻網路中的梯度值,m0

para

ms,m1p

aram

s ,t

updates = ([( p,  pn) for  p,  pn in zip(self.params, params)] +

[(m0, m0n) for m0, m0n in zip(self.m0params, m0params)] +

[(m1, m1n) for m1, m1n in zip(self.m1params, m1params)] +

[(self.t, self.t+1)])

Adam優化演算法詳細解析

adam優化演算法是一種對隨機梯度下降法的擴充套件,最近在計算機視覺和自然語言處理中廣泛應用於深度學習應用。在引入該演算法時,openai的diederik kingma和多倫多大學的jimmy ba在他們的2015 iclr發表了一篇名為 adam a method for stochastic ...

優化演算法 3 RMSProp演算法和Adam演算法

rmsprop演算法全稱root mean square prop演算法。從前面的例子可以知道,當我們利用梯度下降法的時候,雖然橫軸也在前進,但縱軸擺動太大。假設縱軸是b橫軸是w,假如我們想減弱b的幅度,加快或者不減少w的前進,rmsprop演算法就可以起到這個作用。其執行過程是這樣的 那麼該演算法...

adam相關的優化器

adam 自出道以來,就一直是最流行的深度學習優化器,哪怕現在其實已經有幾種可能更好用的優化器 如果將 adam 優化出現以來產生的關於優化過程的有趣想法按時間順序排列的話,結果如下 這個來自 andrej karpathy 的笑話或多或少是我深度學習專案的一套流程。除非把具有學習率硬編碼的 直接從...