我在参考一个用Python实现Andrew NG课程的代码。我不理解for循环中最后两行(grad1和grad2)到底在做什么。
grad1 = np.zeros((Theta1.shape))grad2 = np.zeros((Theta2.shape))for i in range(m): xi= X[i,:] # 1 X 401 a1i = a1[i,:] # 1 X 26 a2i =a2[i,:] # 1 X 10 d2 = a2i - y10[i,:] d1 = Theta2.T @ d2.T * sigmoidGradient(np.hstack((1,xi @ Theta1.T))) grad1= grad1 + d1[1:][:,np.newaxis] @ xi[:,np.newaxis].T grad2 = grad2 + d2.T[:,np.newaxis] @ a1i[:,np.newaxis].T grad1 = 1/m * grad1grad2 = 1/m * grad2grad1_reg = grad1 + (Lambda/m) * np.hstack((np.zeros((Theta1.shape[0],1)),Theta1[:,1:]))grad2_reg = grad2 + (Lambda/m) * np.hstack((np.zeros((Theta2.shape[0],1)),Theta2[:,1:]))
回答:
d1[1:][:,np.newaxis] @ xi[:,np.newaxis].T
计算相对于Theta1的部分梯度,而
d2.T[:,np.newaxis] @ a1i[:,np.newaxis].T
则是对于Theta2的。这些可以通过链式法则推导出来。
for循环将每批数据的梯度累加起来。