📃
Nielsen-NNDL
  • Introduction
  • 第1章 使用神经网络识别手写数字
    • 感知机神经元
    • sigmoid神经元
    • 神经网络的架构
    • 用于识别手写数字的简单网络
    • 梯度下降学习法
      • 准备工作
      • 梯度下降法
      • 应用到神经网络
    • 实现数字分类的神经网络
      • 数据集
      • 初始化
      • 向后传递
      • 随机梯度下降
      • 总结
  • 第2章 反向传播算法的工作原理
    • 热身:一种矩阵方法快速计算神经网络的输出
    • 关于代价函数的两个假设
    • Hadamard积
    • 反向传播算法中的4个等式
      • 一个新的定义
      • 4个等式
      • 等式的意义
    • 4个等式的证明
    • 反向传播算法
    • 代码解读
    • 反向传播算法为什么这么快
  • 第3章 提升神经网络的学习方法
    • cross-entropy代价函数
      • 当前神经网络存在的问题
      • 引入cross-entropy代价函数
      • 使用cross-entropy分类手写数字
      • cross-entropy代价函数是怎么推出来的
      • cross-entropy的数学意义
      • softmaxt+loglikelihood
    • 过拟合和正则化
      • 过拟合
      • L2正则化
      • 在当前神经网络中使用L2正则化
      • 其它问题
      • L1正则化
      • dropout正则化
      • 人为扩充训练数据
    • weights初始化
    • 回到手势识别代码
    • 怎样选择超参数
      • broad策略
      • 学习率eta
      • 迭代次数epochs
      • 正则化参数lambda
      • minibatch样本数m
      • 自动化技术
    • 其它技术
      • Hessian技术
      • momentum技术
      • tanh神经元
      • RectifiedLinear神经元
  • 第5章 训练深度神经网络难以训练
    • 梯度消失问题
    • 梯度消失的原因
  • 第6章 深度学习
    • 卷积神经网络介绍
      • LocalReceptiveField
      • SharedWeights
      • pooling层
      • 组装到一起
    • 卷积神经网络的实践与改进
    • 其它深度神经网络的方法
  • 术语中英文对照
Powered by GitBook
On this page
  • update_mini_batch
  • backprop

Was this helpful?

  1. 第2章 反向传播算法的工作原理

代码解读

Previous反向传播算法Next反向传播算法为什么这么快

Last updated 5 years ago

Was this helpful?

update_mini_batch

update_mini_batch(self, mini_batch, eta)函数实现了“” 实现的过程与描述略不同。 代码中不是每次求出一个∇wx\nabla w^x∇wx和∇bx\nabla b^x∇bx就马上更新w和b,而是把所有样本计算出来的∇wx\nabla w^x∇wx和∇bx\nabla b^x∇bx加起来,最后一次性更新w和b。

w=w−ηm∇wxb=b−ηm∇bxw = w - \frac{\eta}{m}\nabla w^x \\ b = b - \frac{\eta}{m}\nabla b^xw=w−mη​∇wxb=b−mη​∇bx
  1. 对于每一个训练样本x,根据反向传播算法计算所有神经元的∇wx\nabla w^x∇wx和∇bx\nabla b^x∇bx

    delta_nabla_b, delta_nabla_w = self.backprop(x, y)
  2. 把所有样本计算出来的∇wx\nabla w^x∇wx和∇bx\nabla b^x∇bx加起来

    nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
             nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
  3. 一次性更新w和b

    self.weights = [w-(eta/len(mini_batch))*nw
                 for w, nw in zip(self.weights, nabla_w)]
    self.biases = [b-(eta/len(mini_batch))*nb
                 for b, nb in zip(self.biases, nabla_b)]

backprop

activations = [x]
  1. 根据定义依次计算每一层每一个神经元的z和a

    z = np.dot(w, activation)+b
    ...
    activation = sigmoid(z)
  2. delta = self.cost_derivative(activations[-1], y) * sigmoid_prime(zs[-1])
  3. sp = sigmoid_prime(z)  # Derivative of the sigmoid function
    delta = np.dot(self.weights[-l+1].transpose(), delta) * sp
  4. nabla_b[-l] = delta
    nabla_w[-l] = np.dot(delta, activations[-l-1].transpose())

以上代码可以以矩阵的方式实现,速度会快很多。

backprop(self, x, y)函数实现了“” 1. 对于输入神经元来说,输入x即输出a1

根据公式计算输出神经元的δL\delta^LδL

根据公式向前依次计算每一层每一个神经元的δ\deltaδ

根据公式计算所有神经元的∇w\nabla w∇w和∇b\nabla b∇b

算法一:原始的反向传播算法
算法二:反向传播算法 结合 随机梯度下降算法