最優化方法
本文只對吳恩達最優化方法中原理部分進行整理,沒有代碼部分,需要原始代碼可以到GitHub上down下來。文尾附鏈接。
除了使用Gradient Descent更新參數降低成本,還有更多高級優化方法,這些方法可以加快學習速度,甚至可以獲得更好的COST函數最終值。 擁有一個好的優化算法可能是等待天數與短短幾個小時之間的差異,以獲得同樣的效果。最優化方法做的就是加速訓練。
梯度下降在成本函數上“下坡” \(J\). 把它想象成它試圖這樣做:

在訓練的每個步驟中,您都會按照特定方向更新參數,以嘗試達到最低點。
注意: 本文中, 目標函數J對特參數a的導數用da表示:$\frac{\partial J}{\partial a } = $ da 。
1 - 梯度下降 Gradient Descent
機器學習中的一種簡單優化方法是梯度下降(Gradient Descent , GD)。 當您對每個步驟的所有$ m $示例執行梯度下降操作時,它也稱為Batch Gradient Descent。
Gradient Descent:實施梯度下降更新規則。 梯度下降規則是,對於$ l = 1,...,L $:
$ W^{[l]} = W^{[l]} - \alpha \text{ } dW^{[l]} \tag{1}\( \) b^{[l]} = b^{[l]} - \alpha \text{ } db^{[l]} \tag{2}\( 其中L是層數,\) \alpha$是學習率。
其中一個變體是隨機梯度下降(SGD),相當於小批量梯度下降,其中每個小批量只有一個例子。 您剛剛實施的更新規則不會更改。 您將在一次只計算一個訓練示例而不是整個訓練集上計算漸變的變化是什么。 下面的代碼示例說明了隨機梯度下降和(批量)梯度下降之間的差異。
- 批量梯度下降(Batch) Gradient Descent:
X = data_input
Y = labels
parameters = initialize_parameters(layers_dims)
for i in range(0, num_iterations):
# Forward propagation
a, caches = forward_propagation(X, parameters)
# Compute cost.
cost = compute_cost(a, Y)
# Backward propagation.
grads = backward_propagation(a, caches, parameters)
# Update parameters.
parameters = update_parameters(parameters, grads)
- 隨機梯度下降Stochastic Gradient Descent:
X = data_input
Y = labels
parameters = initialize_parameters(layers_dims)
for i in range(0, num_iterations):
for j in range(0, m):
# Forward propagation
a, caches = forward_propagation(X[:,j], parameters)
# Compute cost
cost = compute_cost(a, Y[:,j])
# Backward propagation
grads = backward_propagation(a, caches, parameters)
# Update parameters.
parameters = update_parameters(parameters, grads)
2 - Mini-Batch Gradient descent
下面對Mini-Batch Gradient descent進行介紹,測試集為(X, Y)。
總共有兩步:
- 重新隨機排序shuffle: 將訓練集(X,Y)的重新排序,如下所示。 X和Y的每一列代表一個訓練樣例。 注意重新隨機排序是在X和Y之間同步完成的。這樣在洗牌之后,X的\(i^{th}\)列是對應於Y中的\(i^{th}\)標簽的示例。重新排序使這些例子被隨機分配到不同的mini-batches中去。

- Partition分區: 將重新排序后的訓練集(X,Y)分區為大小為
mini_batch_size(此處為64)的mini-batches。 請注意,訓練示例的數量並不總是被mini_batch_size整除。 最后一個迷你批次可能更小,但您不必擔心這一點。 當最終的小批量小於完整的mini_batch_size時,它將如下所示:

請注意,最后一個小批量可能最終小於mini_batch_size = 64。讓\(\lfloor s\rfloor\) 代表\(s\)向下舍入到最接近的整數(這是Python中的math.floor(s)。 如果示例的總數不是mini_batch_size=64的倍數,那么將會有\(\lfloor \frac{m}{mini\_batch\_size}\rfloor\) 最終小批量中的示例將是(\(m-mini_\_batch_\_size \times \lfloor \frac{m}{mini\_batch\_size}\rfloor\))。
3 - 動量Momentum
因為mini-batch梯度下降在僅僅看到一個例子的子集之后進行參數更新,所以更新的方向具有一些變化,因此小批量梯度下降所采用的路徑將沿着局部最優收斂方向擺動。 使用Momentum可以減少這些振盪。
Momentum考慮了過去的梯度方向以平滑更新。我們將先前收斂的方向存儲在變量\(v\)中。 形式上,這將是先前步驟的梯度的指數加權平均值。 您還可以將\(v\)視為滾球下坡的“速度”,根據坡度/坡度的方向建立速度(和動量)。

動量momentum公式:
使用momentum優化梯度下降的公式如下。對於網絡的每一層 \(l = 1, ..., L\):
L代表神經網絡的某一層,\(\beta\) 是動量momentum ,\(\alpha\)是學習率。
注意:
- 用零初始化速度 \(v\)。 因此,該算法將需要幾次迭代來“建立”速度並開始開始有較快的速度。
- 如果 \(\beta = 0\),那么這只是沒有動量的標准梯度下降。
你如何選擇 $ \beta $?
- 動量 \(\beta\) 越大,更新越平滑,因為我們將過去的漸變考慮得越多。 但是,如果\(\ beta\)太大,它也可能會使更新過於平滑。
- \(\beta\)的常用值范圍為0.8到0.999。 如果你不想調整它,\(\beta = 0.9\)通常是合理的默認值。
- 調整模型的最佳 \(\beta\) 可能需要嘗試多個值才能看到在減少成本函數\(J\)的值方面最有效的方法。
4 - Adam
Adam是用於訓練神經網絡的最有效的優化算法之一。 它結合了RMSProp和Momentum的想法。
Adam 是如何工作的?
- 它計算過去梯度的指數加權平均值,並將其存儲在變量\(v\)(偏差校正前)和\(v^{correct}\)(偏差校正)中。
- 它計算過去梯度的平方的指數加權平均值,並將其存儲在變量\(s\)(偏差校正前)和\(s^{correct}\)(偏差校正)中。
- 它基於來自“1”和“2”的組合信息更新參數改變方向。
參數跟新准則如下,對於網絡每一層參數 \(l = 1, ..., L\):
這里:
- t為每層參數執行Adam的次數
- L是層數
- \(\beta_1\)和\(\beta_2\)是超參數,可控制兩個指數值加權平均值。
- \(\alpha\)是學習率
- \(\varepsilon\)是一個非常小的數字,以避免除以零
5 - 總結
Adam明顯優於小批量梯度下降和動量。 如果您在此簡單數據集上運行模型以獲得更多時期,則所有這三種方法都將產生非常好的結果。 但是,你已經看到Adam收斂得更快。
Adam的一些優點包括:
- 相對較低的內存要求(雖然高於梯度下降和帶動量的梯度下降)
- 即使很少調整超參數(除了\(\alpha\)),通常效果很好
