前言
本文旨在學(xué)習(xí)和記錄温数,如需轉(zhuǎn)載涯呻,請(qǐng)附出處http://www.reibang.com/p/7b00149dc797
參數(shù)更新
神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的目標(biāo)是找到一組使損失函數(shù)盡可能小的參數(shù)溢豆,這個(gè)過(guò)程一般稱作最優(yōu)化問(wèn)題蔼两。
一般計(jì)算參數(shù)的梯度來(lái)更新參數(shù),沿著梯度的方向進(jìn)行參數(shù)更新栗弟,然后重復(fù)多次吐葵,直到收斂规揪,這個(gè)最基礎(chǔ)的參數(shù)更新方法叫做隨機(jī)梯度下降(stochastic gradient descent, SGD)
-
基于梯度的優(yōu)化方法
目標(biāo)函數(shù):最小化或最大化的函數(shù),通常也稱損失函數(shù)温峭、誤差函數(shù)猛铅。一般格式為;
梯度下降:對(duì)誤差函數(shù)求導(dǎo),往其導(dǎo)數(shù)的反方向移動(dòng)一小步來(lái)減小誤差函數(shù)诚镰;
局部極小點(diǎn):臨界點(diǎn)小于周?chē)械呐R近點(diǎn)奕坟,不可能通過(guò)無(wú)窮小的步長(zhǎng)來(lái)減小f(x);
局部極大點(diǎn):與局部極小點(diǎn)相反祥款;
鞍點(diǎn):臨界點(diǎn)既不是最小也不是最大;
在深度學(xué)習(xí)中月杉,優(yōu)化的函數(shù)可能不是非凸的刃跛,很可能存在許多全局極小點(diǎn)或者鞍點(diǎn)時(shí),優(yōu)化算法可能無(wú)法找到全局最小點(diǎn)苛萎;但是即使找到的不是全局最小點(diǎn)桨昙,他找到的局部極小點(diǎn)對(duì)應(yīng)于誤差函數(shù)顯著低的值,通常代表網(wǎng)絡(luò)收斂了腌歉。 -
導(dǎo)數(shù)的導(dǎo)數(shù)
一階導(dǎo)數(shù)隨輸入的變化蛙酪,也叫二階導(dǎo)數(shù),可以衡量曲率
. 如果二階導(dǎo)數(shù)為0翘盖,即沒(méi)有曲率桂塞,就是平坦的線,用梯度就可以預(yù)測(cè)值馍驯,如果梯度為1阁危,步長(zhǎng)為,則此時(shí)將下降
;
. 如果二階導(dǎo)數(shù)為正數(shù)汰瘫,函數(shù)曲線向下凹陷狂打,實(shí)際下降比要少,比預(yù)期要下降慢混弥;
. 如果二階導(dǎo)數(shù)為負(fù)數(shù)趴乡,函數(shù)曲線向上凹陷,實(shí)際下降比要多蝗拿,比預(yù)期要下降快晾捏;
-
Hessian矩陣:一個(gè)多元函數(shù)的二階導(dǎo)數(shù)構(gòu)成的方陣
Hessian矩陣是實(shí)對(duì)稱的,可以將其分解為一組實(shí)特征值和一組特征向量的正交基蛹磺。特定方向d上的二階導(dǎo)數(shù)可以寫(xiě)成,當(dāng)d是H的一個(gè)特征向量時(shí)粟瞬,這個(gè)方向的二階導(dǎo)數(shù)就是對(duì)應(yīng)的特征值;對(duì)于其他方向的二階導(dǎo)數(shù)可以寫(xiě)成所以特征值的加權(quán)平均萤捆,且與d夾角越小的特征向量的權(quán)重越來(lái)越大。最大特征值確定為最大二階導(dǎo)數(shù)俗批。
f(x)在當(dāng)前點(diǎn)的近似二階泰勒級(jí)數(shù):
俗或,其中g(shù)為梯度,H是
的Hessian值岁忘。
如果使用學(xué)習(xí)率辛慰,則新的點(diǎn)為
,帶入二階泰勒級(jí)數(shù)的近似干像,可以得到:
上式三項(xiàng)分別為:函數(shù)的原始值帅腌、函數(shù)梯度導(dǎo)致的預(yù)期更新和函數(shù)曲率帶來(lái)的校正驰弄。當(dāng)最后一項(xiàng)較大的時(shí)候,梯度下降有可能是上升的速客。當(dāng)?shù)谌?xiàng)為0或者負(fù)數(shù)時(shí)戚篙,近似的泰勒展開(kāi)表明梯度下降將一直下降。在實(shí)際情況上溺职,泰勒級(jí)數(shù)不會(huì)在大的時(shí)候也保持準(zhǔn)確岔擂。所以當(dāng)
為正時(shí),通過(guò)計(jì)算浪耘,使近似的泰勒級(jí)數(shù)下降的最多最優(yōu)步長(zhǎng)為:
最壞情況下乱灵,g與H最大特征值對(duì)應(yīng)的特征向量對(duì)齊,最優(yōu)步長(zhǎng)為七冲。
二階導(dǎo)數(shù)的另一個(gè)作用:
二階導(dǎo)數(shù)測(cè)試:確定一個(gè)臨界點(diǎn)是否為局部極大值痛倚、局部極小值或者鞍點(diǎn)。
. 臨界點(diǎn)導(dǎo)數(shù)都為0澜躺,如果其二階導(dǎo)數(shù)大于0意味著導(dǎo)數(shù)隨著右移動(dòng)越來(lái)越大状原,則為局部極小值;
. 臨界點(diǎn)導(dǎo)數(shù)都為0苗踪,如果其二階導(dǎo)數(shù)小于0意味著導(dǎo)數(shù)隨著右移動(dòng)越來(lái)越小颠区,則為局部極大值;
. 臨界點(diǎn)的二階導(dǎo)數(shù)為0通铲,無(wú)法確定毕莱,鞍點(diǎn)或者平坦區(qū)域。
擴(kuò)展到多維情況下颅夺,單個(gè)點(diǎn)上每個(gè)方向的二階導(dǎo)數(shù)是不同的朋截,Hessian矩陣的條件數(shù)會(huì)影響梯度下降,一個(gè)方向上導(dǎo)數(shù)增加的很快吧黄,另一方向卻很慢部服,梯度下降無(wú)法判斷這種變化,病態(tài)的條件會(huì)難以選擇合適的步
長(zhǎng)拗慨。步長(zhǎng)不能太大廓八,以免沖過(guò)了最小而具有較強(qiáng)正曲率方向上升;而且這步長(zhǎng)太小赵抢,在其他較小曲率上進(jìn)展會(huì)不明顯剧蹂。
一、SGD
標(biāo)準(zhǔn)的SGD更新策略:
SGD的缺點(diǎn):
-
優(yōu)化效率低
如果損失在一個(gè)方向上變換的較快而在另一方向上變換的較慢烦却,它的梯度非常緩慢在慢的那個(gè)方向上宠叼,而在快的方向上抖動(dòng)劇烈。這是因?yàn)樘荻鹊姆较虿](méi)有指定最小值的方向其爵,梯度不知道網(wǎng)那個(gè)方向去下降冒冬,是病態(tài)的變換伸蚯;
cs231課件截圖.png -
難以跳出局部最小值或鞍點(diǎn)
因?yàn)楦虏呗灾豢紤]了梯度,在局部最小值和鞍點(diǎn)的梯度都為0简烤,此時(shí)梯度下降將停滯不前剂邮; -
mini-batch容易引入噪聲
對(duì)m個(gè)訓(xùn)練樣本的隨機(jī)采樣,其梯度并不會(huì)在極小點(diǎn)消失乐埠。而且隨機(jī)采樣的點(diǎn)并不能代表全局?jǐn)?shù)據(jù)集抗斤。
二、帶動(dòng)量的SGD
momentum動(dòng)量
之前一般的SGD優(yōu)化只考慮了梯度丈咐,步長(zhǎng)只跟梯度和學(xué)習(xí)率有關(guān)瑞眼;現(xiàn)在,步長(zhǎng)需要考慮梯度序列的大小和排序棵逊,當(dāng)很多梯度指向相同的方向的時(shí)候伤疙,步長(zhǎng)最大,速度一直在-g方向一直加速辆影,直到最大速度徒像,步長(zhǎng)大小為:
對(duì)一個(gè)方向梯度較大和一個(gè)方向梯度較小的情況下,采用普通的SGD會(huì)很震蕩蛙讥,采用帶momentum的SGD會(huì)緩和這種情況锯蛀,因?yàn)樵谔荻容^小的那個(gè)方向一些在累積梯度,而另外方向雖然梯度很大次慢,但是一直震蕩旁涤,累加起來(lái)就變小了,所以會(huì)更快的向最小點(diǎn)靠近迫像。
Nesterov動(dòng)量
令,則有
Nesterov動(dòng)量和momentum動(dòng)量之間的區(qū)別就在于計(jì)算梯度上劈愚。Nesterov動(dòng)量中,梯度計(jì)算在施加當(dāng)前速度之后闻妓,相當(dāng)于momentum動(dòng)量上添加了校正因子菌羽。利用速度更新把loss帶到一定地方再計(jì)算梯度,然后混合速度得到實(shí)際的更新方向由缆。
三注祖、AdaGrad
AdaGrad算法為每個(gè)參數(shù)自適應(yīng)的調(diào)整學(xué)習(xí)率.
AdaGrad保存了以前所有梯度的平方和,在更新參數(shù)時(shí)犁功,除以了所有梯度平方和的根號(hào)氓轰,調(diào)整學(xué)習(xí)的尺度。對(duì)于變化較大的參數(shù)的學(xué)習(xí)率將變小浸卦,變化小的參數(shù)將會(huì)得到加速。
但是案糙,如果一直學(xué)習(xí)下去限嫌,其梯度將為為0
四靴庆、RMSProp
RMSProp是改進(jìn)的AdaGrad優(yōu)化算法,它在計(jì)算梯度平方和時(shí)采用了加權(quán)怒医,指數(shù)衰減平方來(lái)計(jì)算炉抒,逐步遺忘過(guò)去的梯度。
另外稚叹,使用Nesterov動(dòng)量的RMSProp可以描述為:
def rmsprop(w, dw, config=None):
"""
Uses the RMSProp update rule, which uses a moving average of squared
gradient values to set adaptive per-parameter learning rates.
config format:
- learning_rate: Scalar learning rate.
- decay_rate: Scalar between 0 and 1 giving the decay rate for the squared
gradient cache.
- epsilon: Small scalar used for smoothing to avoid dividing by zero.
- cache: Moving average of second moments of gradients.
"""
if config is None: config = {}
config.setdefault('learning_rate', 1e-2)
config.setdefault('decay_rate', 0.99)
config.setdefault('epsilon', 1e-8)
config.setdefault('cache', np.zeros_like(w))
next_w = None
config['cache'] = config['decay_rate']*config['cache']+(1-config['decay_rate'])*dw*dw
next_w = w-config['learning_rate']*dw/(np.sqrt(config['cache'])+1e-7)
return next_w, config
五焰薄、Adam
Adam算法是AdaGrad/RMSProp和動(dòng)量方法的結(jié)合
修正
以下代碼未寫(xiě)修正。
def adam(w, dw, config=None):
"""
Uses the Adam update rule, which incorporates moving averages of both the
gradient and its square and a bias correction term.
config format:
- learning_rate: Scalar learning rate.
- beta1: Decay rate for moving average of first moment of gradient.
- beta2: Decay rate for moving average of second moment of gradient.
- epsilon: Small scalar used for smoothing to avoid dividing by zero.
- m: Moving average of gradient.
- v: Moving average of squared gradient.
- t: Iteration number.
"""
if config is None: config = {}
config.setdefault('learning_rate', 1e-3)
config.setdefault('beta1', 0.9)
config.setdefault('beta2', 0.999)
config.setdefault('epsilon', 1e-8)
config.setdefault('m', np.zeros_like(w))
config.setdefault('v', np.zeros_like(w))
config.setdefault('t', 0)
next_w = None
config['m'] = config['m']*config['beta1']+(1-config['beta1'])*dw
config['v'] = config['v']*config['beta2']+(1-config['beta2'])*dw*dw
next_w = w - config['learning_rate']*config['m']/(np.sqrt(config['v']+config['epsilon']))
return next_w, config
實(shí)驗(yàn)結(jié)果
總結(jié)
現(xiàn)在常用的優(yōu)化算法有SGD扒袖,帶動(dòng)量的SGD(momentum/Nesterov),AdaGrad,RMSProp,Adam塞茅。其中,后三種是自適應(yīng)學(xué)習(xí)率算法季率,這幾種都是比較常用的野瘦,目前并沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)說(shuō)哪一個(gè)算法更好,一般使用時(shí)都取決于是否對(duì)該方法比較熟悉或者以便調(diào)節(jié)超參數(shù)飒泻。