[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 ...
随机推荐
- eclipse如何设置编译后target目录不提交svn服务器
eclipse设置 windows ->prefrences->team->Ignored Resource 点击Add Pattern 输入 */target/* 等 ...
- c++编译时打印宏定义
#pragma message("this is message") #pragma message只能打印字符串,如果想打印任何宏定义可使用: #define PRINT_MAC ...
- Python3:Requests模块的异常值处理
Python3:Requests模块的异常值处理 用Python的requests模块进行爬虫时,一个简单高效的模块就是requests模块,利用get()或者post()函数,发送请求. 但是在真正 ...
- Java实现获取属性文件的参数值
Java实现获取属性文件的参数值 1,属性文件内容(analysis.properties),路径必须在:src根目录下: #client data path analysis.client.data ...
- Python3.x:生成器简介
Python3.x:生成器简介 概念 任何使用yield的函数都称之为生成器:使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调 ...
- 通过代码来操作SQLite的示例
Getting started with SQLite in C# http://blog.tigrangasparian.com/2012/02/09/getting-started-with-sq ...
- Sublime编辑器上的Linux Vim插件常用快捷键
Sublime编辑器上的 Vim 插件常用快捷键 vim 的设置: 在Reference-> User Settings(首选项--> 设置用户) 选项,点击进入配置文件编辑状态,默认的用 ...
- codeforces 98 div2 C.History 水题
C. History time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- Java Redis的Pipeline管道,批量操作,节省大量网络往返时间 & Redis批量读写(hmset&hgetall) 使用Pipeline
一般情况下,大家使用redis去put/get都是先拿到一个jedis实例,然后操作,然后释放连接:这种模式是 请求-响应,请求-响应 这种模式,下一次请求必须得等第一次请求响应回来之后才可以,因为r ...
- find ... -exec ... {} \; 的解释
find的特殊功能是能够进行额外的动作,如上图的 find / -type f -name "test.txt" -exec rm {} \;命令 1) {} 代表的是由find找 ...