本文翻译自: 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. Linux 查看系统所有用户

    grep bash /etc/passwd Linux 查看系统所有用户

  2. Git提交撤销

    场景:本地修改代码后,执行commit提交,但此时想撤销该提交. 执行命令: git reflog   查看所有commit历史 git reset --hard commitid     将当前远程 ...

  3. linux内核源码在线浏览

    1.https://elixir.bootlin.com  (只能搜索函数和宏定义,功能单一) 2.https://lxr.missinglinkelectronics.com (比第一个功能多一些, ...

  4. HDU 6354 Everything Has Changed(余弦定理)多校题解

    题意:源点处有个圆,然后给你m个圆(保证互不相交.内含),如果源点圆和这些原相交了,就剪掉相交的部分,问你最后周长(最外面那部分的长度). 思路:分类讨论,只有内切和相交会变化周长,然后乱搞就行了.题 ...

  5. C# .NET 开发心得

    1. 工作路径问题 1. 多项目构成的解决方案,Web APP作为启动项目时的工作路径 //当前执行的exe文件名 //C:\\Program Files\\IIS Express\\iisexpre ...

  6. POJ 1239 Increasing Sequences(经典的两次dp)

    http://poj.org/problem?id=1239 题意:给出一串序列,现在要添加逗号作为分隔符,使得序列是递增序列,然后让最后一个数尽量小,第一个数尽量大. 思路:先从头到尾进行一次dp, ...

  7. ZOJ 1276 Optimal Array Multiplication Sequence(矩阵连乘)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1276 裸的矩阵连乘问题. #include<iostream> ...

  8. Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms")

    从spring-boot开始,已经支持yml文件形式的配置,@ConfigurationProperties的大致作用就是通过它可以把properties或者yml配置直接转成对象 例如: 配置文件: ...

  9. Binary Tree Zigzag Level Order Traversal,z字形遍历二叉树,得到每层访问的节点值。

    问题描述: Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from l ...

  10. angular项目一

    1.Angularjs第三方模块angular-route和angular-ui-router的区别.差异.不同, ui-router路由器是一个第三方模块,功能非常强大.它支持一切正常ngroute ...