深度學習基礎課:用全連接層識別手寫數字(中)
大家好~我開設了“深度學習基礎班”的線上課程,帶領同學從0開始學習全連接和卷積神經網絡,進行數學推導,并且實現可以運行的Demo程序
線上課程資料:
本節課錄像回放
加QQ群,獲得ppt等資料,與群主交流討論:106047770
本系列文章為線上課程的復盤,每上完一節課就會同步發布對應的文章
本文為第五節課:“用全連接層識別手寫數字(中)”的復盤文章
本課程系列文章可進入索引查看:
深度學習基礎課系列文章索引
主問題:如何使訓練收斂?
- 如何找到未收斂的原因?
答:通過打印(log)來調試,打印一些重要的值 - 打印哪些值?
答:前向傳播的輸入輸出;
后向傳播的輸入輸出;
更新后的權重矩陣。
任務:找到未收斂的原因并修復
- 請通過打印的方法調試,找到異常的數據?
答:使用Log.res模塊的log和printForDebug函數來打印,找到了下面的異常數據:
1.前向傳播的輸出中,隱藏層和輸出層的輸出向量的值都幾乎為1。
進一步發現:它們的加權和都比較大,其中隱藏層的加權和基本上都是50幾,輸出層的加權和基本上都是10幾。
2.后向傳播的輸出中,隱藏層和輸出層的梯度都很小 - 原因是什么?如何修復?
答: 對于第1個異常數據,原因是隱藏層的輸入向量的個數(784)和輸出層的輸入向量的個數(30)都很多,導致加權和過大,從而導致sigmoid激活函數的返回接近1
對于第2個異常數據,原因是:sigmoid激活函數的返回接近1->激活函數的導數接近0->梯度很小
另外因為損失函數變化了,所以在后向傳播中計算輸出層的誤差項時, \(\frac{dE}{dy_k}\)應該要修改。不過目前暫時不修改,因為跟修改前差別不大,所以影響不大。另外以后會再次修改損失函數,所以到時候再改
修復方案:
根據輸入向量的個數來減小加權和,解決“sigmoid激活函數返回接近1”的問題;并且提高學習率,來減輕梯度過小的問題
- 請實現修復
答:待修復的代碼為:ImplementTrain_answer,修復后的代碼為:ImplementTrain_fix - 請每個同學都運行修復后的代碼,看下是否收斂?
答:現在正確率在50輪時能提高到60%左右,增加更多輪數則會提高到100%,所以收斂了
任務:重構調試代碼
- 請增加異常檢查的代碼,自動化檢查異常數據?
答:待修改的代碼為:ImplementTrain_fix。增加了代碼:DebugUtils,修改后的代碼為ImplementTrain_fix_check
現在會檢查減小加權和后,加權后是否<=7;以及檢查隱藏層和輸出層的梯度 乘以 學習率后 是否出現消失或者爆炸的情況(梯度消失或梯度爆炸) - 請每個同學都運行代碼,看下是否通過了自動化檢查?
答:通過了檢查 - 請每個同學都調整下學習率,看下結果?
答:我們檢查梯度乘以學習率后的值,具體是通過自動化檢查中梯度消失的值的個數(打印的次數)來判斷該值變化的趨勢:學習率為0.1時,該值呈逐漸減小的趨勢,所以導致正確率一直維持不變(10%)左右;學習率為10.0時,該值呈現逐漸增大的趨勢,所以導致正確率逐漸加快地增加(直到100%)
結學
- 未收斂的原因的原因是什么?
- 如何修復?
- 如何自動化地檢查?
浙公網安備 33010602011771號