[CLPR] 用于加速训练神经网络的二阶方法
本文翻译自: 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] 用于加速训练神经网络的二阶方法的更多相关文章
- AI佳作解读系列(一)——深度学习模型训练痛点及解决方法
1 模型训练基本步骤 进入了AI领域,学习了手写字识别等几个demo后,就会发现深度学习模型训练是十分关键和有挑战性的.选定了网络结构后,深度学习训练过程基本大同小异,一般分为如下几个步骤 定义算法公 ...
- ReLeQ:一种自动强化学习的神经网络深度量化方法
ReLeQ:一种自动强化学习的神经网络深度量化方法 ReLeQ:一种自动强化学习的神经网络深度量化方法ReLeQ: An Automatic Reinforcement Learning Ap ...
- stanford coursera 机器学习编程作业 exercise4--使用BP算法训练神经网络以识别阿拉伯数字(0-9)
在这篇文章中,会实现一个BP(backpropagation)算法,并将之应用到手写的阿拉伯数字(0-9)的自动识别上. 训练数据集(training set)如下:一共有5000个训练实例(trai ...
- 机器学习入门15 - 训练神经网络 (Training Neural Networks)
原文链接:https://developers.google.com/machine-learning/crash-course/training-neural-networks/ 反向传播算法是最常 ...
- Gradient Centralization: 简单的梯度中心化,一行代码加速训练并提升泛化能力 | ECCV 2020 Oral
梯度中心化GC对权值梯度进行零均值化,能够使得网络的训练更加稳定,并且能提高网络的泛化能力,算法思路简单,论文的理论分析十分充分,能够很好地解释GC的作用原理 来源:晓飞的算法工程笔记 公众号 论 ...
- 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练
将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...
- 怎么选取训练神经网络时的Batch size?
怎么选取训练神经网络时的Batch size? - 知乎 https://www.zhihu.com/question/61607442 深度学习中的batch的大小对学习效果有何影响? - 知乎 h ...
- 使用Google Colab训练神经网络(二)
Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.Colaborat ...
- pytorch1.0批训练神经网络
pytorch1.0批训练神经网络 import torch import torch.utils.data as Data # Torch 中提供了一种帮助整理数据结构的工具, 叫做 DataLoa ...
随机推荐
- linux下抓包工具tcpdump详解
本文转自:http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 简介 用简单的话来定义tcpdump,就是:dump the ...
- Hopper Disassembler v4 ( The macOS Disassembler, Decompiler and Debugger)
Hopper Disassembler v4 ( The macOS Disassembler, Decompiler and Debugger) Reveal13 (UI) 两个好东西..不知道的自 ...
- WinterCamp2017 游记
Winter is coming! Day0 Day0前一天打了一轮CF,做完了ABCD,Div2 Rank59.然后就去开开心心的睡觉,准备第二天的行程. 快到一点的时候躺在了床上,睡不着,翻来覆去 ...
- 20145315 《Java程序设计》第四周学习总结
20145315 <Java程序设计>第四周学习总结 教材学习内容总结 第六章 继承与多态 6.1何谓继承 6.1.1继承共同行为 把相同的程序代码提升为父类 private String ...
- Execution Order for the ApiController
Execution Order for the ApiController Assuming the request goes into the ApiController scope, the op ...
- 【Jmeter】 Report Dashboard 生成html图形测试报告
背景 最近在学习Jmeter相关的东西,今天看了下Jmeter的官方文档,没想到在入门指南(Getting Started)第二条中就看到了让人惊喜的东西:可以利用既有测试数据生成HTML格式的Rep ...
- MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka
几种MQ产品说明: ZeroMQ : 扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装,如果我们做为消息队列使用,需要开发大量的代码 RabbitMQ :结合erla ...
- UVALive-3268 Jamie's Contact Groups (最大流,网络流建模)
题目大意:你的手机通讯录里有n个联系人,m个分组,其中,有的联系人在多个分组里.你的任务是在一些分组里删除一些联系人,使得每个联系人只在一个分组里并且使人数最多的那个分组人数最少.找出人数最多的那个分 ...
- 个人知识管理系统Version1.0开发记录(10)
物理分页 这次我们运用Mybatis拦截器来实现物理分页,后面会运用动态sql来实现,或者运用Map/CollectionUtils/StringUtils编写工具类来实现.oracle是运用的row ...
- C++ lower_bound 和upper_bound
二分查找的函数有 3 个: 1.lower_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个 出现的位置. 2.upper_bound(起始地址,结束地址,要查找的数值) 返回的是 ...