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

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

①sigmoid函数的求导:
y j x j = y j ( 1 y j ) \frac{\partial y_j}{\partial x_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
出处是[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} (8)

= ε E w j i =-\varepsilon\frac{\partial E}{\partial w_{ji}} (6)

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

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

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

这里的 g r a d s [ b 2 ] grads['b2'] 推导如下:
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}

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

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

关于这里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

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

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

参考:
[1]https://blog.csdn.net/appleyuchi/article/details/90907585
[2]《learning representations by back-propagating errors》


更多精彩内容