这一章的代码解读的难点是:
涉及到两个函数的求导问题。
①sigmoid函数的求导:
∂xj∂yj=yj(1−yj)
出处是[2]
②softmax函数的求导:
∂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
=-ε∂w∂E (8)
=-ε∂wji∂E (6)
=-ε∂xj∂E⋅yi
≈-εbatch_numy−t⋅z1.T(代码中的变量)
=-ε⋅grads[′W2′](代码中的变量)
变量名称 |
对应的理论名称 |
变量维度 |
a1 |
x1 |
(100,50) |
z1 |
y1 |
(100,50) |
a2 |
x2 |
(100,10) |
y |
y2 |
(100,10) |
da1 |
∂x2∂E⋅w21 |
(100,50) |
dz1 |
∂x2∂E⋅∂y1∂x2⋅∂x1∂y1 =
∂x2∂E⋅w21⋅[y1⋅(1−y1)] |
(100,50) |
dy=batch_numy−t |
∂x2∂E(这里的
x2是一个矢量,整体表示100条数据对各个输出节点的误差贡献) |
(100, 10) |
z1.T |
yi |
(50, 100) |
grads[′b2′] |
∂x2∂E |
(10,) |
grads[′W2′] |
∂w21∂E |
(50,10) |
grads[′W1′] |
∂x2∂E⋅∂y1∂x2⋅∂x1∂y1⋅∂w10∂x1=∂x2∂E⋅w21⋅[y1⋅(1−y1)]⋅x |
(784,50) |
grads[′b1′] |
∂x1∂E |
(50,) |
关于上述表格中的
“y−t”的出处,可以参考[1]:
这里的
grads[′b2′]推导如下:
∂b2∂E=∂x2∂E∂b2∂x2=∂x2∂E∂b2∂(w21⋅y1+b2)=∂x2∂E
grads[′b1′]推导推导同理。
--------------------------------------------
为什么在计算
grads[′b1′]和
grads[′b2′]时进行求和?
与后面的batch_num进行配套使用,获取该轮batch训练得到的
bj的平均值作为最终的模型参数
--------------------------------------------
关于这里batch_num出现在dy中不太好理解,其实我们可以看到batch_num最终进入了
grads[′b2′]中,所以其含义是对100条数据产生的bj的和取了一个平均,作为这轮batch训练后的得到的偏置bj
--------------------------------------------
注意:
softmax以及sigmoid的求导结果是不一样的.
参考:
[1]https://blog.csdn.net/appleyuchi/article/details/90907585
[2]《learning representations by back-propagating errors》