《深度学习入门:基于Python的理论与实现》第四章代码原理详细解析
這一章的代碼解讀的難點是:
 涉及到兩個函數的求導問題。
①sigmoid函數的求導:
 ?yj?xj=yj(1?yj)\frac{\partial y_j}{\partial x_j}=y_j(1-y_j)?xj??yj??=yj?(1?yj?)
 出處是[2]
②softmax函數的求導:
 ?E?zi=ai?yi\frac{\partial E}{\partial z_i}=a_i-y_i?zi??E?=ai??yi?
 出處是[1]
、------------------------------------------
 第四章的整個神經網絡的結構是:
 輸入層:784個節點(無激活函數)
 隱藏層:50個節點(激活函數:sigmoid)
 輸出層:10個節點(激活函數:softmax)
 下面的維度檢查中的100,是因為一個batch_size=100
 、------------------------------------------
 代碼變量與神經網絡結構之間的具體對應關系:
 輸入x,
 第一層輸入a1,輸出z1
 第二層輸入a2,輸出y
 、------------------------------------------
 理論與神經網絡結構之間的具體對應關系是:
 輸入x,
 第一層輸入x1,輸出y1
 第二層輸入x2,輸出y2
、------------------------------------------
 According to [2]:
 △w
 =-ε?E?w=-\varepsilon\frac{\partial E}{\partial w}=-ε?w?E? (8)
=-ε?E?wji=-\varepsilon\frac{\partial E}{\partial w_{ji}}=-ε?wji??E? (6)
=-ε?E?xj?yi=-\varepsilon\frac{\partial E}{\partial x_j}·y_i=-ε?xj??E??yi?
 ≈-εy?tbatch_num?z1.T\approx -\varepsilon \frac{y-t}{batch\_num}·z1.T≈-εbatch_numy?t??z1.T(代碼中的變量)
 =-ε?grads[′W2′]=-\varepsilon·grads['W2']=-ε?grads[′W2′](代碼中的變量)
| a1a1a1 | x1(隱藏層輸入)x_1(隱藏層輸入)x1?(隱藏層輸入) | (100,50) | 
| z1z1z1 | y1(隱藏層輸出)y_1(隱藏層輸出)y1?(隱藏層輸出) | (100,50) | 
| a2a2a2 | x2(輸出層輸入)x_2(輸出層輸入)x2?(輸出層輸入) | (100,10) | 
| yyy | y2(輸出層輸出)y_2(輸出層輸出)y2?(輸出層輸出) | (100,10) | 
| da1da1da1 | ?E?x2?w21\frac{\partial E}{\partial x_2}·w_{21}?x2??E??w21? | (100,50) | 
| dz1dz1dz1 | ?E?x2??x2?y1??y1?x1\frac{\partial E}{\partial x_2}·\frac{\partial x_2}{\partial y_1}·\frac{\partial y_1}{\partial x_1}?x2??E???y1??x2????x1??y1?? =?E?x2?w21?[y1?(1?y1)]\frac{\partial E}{\partial x_2}·w_{21}·[y_1·(1-y_1)]?x2??E??w21??[y1??(1?y1?)] | (100,50) | 
| dy=y?tbatch_numdy=\frac{y-t}{batch\_num}dy=batch_numy?t? | ?E?x2\frac{\partial E}{\partial x_2}?x2??E?(這里的x2x_2x2?是一個矢量,整體表示100條數據對各個輸出節點的誤差貢獻) | (100, 10) | 
| z1.Tz1.Tz1.T | yiy_iyi? | (50, 100) | 
| grads[′b2′]grads['b2']grads[′b2′] | ?E?x2\frac{\partial E}{\partial x_2}?x2??E? | (10,) | 
| grads[′W2′]grads['W2']grads[′W2′] | ?E?w21\frac{\partial E}{\partial w_{21}}?w21??E? | (50,10) | 
| grads[′W1′]grads['W1']grads[′W1′] | ?E?x2??x2?y1??y1?x1??x1?w10=?E?x2?w21?[y1?(1?y1)]?x\frac{\partial E}{\partial x_2}·\frac{\partial x_2}{\partial y_1}·\frac{\partial y_1}{\partial x_1}·\frac{\partial x_1}{\partial w_{10}}=\frac{\partial E}{\partial x_2}·w_{21}·[y_1·(1-y_1)]·x?x2??E???y1??x2????x1??y1????w10??x1??=?x2??E??w21??[y1??(1?y1?)]?x | (784,50) | 
| grads[′b1′]grads['b1']grads[′b1′] | ?E?x1\frac{\partial E}{\partial x_1}?x1??E? | (50,) | 
關于上述表格中的“y?t”“y-t”“y?t”的出處,可以參考[1]:
這里的grads[′b2′]grads['b2']grads[′b2′]推導如下:
 ?E?b2=?E?x2?x2?b2=?E?x2?(w21?y1+b2)?b2=?E?x2\frac{\partial E}{\partial b_2}=\frac{\partial E}{\partial x_2}\frac{\partial x_2}{\partial b_2}=\frac{\partial E}{\partial x_2}\frac{\partial(w_{21}·y_1+b2)}{\partial b_2}=\frac{\partial E}{\partial x_2}?b2??E?=?x2??E??b2??x2??=?x2??E??b2??(w21??y1?+b2)?=?x2??E?
grads[′b1′]grads['b1']grads[′b1′]推導推導同理。
 --------------------------------------------
為什么在計算grads[′b1′]grads['b1']grads[′b1′]和grads[′b2′]grads['b2']grads[′b2′]時進行求和?
 與后面的batch_num進行配套使用,獲取該輪batch訓練得到的bjbjbj的平均值作為最終的模型參數
 --------------------------------------------
關于這里batch_num出現在dy中不太好理解,其實我們可以看到batch_num最終進入了grads[′b2′]中,所以其含義是對100條數據產生的bj的和取了一個平均,作為這輪batch訓練后的得到的偏置bjgrads['b2']中,所以其含義是對100條數據產生的b_j的和取了一個平均, 作為這輪batch訓練后的得到的偏置b_jgrads[′b2′]中,所以其含義是對100條數據產生的bj?的和取了一個平均,作為這輪batch訓練后的得到的偏置bj?
--------------------------------------------
注意:
 softmax以及sigmoid的求導結果是不一樣的.
參考:
 [1]softmax with cross-entropy loss求導(轉載+細節整理)
 [2]《learning representations by back-propagating errors》
總結
以上是生活随笔為你收集整理的《深度学习入门:基于Python的理论与实现》第四章代码原理详细解析的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: softmax with cross-e
 - 下一篇: A little something t