《深度学习入门:基于Python的理论与实现》第四章代码原理详细解析

系统 1269 0

这一章的代码解读的难点是:
涉及到两个函数的求导问题。

①sigmoid函数的求导:
∂ y j ∂ x j = y j ( 1 − y j ) \frac{\partial y_j}{\partial x_j}=y_j(1-y_j) x j y j = y j ( 1 y j )
出处是[2]

②softmax函数的求导:
∂ E ∂ z i = a i − y i \frac{\partial E}{\partial z_i}=a_i-y_i z i E = a i y i
出处是[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 ∂ w j i =-\varepsilon\frac{\partial E}{\partial w_{ji}} = ε w j i E (6)

= - ε ∂ E ∂ x j ⋅ y i =-\varepsilon\frac{\partial E}{\partial x_j}·y_i = ε x j E y i
≈ - ε y − t b a t c h _ n u m ⋅ z 1. T \approx -\varepsilon \frac{y-t}{batch\_num}·z1.T ε b a t c h _ n u m y t z 1 . T (代码中的变量)
= - ε ⋅ g r a d s [ ′ W 2 ′ ] =-\varepsilon·grads['W2'] = ε g r a d s [ W 2 ] (代码中的变量)

变量名称 对应的理论名称 变量维度
a 1 a1 a 1 x 1 ( 隐 藏 层 输 入 ) x_1(隐藏层输入) x 1 ( ) (100,50)
z 1 z1 z 1 y 1 ( 隐 藏 层 输 出 ) y_1(隐藏层输出) y 1 ( ) (100,50)
a 2 a2 a 2 x 2 ( 输 出 层 输 入 ) x_2(输出层输入) x 2 ( ) (100,10)
y y y y 2 ( 输 出 层 输 出 ) y_2(输出层输出) y 2 ( ) (100,10)
d a 1 da1 d a 1 ∂ E ∂ x 2 ⋅ w 21 \frac{\partial E}{\partial x_2}·w_{21} x 2 E w 2 1 (100,50)
d z 1 dz1 d z 1 ∂ E ∂ x 2 ⋅ ∂ x 2 ∂ y 1 ⋅ ∂ y 1 ∂ x 1 \frac{\partial E}{\partial x_2}·\frac{\partial x_2}{\partial y_1}·\frac{\partial y_1}{\partial x_1} x 2 E y 1 x 2 x 1 y 1 = ∂ E ∂ x 2 ⋅ w 21 ⋅ [ y 1 ⋅ ( 1 − y 1 ) ] \frac{\partial E}{\partial x_2}·w_{21}·[y_1·(1-y_1)] x 2 E w 2 1 [ y 1 ( 1 y 1 ) ] (100,50)
d y = y − t b a t c h _ n u m dy=\frac{y-t}{batch\_num} d y = b a t c h _ n u m y t ∂ E ∂ x 2 \frac{\partial E}{\partial x_2} x 2 E (这里的 x 2 x_2 x 2 是一个矢量,整体表示100条数据对各个输出节点的误差贡献) (100, 10)
z 1. T z1.T z 1 . T y i y_i y i (50, 100)
g r a d s [ ′ b 2 ′ ] grads['b2'] g r a d s [ b 2 ] ∂ E ∂ x 2 \frac{\partial E}{\partial x_2} x 2 E (10,)
g r a d s [ ′ W 2 ′ ] grads['W2'] g r a d s [ W 2 ] ∂ E ∂ w 21 \frac{\partial E}{\partial w_{21}} w 2 1 E (50,10)
g r a d s [ ′ W 1 ′ ] grads['W1'] g r a d s [ W 1 ] ∂ E ∂ x 2 ⋅ ∂ x 2 ∂ y 1 ⋅ ∂ y 1 ∂ x 1 ⋅ ∂ x 1 ∂ w 10 = ∂ E ∂ x 2 ⋅ w 21 ⋅ [ y 1 ⋅ ( 1 − y 1 ) ] ⋅ 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 x 2 E y 1 x 2 x 1 y 1 w 1 0 x 1 = x 2 E w 2 1 [ y 1 ( 1 y 1 ) ] x (784,50)
g r a d s [ ′ b 1 ′ ] grads['b1'] g r a d s [ b 1 ] ∂ E ∂ x 1 \frac{\partial E}{\partial x_1} x 1 E (50,)

关于上述表格中的 “ y − t ” “y-t” y t 的出处,可以参考[1]:

这里的 g r a d s [ ′ b 2 ′ ] grads['b2'] g r a d s [ b 2 ] 推导如下:
∂ E ∂ b 2 = ∂ E ∂ x 2 ∂ x 2 ∂ b 2 = ∂ E ∂ x 2 ∂ ( w 21 ⋅ y 1 + b 2 ) ∂ b 2 = ∂ E ∂ x 2 \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} b 2 E = x 2 E b 2 x 2 = x 2 E b 2 ( w 2 1 y 1 + b 2 ) = x 2 E

g r a d s [ ′ b 1 ′ ] grads['b1'] g r a d s [ b 1 ] 推导推导同理。
--------------------------------------------

为什么在计算 g r a d s [ ′ b 1 ′ ] grads['b1'] g r a d s [ b 1 ] g r a d s [ ′ b 2 ′ ] grads['b2'] g r a d s [ b 2 ] 时进行求和?
与后面的batch_num进行配套使用,获取该轮batch训练得到的 b j bj b j 的平均值作为最终的模型参数
--------------------------------------------

关于这里batch_num出现在dy中不太好理解,其实我们可以看到batch_num最终进入了 g r a d s [ ′ b 2 ′ ] 中 , 所 以 其 含 义 是 对 100 条 数 据 产 生 的 b j 的 和 取 了 一 个 平 均 , 作 为 这 轮 b a t c h 训 练 后 的 得 到 的 偏 置 b j grads['b2']中,所以其含义是对100条数据产生的b_j的和取了一个平均, 作为这轮batch训练后的得到的偏置b_j g r a d s [ b 2 ] 1 0 0 b j b a t c h b j

--------------------------------------------

注意:
softmax以及sigmoid的求导结果是不一样的.

参考:
[1]softmax with cross-entropy loss求导(转载+细节整理)
[2]《learning representations by back-propagating errors》


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论