Improving Deep Neural Networks[3]
對吳恩達老師的《優化深度神經網絡》課程作業知識進行總結。
文章目錄
梯度檢測 Gradient Checking
首先,明確梯度檢測的目的:梯度檢測是一個用於檢測在反向傳播過程中,是否正確計算了梯度的方法。在本節中,吳恩達老師舉了一個例子說明梯度檢測的使用情況:
在公司或團隊的工作中,你的上司要求你證明自己的反向傳播部分計算的導數都是正確的,此時,就需要利用梯度檢測來進行確認證明了。
1 梯度檢測的工作原理
反向傳播過程中,我們會計算J關於各個參數的梯度:,其中是有關的參數。
前向傳播的結構非常簡單,幾乎沒有計算的過程,因此,我們幾乎可以100%認爲前向傳播得到的是可靠的。
梯度檢測正是利用來進行檢測的。
梯度的計算公式定義如下:
可以知道,公式左側的梯度正是我們需要驗證的;
在前向傳播得到之後,我們可以取一個足夠小的值,依據公式右側的式子計算並驗證。
2 N維梯度檢測 N-dimensional Gradient Check
根據工作原理,使用以下代碼進行檢測:
def gradient_check_n(parameters, gradients, X, Y, epsilon = 1e-7):
# Set-up variables
parameters_values, _ = dictionary_to_vector(parameters)
grad = gradients_to_vector(gradients)
num_parameters = parameters_values.shape[0]
J_plus = np.zeros((num_parameters, 1))
J_minus = np.zeros((num_parameters, 1))
gradapprox = np.zeros((num_parameters, 1))
# Compute gradapprox
for i in range(num_parameters):
theta_plus = np.copy(parameters_values)
theta_plus[i][0] += epsilon
J_plus[i], _ =
forward_propagation_n(X, Y, vector_to_dictionary(theta_plus))
theta_minus = np.copy(parameters_values)
theta_minus[i][0] -= epsilon
J_minus[i], _ =
forward_propagation_n(X, Y, vector_to_dictionary(theta_minus))
# Compute gradapprox[i]
gradapprox[i] = (J_plus[i] - J_minus[i]) / (2 * epsilon)
difference =
(np.linalg.norm(grad - gradapprox)) /
(np.linalg.norm(grad) + np.linalg.norm(gradapprox))
if difference > 1e-7:
...
return difference
在完成grad計算(反向傳播)以及gradapprox計算(梯度定義)後,利用歐氏距離進行度量:
在代碼中,利用了 np.linalg.norm()
計算範數。
3 總結 Conclusion
吳恩達老師在本節末提到:
- 梯度檢測是非常緩慢、低效的(因爲gradapprox的計算),因此在迭代訓練中不會將梯度檢測加入每一次迭代,而是在一些特定時候進行檢測。
- 不要和Dropout一起使用。Dropout會關閉神經元,會使得部分情況下無法檢測到錯誤/誤判錯誤,一般地,我們在檢測無誤後再添加Dropout正則化。
上一篇:Improving Deep Neural Networks[2]
下一篇:
2019/10 Karl