cs231n學(xué)習(xí)之參數(shù)更新(6)

前言

本文旨在學(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ù)猛铅。一般格式為x^{*}=argminf(x);
    梯度下降:對(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)為\epsilon,則此時(shí)將下降\epsilon;
    . 如果二階導(dǎo)數(shù)為正數(shù)汰瘫,函數(shù)曲線向下凹陷狂打,實(shí)際下降比\epsilon要少,比預(yù)期要下降慢混弥;
    . 如果二階導(dǎo)數(shù)為負(fù)數(shù)趴乡,函數(shù)曲線向上凹陷,實(shí)際下降比\epsilon要多蝗拿,比預(yù)期要下降快晾捏;
  • Hessian矩陣:一個(gè)多元函數(shù)的二階導(dǎo)數(shù)構(gòu)成的方陣
    Hessian矩陣是實(shí)對(duì)稱的,可以將其分解為一組實(shí)特征值和一組特征向量的正交基蛹磺。特定方向d上的二階導(dǎo)數(shù)可以寫(xiě)成d^THd,當(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)x_{0}的近似二階泰勒級(jí)數(shù):f(x)\approx f(x_{0})+(x-x_{0})g+1/2(x-x_{0})^{2}H(x-x_{0})俗或,其中g(shù)為梯度,H是x_{0}的Hessian值岁忘。
如果使用學(xué)習(xí)率\epsilon辛慰,則新的點(diǎn)為x_{0}- g\epsilon,帶入二階泰勒級(jí)數(shù)的近似干像,可以得到:
f(x_{0}-g\epsilon)\approx f(x_{0})-g^{T}g\epsilon +1/2\epsilon^{2}g^{T}Hg
上式三項(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ì)在\epsilon大的時(shí)候也保持準(zhǔn)確岔擂。所以當(dāng)g^{T}Hg為正時(shí),通過(guò)計(jì)算浪耘,使近似的泰勒級(jí)數(shù)下降的最多最優(yōu)步長(zhǎng)為:
\epsilon^{*}=\frac{g^{T}g}{g^{T}Hg}
最壞情況下乱灵,g與H最大特征值對(duì)應(yīng)的特征向量對(duì)齊,最優(yōu)步長(zhǎng)為\frac{1}{最大特征值}七冲。
二階導(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ì)不明顯剧蹂。

image.png

一、SGD

標(biāo)準(zhǔn)的SGD更新策略:
X = X-lr*dx
SGD的缺點(diǎn)

  1. 優(yōu)化效率低
    如果損失在一個(gè)方向上變換的較快而在另一方向上變換的較慢烦却,它的梯度非常緩慢在慢的那個(gè)方向上宠叼,而在快的方向上抖動(dòng)劇烈。這是因?yàn)樘荻鹊姆较虿](méi)有指定最小值的方向其爵,梯度不知道網(wǎng)那個(gè)方向去下降冒冬,是病態(tài)的變換伸蚯;
    cs231課件截圖.png
  2. 難以跳出局部最小值或鞍點(diǎn)
    因?yàn)楦虏呗灾豢紤]了梯度,在局部最小值和鞍點(diǎn)的梯度都為0简烤,此時(shí)梯度下降將停滯不前剂邮;
  3. mini-batch容易引入噪聲
    對(duì)m個(gè)訓(xùn)練樣本的隨機(jī)采樣,其梯度并不會(huì)在極小點(diǎn)消失乐埠。而且隨機(jī)采樣的點(diǎn)并不能代表全局?jǐn)?shù)據(jù)集抗斤。

二、帶動(dòng)量的SGD

momentum動(dòng)量

v=\alpha v-lr*g
\theta = \theta+v
之前一般的SGD優(yōu)化只考慮了梯度丈咐,步長(zhǎng)只跟梯度和學(xué)習(xí)率有關(guān)瑞眼;現(xiàn)在,步長(zhǎng)需要考慮梯度序列的大小和排序棵逊,當(dāng)很多梯度指向相同的方向的時(shí)候伤疙,步長(zhǎng)最大,速度一直在-g方向一直加速辆影,直到最大速度徒像,步長(zhǎng)大小為:
\frac{lr*||g||}{1-\alpha}

