top of page
アンカー 1

一、前文回顾

上一节我们讲了误差逆传播方法来求微分,这节直接来用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)

五、总结

把这个求梯度的方法直接代替掉我们以前的数值微分求梯度,大概不到一分钟就可以训练完成,对比数值微分求导的上百个小时简直就是质的飞跃。

到底为止我们完成了一个完整神经网络的从训练到推理的完整过程,因为是一个超级简易版的神经网络,所以也只能识别手写数字。要想让它识别更复杂的图像,还得用到另外一种方法:卷积神经网络

bottom of page