02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法(作业:优化方法)
文章目錄
- 1. 梯度下降
- 2. mini-Batch 梯度下降
- 3. 動(dòng)量
- 4. Adam
- 5. 不同優(yōu)化算法下的模型
- 5.1 Mini-batch梯度下降
- 5.2 帶動(dòng)量的Mini-batch梯度下降
- 5.3 帶Adam的Mini-batch梯度下降
- 5.4 對(duì)比總結(jié)
測(cè)試題:參考博文
筆記:02.改善深層神經(jīng)網(wǎng)絡(luò):超參數(shù)調(diào)試、正則化以及優(yōu)化 W2.優(yōu)化算法
- 導(dǎo)入一些包
1. 梯度下降
(Batch)Gradient Descent 梯度下降 對(duì)每一層都進(jìn)行:
W[l]=W[l]?α?dW[l]W^{[l]} =W^{[l]}-\alpha *d W^{[l]}W[l]=W[l]?α?dW[l]
b[l]=b[l]?α?db[l]b^{[l]} =b^{[l]}-\alpha *d b^{[l]}b[l]=b[l]?α?db[l]
lll 是層號(hào),α\alphaα 是學(xué)習(xí)率
# GRADED FUNCTION: update_parameters_with_gddef update_parameters_with_gd(parameters, grads, learning_rate):"""Update parameters using one step of gradient descentArguments:parameters -- python dictionary containing your parameters to be updated:parameters['W' + str(l)] = Wlparameters['b' + str(l)] = blgrads -- python dictionary containing your gradients to update each parameters:grads['dW' + str(l)] = dWlgrads['db' + str(l)] = dbllearning_rate -- the learning rate, scalar.Returns:parameters -- python dictionary containing your updated parameters """L = len(parameters) // 2 # number of layers in the neural networks# Update rule for each parameterfor l in range(L):### START CODE HERE ### (approx. 2 lines)parameters["W" + str(l+1)] = parameters['W'+str(l+1)] - learning_rate * grads['dW'+str(l+1)]parameters["b" + str(l+1)] = parameters['b'+str(l+1)] - learning_rate * grads['db'+str(l+1)]### END CODE HERE ###return parametersStochastic Gradient Descent 隨機(jī)梯度下降
- 每次只用1個(gè)樣本來(lái)更新梯度,當(dāng)訓(xùn)練集很大的時(shí)候,SGD 很快
- 其尋優(yōu)過(guò)程有震蕩
代碼差異:
- (Batch) Gradient Descent:
- Stochastic Gradient Descent:
3者的差別在于,一次梯度更新時(shí),用到的樣本數(shù)量不同
調(diào)好參數(shù)的 mini-batch 梯度下降,通常優(yōu)于梯度下降或隨機(jī)梯度下降(特別是當(dāng)訓(xùn)練集很大時(shí))
2. mini-Batch 梯度下降
如何從訓(xùn)練集 (X,Y)(X,Y)(X,Y) 建立 mini-batches
步驟1:隨機(jī)打亂數(shù)據(jù),X 和 Y 是同步進(jìn)行的,保持對(duì)應(yīng)關(guān)系
步驟2:切分?jǐn)?shù)據(jù)集(每個(gè)子集大小為 mini_batch_size,最后一個(gè)可能不夠,沒(méi)關(guān)系)
3. 動(dòng)量
帶動(dòng)量 的 梯度下降可以降低 mini-batch 梯度下降時(shí)的震蕩
原因:Momentum 考慮過(guò)去的梯度對(duì)當(dāng)前的梯度進(jìn)行平滑,梯度不會(huì)劇烈變化
- 初始化梯度的 初速度為 0
- 對(duì)每一層,更新動(dòng)量
{vdW[l]=βvdW[l]+(1?β)dW[l]W[l]=W[l]?αvdW[l]\begin{cases} v_{dW^{[l]}} = \beta v_{dW^{[l]}} + (1 - \beta) dW^{[l]} \\ W^{[l]} = W^{[l]} - \alpha v_{dW^{[l]}} \end{cases}{vdW[l]?=βvdW[l]?+(1?β)dW[l]W[l]=W[l]?αvdW[l]??
{vdb[l]=βvdb[l]+(1?β)db[l]b[l]=b[l]?αvdb[l]\begin{cases} v_{db^{[l]}} = \beta v_{db^{[l]}} + (1 - \beta) db^{[l]} \\ b^{[l]} = b^{[l]} - \alpha v_{db^{[l]}} \end{cases}{vdb[l]?=βvdb[l]?+(1?β)db[l]b[l]=b[l]?αvdb[l]??
# GRADED FUNCTION: update_parameters_with_momentumdef update_parameters_with_momentum(parameters, grads, v, beta, learning_rate):"""Update parameters using MomentumArguments:parameters -- python dictionary containing your parameters:parameters['W' + str(l)] = Wlparameters['b' + str(l)] = blgrads -- python dictionary containing your gradients for each parameters:grads['dW' + str(l)] = dWlgrads['db' + str(l)] = dblv -- python dictionary containing the current velocity:v['dW' + str(l)] = ...v['db' + str(l)] = ...beta -- the momentum hyperparameter, scalarlearning_rate -- the learning rate, scalarReturns:parameters -- python dictionary containing your updated parameters v -- python dictionary containing your updated velocities"""L = len(parameters) // 2 # number of layers in the neural networks# Momentum update for each parameterfor l in range(L):### START CODE HERE ### (approx. 4 lines)# compute velocitiesv["dW" + str(l+1)] = beta* v["dW" + str(l+1)] + (1-beta)*grads['dW' + str(l+1)]v["db" + str(l+1)] = beta* v["db" + str(l+1)] + (1-beta)*grads['db' + str(l+1)]# update parametersparameters["W" + str(l+1)] = parameters["W" + str(l+1)] - learning_rate*v["dW" + str(l+1)]parameters["b" + str(l+1)] = parameters["b" + str(l+1)] - learning_rate*v["db" + str(l+1)]### END CODE HERE ###return parameters, v注意:
- 速度 v 初始化為 0,算法需要幾次迭代后才能把 v 加上來(lái),然后開(kāi)始采用大的步長(zhǎng)
- β=0\beta = 0β=0 就是不帶動(dòng)量的標(biāo)準(zhǔn)梯度下降
如何選擇 β\betaβ:
- β\betaβ 越大,考慮的過(guò)去的梯度越多,梯度輸出也更光滑,太大也不行,過(guò)度光滑
- 經(jīng)常取值為 0.8 - 0.999 之間,如果不確定,0.9 是個(gè)合理的默認(rèn)值
- 參數(shù)驗(yàn)證選取,看其如何影響損失函數(shù)
4. Adam
參看筆記
對(duì)每一層:
{vdW[l]=β1vdW[l]+(1?β1)?J?W[l]vdW[l]corrected=vdW[l]1?(β1)tsdW[l]=β2sdW[l]+(1?β2)(?J?W[l])2sdW[l]corrected=sdW[l]1?(β2)tW[l]=W[l]?αvdW[l]correctedsdW[l]corrected+ε\begin{cases} v_{dW^{[l]}} = \beta_1 v_{dW^{[l]}} + (1 - \beta_1) \frac{\partial \mathcal{J} }{ \partial W^{[l]} } \\ v^{corrected}_{dW^{[l]}} = \frac{v_{dW^{[l]}}}{1 - (\beta_1)^t} \\ s_{dW^{[l]}} = \beta_2 s_{dW^{[l]}} + (1 - \beta_2) (\frac{\partial \mathcal{J} }{\partial W^{[l]} })^2 \\ s^{corrected}_{dW^{[l]}} = \frac{s_{dW^{[l]}}}{1 - (\beta_2)^t} \\ W^{[l]} = W^{[l]} - \alpha \frac{v^{corrected}_{dW^{[l]}}}{\sqrt{s^{corrected}_{dW^{[l]}}} + \varepsilon} \end{cases}????????????????????vdW[l]?=β1?vdW[l]?+(1?β1?)?W[l]?J?vdW[l]corrected?=1?(β1?)tvdW[l]??sdW[l]?=β2?sdW[l]?+(1?β2?)(?W[l]?J?)2sdW[l]corrected?=1?(β2?)tsdW[l]??W[l]=W[l]?αsdW[l]corrected??+εvdW[l]corrected???
- 初始化為 0
- 迭代更新
5. 不同優(yōu)化算法下的模型
數(shù)據(jù)集:使用以下數(shù)據(jù)集進(jìn)行測(cè)試
3層神經(jīng)網(wǎng)絡(luò)模型:
- Mini-batch Gradient Descent::
使用函數(shù) update_parameters_with_gd() - Mini-batch Momentum::
使用函數(shù) initialize_velocity() 和 update_parameters_with_momentum() - Mini-batch Adam:
使用函數(shù) initialize_adam() 和 update_parameters_with_adam()
5.1 Mini-batch梯度下降
# train 3-layer model layers_dims = [train_X.shape[0], 5, 2, 1] parameters = model(train_X, train_Y, layers_dims, optimizer = "gd")# Predict predictions = predict(train_X, train_Y, parameters)# Plot decision boundary plt.title("Model with Gradient Descent optimization") axes = plt.gca() axes.set_xlim([-1.5,2.5]) axes.set_ylim([-1,1.5]) plot_decision_boundary(lambda x: predict_dec(parameters, x.T), train_X, train_Y)表現(xiàn):
Accuracy: 0.79 (Mini-batch梯度下降)
5.2 帶動(dòng)量的Mini-batch梯度下降
# train 3-layer model layers_dims = [train_X.shape[0], 5, 2, 1] parameters = model(train_X, train_Y, layers_dims, beta = 0.9, optimizer = "momentum")# Predict predictions = predict(train_X, train_Y, parameters)# Plot decision boundary plt.title("Model with Momentum optimization") axes = plt.gca() axes.set_xlim([-1.5,2.5]) axes.set_ylim([-1,1.5]) plot_decision_boundary(lambda x: predict_dec(parameters, x.T), train_X, train_Y)表現(xiàn):
Accuracy: 0.79(帶動(dòng)量的Mini-batch梯度下降)
本例子由于太過(guò)簡(jiǎn)單,所以動(dòng)量的優(yōu)勢(shì)沒(méi)有體現(xiàn)出來(lái),在大的數(shù)據(jù)集上會(huì)較不帶動(dòng)量的模型更好
5.3 帶Adam的Mini-batch梯度下降
# train 3-layer model layers_dims = [train_X.shape[0], 5, 2, 1] parameters = model(train_X, train_Y, layers_dims, optimizer = "adam")# Predict predictions = predict(train_X, train_Y, parameters)# Plot decision boundary plt.title("Model with Adam optimization") axes = plt.gca() axes.set_xlim([-1.5,2.5]) axes.set_ylim([-1,1.5]) plot_decision_boundary(lambda x: predict_dec(parameters, x.T), train_X, train_Y)表現(xiàn):
Accuracy: 0.9366666666666666(帶Adam的Mini-batch梯度下降)
5.4 對(duì)比總結(jié)
| Gradient descent | 79.7% | 振蕩(我的結(jié)果是光滑) |
| Momentum | 79.7% | 振蕩 (我的結(jié)果是光滑,求指點(diǎn)) |
| Adam | 94% | 更光滑 |
- 動(dòng)量Momentum 通常是有幫助的,但是 較小的學(xué)習(xí)率 和 過(guò)于簡(jiǎn)單的數(shù)據(jù)集,優(yōu)勢(shì)體現(xiàn)不出來(lái)
- Adam,明顯優(yōu)于 mini-batch梯度下降 和 動(dòng)量
- 如果運(yùn)行更多的迭代次數(shù),三種方法都會(huì)產(chǎn)生非常好的結(jié)果。但是 Adam 收斂更快
- Adam優(yōu)點(diǎn):
相對(duì)較低的內(nèi)存要求(雖然比 梯度下降 和 動(dòng)量梯度下降更高)
即使很少調(diào)整超參數(shù)(除了𝛼 學(xué)習(xí)率),通常也能很好地工作
我的CSDN博客地址 https://michael.blog.csdn.net/
長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法(作业:优化方法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [Kaggle] Digit Recog
- 下一篇: LeetCode 1066. 校园自行车