筆記參考:https://zhuanlan.zhihu.com/p/20894041?refer=intelligentunit
感謝原作者的翻譯I昴帷垮卓!
非原創(chuàng),禁止轉(zhuǎn)載本文
內(nèi)容列表:
- 簡(jiǎn)介
- 損失函數(shù)可視化
-
- 最優(yōu)化
- 3.1 策略#1:隨機(jī)搜索
- 3.2 策略#2:隨機(jī)局部搜索
- 3.3 策略#3:跟隨梯度
-
- 梯度計(jì)算
- 4.1 使用有限差值進(jìn)行數(shù)值計(jì)算
- 4.2 微分計(jì)算梯度
- 梯度下降
- 小結(jié)
1. 簡(jiǎn)介
在上一節(jié)中晶姊,我們介紹了圖像分類任務(wù)中的兩個(gè)關(guān)鍵部分:
- 基于參數(shù)的評(píng)分函數(shù)扒接。該函數(shù)將原始圖像像素映射為分類評(píng)分值(例如:一個(gè)線性函數(shù))。
- 損失函數(shù)们衙。該函數(shù)能夠根據(jù)分類評(píng)分和訓(xùn)練集圖像數(shù)據(jù)實(shí)際分類的一致性钾怔,衡量某個(gè)具體參數(shù)集的質(zhì)量好壞。損失函數(shù)有多種版本和不同的實(shí)現(xiàn)方式(例如:Softmax或SVM)蒙挑。
上節(jié)中宗侦,線性函數(shù)的形式是
而SVM實(shí)現(xiàn)的公式是:
對(duì)于圖像數(shù)據(jù) xi ,如果基于參數(shù)集 W 做出的分類預(yù)測(cè)與真實(shí)情況比較一致忆蚀,那么計(jì)算出來(lái)的損失值 L 就很低》現(xiàn)在介紹第三個(gè),也是最后一個(gè)關(guān)鍵部分:最優(yōu)化Optimization馋袜。最優(yōu)化是尋找能使得損失函數(shù)值最小化的參數(shù) W 的過(guò)程男旗。
鋪墊:一旦理解了這三個(gè)部分是如何相互運(yùn)作的,我們將會(huì)回到第一個(gè)部分(基于參數(shù)的函數(shù)映射)欣鳖,然后將其拓展為一個(gè)遠(yuǎn)比線性函數(shù)復(fù)雜的函數(shù):首先是神經(jīng)網(wǎng)絡(luò)察皇,然后是卷積神經(jīng)網(wǎng)絡(luò)。而損失函數(shù)和最優(yōu)化過(guò)程這兩個(gè)部分將會(huì)保持相對(duì)穩(wěn)定泽台。
2. 損失函數(shù)可視化
本課中討論的損失函數(shù)一般都是定義在高維度的空間中(比如什荣,在CIFAR-10中一個(gè)線性分類器的權(quán)重矩陣大小是[10x3073],就有30730個(gè)參數(shù))怀酷,這樣要將其可視化就很困難稻爬。然而辦法還是有的,在1個(gè)維度或者2個(gè)維度的方向上對(duì)高維空間進(jìn)行切片蜕依,就能得到一些直觀感受桅锄。例如琉雳,隨機(jī)生成一個(gè)權(quán)重矩陣W ,該矩陣就與高維空間中的一個(gè)點(diǎn)對(duì)應(yīng)友瘤。然后沿著某個(gè)維度方向前進(jìn)的同時(shí)記錄損失函數(shù)值的變化咐吼。換句話說(shuō),就是生成一個(gè)隨機(jī)的方向 W1 并且沿著此方向計(jì)算損失值商佑,計(jì)算方法是根據(jù)不同的 a 值來(lái)計(jì)算 L( W + aW1 ) 锯茄。這個(gè)過(guò)程將生成一個(gè)圖表,其x軸是 a 值茶没,y軸是損失函數(shù)值肌幽。同樣的方法還可以用在兩個(gè)維度上,通過(guò)改變 a, b 來(lái)計(jì)算損失值 L( W + aW1 + bW2 ) 抓半,從而給出二維的圖像喂急。在圖像中,a, b 可以分別用x和y軸表示笛求,而損失函數(shù)的值可以用顏色變化表示:
一個(gè)無(wú)正則化的多類SVM的損失函數(shù)的圖示廊移。左邊和中間只有一個(gè)樣本數(shù)據(jù),右邊是CIFAR-10中的100個(gè)數(shù)據(jù)探入。左:a值變化在某個(gè)維度方向上對(duì)應(yīng)的的損失值變化狡孔。中和右:兩個(gè)維度方向上的損失值切片圖,藍(lán)色部分是低損失值區(qū)域蜂嗽,紅色部分是高損失值區(qū)域苗膝。注意損失函數(shù)的分段線性結(jié)構(gòu)( 往下看有真相 ~ )。多個(gè)樣本的損失值是總體的平均值植旧,所以右邊的碗狀結(jié)構(gòu)是很多的分段線性結(jié)構(gòu)的平均(比如中間這個(gè)就是其中之一)辱揭。
損失函數(shù)的分段線性結(jié)構(gòu)。對(duì)于一個(gè)單獨(dú)的數(shù)據(jù)病附,有損失函數(shù)的計(jì)算公式如下:
通過(guò)公式可見问窃,每個(gè)樣本的數(shù)據(jù)損失值是以 W 為參數(shù)的線性函數(shù)的總和(零閾值來(lái)源于 max( 0,- ) 函數(shù))完沪。 W 的每一行(即 Wj )域庇,有時(shí)候它前面是一個(gè)正號(hào)(比如當(dāng)它對(duì)應(yīng)錯(cuò)誤分類的時(shí)候),有時(shí)候它前面是一個(gè)負(fù)號(hào)(比如當(dāng)它是是正確分類的時(shí)候)丽焊。為進(jìn)一步闡明较剃,假設(shè)有一個(gè)簡(jiǎn)單的數(shù)據(jù)集咕别,其中包含有3個(gè)只有1個(gè)維度的點(diǎn)技健,數(shù)據(jù)集數(shù)據(jù)點(diǎn)有3個(gè)類別。那么完整的無(wú)正則化SVM的損失值計(jì)算如下:
因?yàn)檫@些例子都是一維的惰拱,所以數(shù)據(jù) xi 和權(quán)重 Wj 都是數(shù)字雌贱。觀察 W0 啊送,可以看到上面的式子中一些項(xiàng)是 W0 的線性函數(shù),且每一項(xiàng)都會(huì)與0比較欣孤,取兩者的最大值馋没。可作圖如下:
從一個(gè)維度方向上對(duì)數(shù)據(jù)損失值的展示降传。x軸方向就是一個(gè)權(quán)重篷朵,y軸就是損失值。數(shù)據(jù)損失是多個(gè)部分組合而成婆排。其中每個(gè)部分要么是某個(gè)權(quán)重的獨(dú)立部分声旺,要么是該權(quán)重的線性函數(shù)與0閾值的比較。完整的SVM數(shù)據(jù)損失就是這個(gè)形狀的30730維版本段只。( 反復(fù)看這段話腮猖,感覺還是有點(diǎn)道理的。赞枕。澈缺。)
需要多說(shuō)一句的是,你可能根據(jù)SVM的損失函數(shù)的碗狀外觀猜出它是一個(gè)凸函數(shù)炕婶。關(guān)于如何高效地最小化凸函數(shù)的論文有很多姐赡,你也可以學(xué)習(xí)斯坦福大學(xué)關(guān)于(凸函數(shù)最優(yōu)化)的課程。但是一旦我們將 f 函數(shù)擴(kuò)展到神經(jīng)網(wǎng)絡(luò)柠掂,目標(biāo)函數(shù)就就不再是凸函數(shù)了雏吭,圖像也不會(huì)像上面那樣是個(gè)碗狀,而是凹凸不平的復(fù)雜地形形狀陪踩。
不可導(dǎo)的損失函數(shù)杖们。作為一個(gè)技術(shù)筆記,你要注意到:由于max操作肩狂,損失函數(shù)中存在一些不可導(dǎo)點(diǎn)(kinks)摘完,這些點(diǎn)使得損失函數(shù)不可微,因?yàn)樵谶@些不可導(dǎo)點(diǎn)傻谁,梯度是沒有定義的孝治。但是次梯度(subgradient)依然存在且常常被使用。在本課中审磁,我們將交換使用次梯度和梯度兩個(gè)術(shù)語(yǔ)谈飒。
3. 最優(yōu)化
重申一下:損失函數(shù)可以量化某個(gè)具體權(quán)重集 W 的質(zhì)量。而最優(yōu)化的目標(biāo)就是找到能夠最小化損失函數(shù)值的 W 态蒂。我們現(xiàn)在就朝著這個(gè)目標(biāo)前進(jìn)杭措,實(shí)現(xiàn)一個(gè)能夠最優(yōu)化損失函數(shù)的方法。對(duì)于有一些經(jīng)驗(yàn)的同學(xué)钾恢,這節(jié)課看起來(lái)有點(diǎn)奇怪手素,因?yàn)槭褂玫睦樱⊿VM 損失函數(shù))是一個(gè)凸函數(shù)問(wèn)題鸳址。但是要記得,最終的目標(biāo)是不僅僅對(duì)凸函數(shù)做最優(yōu)化泉懦,而是能夠最優(yōu)化一個(gè)神經(jīng)網(wǎng)絡(luò)稿黍,而對(duì)于神經(jīng)網(wǎng)絡(luò)是不能簡(jiǎn)單的使用凸函數(shù)的最優(yōu)化技巧的。
3.1 策略#1:隨機(jī)搜索(差勁)
既然確認(rèn)參數(shù)集W的好壞蠻簡(jiǎn)單的崩哩,那第一個(gè)想到的(差勁)方法巡球,就是可以隨機(jī)嘗試很多不同的權(quán)重,然后看其中哪個(gè)最好邓嘹。過(guò)程如下:
# 假設(shè)X_train的每一列都是一個(gè)數(shù)據(jù)樣本(比如3073 x 50000)
# 假設(shè)Y_train是數(shù)據(jù)樣本的類別標(biāo)簽(比如一個(gè)長(zhǎng)50000的一維數(shù)組)
# 假設(shè)函數(shù)L對(duì)損失函數(shù)進(jìn)行評(píng)價(jià)
bestloss = float("inf") # Python assigns the highest possible float value
for num in xrange(1000):
W = np.random.randn(10, 3073) * 0.0001 # generate random parameters
loss = L(X_train, Y_train, W) # get the loss over the entire training set
if loss < bestloss: # keep track of the best solution
bestloss = loss
bestW = W
print 'in attempt %d the loss was %f, best %f' % (num, loss, bestloss)
# 輸出:
# in attempt 0 the loss was 9.401632, best 9.401632
# in attempt 1 the loss was 8.959668, best 8.959668
# in attempt 2 the loss was 9.044034, best 8.959668
# in attempt 3 the loss was 9.278948, best 8.959668
# in attempt 4 the loss was 8.857370, best 8.857370
# in attempt 5 the loss was 8.943151, best 8.857370
# in attempt 6 the loss was 8.605604, best 8.605604
# ... (trunctated: continues for 1000 lines)
在上面的代碼中辕漂,我們嘗試了若干隨機(jī)生成的權(quán)重矩陣W,其中某些的損失值較小吴超,而另一些的損失值大些钉嘹。我們可以把這次隨機(jī)搜索中找到的最好的權(quán)重W取出,然后去跑測(cè)試集:
# 假設(shè)X_test尺寸是[3073 x 10000], Y_test尺寸是[10000 x 1]
scores = Wbest.dot(Xte_cols) # 10 x 10000, the class scores for all test examples
# 找到在每列中評(píng)分值最大的索引(即預(yù)測(cè)的分類)
Yte_predict = np.argmax(scores, axis = 0)
# 以及計(jì)算準(zhǔn)確率
np.mean(Yte_predict == Yte)
# 返回 0.1555
驗(yàn)證集上表現(xiàn)最好的權(quán)重W跑測(cè)試集的準(zhǔn)確率是15.5%鲸阻,而完全隨機(jī)猜的準(zhǔn)確率是10%跋涣,如此看來(lái),這個(gè)準(zhǔn)確率對(duì)于這樣一個(gè)不經(jīng)過(guò)大腦的策略來(lái)說(shuō)鸟悴,還算不錯(cuò)嘛陈辱!
核心思路:迭代優(yōu)化。當(dāng)然细诸,我們肯定能做得更好些沛贪。核心思路是:雖然找到最優(yōu)的權(quán)重W非常困難,甚至是不可能的(尤其當(dāng)W中存的是整個(gè)神經(jīng)網(wǎng)絡(luò)的權(quán)重的時(shí)候)震贵,但如果問(wèn)題轉(zhuǎn)化為:對(duì)一個(gè)權(quán)重矩陣集W取優(yōu)利赋,使其損失值稍微減少。那么問(wèn)題的難度就大大降低了猩系。換句話說(shuō)媚送,我們的方法從一個(gè)隨機(jī)的W開始,然后對(duì)其迭代取優(yōu)寇甸,每次都讓它的損失值變得更小一點(diǎn)塘偎。
我們的策略是從隨機(jī)權(quán)重開始,然后迭代取優(yōu)拿霉,從而獲得更低的損失值吟秩。
3.2 策略#2:隨機(jī)局部搜索
第一個(gè)策略可以看做是每走一步都嘗試幾個(gè)隨機(jī)方向,如果某個(gè)方向是向山下的绽淘,就向該方向走一步涵防。這次我們從一個(gè)隨機(jī) W 開始,然后生成一個(gè)隨機(jī)的擾動(dòng) δW 收恢,只有當(dāng) W + δW 的損失值變低武学,我們才會(huì)更新。這個(gè)過(guò)程的具體代碼如下:
W = np.random.randn(10, 3073) * 0.001 # 生成隨機(jī)初始W
bestloss = float("inf")
for i in xrange(1000):
step_size = 0.0001
Wtry = W + np.random.randn(10, 3073) * step_size
loss = L(Xtr_cols, Ytr, Wtry)
if loss < bestloss:
W = Wtry
bestloss = loss
print 'iter %d loss is %f' % (i, bestloss)
使用同樣的數(shù)據(jù)(1000)伦意,這個(gè)方法可以得到21.4%的分類準(zhǔn)確率火窒。這個(gè)比策略一好,但是依然過(guò)于浪費(fèi)計(jì)算資源驮肉。
3.3 跟隨梯度
梯度下降大家都很熟悉了熏矿,我就直接搬運(yùn)原作者的話了,大家看一看就好
前兩個(gè)策略中离钝,我們是嘗試在權(quán)重空間中找到一個(gè)方向票编,沿著該方向能降低損失函數(shù)的損失值。其實(shí)不需要隨機(jī)尋找方向卵渴,因?yàn)榭梢灾苯佑?jì)算出最好的方向慧域,這就是從數(shù)學(xué)上計(jì)算出最陡峭的方向。這個(gè)方向就是損失函數(shù)的梯度(gradient)浪读。在蒙眼徒步者的比喻中昔榴,這個(gè)方法就好比是感受我們腳下山體的傾斜程度,然后向著最陡峭的下降方向下山碘橘。
在一維函數(shù)中互订,斜率是函數(shù)在某一點(diǎn)的瞬時(shí)變化率。梯度是函數(shù)的斜率的一般化表達(dá)痘拆,它不是一個(gè)值仰禽,而是一個(gè)向量。在輸入空間中纺蛆,梯度是各個(gè)維度的斜率組成的向量(或者稱為導(dǎo)數(shù)derivatives)吐葵。對(duì)一維函數(shù)的求導(dǎo)公式如下:
當(dāng)函數(shù)有多個(gè)參數(shù)的時(shí)候,我們稱導(dǎo)數(shù)為偏導(dǎo)數(shù)桥氏。而梯度就是在每個(gè)維度上偏導(dǎo)數(shù)所形成的向量折联。
4. 梯度計(jì)算
計(jì)算梯度有兩種方法:一個(gè)是緩慢的近似方法(數(shù)值梯度法),但實(shí)現(xiàn)相對(duì)簡(jiǎn)單识颊。另一個(gè)方法(分析梯度法)計(jì)算迅速诚镰,結(jié)果精確,但是實(shí)現(xiàn)時(shí)容易出錯(cuò)祥款,且需要使用微分∏灞浚現(xiàn)在對(duì)兩種方法進(jìn)行介紹:
4.1 利用有限差值計(jì)算梯度(數(shù)值)
公式已經(jīng)給出數(shù)值計(jì)算梯度的方法。下面代碼是一個(gè)輸入為函數(shù)f和向量x刃跛,計(jì)算f的梯度的通用函數(shù)抠艾,它返回函數(shù)f在點(diǎn)x處的梯度(也就是我們常說(shuō)的數(shù)值方法算出來(lái),簡(jiǎn)單粗暴):
def eval_numerical_gradient(f, x):
"""
一個(gè)f在x處的數(shù)值梯度法的簡(jiǎn)單實(shí)現(xiàn)
- f是只有一個(gè)參數(shù)的函數(shù)
- x是計(jì)算梯度的點(diǎn)
"""
fx = f(x) # 在原點(diǎn)計(jì)算函數(shù)值
grad = np.zeros(x.shape)
h = 0.00001
# 對(duì)x中所有的索引進(jìn)行迭代
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
# 計(jì)算x+h處的函數(shù)值
ix = it.multi_index
old_value = x[ix]
x[ix] = old_value + h # 增加h
fxh = f(x) # 計(jì)算f(x + h)
x[ix] = old_value # 存到前一個(gè)值中 (非常重要)
# 計(jì)算偏導(dǎo)數(shù)
grad[ix] = (fxh - fx) / h # 坡度
it.iternext() # 到下個(gè)維度
return grad
根據(jù)上面的梯度公式桨昙,代碼對(duì)所有維度進(jìn)行迭代检号,在每個(gè)維度上產(chǎn)生一個(gè)很小的變化h腌歉,通過(guò)觀察函數(shù)值變化,計(jì)算函數(shù)在該維度上的偏導(dǎo)數(shù)齐苛。最后翘盖,所有的梯度存儲(chǔ)在變量grad中。
實(shí)踐考量:注意在數(shù)學(xué)公式中凹蜂,h的取值是趨近于0的馍驯,然而在實(shí)際中,用一個(gè)很小的數(shù)值(比如例子中的1e-5)就足夠了玛痊。在不產(chǎn)生數(shù)值計(jì)算出錯(cuò)的理想前提下汰瘫,你會(huì)使用盡可能小的h。還有擂煞,實(shí)際中用中心差值公式(centered difference formula)[f(x + h) - f(x - h)] / 2h 效果較好混弥。
可以使用上面這個(gè)公式來(lái)計(jì)算任意函數(shù)在任意點(diǎn)上的梯度。下面計(jì)算權(quán)重空間中的某些隨機(jī)點(diǎn)上对省,CIFAR-10損失函數(shù)的梯度:
# 要使用上面的代碼我們需要一個(gè)只有一個(gè)參數(shù)的函數(shù)
# (在這里參數(shù)就是權(quán)重)所以也包含了X_train和Y_train
def CIFAR10_loss_fun(W):
return L(X_train, Y_train, W)
W = np.random.rand(10, 3073) * 0.001 # 隨機(jī)權(quán)重向量
df = eval_numerical_gradient(CIFAR10_loss_fun, W) # 得到梯度
梯度告訴我們損失函數(shù)在每個(gè)維度上的斜率剑逃,以此來(lái)進(jìn)行更新:
loss_original = CIFAR10_loss_fun(W) # 初始損失值
print 'original loss: %f' % (loss_original, )
# 查看不同步長(zhǎng)的效果
for step_size_log in [-10, -9, -8, -7, -6, -5,-4,-3,-2,-1]:
step_size = 10 ** step_size_log
W_new = W - step_size * df # 權(quán)重空間中的新位置
loss_new = CIFAR10_loss_fun(W_new)
print 'for step size %f new loss: %f' % (step_size, loss_new)
# 輸出:
# original loss: 2.200718
# for step size 1.000000e-10 new loss: 2.200652
# for step size 1.000000e-09 new loss: 2.200057
# for step size 1.000000e-08 new loss: 2.194116
# for step size 1.000000e-07 new loss: 2.135493
# for step size 1.000000e-06 new loss: 1.647802
# for step size 1.000000e-05 new loss: 2.844355
# for step size 1.000000e-04 new loss: 25.558142
# for step size 1.000000e-03 new loss: 254.086573
# for step size 1.000000e-02 new loss: 2539.370888
# for step size 1.000000e-01 new loss: 25392.214036
在梯度負(fù)方向上更新:在上面的代碼中,為了計(jì)算W_new官辽,要注意我們是向著梯度df的負(fù)方向去更新蛹磺,這是因?yàn)槲覀兿M麚p失函數(shù)值是降低而不是升高。
步長(zhǎng)的影響:梯度指明了函數(shù)在哪個(gè)方向是變化率最大的同仆,但是沒有指明在這個(gè)方向上應(yīng)該走多遠(yuǎn)萤捆。在后續(xù)的課程中可以看到,選擇步長(zhǎng)(也叫作學(xué)習(xí)率)將會(huì)是神經(jīng)網(wǎng)絡(luò)訓(xùn)練中最重要(也是最頭痛)的超參數(shù)設(shè)定之一俗批。還是用蒙眼徒步者下山的比喻俗或,這就好比我們可以感覺到腳朝向的不同方向上,地形的傾斜程度不同岁忘。但是該跨出多長(zhǎng)的步長(zhǎng)呢辛慰?不確定。如果謹(jǐn)慎地小步走干像,情況可能比較穩(wěn)定但是進(jìn)展較慢(這就是步長(zhǎng)較小的情況)帅腌。相反,如果想盡快下山,那就大步走吧,但結(jié)果也不一定盡如人意偿洁。在上面的代碼中就能看見反例,在某些點(diǎn)如果步長(zhǎng)過(guò)大溺职,反而可能越過(guò)最低點(diǎn)導(dǎo)致更高的損失值。
梯度告訴了我們損失函數(shù)下降最陡峭的方向。小步長(zhǎng)下降穩(wěn)定但進(jìn)度慢浪耘,大步長(zhǎng)進(jìn)展快但是風(fēng)險(xiǎn)更大乱灵。采取大步長(zhǎng)可能導(dǎo)致錯(cuò)過(guò)最優(yōu)點(diǎn),讓損失值上升七冲。步長(zhǎng)(后面會(huì)稱其為學(xué)習(xí)率)將會(huì)是我們?cè)谡{(diào)參中最重要的超參數(shù)之一痛倚。
敲黑板!癞埠!問(wèn)題出現(xiàn)了W丛聋呢!
效率問(wèn)題:你可能已經(jīng)注意到苗踪,計(jì)算數(shù)值梯度的復(fù)雜性和參數(shù)的量線性相關(guān)。在本例中有30730個(gè)參數(shù)削锰,所以損失函數(shù)每走一步就需要計(jì)算30731次損失函數(shù)的梯度⊥ú現(xiàn)代神經(jīng)網(wǎng)絡(luò)很容易就有上千萬(wàn)的參數(shù),因此這個(gè)問(wèn)題只會(huì)越發(fā)嚴(yán)峻器贩。顯然這個(gè)策略不適合大規(guī)模數(shù)據(jù)颅夺,我們需要更好的策略。
4.2 微分分析計(jì)算梯度(公式)
使用有限差值近似計(jì)算梯度比較簡(jiǎn)單蛹稍,但缺點(diǎn)在于終究只是近似(因?yàn)槲覀儗?duì)于h值是選取了一個(gè)很小的數(shù)值吧黄,但真正的梯度定義中h趨向0的極限),且耗費(fèi)計(jì)算資源太多唆姐。第二個(gè)梯度計(jì)算方法是利用微分來(lái)分析拗慨,能得到計(jì)算梯度的公式(不是近似),用公式計(jì)算梯度速度很快奉芦,唯一不好的就是實(shí)現(xiàn)的時(shí)候容易出錯(cuò)赵抢。為了解決這個(gè)問(wèn)題,在實(shí)際操作時(shí)常常將分析梯度法的結(jié)果和數(shù)值梯度法的結(jié)果作比較声功,以此來(lái)檢查其實(shí)現(xiàn)的正確性烦却,這個(gè)步驟叫做梯度檢查。
用SVM的損失函數(shù)在某個(gè)數(shù)據(jù)點(diǎn)上的計(jì)算來(lái)舉例:
可以對(duì)函數(shù)進(jìn)行微分先巴。比如其爵,對(duì) Wyi 進(jìn)行微分得到:
譯者注:原公式中1為空心字體,嘗試\mathbb{}等多種方法仍無(wú)法實(shí)現(xiàn)伸蚯,請(qǐng)知友指點(diǎn)醋闭。
本菜注:知乎markdown都打不出來(lái)的符號(hào),我一個(gè)簡(jiǎn)書閹割版markdown能打出來(lái)么 <( ̄ ﹌  ̄)>
其中 1 是一個(gè)示性函數(shù)朝卒,如果括號(hào)中的條件為真证逻,那么函數(shù)值為1,如果為假,則函數(shù)值為0囚企。雖然上述公式看起來(lái)復(fù)雜丈咐,但在代碼實(shí)現(xiàn)的時(shí)候比較簡(jiǎn)單:只需要計(jì)算沒有滿足邊界值的分類的數(shù)量(因此對(duì)損失函數(shù)產(chǎn)生了貢獻(xiàn)),然后乘以 xi 就是梯度了龙宏。注意棵逊,這個(gè)梯度只是對(duì)應(yīng)正確分類的W的行向量的梯度,那些 j ≠ yi 行的梯度是:
一旦將梯度的公式微分出來(lái)银酗,代碼實(shí)現(xiàn)公式并用于梯度更新就比較順暢了辆影。
5. 梯度下降
現(xiàn)在可以計(jì)算損失函數(shù)的梯度了,程序重復(fù)地計(jì)算梯度然后對(duì)參數(shù)進(jìn)行更新黍特,這一過(guò)程稱為梯度下降蛙讥,他的普通版本是這樣的:
# 普通的梯度下降
while True:
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += - step_size * weights_grad # 進(jìn)行梯度更新
這個(gè)簡(jiǎn)單的循環(huán)在所有的神經(jīng)網(wǎng)絡(luò)核心庫(kù)中都有。雖然也有其他實(shí)現(xiàn)最優(yōu)化的方法(比如LBFGS)灭衷,但是到目前為止次慢,梯度下降是對(duì)神經(jīng)網(wǎng)絡(luò)的損失函數(shù)最優(yōu)化中最常用的方法。課程中翔曲,我們會(huì)在它的循環(huán)細(xì)節(jié)增加一些新的東西(比如更新的具體公式)迫像,但是核心思想不變,那就是我們一直跟著梯度走瞳遍,直到結(jié)果不再變化闻妓。
小批量數(shù)據(jù)梯度下降(Mini-batch gradient descent):在大規(guī)模的應(yīng)用中(比如ILSVRC挑戰(zhàn)賽),訓(xùn)練數(shù)據(jù)可以達(dá)到百萬(wàn)級(jí)量級(jí)掠械。如果像這樣計(jì)算整個(gè)訓(xùn)練集由缆,來(lái)獲得僅僅一個(gè)參數(shù)的更新就太浪費(fèi)了。一個(gè)常用的方法是計(jì)算訓(xùn)練集中的小批量(batches)數(shù)據(jù)份蝴。例如犁功,在目前最高水平的卷積神經(jīng)網(wǎng)絡(luò)中,一個(gè)典型的小批量包含256個(gè)例子婚夫,而整個(gè)訓(xùn)練集是多少呢浸卦?一百二十萬(wàn)個(gè)。這個(gè)小批量數(shù)據(jù)就用來(lái)實(shí)現(xiàn)一個(gè)參數(shù)更新:
# 普通的小批量數(shù)據(jù)梯度下降
while True:
data_batch = sample_training_data(data, 256) # 256個(gè)數(shù)據(jù)
weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
weights += - step_size * weights_grad # 參數(shù)更新
這個(gè)方法之所以效果不錯(cuò)案糙,是因?yàn)橛?xùn)練集中的數(shù)據(jù)都是相關(guān)的限嫌。要理解這一點(diǎn),可以想象一個(gè)極端情況:在ILSVRC中的120萬(wàn)個(gè)圖像是1000張不同圖片的復(fù)制(每個(gè)類別1張圖片时捌,每張圖片有1200張復(fù)制)怒医。那么顯然計(jì)算這1200張復(fù)制圖像的梯度就應(yīng)該是一樣的。對(duì)比120萬(wàn)張圖片的數(shù)據(jù)損失的均值與只計(jì)算1000張的子集的數(shù)據(jù)損失均值時(shí)奢讨,結(jié)果應(yīng)該是一樣的稚叹。實(shí)際情況中,數(shù)據(jù)集肯定不會(huì)包含重復(fù)圖像,那么小批量數(shù)據(jù)的梯度就是對(duì)整個(gè)數(shù)據(jù)集梯度的一個(gè)近似扒袖。因此塞茅,在實(shí)踐中通過(guò)計(jì)算小批量數(shù)據(jù)的梯度可以實(shí)現(xiàn)更快速地收斂,并以此來(lái)進(jìn)行更頻繁的參數(shù)更新季率。
小批量數(shù)據(jù)策略有個(gè)極端情況野瘦,那就是每個(gè)批量中只有1個(gè)數(shù)據(jù)樣本,這種策略被稱為隨機(jī)梯度下降(Stochastic Gradient Descent 簡(jiǎn)稱SGD)飒泻,有時(shí)候也被稱為在線梯度下降鞭光。這種策略在實(shí)際情況中相對(duì)少見,因?yàn)橄蛄炕僮鞯拇a一次計(jì)算100個(gè)數(shù)據(jù) 比100次計(jì)算1個(gè)數(shù)據(jù)要高效很多泞遗。即使SGD在技術(shù)上是指每次使用1個(gè)數(shù)據(jù)來(lái)計(jì)算梯度惰许,你還是會(huì)聽到人們使用SGD來(lái)指代小批量數(shù)據(jù)梯度下降(或者用MGD來(lái)指代小批量數(shù)據(jù)梯度下降,而BGD來(lái)指代則相對(duì)少見)刹孔。小批量數(shù)據(jù)的大小是一個(gè)超參數(shù)啡省,但是一般并不需要通過(guò)交叉驗(yàn)證來(lái)調(diào)參娜睛。它一般由存儲(chǔ)器的限制來(lái)決定的髓霞,或者干脆設(shè)置為同樣大小,比如32畦戒,64方库,128等。之所以使用2的指數(shù)障斋,是因?yàn)樵趯?shí)際中許多向量化操作實(shí)現(xiàn)的時(shí)候纵潦,如果輸入數(shù)據(jù)量是2的倍數(shù),那么運(yùn)算更快垃环。
關(guān)于Mini-batch gradient descent和SGD不太理解的同學(xué)邀层,可以去看看Ng的Machine Learning課程的第10章。
6. 小結(jié)
信息流的總結(jié)圖例。數(shù)據(jù)集中的(x,y)是給定的涛目。權(quán)重從一個(gè)隨機(jī)數(shù)字開始秸谢,且可以改變。在前向傳播時(shí)霹肝,評(píng)分函數(shù)計(jì)算出類別的分類評(píng)分并存儲(chǔ)在向量f中估蹄。損失函數(shù)包含兩個(gè)部分:數(shù)據(jù)損失和正則化損失。其中沫换,數(shù)據(jù)損失計(jì)算的是分類評(píng)分f和實(shí)際標(biāo)簽y之間的差異臭蚁,正則化損失只是一個(gè)關(guān)于權(quán)重的函數(shù)。在梯度下降過(guò)程中,我們計(jì)算權(quán)重的梯度(如果愿意的話垮兑,也可以計(jì)算數(shù)據(jù)上的梯度)炭晒,然后使用它們來(lái)實(shí)現(xiàn)參數(shù)的更新。
在本節(jié)課中:
將損失函數(shù)比作了一個(gè)高維度的最優(yōu)化地形甥角,并嘗試到達(dá)它的最底部网严。最優(yōu)化的工作過(guò)程可以看做一個(gè)蒙著眼睛的徒步者希望摸索著走到山的底部。在例子中嗤无,可見SVM的損失函數(shù)是分段線性的震束,并且是碗狀的。
提出了迭代優(yōu)化的思想当犯,從一個(gè)隨機(jī)的權(quán)重開始垢村,然后一步步地讓損失值變小,直到最小嚎卫。
函數(shù)的梯度給出了該函數(shù)最陡峭的上升方向嘉栓。介紹了利用有限的差值來(lái)近似計(jì)算梯度的方法,該方法實(shí)現(xiàn)簡(jiǎn)單但是效率較低(有限差值就是h拓诸,用來(lái)計(jì)算數(shù)值梯度)侵佃。
參數(shù)更新需要有技巧地設(shè)置步長(zhǎng)。也叫學(xué)習(xí)率奠支。如果步長(zhǎng)太小馋辈,進(jìn)度穩(wěn)定但是緩慢,如果步長(zhǎng)太大倍谜,進(jìn)度快但是可能有風(fēng)險(xiǎn)迈螟。
討論權(quán)衡了數(shù)值梯度法和分析梯度法。數(shù)值梯度法計(jì)算簡(jiǎn)單尔崔,但結(jié)果只是近似且耗費(fèi)計(jì)算資源答毫。分析梯度法計(jì)算準(zhǔn)確迅速但是實(shí)現(xiàn)容易出錯(cuò),而且需要對(duì)梯度公式進(jìn)行推導(dǎo)的數(shù)學(xué)基本功季春。因此洗搂,在實(shí)際中使用分析梯度法,然后使用梯度檢查來(lái)檢查其實(shí)現(xiàn)正確與否鹤盒,其本質(zhì)就是將分析梯度法的結(jié)果與數(shù)值梯度法的計(jì)算結(jié)果對(duì)比蚕脏。
- 介紹了梯度下降算法,它在循環(huán)中迭代地計(jì)算梯度并更新參數(shù)侦锯。
預(yù)告:這節(jié)課的核心內(nèi)容是:理解并能計(jì)算損失函數(shù)關(guān)于權(quán)重的梯度驼鞭,是設(shè)計(jì)、訓(xùn)練和理解神經(jīng)網(wǎng)絡(luò)的核心能力尺碰。下節(jié)中挣棕,將介紹如何使用鏈?zhǔn)椒▌t來(lái)高效地計(jì)算梯度译隘,也就是通常所說(shuō)的反向傳播(backpropagation)機(jī)制。該機(jī)制能夠?qū)Π矸e神經(jīng)網(wǎng)絡(luò)在內(nèi)的幾乎所有類型的神經(jīng)網(wǎng)絡(luò)的損失函數(shù)進(jìn)行高效的最優(yōu)化洛心。
CS231n的反向傳播課程是我見過(guò)的最容易理解的了固耘,雖然花了50min講,但是還是建議之前不太理解的同學(xué)能夠花時(shí)間看看词身!
再次感謝原作者的翻譯L俊!