欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度学习(3)--反向传播算法

程序员文章站 2024-01-25 18:21:40
...

      由上一节的内容中我们知道了随机梯度下降算法,我们通过下面两个公式来进行更新,最重要的就是对两个变量weights和biases的更新,我们通过backpropagation来计算偏导数。

                 深度学习(3)--反向传播算法

 Backpropagation算法

     通过迭代性的来处理训练集中的实例

     对比经过神经网络后输入层预测值(predicted value)与真实值(target value)之间

     反方向(从输出层=>隐藏层=>输入层)来以最小化误差(error)来更新每个连接的权重(weight)

     算法详细介绍

           输入:D:数据集,l 学习率(learning rate),一个多层前向神经网络

           输入:一个训练好的神经网络(a trained neural network)

           1 初始化权重(weights)和偏向(bias): 随机初始化在-1到1之间,或者-0.5到0.5之间,每个单元有一个偏向

           2 对于每一个训练实例X,执行以下步骤:

              2.1:由输入层向前传送

               深度学习(3)--反向传播算法             深度学习(3)--反向传播算法           

                                     深度学习(3)--反向传播算法                                                                      深度学习(3)--反向传播算法

            2.2 根据误差(error)反向传送

                      对于输出层:深度学习(3)--反向传播算法

                      对于隐藏层:深度学习(3)--反向传播算法

                      权重更新: 

                                             深度学习(3)--反向传播算法

                      偏向更新 :

                                            深度学习(3)--反向传播算法

          3 终止条件

                  3.1 权重的更新低于某个阈值

                  3.2 预测的错误率低于某个阈值

                  3.3 达到预设一定的循环次数

   

 Backpropagation 算法举例

          深度学习(3)--反向传播算法深度学习(3)--反向传播算法

代码实现

    def back(self,x,y):

        nabla_b = [np.zeros(b.shape) for b in self.biases] #随机梯度下降算法,用于存储我们指定的minibatch中的数据的bias的总和
        nabla_w = [np.zeros(w.shape) for w in self.weights]

        activation =x #第一层的**值一般就是输入值,或者通过数据增强后的输入值
        activations = [x]
        zs = [] #存储中间结果,待**值
        for w,b in zip(self.weights,self.biases):
           # print w.shape,b.shape
            z = np.dot(w,activation)+b
            zs.append(z)
            activation = sigmoid(z)
            activations.append(activation)
        delta = cost(activations[-1],y)*sigmoid_prime(zs[-1])
        nabla_b[-1] = delta
        #delta 目前可能是10*1 的向量,而activation[-2]可能是784*1 无法直接点乘 需要转置后者 最终是10个784维向量 内部相加输出 10*1
        nabla_w[-1] = np.dot(delta,activations[-2].transpose())
        for l in range(2,self.layers):
            delta = np.dot(self.weights[-l+1].transpose(),delta)*sigmoid_prime(zs[-l])
            nabla_b[-l] =delta
            nabla_w[-l] = np.dot(delta,activations[-l-1].transpose())
        return (nabla_b,nabla_w)

  坚持一件事或许很难,但坚持下来一定很酷^_^!