image.png

對(duì)一個(gè)方向梯度較大和一個(gè)方向梯度較小的情況下,采用普通的SGD會(huì)很震蕩蛙讥,采用帶momentum的SGD會(huì)緩和這種情況锯蛀,因?yàn)樵谔荻容^小的那個(gè)方向一些在累積梯度,而另外方向雖然梯度很大次慢,但是一直震蕩旁涤,累加起來(lái)就變小了,所以會(huì)更快的向最小點(diǎn)靠近迫像。
image.png

Nesterov動(dòng)量

v_{t+1} = \alpha*v_{t}-lr\bigtriangledown f(x_{t}+\alpha v_{t})
x_{t+1}=x_{t}+v_{t+1}

image.png

\hat x_{t}=x_{t}+\alpha v_{t},則有
v_{t+1}=\alpha*v_{t}-lr\bigtriangledown f(\hat x_{t})
\hat x_{t+1}=x_{t+1}+\alpha v_{t+1}=x_t+v_{t+1}+\alpha v_{t+1}
\hat x_{t+1}=x_t+v_{t+1}+\alpha v_{t+1}+\alpha v_{t}-\alpha v_{t}=\hat x_{t}+v_{t+1}+\alpha (v_{t+1}-v_{t})
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í)率.
h = h+grad*grad
w=w-lr\frac{1}{\sqrt h}grad
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ò)去的梯度。
h =\alpha h+(1-\alpha )grad*grad
w=w-lr\frac{1}{\sqrt h}grad
另外稚叹,使用Nesterov動(dòng)量的RMSProp可以描述為:
grad = \bigtriangledown f(w_{t}+\alpha v_{t})
h =\alpha h+(1-\alpha )grad*grad
v_{t+1} = \alpha*v_{t}-\frac {lr}{\sqrt {h}}*grad)
w_{t+1}=w_{t}+v_{t+1}

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é)合
t = t+1
s=\beta_{1} s+(1-\beta_{1})grad
r =\beta_{2} s+(1-\beta_{2})grad *grad
\hat s = \frac{s}{1-\beta_{1}^t}修正
\hat r = \frac{r}{1-\beta_{2}^t}
w=w-lr*\frac{\hat s}{\sqrt{\hat r}}+eps
以下代碼未寫(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é)果


loss.png

train accuracy.png

valid accuracy.png

總結(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ù)飒泻。

參考

  1. cs231課件
  2. 花書(shū)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鞭光,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泞遗,更是在濱河造成了極大的恐慌惰许,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件史辙,死亡現(xiàn)場(chǎng)離奇詭異汹买,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)髓霞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)卦睹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人方库,你說(shuō)我怎么就攤上這事结序。” “怎么了纵潦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵徐鹤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我邀层,道長(zhǎng)返敬,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任寥院,我火速辦了婚禮劲赠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己凛澎,他們只是感情好霹肝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著塑煎,像睡著了一般沫换。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上最铁,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天讯赏,我揣著相機(jī)與錄音,去河邊找鬼冷尉。 笑死漱挎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的网严。 我是一名探鬼主播识樱,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼震束!你這毒婦竟也來(lái)了怜庸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤垢村,失蹤者是張志新(化名)和其女友劉穎割疾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嘉栓,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宏榕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侵佃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麻昼。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖馋辈,靈堂內(nèi)的尸體忽然破棺而出抚芦,到底是詐尸還是另有隱情,我是刑警寧澤迈螟,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布叉抡,位于F島的核電站,受9級(jí)特大地震影響答毫,放射性物質(zhì)發(fā)生泄漏褥民。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一洗搂、第九天 我趴在偏房一處隱蔽的房頂上張望消返。 院中可真熱鬧载弄,春花似錦、人聲如沸侦副。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秦驯。三九已至,卻和暖如春挣棕,著一層夾襖步出監(jiān)牢的瞬間译隘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工洛心, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留固耘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓词身,卻偏偏與公主長(zhǎng)得像厅目,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子法严,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容