深度學習基礎課:全連接層的梯度檢查
大家好~我開設了“深度學習基礎班”的線上課程,帶領同學從0開始學習全連接和卷積神經網絡,進行數學推導,并且實現可以運行的Demo程序
線上課程資料:
本節課錄像回放1
本節課錄像回放2
本節課錄像回放3
加QQ群,獲得ppt等資料,與群主交流討論:106047770
本系列文章為線上課程的復盤,每上完一節課就會同步發布對應的文章
本文為第四節課:“全連接層的梯度檢查”的復盤文章
本課程系列文章可進入索引查看:
深度學習基礎課系列文章索引
回顧相關課程內容
-
第二節課“判斷性別”Demo需求分析和初步設計(下1)
- 求損失函數的極小值點的梯度下降公式是什么?
-
第三節課:全連接層的前向和后向傳播推導(下)
- 反向傳播算法計算的結果是什么?
- 計算梯度有什么用?
-
第二節課“判斷性別”Demo需求分析和初步設計(下1)
- 損失函數的表達式是什么?
- 隨機梯度下降算法是什么?
- 隨機梯度下降公式是什么?
- 求損失函數的極小值點的梯度下降公式是什么?
為什么要學習本課
- 如何驗證反向傳播計算的梯度是否正確?
- 我們是如何驗證的?
答:驗證過程為:因為NeuralNetwork_train_answer->train函數打印的loss的結果與判斷性別Demo的NeuralNetwork_train_before->train函數打印的loss一樣,所以說明代碼正確,通過了運行測試 - 還有其它辦法嗎?
- 我們是如何驗證的?
主問題:如何以最小的誤差計算導數?
任務:實現導數的計算
- 導數的定義是什么?
\( f'(x) = \lim_{h \to 0} ? \)
答:
- 請實現導數的計算
答:待實現的代碼:Diff1
實現后的代碼:Diff1_answer
任務:計算函數的導數
- 請用剛剛寫的代碼計算下面的函數在x=2的導數,查看是否有誤差?
\( f(x)=x^2 + 3x \)
答:實現后的代碼:Diff1_compute_answer- h如果太小(如1e-15),誤差是否會增加?
答:會 - 為什么?
答:因為計算機的浮點數誤差的原因,h太小的話(比如1e-15)會造成計算結果上的誤差,所以我們一般用[1e-4,1e-7]之間的數值。 我們這里使用1e-4
- h如果太小(如1e-15),誤差是否會增加?
任務:實現改進的導數的計算
-
如何修改導數的定義公式\(f'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h}\),從而減小誤差?
- 如該圖所示,紅色實線的斜率是真實的導數

- 藍色虛線的斜率是目前求得的導數
- 為什么?
- 綠色虛線的斜率是否更接近真實導數?
- 如何修改導數的定義公式為綠色的虛線?
答:修改后的公式為:
- 如該圖所示,紅色實線的斜率是真實的導數
- 請實現改進的導數的計算
答:待實現的代碼:Diff2
實現后的代碼:Diff2_answer
任務:計算函數的導數
- 請用剛剛寫的代碼計算同樣的函數在x=2的導數,查看誤差是否變小了?
答:實現后的代碼:Diff2_compute_answer
運行代碼后,發現誤差確實更小了
主問題:梯度檢查的思路是什么?
- 梯度\(\frac{dE}{dw_{ji}}\)是否為導數?
答:是 - 通過導數定義的公式\(f'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x - h)}{2h}\)計算梯度的公式是什么?
答:
- 如何用該公式檢查梯度?
答:我們使用該公式來計算梯度值;
然后將其與后向傳播計算的梯度值進行比較。
如果兩者的誤差小于1e-4,那么就說明后向傳播的代碼是正確的。
主問題:如何對輸出層進行梯度檢查?
- 對輸出層進行梯度檢查的步驟是什么?
答:
1、使用一個樣本d進行前向傳播和后向傳播,這樣就能得到輸出層的一個神經元k的梯度
2、將神經元k的一個權重值??_????加上一個很小的值??(1e-4 ),重新計算神經網絡在這個樣本d的E:E(??_????+??)
3、將神經元k的一個權重值??_???? 減去一個很小的值??(1e-4 ),重新計算神經網絡在這個樣本d的E:E(??_???????)
4、根據導數定義公式計算出期望的梯度值,和第一步獲得的梯度值進行比較,誤差應該小于1e-4
5、重復上面的過程,對輸出層的每個神經元的每個權重進行檢查
- 在通過后向傳播計算梯度的誤差項時,n是多少?

答:因為只用了一個樣本,所以n是1
任務:實現輸出層的梯度檢查

- 請實現輸出層的梯度檢查
- 實現前面4個步驟
答:待實現的代碼:OutputLayerGradientCheck
實現后的代碼:OutputLayerGradientCheck_1_4_answer - 實現所有步驟
答:實現后的代碼:OutputLayerGradientCheck_5_answer
- 實現前面4個步驟
- 請每個同學都運行代碼,看下是否通過了檢查
答:通過了檢查。運行結果如下:

主問題:如何對隱藏層進行梯度檢查?
-
對隱藏層進行梯度檢查的步驟是什么?
答:步驟與對輸出層進行梯度檢查相同 -
在通過后向傳播計算隱藏層的梯度的誤差項時,需要輸出層的誤差項,它是多少?
即:\( \begin{aligned} \overrightarrow{\delta_{隱藏層}} &=\begin{bmatrix} \delta_{3} \\ \delta_{4} \\ \end{bmatrix}\\ &= \begin{bmatrix} \overrightarrow{\delta_{輸出層}} \cdot W_{輸出層_{1列}} \;\; \frac{df(net_3)}{dnet_3} \\ \overrightarrow{\delta_{輸出層}} \cdot W_{輸出層_{2列}} \;\; \frac{df(net_4)}{dnet_4} \\ \end{bmatrix} \end{aligned} \)中的\(\overrightarrow{\delta_{輸出層}} = ?\)- 損失函數E應該設計成什么,以及輸出層應該選擇什么激活函數(sigmoid or linear),才能使輸出層的誤差向量的值全為1?
答:
- 損失函數E應該設計成什么,以及輸出層應該選擇什么激活函數(sigmoid or linear),才能使輸出層的誤差向量的值全為1?
輸出層的誤差項公式為:

- 現在輸出層的激活函數使用linear,那么隱藏層的激活函數也必須是linear嗎?
答:不需要
任務:實現隱藏層的梯度檢查

- 請實現隱藏層的梯度檢查
答:待實現的代碼:HiddenLayerGradientCheck
實現后的代碼:HiddenLayerGradientCheck_answer - 請每個同學都運行代碼,看下是否通過了檢查
答:通過了檢查。運行結果如下:

任務:整合全連接層的梯度檢查
-
請整合輸出層和隱藏層的梯度檢查
答:待實現的代碼:LinearLayerGradientCheck
實現后的代碼:LinearLayerGradientCheck_answer -
請每個同學都運行代碼,看下是否通過了檢查
答:通過了檢查。運行結果如下:

總結
- 請總結本節課的內容?
- 請回答所有主問題?
浙公網安備 33010602011771號