[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 ...
随机推荐
- springcloud9----feign-client-without-hystrix
package com.itmuch.cloud; import org.springframework.boot.SpringApplication; import org.springframew ...
- ipod不识别命令
root@mx6q:~# history 0 sync 1 reboot 2 cd /usr/app/ 3 ls 4 cd extend-sysfs/ 5 ls 6 cd etc/ 7 ls 8 cd ...
- 【知识总结】CSS中样式覆盖优先顺序
层叠样式类型 类型: 1. 浏览器默认样式 2. 浏览器用户自定义样式 3. 外部样式表 4. 内部样式表 5. 内联样式表 顺序: 浏览器默认样式 < 浏览器用户自定义样式 < 外部样式 ...
- 【运维技术】Nginx安装教程(yum安装,源码编译)
安装方式 yum直接更新源安装 源码直接编译之后安装 使用yum进行直接安装 Installing a Prebuilt CentOS/RHEL Package from an OS Reposito ...
- 前端学习笔记之CSS属性设置
CSS属性设置 阅读目录 一 字体属性 二 文本属性 三 背景属性 四 盒子模型 五 盒子模型各部分详解 一 字体属性 1.font-weight:文字粗细 取值 描述 normal 默认值,标准 ...
- Mysql日期转换函数、时间转换函数
Mysql日期转换函数.时间转换函数 一.MySQL 获得当前日期时间 函数 1,获得当前日期+时间(date + time)函数:now(): select now(); 结果: :: 2,获得当前 ...
- linux使用vi浏览python源码
一.背景 2018/8/15,这一天要分析一个python项目,因此需要浏览代码,而我使用的是ubuntu 16.04,于是作此文 二.步骤 2.1 获取生成tags文件的脚本 http://svn. ...
- JVM的异常处理
异常处理的两大组成要素:抛出异常和捕获异常.这两大要素共同实现程序控制流的非正常转移. 抛出异常分为:显式和隐式两种. 显式抛异常的主题是应用程序,它指的是在程序中使用 “throw” 关键字.手动 ...
- POJ Stockbroker Grapevine(floyd)
https://vjudge.net/problem/POJ-1125 题意: 题意不是很好理解,首先输入一个n,表示有n个股票经纪人,接下来输入n行,每行第一个数m为该股票经纪人认识的经纪人数,然后 ...
- h.264_javascript_资料
1. 用ffmpeg制作推流工具,实现推流系统声音和桌面到rtmp服务器-CSDN论坛-CSDN.NET-中国最大的IT技术社区.html http://bbs.csdn.net/topics/392 ...