深度學習基礎課:使用交叉熵損失函數和Softmax激活函數(上)
大家好~本課程為“深度學習基礎班”的線上課程,帶領同學從0開始學習全連接和卷積神經網絡,進行數學推導,并且實現可以運行的Demo程序
線上課程資料:
本節課錄像回放
加QQ群,獲得ppt等資料,與群主交流討論:106047770
本系列文章為線上課程的復盤,每上完一節課就會同步發布對應的文章
本課程系列文章可進入索引查看:
深度學習基礎課系列文章索引
回顧相關課程內容
- 什么是訓練?
- 訓練中的收斂是指什么?
為什么要學習本課
- 全連接層在“判斷性別Demo“的訓練時,收斂得比較慢,如何加快?
- 全連接層在“識別手寫數字“的訓練時,收斂得比較慢,如何加快?
主問題:如何加快二分類的訓練速度?
- “判斷性別Demo“屬于二分類還是多分類?
答:二分類 - 收斂的速度決定于什么?
答:梯度越大,收斂越快 - 我們現在只考慮輸出層
- 使用的是什么損失函數?
答:MSE

- 使用的是什么激活函數?
答:sigmoid,它的曲線如下圖所示:

- 輸出層的單個神經元的梯度計算公式是什么?
答:
\[\begin{aligned}
\frac{dE}{dw_{kj}} &=\delta_k a_j \\
&= \frac{dE}{dy_k}\frac{df(net_k)}{dnet_k} a_j \\
&=-\frac {2}{n}(y_{真實}-y_k) \frac{df(net_k)}{dnet_k} a_j
\end{aligned}
\]
- 公式中的第三項(激活函數的導數)的值跟loss的大小有什么關系?
答:loss很大或者很小時,值都很小。
這是因為\(y_{真實值}\)只能等于0或者1,所以如果\(y_{真實值}\)為0,那么loss很大或者很小的情況就是\(y_{輸出值}\)接近1或者0,而此時的導數是非常小的;\(y_{真實值}\)為1的情況也是一樣 - 所以loss的大小和梯度的大小的關系是什么?
答:loss很大或者很小時,梯度都很小 - 所以loss的大小和收斂速度的關系是什么?
答:loss很大或者很小時,收斂速度都很慢 - 希望loss和梯度的關系是什么,才能盡快收斂?
答:成正比關系,即:
loss很大時,梯度很大;
loss很小時,梯度很小 - 誤差項的大小和梯度的大小的關系是什么?
答:正比 - 請思考誤差項的公式應該是什么樣的,才能滿足loss與誤差項成正比,從而與梯度成正比?
答:因為\(loss=y_k - y_{真實}\),所以如果誤差項等于loss,那么它們肯定就成正比關系。所以誤差項公式為: \(\delta_k=y_k - y_{真實}\) - 我們使用新的損失函數:交叉熵損失函數,它應該是什么,才能滿足下面的公式?
\[\begin{aligned}
E = ?從而
\frac{dE}{dy_k}\frac{df(net_k)}{dnet_k} = \delta_k = y_k - y_{真實} \\
\end{aligned}
\]
答:
\[e = - \frac {1}{n} \sum_{i=1}^n (y_{真實}\ln{y_{輸出}} + (1-y_{真實})\ln{(1-y_{輸出})})
\]
結學
- 我們如何設計新的損失函數?
答:我們倒著推導:
首先找到loss跟誤差項的關系;
然后根據該關系以及loss的公式,設計希望的誤差項公式;
最后根據梯度與誤差項的公式,推導出損失函數的公式。 - 如何加快二分類的訓練速度?
答:使用新的損失函數,使loss跟收斂速度成正比
任務:判斷性別Demo使用交叉熵損失函數
- 請實現“使用交叉熵損失函數”的代碼
- 實現_computeLoss函數
- 修改輸出層誤差項的計算
答:待實現的代碼為:CrossEntropyLoss_gender,實現后的代碼為:CrossEntropyLoss_gender_answer
- 請每個同學運行代碼,并與之前的代碼NeuralNetwork_train_fix_zeroMean_answer_fix比較,看下:
- loss的訓練速度是否加快?
- 是否在loss很大時訓練速度也很快?
答:我們取20輪的訓練結果
之前的代碼的運行結果:
[ 'loss: ', 0.4507304592177789 ]
[ 'loss: ', 0.42877150239298367 ]
[ 'loss: ', 0.4003410570050336 ]
[ 'loss: ', 0.36471054740582803 ]
[ 'loss: ', 0.32348350190262276 ]
[ 'loss: ', 0.28148842822336106 ]
[ 'loss: ', 0.24435904667566208 ]
[ 'loss: ', 0.21478940821264678 ]
[ 'loss: ', 0.19217920769398236 ]
[ 'loss: ', 0.1746959045869208 ]
[ 'loss: ', 0.16069147885466947 ]
[ 'loss: ', 0.14903993518214445 ]
[ 'loss: ', 0.13904224985035976 ]
[ 'loss: ', 0.13027401434711444 ]
[ 'loss: ', 0.12247365805566274 ]
[ 'loss: ', 0.11547411658524662 ]
[ 'loss: ', 0.10916376857366585 ]
[ 'loss: ', 0.1034647748090702 ]
[ 'loss: ', 0.09832137076163855 ]
[ 'loss: ', 0.09369385876122124 ]
現在的代碼的運行結果:
[ 'loss: ', 0.9942633398183269 ]
[ 'loss: ', 0.6659776522867806 ]
[ 'loss: ', 0.49140689993232145 ]
[ 'loss: ', 0.37709033494651706 ]
[ 'loss: ', 0.2994042613488786 ]
[ 'loss: ', 0.22748275377361313 ]
[ 'loss: ', 0.178710734329234 ]
[ 'loss: ', 0.14814081504087312 ]
[ 'loss: ', 0.1262728567509965 ]
[ 'loss: ', 0.10981773645519985 ]
[ 'loss: ', 0.09701072087557354 ]
[ 'loss: ', 0.08678048289782145 ]
[ 'loss: ', 0.07843471667890223 ]
[ 'loss: ', 0.07150614449993825 ]
[ 'loss: ', 0.06566841165919438 ]
[ 'loss: ', 0.06068705773306658 ]
[ 'loss: ', 0.05638955210782751 ]
[ 'loss: ', 0.05264627797401171 ]
[ 'loss: ', 0.049358078224151274 ]
[ 'loss: ', 0.04644787505022075 ]
通過比較最后一輪的結果,我們可以看到現在的代碼的loss更接近0,所以更加收斂;
通過比較前三輪的結果,我們可以看到現在的代碼在loss很大時訓練速度更快
浙公網安備 33010602011771號