搜尋
一、前文回顾
上一节我们讲了误差逆传播方法来求微分,这节直接来用Python来实现,看看运行速度有多快
二、误差逆传播之Sigmoid
我们首先来看看激活函数Sigmoid的误差逆传播。(激活函数Sigmoid是什么?参考第6弹)

三、误差逆传播之行列积
因为神经网络的计算都是使用行列积W*X+B。所以用误差逆转播来推导行列积的微分。

四、求微分
Sigmoid和行列积的逆传播求微分已经有了,接下来我们直接用Python来实现整个神经网络的求梯度。
# 误差逆传播求微分
def gradient(self, x, t):
W1, W2 = self.params['W1'], self.params['W2']
b1, b2 = self.params['b1'], self.params['b2']
grads = {}
batch_num = x.shape[0]
# forward
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
y = softmax(a2)
# backward
dy = (y - t) / batch_num # 损失值
grads['W2'] = np.dot(z1.T, dy)
grads['b2'] = np.sum(dy, axis=0)
dz1 = np.dot(dy, W2.T)
da1 = sigmoid_grad(a1) * dz1
grads['W1'] = np.dot(x.T, da1)
grads['b1'] = np.sum(da1, axis=0)
return grads
def sigmoid_grad(x):
return (1.0 - sigmoid(x)) * sigmoid(x)
五、总结
把这个求梯度的方法直接代替掉我们以前的数值微分求梯度,大概不到一分钟就可以训练完成,对比数值微分求导的上百个小时简直就是质的飞跃。
到底为止我们完成了一个完整神经网络的从训练到推理的完整过程,因为是一个超级简易版的神经网络,所以也只能识别手写数字。要想让它识别更复杂的图像,还得用到另外一种方法:卷积神经网络
Comments