deeplearning.ai 改善深层神经网络 week2 优化算法
這一周的主題是優(yōu)化算法。
?
1. ?Mini-batch:
上一門課討論的向量化的目的是去掉for循環(huán)加速優(yōu)化計(jì)算,X = [x(1) x(2) x(3) ... x(m)],X的每一個(gè)列向量x(i)是一個(gè)樣本,m是樣本個(gè)數(shù)。但當(dāng)樣本很多時(shí)(比如m=500萬),向量化依然不能解決問題。所以提出了mini-batch的概念(Batch是指對(duì)整個(gè)樣本都操作,mini-batch指只對(duì)所有樣本的子集進(jìn)行操作)。把若干樣本合并成一個(gè)mini-batch,比如這里選擇1000,X{1} = [x(1) x(2) ... x(1000)],X{2}?= [x(1001)?x(1002)?... x(2000)],等等。則我們一共有5000個(gè)mini-batch,此時(shí) X = [X{1} X{2} ... X{5000}]。同樣的,把輸出Y也做這樣的操作,得到 Y = [Y{1} Y{2} ... Y{5000}] 。
Notation:x(i)表示第i個(gè)樣本,z[l]表示第l層的z值,X{t}表示第t個(gè)mini-batch。
具體算法:
repeat { #不斷重復(fù)迭代優(yōu)化for t = 1, ..., 5000 { #對(duì)于普通的batch處理手段,遍歷一次樣本更新一次參數(shù)。而在mini-batch的方法中,遍歷一次樣本更新了5000次參數(shù)。Forward prop on X{t} #用向量化的手段依次處理每一個(gè)mini-batchZ[1] = W[1]X{t} + b[1]A[1] = g[1](Z[1])...A[l] = g[l](Z[l])Compute cost J = 1/1000*(∑L(y_hat(i), y(i)))+ 正則化項(xiàng)Back prop to compute gradients with respect to J{t} (using X{t}, Y{t})W[l] = W[l] - αdW[l], b[l] = b[l] - αdb[l]} }對(duì)于batch處理方式來說,cost function J隨著優(yōu)化的進(jìn)行是越來越小的,單調(diào)遞減。而對(duì)于mini-batch的處理方式來說,則是震蕩著下降,或者說下降的曲線夾雜了噪音。
一個(gè)超參數(shù)是mini-batch的大小,size。如果size = m,則意味著就是batch gradient descent,用整個(gè)數(shù)據(jù)集訓(xùn)練。如果size = 1,則是stochastic gradient descent,每個(gè)樣本都是獨(dú)立的mini-batch。前者的問題是每次迭代的計(jì)算太費(fèi)時(shí),后者的問題是隨機(jī)性太嚴(yán)重,效率過于低下,失去了向量化帶來的加速計(jì)算效果。mini-batch的大小介于兩者之間,能獲得平衡的效果,一方面有向量化的加速效果,另一方面又不需要計(jì)算全部樣本。關(guān)于mini-batch的大小,NG的建議:1)如果小數(shù)據(jù)集(少于2000),直接使用batch方法;2)一般的mini-batch大小是64~512,考慮到CPU/GPU的內(nèi)存存儲(chǔ)方式,2的冪的大小算得更快。不用擔(dān)心mini-batch的大小不能整除樣本數(shù)的問題,最后一個(gè)樣本就少一點(diǎn)沒事。也有人用1024,但不常見。這是一個(gè)超參數(shù),所以NG建議多嘗試幾個(gè)不同的2的冪,找個(gè)最好的。mini-batch越大,減少了噪音,也減少了正則化效果。
?
def random_mini_batches(X, Y, mini_batch_size = 64, seed = 0):"""Creates a list of random minibatches from (X, Y)Arguments:X -- input data, of shape (input size, number of examples)Y -- true "label" vector (1 for blue dot / 0 for red dot), of shape (1, number of examples)mini_batch_size -- size of the mini-batches, integerReturns:mini_batches -- list of synchronous (mini_batch_X, mini_batch_Y)"""np.random.seed(seed) # To make your "random" minibatches the same as oursm = X.shape[1] # number of training examplesmini_batches = []# Step 1: Shuffle (X, Y)permutation = list(np.random.permutation(m))shuffled_X = X[:, permutation]shuffled_Y = Y[:, permutation].reshape((1,m))# Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case.num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionningfor k in range(0, num_complete_minibatches):mini_batch_X = shuffled_X[:, k*mini_batch_size : (k+1)*mini_batch_size]mini_batch_Y = shuffled_Y[:, k*mini_batch_size : (k+1)*mini_batch_size]mini_batch = (mini_batch_X, mini_batch_Y)mini_batches.append(mini_batch)# Handling the end case (last mini-batch < mini_batch_size)if m % mini_batch_size != 0:mini_batch_X = shuffled_X[:, (k+1)*mini_batch_size : m-1]mini_batch_Y = shuffled_Y[:, (k+1)*mini_batch_size : m-1]mini_batch = (mini_batch_X, mini_batch_Y)mini_batches.append(mini_batch)return mini_batches
2.?指數(shù)加權(quán)平均(指數(shù)加權(quán)移動(dòng)平均):
vt = βvt-1 + (1-β)θt 。這個(gè)公式可以看成 vt?近似等于 1/(1-β) 個(gè)數(shù)據(jù)的平均值,比如β = 0.9,則近似可以看成是10個(gè)數(shù)據(jù)的平均值。展開來看,vt = (1-β)*θt? + (1-β)*β*θt-1? + (1-β)*β2*θt? + ...(1-β)*βn*θt?,權(quán)重指數(shù)衰減。(為什么近似等于1/(1-β) 個(gè)數(shù)據(jù)的平均值?NG解釋說,如果β接近1,β1/(1-β)≈1/e=0.37,0.37的權(quán)重已經(jīng)很小了,所以說近似等于 1/(1-β) 個(gè)數(shù)據(jù)的平均值。)
指數(shù)加權(quán)平均的一大好處是可以迭代計(jì)算,占內(nèi)存很小。相比之下,如果記錄過去n個(gè)數(shù)值,然后算平均數(shù),顯然耗內(nèi)存很多。
偏差矯正:偏差產(chǎn)生的原因是頭部缺數(shù)據(jù),造成求得的指數(shù)加權(quán)平均比較小。偏差矯正的公式是 vt?/ (1 -?βt),注意這里是計(jì)算完vt后矯正,而不是在迭代過程中實(shí)時(shí)矯正。直觀地說,如果β大,比如0.98,則需要平均更多的數(shù)據(jù),于是1 -?βt更小,從而把 vt?放大。
?
3. Momentum (Gradient descent with momentum)
這種方法幾乎總是比標(biāo)準(zhǔn)的梯度下降快。基本想法是:用梯度的指數(shù)加權(quán)平均數(shù)來更新權(quán)重。如果優(yōu)化的問題有大的condition number,則優(yōu)化過程中,會(huì)在一個(gè)方向劇烈震蕩。這導(dǎo)致我們只能選用小的學(xué)習(xí)率,降低了優(yōu)化的速度。如果學(xué)習(xí)率大,很容易就發(fā)散了。我們希望的是在震蕩的方向上迭代步長(zhǎng)小一點(diǎn),而在沒有震蕩的方向上迭代步長(zhǎng)大一點(diǎn)。指數(shù)加權(quán)平均的做法在震蕩方向上把數(shù)據(jù)正負(fù)抵消了,所以得到很小的數(shù),而在沒有震蕩的方向上則持續(xù)增加。物理的直觀解釋是想象一個(gè)小球從碗的邊沿滾下去,梯度是它的加速度,momentum是它的速度,β是和摩擦力相關(guān)的量。相比于標(biāo)準(zhǔn)的梯度下降,當(dāng)前迭代只與當(dāng)前梯度相關(guān),而momentum的方法把當(dāng)前迭代和過往梯度也聯(lián)系起來。
具體算法:
vdW = 0,?vdb = 0
對(duì)于每一步的迭代:
計(jì)算當(dāng)前mini-batch的梯度dW, db。
vdW =?βvdW + (1-β)dW ?# NG解釋說也有的教材寫成 vdW?=?βvdW?+ dW,他自己不喜歡這種,因?yàn)楦y調(diào)參數(shù),調(diào)β的時(shí)候,會(huì)再需要調(diào)α。
vdb =?βvdb + (1-β)db
W = W -?αvdW, b = b-?αvdb
α和β是超參數(shù),不過經(jīng)驗(yàn)上看β取0.9是非常不錯(cuò)的。一般人們不用偏差矯正,因?yàn)橥ㄟ^初始階段后就無偏了。
?
4. RMSprop(Root mean square prop): NG說這個(gè)方法最開始是Geoffrey Hinton在coursera的課上提出來的。
具體算法:
SdW = 0,?Sdb?= 0
對(duì)于每一步的迭代:
計(jì)算當(dāng)前mini-batch的梯度dW, db。
SdW?=?βSdW?+ (1-β)dW2? ?#?dW2是把向量的每個(gè)元素各自平方。
Sdb?=?βvdb?+ (1-β)db2
W = W -?αdW/(sqrt(SdW)+ε), b = b-?αdb/(sqrt(Sdb)+ε) # 分母加上ε為了防止除以0的情況,ε可以隨便設(shè)一個(gè)很小的數(shù),比如e-8
直觀地解釋:對(duì)于震蕩的優(yōu)化方向,S值會(huì)比較大,從而更新參數(shù)時(shí)步長(zhǎng)會(huì)比較小,從而消除震蕩。
?
5. Adam(Adaptive moment estimation):將Momentum和RMSprop結(jié)合起來。
具體算法:
vdW = 0,SdW = 0,??vdb?= 0,Sdb?= 0
對(duì)于每一步的迭代:
計(jì)算當(dāng)前mini-batch的梯度dW, db。
vdW?=?β1vdW?+ (1-β1)dW,vdb?= β1vdb?+ (1-β1)db ?# β1對(duì)應(yīng)Momentum。
SdW?=?β2SdW?+ (1-β2)dW2?, Sdb?= β2vdb?+ (1-β2)db2? #?β2對(duì)應(yīng)RMSprop。
vdW_corrected = vdW / (1 -?β1t),vdb_corrected?= vdb?/ (1 -?β1t),
SdW_corrected?= SdW?/ (1 -?β2t),Sdb_corrected?= Sdb?/ (1 -?β2t),
W = W -?αvdW_corrected?/ (sqrt(SdW_corrected)+ε),?b = b -?αvdb_corrected?/ (sqrt(Sdb_corrected)+ε)
超參數(shù):α需要調(diào)試,β1可以設(shè)為0.9,β2可以設(shè)為0.999,ε可以設(shè)為e-8。一般大家都只調(diào)α,另外幾個(gè)就按照默認(rèn)值。
Adam非常非常牛逼,默認(rèn)選項(xiàng)。
?
6. 學(xué)習(xí)率衰減(Learning rate decay):
1 epoch的意思是遍歷一次數(shù)據(jù)集。
一種典型的decay方法:α = α0?/ (1+decay_rate*epoch_num),decay_rate是另一個(gè)需要調(diào)的超參數(shù)。
其他decay方法:α = 0.95epoch_numα0;α = k*α0?/ sqrt(epoch_num);α = k*α0?/ sqrt(t),t是迭代次數(shù);還有分段離散衰減的。
NG說學(xué)習(xí)率衰減并不是他優(yōu)先考慮的東西,他優(yōu)先還是選一個(gè)好一些的固定的α。
?
7. 深度學(xué)習(xí)中的局部最優(yōu):
傳統(tǒng)的理解中,局部最優(yōu)是要避免的。但是在深度學(xué)習(xí)優(yōu)化的問題里(比如有2萬個(gè)參數(shù),或者說在2萬維的空間),梯度為0的點(diǎn)往往并不是局部最優(yōu),而是鞍點(diǎn)。NG說:我們對(duì)低緯度空間的大部分直覺不能應(yīng)用到高緯度空間中。所以深度學(xué)習(xí)的優(yōu)化中,并不擔(dān)心陷入局部最優(yōu),而是擔(dān)心在平穩(wěn)段(導(dǎo)數(shù)在很大的區(qū)域都接近0)優(yōu)化變慢。Momentum、RMSprop、Adam等算法可以加速對(duì)平穩(wěn)段的優(yōu)化。
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zonghaochen/p/7791763.html
總結(jié)
以上是生活随笔為你收集整理的deeplearning.ai 改善深层神经网络 week2 优化算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #44
- 下一篇: async 和 await的前世今生 (