学习吴恩达机器学习时,课程和练习题中讲过,计算时需要去掉
代码中也做了类似处理:
for t in range(m):
a1t = a1[t,:] # (1, 401)
z2t = z2[t,:] # (1, 25)
a2t = a2[t,:] # (1, 26)
ht = h[t,:] # (1, 10)
yt = y[t,:] # (1, 10)
d3t = ht - yt # (1, 10)
z2t = np.insert(z2t, 0, values=np.ones(1)) # (1, 26)
d2t = np.multiply((theta2.T * d3t.T).T, sigmoid_gradient(z2t)) # (1, 26)
delta1 = delta1 + (d2t[:,1:]).T * a1t
delta2 = delta2 + d3t.T * a2t
上述代码倒数第二行的d2t[:,1:]去掉。
这里会产生的疑惑是,去掉是不是就不计算误差对每层的常数偏置的影响了。实际上不是这样的,每层的常数偏置都得系数都需要计算其偏导数,
比如我们在计算输入层的的偏置时,X矩阵的(行,列)是(X样本数,输入项数+1),误差矩阵是下一级的矩阵去掉,因为关联的是第二层的偏置,与第一层的输入X之间没有连线,所以不参与输入层系数的误差(偏导数)的运算,在计算输入层系数偏导数theta1时不参与运算,但它是theta2的一部分,所以说它对theta2来说是有用的。