<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          注意!這個(gè)小球開(kāi)始下山了

          共 4697字,需瀏覽 10分鐘

           ·

          2024-05-23 09:00



            新智元報(bào)道  

          編輯:alan
          【新智元導(dǎo)讀】4年前的開(kāi)源項(xiàng)目突然在Hacker News爆火,通過(guò)可視化的「小球下山」,幫助非專業(yè)和專業(yè)人士,更好地理解AI訓(xùn)練中梯度下降的過(guò)程。

          近日,一個(gè)4年前的開(kāi)源項(xiàng)目穿越了時(shí)空,突然爆火!

          畢業(yè)于哈佛,前Quora數(shù)據(jù)科學(xué)主管,現(xiàn)工作于Waymo的Lili Jiang,在20年初編寫(xiě)了一個(gè)軟件,

          通過(guò)可視化的「小球下山」,幫助非專業(yè)和專業(yè)人士,更好地理解AI訓(xùn)練中梯度下降的過(guò)程。

          軟件名為Gradient Descent Viz,囊括了當(dāng)下最常見(jiàn)的5種梯度下降算法:Vanilla Gradient Descent、Momentum、AdaGrad、RMSProp和Adam。

          你可以選擇不同的曲面,并發(fā)現(xiàn)Adam和RMSProp可以更好地處理鞍點(diǎn):

          可以調(diào)整參數(shù),并發(fā)現(xiàn)學(xué)習(xí)率低時(shí),動(dòng)量法不足以推動(dòng)小球通過(guò)平坦區(qū)域,而提高學(xué)習(xí)率可以解決問(wèn)題。

          可以觀看分步動(dòng)畫(huà),直觀地了解每種方法的計(jì)算過(guò)程,比如動(dòng)量下降的內(nèi)部工作原理:

          可以使用可視元素來(lái)跟蹤梯度、動(dòng)量、梯度平方和等數(shù)據(jù),比如下圖中的兩片灰色代表兩個(gè)方向上的梯度平方和:

          可以繪制下降路徑,以了解不同的算法如何以不同的方式到達(dá)目的地:

          項(xiàng)目地址:https://github.com/lilipads/gradient_descent_viz

          OK,介紹完畢,下面上點(diǎn)硬菜,結(jié)合大佬給出的可視化展示,解釋一下梯度下降的幾種優(yōu)化算法的原理。

          (小編水平有限,如有失誤,煩請(qǐng)諸位指正)

          AI訓(xùn)練的本質(zhì):從小球下山開(kāi)始

          眾所周知,AI訓(xùn)練的目標(biāo)是讓預(yù)測(cè)值盡可能接近真實(shí)值。

          可以按照某種方式,定義預(yù)測(cè)值和真實(shí)值之間的誤差,也就是損失函數(shù),比如最常用的交叉熵?fù)p失函數(shù)。

          要讓誤差最小,也就是求損失函數(shù)的最小值。

          為此,我們需要一個(gè)好的算法來(lái)快速可靠地找到全局最小值(不會(huì)卡在局部最小值或者鞍點(diǎn))。

          梯度下降

          真實(shí)的神經(jīng)網(wǎng)絡(luò)中,參數(shù)千千萬(wàn),不過(guò)我們?nèi)祟悾òㄐ【帲┮话闱闆r下只能感知3維的事物,

          所以,下面先用兩個(gè)參數(shù)x,y對(duì)應(yīng)的損失函數(shù)Z來(lái)理解這個(gè)問(wèn)題。

          下面的曲面表示損失函數(shù)Z(x,y):

          在這種情況下,我們可以使用「一眼看出」大法,馬上發(fā)現(xiàn)曲面最低點(diǎn)的位置(也就是損失函數(shù)的最小值),——但計(jì)算機(jī)程序不能。

          人眼可以看到整個(gè)曲面,而算法只能一步步進(jìn)行探索,就像拿著手電筒在黑暗中行走。

          如上圖中的演示,算法需要每次找到一個(gè)最佳的前進(jìn)(下降)方向,然后移動(dòng)一段距離,——這個(gè)最佳的方向就是梯度(函數(shù)對(duì)每個(gè)參數(shù)的偏導(dǎo))。

          根據(jù)我們小學(xué)二年級(jí)學(xué)過(guò)的知識(shí),當(dāng)二元函數(shù)Z在(x,y)點(diǎn)可微時(shí),函數(shù)值變化量可以寫(xiě)成:

          改寫(xiě)成向量?jī)?nèi)積的形式就是:

          我們需要讓函數(shù)值下降得越快越好,那么x和y的改變方向,就應(yīng)該和梯度(兩個(gè)偏導(dǎo))的方向相反,——即向量方向相反,內(nèi)積最小:

          這就是「梯度下降」的意義,梯度前面的系數(shù)是我們熟悉的學(xué)習(xí)率,用來(lái)控制每次移動(dòng)的步長(zhǎng),步子太小訓(xùn)練慢、步子大了容易扯著蛋。

          如果我們「深入淺出」,把問(wèn)題退化到一元函數(shù),就是下面這個(gè)樣子:

          當(dāng)然了,最原始的梯度下降算法,需要對(duì)網(wǎng)絡(luò)中所有參數(shù)求偏導(dǎo)再求和,計(jì)算量相當(dāng)大。

          我們現(xiàn)在用的梯度下降算法,一般指的是隨機(jī)梯度下降(Stochastic Gradient Descent,SGD),表示每次迭代只隨機(jī)使用一個(gè)樣本或一個(gè)小批量(mini-batch)來(lái)計(jì)算梯度。

          動(dòng)量法

          當(dāng)我們使用梯度下降的時(shí)候,可能會(huì)遇到下圖中這種問(wèn)題:

          代表梯度下降的紅線在尋找極值的過(guò)程中振蕩比較嚴(yán)重,相應(yīng)的也需要更多的步數(shù)才能收斂。

          這是因?yàn)槊總€(gè)點(diǎn)的梯度可能和最終的方向差別比較大,——為了解決這個(gè)問(wèn)題,科學(xué)家們提出了動(dòng)量法,也就是下圖中藍(lán)線的路徑。

          動(dòng)量法的思想就是把歷史的梯度也考慮進(jìn)來(lái),用整體的趨勢(shì)讓路徑變得更加平滑。

          另一種簡(jiǎn)單理解就是,振蕩來(lái)自于前后兩點(diǎn)梯度的垂直分量方向相反。作為矯正,當(dāng)我們遇到這種反向的情況時(shí),可以將當(dāng)前的垂直分量減小一點(diǎn)。

          而前后兩點(diǎn)梯度的水平分量是同向的,所以可以將當(dāng)前的水平分量增大一點(diǎn)。

          ——把過(guò)去的梯度按照一定比例加到當(dāng)前梯度,正好可以滿足這兩點(diǎn)。

          動(dòng)量法可以用公式表示為:

          delta = - learning_rate * gradient + previous_delta * decay_rate

          或者突出累積梯度的概念,表示為:

          sum_of_gradient = gradient + previous_sum_of_gradient * decay_rate

          delta = -learning_rate * sum_of_gradient

          兩個(gè)公式是一樣的,其中衰減率decay_rate,控制歷史梯度信息進(jìn)入的比例,一般情況下設(shè)置為0.8-0.9。

          另外,這個(gè)公式是一個(gè)遞歸的表示,所以距離當(dāng)前時(shí)刻越遠(yuǎn)的梯度會(huì)被decay_rate衰減得越多(指數(shù)級(jí)),

          這樣既保證了整體的趨勢(shì),又不會(huì)過(guò)多的被遙遠(yuǎn)的梯度所干擾。

          我們可以利用本文的開(kāi)源軟件形象地了解動(dòng)量法,以及其中參數(shù)的意義,比如當(dāng)decay_rate為0時(shí),就與普通的梯度下降完全相同;

          而當(dāng)decay_rate = 1時(shí),小球就像在沒(méi)有摩擦的碗中那樣,孤獨(dú)搖擺,永無(wú)休止。

          下圖中,普通梯度下降和動(dòng)量法在軟件中PK了一把:

          可以看出,Momentum相比于Vanilla Gradient Descent有兩個(gè)明顯優(yōu)勢(shì):

          1.積累了過(guò)去的動(dòng)量,所以跑得快;

          2.動(dòng)量法有機(jī)會(huì)逃脫局部最小值(也是因?yàn)閬?lái)自過(guò)去的力量把它推了出去)

          AdaGrad

          前面我們提到了學(xué)習(xí)率的問(wèn)題,學(xué)習(xí)率設(shè)置過(guò)大或過(guò)小都會(huì)出問(wèn)題。

          在實(shí)際訓(xùn)練中,學(xué)習(xí)率一般會(huì)人為設(shè)定在迭代中不斷衰減,使得開(kāi)始時(shí)可以快速深入,然后逐漸減慢速度,仔細(xì)探索。心有猛虎,細(xì)嗅薔薇。

          不過(guò)同樣的,學(xué)習(xí)率衰減太快或太慢,也都會(huì)出問(wèn)題,所以科學(xué)家們提出了AdaGrad算法來(lái)自適應(yīng)調(diào)整學(xué)習(xí)率。

          AdaGrad可用公式表示為:

          sum_of_gradient_squared = previous_sum_of_gradient_squared + gradient2

          delta = -learning_rate * gradient / sqrt(sum_of_gradient_squared)

          其實(shí)就是跟動(dòng)量法類似的思想,使用歷史梯度數(shù)據(jù)來(lái)校正當(dāng)前數(shù)據(jù)。

          這里給學(xué)習(xí)率除上一個(gè)歷史梯度的平方和開(kāi)根號(hào),直觀的理解就是:對(duì)于一個(gè)參數(shù),在過(guò)去修改得越多,那么在未來(lái)需要修改得就越少。

          這樣就達(dá)成了學(xué)習(xí)率的自適應(yīng)調(diào)節(jié),而且每個(gè)參數(shù)有自己的學(xué)習(xí)率。

          另外,在深度學(xué)習(xí)中,稀疏特征是非常常見(jiàn)的,而AdaGrad算法在面對(duì)稀疏數(shù)據(jù)時(shí)尤其有效,

          稀疏的特征平均梯度很小,會(huì)導(dǎo)致訓(xùn)練緩慢,而為每個(gè)參數(shù)設(shè)置不同的學(xué)習(xí)率則解決了這個(gè)問(wèn)題。

          上圖中,AdaGrad和Vanilla Gradient Descent進(jìn)行PK,普通梯度下降會(huì)先選擇最陡峭的方向,而AdaGrad選擇的路徑顯然更優(yōu)秀。

          有時(shí)候,普通梯度下降會(huì)干脆停在兩個(gè)方向的梯度為0的鞍點(diǎn)(saddle point),而AdaGrad等基于梯度平方的方法可以更好地逃離鞍點(diǎn)。

          RMSProp

          然而,AdaGrad的問(wèn)題在于它的速度非常慢,——因?yàn)樘荻绕椒降目偤椭粫?huì)增長(zhǎng),永遠(yuǎn)不會(huì)縮小,就造成了學(xué)習(xí)率一定是越來(lái)越小的。

          由于背上了沉重的歷史包袱,AdaGrad在該快的地方也往往快不起來(lái),為了解決這個(gè)問(wèn)題,便誕生了RMSProp算法,公式如下:

          sum_of_gradient_squared = previous_sum_of_gradient_squared decay_rategradient2 (1- decay_rate)

          delta = -learning_rate * gradient / sqrt(sum_of_gradient_squared)

          跟動(dòng)量法中使用衰減率decay_rate的思想一致,讓最近的梯度占比比較高,而離得比較遠(yuǎn)的梯度就趕緊忘掉,說(shuō)白了就是移動(dòng)加權(quán)平均。

          不過(guò)跟動(dòng)量法那邊不同的是,這個(gè) (1- decay_rate)是在分母上,所以還起到了縮放的作用。

          舉個(gè)例子,如果decay_rate設(shè)置為0.99,那么分母就多乘了一個(gè)sqrt(1 - 0.99)= 0.1,因此在相同的學(xué)習(xí)率下,步長(zhǎng)比AdaGrad大了10倍。

          圖中的陰影部分表示兩個(gè)方向上的梯度平法和,明顯綠色的RMSProp甩掉了很多歷史包袱,跑得也更快。

          Adam

          最后出場(chǎng)的是當(dāng)下AI訓(xùn)練最流行的Adam算法,但已經(jīng)沒(méi)啥可說(shuō)的了,因?yàn)锳dam = Momentum + RMSProp,公式如下:

          sum_of_gradient = previous_sum_of_gradient * beta1 + gradient * (1 - beta1) [Momentum]

          sum_of_gradient_squared = previous_sum_of_gradient_squared * beta2 + gradient2 * (1- beta2) [RMSProp]

          delta = -learning_rate * sum_of_gradient / sqrt(sum_of_gradient_squared)

          Beta1是Momentum的衰減率,通常設(shè)置為0.9;Beta2是RMSProp的衰減率,通常設(shè)置為0.999。

          Adam從Momentum中獲得速度,從RMSProp獲得適應(yīng)不同方向梯度的能力,兩者結(jié)合使其功能強(qiáng)大。

          參考資料:
          https://github.com/lilipads/gradient_descent_viz




          瀏覽 205
          2點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          2點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费操逼网站直接入看泡芙视频 | 在线免费观看一级a片 | 欧美在线中文字幕 | 日本内射在线 | 亚洲.无码.变态.欧美.中文 |