本文翻译自: http://www.codeproject.com/Articles/16650/Neural-Network-for-Recognition-of-Handwritten-Digi

所有二阶技术都有同一个目标: 提高BP收敛的速度. 它们都使用同一种基本的方法 - 分别调整每个权值. 比如, 对于每个权值设置不同的学习速率.

在文章 Efficient BackProp, 中, LeCun博士提出了一种被称为"随机对角Levenberg-Marquardt方法"的二阶技术. 他把这种技术和一种"精确优化的随机梯度算法"进行了对比, 后者是一种不依赖于二阶技术的算法, 但对于每个权值都使用了不同的学习速率eta. 根据他的比较, "(随机对角LM)额外引入的误差是可以忽略的, 但训练速度上 - 凭感觉 - 却比随机梯度算法快了3倍." (文章的35页).

我们需要一种二阶方法来加速训练. 不使用这些方法的结果是我们的收敛会非常缓慢.

Simard博士, 在他的文章"Best Practices for Convolutional Neural Networks Applied to Visual Document Analysis,"中提到, 由于想让算法尽量简洁, 所以没有使用二阶技术. 他同样承认他需要上百次循环才能收敛.(我个人认为接近1000)

我们再来看看MNIST数据库, 每一个循环需要60,000次BP过程, 在我的电脑上每个循环需要大概40分钟. 我没有耐心(也没有自信我的代码毫无错误)来等待上千次循环. 同样地, 不像LeCun博士, 我也没有能力去设计一个"精确优化的随机梯度算法". 所以, 由于随机对角LM方法会快3倍, 我的NN实现了这一方法.

我不会详细分析数学或这个算法的代码. 它本质上已经和标准的BP不太一样了. 使用这个技术, 我可以在20~25次循环内收敛到一个满意的结果. 这样有两个好处: 第一, 它证明了我的代码是正确的, 因为LeCun博士的收敛次数也是20左右; 第二, 40分钟一次循环的情况下, 我只需要14~16个小时即可, 这可以接受.

如果你想要仔细分析这一段的代码, 你可以查看CMNistDoc::CalculateHessian()和NeuralNetwork::BackpropagateSecondDervatives(). 另外, 应当注意NNWeight包含一个double成员, 这在前述的代码中没有显式注明. 这个成员名为diagHessian, 它存储的是根据LeCun博士的算法计算出的曲率. 基本上, 当调用CMNistDoc::CalculateHessian()时, 500个MNIST的模式就会被随机挑选出来. 对于每个模式, NeuralNetwork::BackpropagateSecondDervatives()会计算出每个权值的Hessian, 这个数字会被收集到diagHessian中. 在500个模式都运行结束后, diagHessian中的值都被除以500, 从而为每个权值赋予一个独特的diagHessian值. 在实际的BP过程中, diagHessian值被用来缩放当前的学习速率, 从而在曲率较高的区域, 学习速率降低, 反之升高.

[CLPR] 用于加速训练神经网络的二阶方法的更多相关文章

  1. AI佳作解读系列(一)——深度学习模型训练痛点及解决方法

    1 模型训练基本步骤 进入了AI领域,学习了手写字识别等几个demo后,就会发现深度学习模型训练是十分关键和有挑战性的.选定了网络结构后,深度学习训练过程基本大同小异,一般分为如下几个步骤 定义算法公 ...

  2. ReLeQ:一种自动强化学习的神经网络深度量化方法

    ReLeQ:一种自动强化学习的神经网络深度量化方法     ReLeQ:一种自动强化学习的神经网络深度量化方法ReLeQ: An Automatic Reinforcement Learning Ap ...

  3. stanford coursera 机器学习编程作业 exercise4--使用BP算法训练神经网络以识别阿拉伯数字(0-9)

    在这篇文章中,会实现一个BP(backpropagation)算法,并将之应用到手写的阿拉伯数字(0-9)的自动识别上. 训练数据集(training set)如下:一共有5000个训练实例(trai ...

  4. 机器学习入门15 - 训练神经网络 (Training Neural Networks)

    原文链接:https://developers.google.com/machine-learning/crash-course/training-neural-networks/ 反向传播算法是最常 ...

  5. Gradient Centralization: 简单的梯度中心化,一行代码加速训练并提升泛化能力 | ECCV 2020 Oral

    梯度中心化GC对权值梯度进行零均值化,能够使得网络的训练更加稳定,并且能提高网络的泛化能力,算法思路简单,论文的理论分析十分充分,能够很好地解释GC的作用原理   来源:晓飞的算法工程笔记 公众号 论 ...

  6. 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练

    将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...

  7. 怎么选取训练神经网络时的Batch size?

    怎么选取训练神经网络时的Batch size? - 知乎 https://www.zhihu.com/question/61607442 深度学习中的batch的大小对学习效果有何影响? - 知乎 h ...

  8. 使用Google Colab训练神经网络(二)

    Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.Colaborat ...

  9. pytorch1.0批训练神经网络

    pytorch1.0批训练神经网络 import torch import torch.utils.data as Data # Torch 中提供了一种帮助整理数据结构的工具, 叫做 DataLoa ...

随机推荐

  1. WdatePicker设置日期范围

    设置 结束日期不超过当天日期:设置 开始日期不超过结束日期:设置 开始日期默认显示当月1日的日期,结束日期显示当天日期?<label>开始日期:</label><inpu ...

  2. 20145118 《Java程序设计》 第3周学习总结

    20145118 <Java程序设计> 第3周学习总结 教材学习内容总结 第四章开始接触到了Java的核心内容---对象这个概念,在这里为避免混淆,列举面向过程和面向对象的区别: 面向对象 ...

  3. SprigBoot核心技术

    启动原理 运行流程 自动配置原理 一.启动原理 SpringApplication.run(主程序类)– new SpringApplication(主程序类)• 判断是否web应用• 加载并保存所有 ...

  4. Maven编译代码的时候跳过单元测试

    Maven编译代码的时候跳过单元测试 <properties> <maven.test.skip>true</maven.test.skip> </prope ...

  5. python文件操作的坑( FileNotFoundError: [Errno 2] No such file or directory...)

    环境:Windows8.1, Python3.6  pycharm community 2017   c盘下有一个配置文件:setup   with open('c:\\setup','r') as ...

  6. adb 安装软件

    一.连接 adb connect 192.168.1.10 输出 connected to 二.查看设备 adb devices 输出 List of devices attached device ...

  7. python 三维数组找最小值

    #声明三维数组 num=[[[,,],[,,],[,,]], \ [[,,],[,,],[,,]]] value=num[][][]#设置main为num数组的第一个元素 ): ): ): if(va ...

  8. JDK_源码

    1.http://hg.openjdk.java.net/ (ZC:这个貌似像官网的样子,不知道 到底是不是...) 1.1.jdk8u_jdk8u_jdk_ 5b86f66575b7 _src_.h ...

  9. Java IO流-Properties

    2017-11-05 21:37:50 Properties Properties:Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其 ...

  10. Mybatis之SSM配置

    applicationContext-dao.xml <?xml version="1.0" encoding="UTF-8"?> <bean ...