📃
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
  • 入参
  • 一次迭代
  • 一次参数调整

Was this helpful?

  1. 第1章 使用神经网络识别手写数字
  2. 实现数字分类的神经网络

随机梯度下降

SGD()实现随机梯度下降算法。

入参

training_data:训练样本集。 epochs:迭代次数 mini_batch_size:每次随机取的样本数 eta:学习率 test_data:如果有设置test_data,每一次迭代结束后用测试数所来检查一下当前迭代之后的效果。在这一章中不讲这部分内容。

一次迭代

直观上,每一次迭代是指随机取mini_batch_size个数据对算法做一次参数调整。 但这种方法的问题是:每次都是全部样本中随机取,很有可能部分样本取了很多次而部分样本始终没有取到。

书上所谓的每一次迭代是这样的: for j in range(epochs): 1. 对全部样本进行一次随机化 random.shuffle(training_data) 2. 将全部样本分成样本数mini_batch_size\frac{样本数}{mini\_batch\_size}mini_batch_size样本数​份,每一份的样本数为mini_batch_size。 training_data[k:k+mini_batch_size] for k in range(0, n, mini_batch_size)] 3. 依次取每一份对算法做一次参数调整。 update_mini_batch(mini_batch, eta) 这样所有样本都刚好轮一遍,称为一次迭代。 一次迭代中每一次的参数调整所使用的样本是随机的。

一次参数调整

update_mini_batch()实现一次参数的调整。 这个函数是真正将梯度更新算法与神经元相结合的地方。但代码很直观。 1. 依次基于每个样本计算所有神经元的偏导。

delta_nabla_b, delta_nabla_w = self.backprop(x, y)

backprop()不在本章介绍的范围,知道它是求偏导的函数就可以了。 2. 把每个样本的计算结果加起来,就是基于所有样本计算的所有神经元的偏导。

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)]
  1. 针对每个神经元计算它们新参数

    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)]
Previous向后传递Next总结

Last updated 5 years ago

Was this helpful?

说明: 1. delta_nabla_b、delta_nabla_w、nabla_b、nabla_w、self.weights、self.biases这些变量存储的都是整个神经网络的参数,所以结构都是样同的。参照页面中的例子 2. nb、dnb、w、nw、b、nb存储的是一层神经网络的参数,相当于是上面这些变量list中的一项。 3. 上面这些计算看不去有点绕,把初始化看懂这里就好理解了。

初始化