Improving Deep Neural Networks[3]

Improving Deep Neural Networks[3]

對吳恩達老師的《優化深度神經網絡》課程作業知識進行總結。

梯度檢測 Gradient Checking

首先,明確梯度檢測的目的:梯度檢測是一個用於檢測在反向傳播過程中,是否正確計算了梯度的方法。在本節中,吳恩達老師舉了一個例子說明梯度檢測的使用情況:

在公司或團隊的工作中,你的上司要求你證明自己的反向傳播部分計算的導數都是正確的,此時,就需要利用梯度檢測來進行確認證明了。


1 梯度檢測的工作原理

反向傳播過程中,我們會計算J關於各個參數的梯度:Jθ\dfrac{\partial J}{\partial \theta},其中θ\theta是有關的參數。

前向傳播的結構非常簡單,幾乎沒有計算的過程,因此,我們幾乎可以100%認爲前向傳播得到的JJ是可靠的。

梯度檢測正是利用JJ來進行檢測的。

梯度的計算公式定義如下:
Jθ=limε0J(θ+ε)J(θε)2ε \frac{\partial J}{\partial \theta}=\lim _{\varepsilon \rightarrow 0} \frac{J(\theta+\varepsilon)-J(\theta-\varepsilon)}{2 \varepsilon}
可以知道,公式左側的梯度正是我們需要驗證的;

在前向傳播得到JJ之後,我們可以取一個足夠小的值ϵ\epsilon,依據公式右側的式子計算並驗證。


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計算(梯度定義)後,利用歐氏距離進行度量:
difference= grad gradapprox2 grad 2+ gradapprox 2 \text {difference}=\frac{\| \text { grad }-\text {gradapprox} \|_{2}}{\| \text { grad }\left\|_{2}+\right\| \text { gradapprox } \|_{2}}
在代碼中,利用了 np.linalg.norm() 計算範數。


3 總結 Conclusion

吳恩達老師在本節末提到:

  1. 梯度檢測是非常緩慢、低效的(因爲gradapprox的計算),因此在迭代訓練中不會將梯度檢測加入每一次迭代,而是在一些特定時候進行檢測。
  2. 不要和Dropout一起使用。Dropout會關閉神經元,會使得部分情況下無法檢測到錯誤/誤判錯誤,一般地,我們在檢測無誤後再添加Dropout正則化。


上一篇:Improving Deep Neural Networks[2]
下一篇:
2019/10 Karl

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章