作者: Alberto Quesada 译者: KK4SBB

责编:何永灿,关注人工智能,投稿请联系 heyc@csdn.net 或微信号 289416419

神经网络模型的每一类学习过程通常被归纳为一种训练算法。训练的算法有很多,它们的特点和性能各不相同。

问题的抽象

人们把神经网络的学习过程转化为求损失函数f的最小值问题。一般来说,损失函数包括误差项和正则项两部分。误差项衡量神经网络模型在训练数据集上的拟合程度,而正则项则是控制模型的复杂程度,防止出现过拟合现象。

损失函数的函数值由模型的参数(权重值和偏置值)所决定。我们可以把两部分参数合并为一个n维的权重向量,记为w。下图是损失函数f(w)的图示。

如上图所示,w*是损失函数的最小值。在空间内任意选择一个点A,我们都能计算得到损失函数的一阶、二阶导数。一阶导数可以表示为一个向量:

ᐁif(w) = df/dwi (i = 1,…,n)

同样的,损失函数的二阶导数可以表示为海森矩阵( Hessian Matrix ):

Hi,jf(w) = d2f/dwi·dwj (i,j = 1,…,n)

多变量的连续可微分函数的求解问题一直被人们广泛地研究。许多的传统方法都能被直接用于神经网络模型的求解。

一维优化方法

尽管损失函数的值需要由多个参数决定,但是一维优化方法在这里也非常重要。这些方法常常用于训练神经网络模型。

许多训练算法首先计算得到一个训练的方向d,以及速率η来表示损失值在此方向上的变化,f(η)。下图片展示了这种一维函数。

f和η*在η1和η2所在的区间之内。

由此可见,一维优化方法就是寻找到某个给定的一维函数的最小值。黄金分段法和Brent方法就是其中两种广泛应用的算法。这两种算法不断地缩减最小值的范围,直到η1和η2两点之间的距离小于设定的阈值。

多维优化方法

我们把神经网络的学习问题抽象为寻找参数向量w*的问题,使得损失函数f在此点取到最小值。假设我们找到了损失函数的最小值点,那么就认为神经网络函数在此处的梯度等于零。

通常情况下,损失函数属于非线性函数,我们很难用训练算法准确地求得最优解。因此,我们尝试在参数空间内逐步搜索,来寻找最优解。每搜索一步,重新计算神经网络模型的参数,损失值则相应地减小。

我们先随机初始化一组模型参数。接着,每次迭代更新这组参数,损失函数值也随之减小。当某个特定条件或是终止条件得到满足时,整个训练过程即结束。

现在我们就来介绍几种神经网络的最重要训练算法。

1. 梯度下降法(Gradient descent)

梯度下降方法是最简单的训练算法。它仅需要用到梯度向量的信息,因此属于一阶算法。

我们定义f(wi) = fi and ᐁf(wi) = gi。算法起始于W0点,然后在第i步沿着di = -gi方向从wi移到wi+1,反复迭代直到满足终止条件。梯度下降算法的迭代公式为:

wi+1 = wi - di·ηi, i=0,1,…

参数η是学习率。这个参数既可以设置为固定值,也可以用一维优化方法沿着训练的方向逐步更新计算。人们一般倾向于逐步更新计算学习率,但很多软件和工具仍旧使用固定的学习率。

下图是梯度下降训练方法的流程图。如图所示,参数的更新分为两步:第一步计算梯度下降的方向,第二步计算合适的学习率。

梯度下降方法有一个严重的弊端,若函数的梯度变化如图所示呈现出细长的结构时,该方法需要进行很多次迭代运算。而且,尽管梯度下降的方向就是损失函数值减小最快的方向,但是这并不一定是收敛最快的路径。下图描述了此问题。

当神经网络模型非常庞大、包含上千个参数时,梯度下降方法是我们推荐的算法。因为此方法仅需要存储梯度向量(n空间),而不需要存储海森矩阵(n2空间)

2.牛顿算法(Newton’s method)

因为牛顿算法用到了海森矩阵,所以它属于二阶算法。此算法的目标是使用损失函数的二阶偏导数寻找更好的学习方向。

我们定义f(wi) = fi, ᐁf(wi) = gi and Hf(wi) = Hi。用泰勒展开式估计函数f在w0值

f = f0 + g0 · (w - w0) + 0.5 · (w - w0)2 · H0

H0是函数f在w0的海森矩阵值。在f(w)的最小值处g = 0,我们得到了第二个等式

g = g0 + H0 · (w - w0) = 0

因此,将参数初始化在w0,牛顿算法的迭代公式为

wi+1 = wi - Hi-1·gi, i = 0,1,…

Hi-1·gi 被称为牛顿项。值得注意的是,如果海森矩阵是一个非正定矩阵,那么参数有可能朝着最大值的方向移动,而不是最小值的方向。因此损失函数值并不能保证在每次迭代都减小。为了避免这种问题,我们通常会对牛顿算法的等式稍作修改:

wi+1 = wi - (Hi-1·gi) ·ηi, i=0,1,…

学习率η既可以设为固定值,也可以动态调整。向量d = Hi-1·gi被称为牛顿训练方向。

下图展示的是牛顿法的流程图。参数的更新也分为两步,计算牛顿训练方向和合适的学习率。

此方法训练神经网络模型的效率被证明比梯度下降法更好。由于共轭梯度法不需要计算海森矩阵,当神经网络模型较大时我们也建议使用。

4. 柯西-牛顿法(Quasi-Newton method)

由于牛顿法需要计算海森矩阵和逆矩阵,需要较多的计算资源,因此出现了一个变种算法,称为柯西-牛顿法,可以弥补计算量大的缺陷。此方法不是直接计算海森矩阵及其逆矩阵,而是在每一次迭代估计计算海森矩阵的逆矩阵,只需要用到损失函数的一阶偏导数。

海森矩阵是由损失函数的二阶偏导数组成。柯西-牛顿法的主要思想是用另一个矩阵G来估计海森矩阵的逆矩阵,只需要损失函数的一阶偏导数。柯西-牛顿法的更新方程可以写为:

wi+1 = wi - (Gi·gi)·ηi, i=0,1,…

学习率η既可以设为固定值,也可以动态调整。海森矩阵逆矩阵的估计G有多种不同类型。两种常用的类型是Davidon–Fletcher–Powell formula (DFP)和Broyden–Fletcher–Goldfarb–Shanno formula (BFGS)。

柯西-牛顿法的流程图如下所示。参数更新的步骤分为计算柯西-牛顿训练方向和计算学习率。

许多情况下,这是默认选择的算法:它比梯度下降法和共轭梯度法更快,而不需要准确计算海森矩阵及其逆矩阵。

5. Levenberg-Marquardt算法

Levenberg-Marquardt算法又称为衰减的最小 平方法,它针对损失函数是平方和误差的形式。它也不需要准确计算海森矩阵,需要用到梯度向量和雅各布矩阵。

假设损失函数f是平方和误差的形式:

f = ∑ ei2, i=0,…,m

其中m是训练样本的个数。

我们定义损失函数的雅各布矩阵由误差项对参数的偏导数组成,

Ji,jf(w) = dei/dwj (i = 1,…,m & j = 1,…,n)

m是训练集中的样本个数,n是神经网络的参数个数。雅各布矩阵的规模是m·n

损失函数的梯度向量是:

ᐁf = 2 JT·e

e是所有误差项组成的向量。

最后,我们可以用这个表达式来估计计算海森矩阵。

Hf ≈ 2 JT·J + λI

λ是衰减因子,以确保海森矩阵是正的,I是单位矩阵。

此算法的参数更新公式如下:

wi+1 = wi - (JiT·Ji+λiI)-1·(2 JiT·ei), i=0,1,…

若衰减因子λ设为0,相当于是牛顿法。若λ设置的非常大,这就相当于是学习率很小的梯度下降法。

参数λ的初始值非常大,因此前几步更新是沿着梯度下降方向的。如果某一步迭代更新失败,则λ扩大一些。否则,λ随着损失值的减小而减小,Levenberg-Marquardt接近牛顿法。这个过程可以加快收敛的速度。

下图是Levenberg-Marquardt算法训练过程的流程图。第一步计算损失值、梯度和近似海森矩阵。然后衰减参数和衰减系数。

由于Levenberg-Marquardt算法主要针对平方和误差类的损失函数。因此,在训练这类误差的神经网络模型时速度非常快。但是这个算法也有一些缺点。首先,它不适用于其它类型的损失函数。而且,它也不兼容正则项。最后,如果训练数据和网络模型非常大,雅各布矩阵也会变得很大,需要很多内存。因此,当训练数据或是模型很大时,我们并不建议使用Levenberg-Marquardt算法。

内存使用和速度的比较

下图绘制了本文讨论的五种算法的计算速度和内存需求。如图所示,梯度下降法往往是最慢的训练方法,它所需要的内存也往往最少。相反,速度最快的算法一般是Levenberg-Marquardt,但需要的内存也更多。柯西-牛顿法较好地平衡了两者。

总之,如果我们的神经网络模型有上千个参数,则可以用节省存储的梯度下降法和共轭梯度法。如果我们需要训练很多网络模型,每个模型只有几千个训练数据和几百个参数,则Levenberg-Marquardt可能会是一个好选择。其余情况下,柯西-牛顿法的效果都不错。美源星

http://bbs.clzg.cn/thread-7378359-1-1.html http://www.talkforex.com/thread-829907-1-1.html

http://www.wangchao.net.cn/hi/detail_237323.htmlhttp://www.wangchao.net.cn/hi/detail_237331.html

http://www.365128.com/user/myx2/69.html

http://www.365128.com/user/myx2/70.html

http://www.365128.com/user/myx2/71.html

http://www.xianhuo8.cn/bbs/thread-176879-1-1.html

http://www.xianhuo8.cn/bbs/thread-176880-1-1.html

http://www.xianhuo8.cn/bbs/thread-176882-1-1.html

http://www.ttx.cn/read-htm-tid-8234268.html

http://www.ttx.cn/read-htm-tid-8234270.html

http://www.ttx.cn/read-htm-tid-8234272.html

http://t.fx168.com/b4152370

http://t.fx168.com/b4152386

java神经网络该怎么训练_浅谈训练神经网络的五大算法相关推荐

  1. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  2. java中单例的应用_浅谈Java中单例模式的几种应用

    目录 浅谈Java中单例模式的几种应用 第一种:懒汉式 第二种:饿汉式 第三种:双重检索式 第四种:注册登记式 第五种:内部类形式 浅谈Java中单例模式的几种应用 日常开发中,为了提高我们系统中对象 ...

  3. java的向下转型_浅谈Java向下转型的意义

    一开始学习 Java 时不重视向下转型.一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型. 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向 ...

  4. java socket 异步回调函数_浅谈socket同步和异步、阻塞和非阻塞、I/O模型

    原标题:浅谈socket同步和异步.阻塞和非阻塞.I/O模型 在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式 同步/异步主要针 ...

  5. Java hibernate假外键_浅谈hibernate急迫加载问题(多重外键关联)

    数据库结构如下 strategy中有外键member_id(关联member表)外键strategy_category(关联category表)而member表中有外键position_id(关联po ...

  6. python 工业自动化 人工智能_浅谈人工智能神经网络与工业自动化

    过去称为自动化的产品现在更名为人工智能.一些学校甚至将自动化专业直接划分为人工智能神经网络. 共同点:工业自动化表示是知识的应用来解决问题. 区别:知识是人类发现的还是机器本身从数据中提取的. 自动化 ...

  7. php和java的区别菜鸟教程_浅谈Java和PHP的主要区别

    当谈到PHP与Java的差异性问题时,更多的是回答初学者的一些疑问.对于刚接触IT的同学来说,他们需要做好对未来职业的选择.所以是选择PHP还是选择Java更有利于自身的技术特点和发展前景.所以在解决 ...

  8. java实现续打功能_浅谈报表工具的打印方案

    报表工具除了基本的绘制报表,完成数据呈现(也就是让终端用户能看到报表),打印也是报表的基本功能之一. 当前报表工具很多,可以按地域.开闭源等划分,包括有杰表.水晶.Style Report.birt. ...

  9. java类的命名规范_浅谈Java中的命名规范

    现代软件架构的复杂性需要协同开发完成,如何高效地协同呢? 答案是:制定一整套统一的规范. 无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没 ...

  10. java和python混合编程_浅谈C++与Java混合编程

    在学习编程的过程中, 我觉得不止要获得课本的知识, 更多的是通过学习技术知识提高解决问题的能力, 这样我们才能走在最前方, 更 多 Java 学习,请登陆疯狂 java 官网. 现实的情况是, 真实的 ...

最新文章

  1. python基础、print,input,if判断等
  2. Java20-day11【实现多线程(进程、线程-调度-控制-生命周期)、线程同步(同步代码块、线程安全、Lock)、生产者消费者(模式概述、案例)】
  3. c++ select函数_PySpark 操作函数一览
  4. linux下memcache安装
  5. leetcode43. 字符串相乘 经典大数+和*
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的超市库房管理系统
  7. 蓝桥杯 ALGO-20 算法训练 求先序排列
  8. 3.07 检测两个表中是否有相同的数据
  9. 详解:Hive中的NULL的处理、优点、使用情况(注意)
  10. python识别文字软件_使用Python和大漠插件进行文字识别含软件源码
  11. Ubuntu下VScode代码字体设置——monospace(等宽字体)
  12. 爬虫抓取百度指数思路总结
  13. HyperSnap编辑捕获图像,hypersnap截动图
  14. iOS播放器开发之MPMoviePlayerController
  15. wordpress 后台添加简单的友情链接
  16. exchange服务器维护,Exchange服务器之禁用和删除Exchange邮箱深入探讨
  17. 非常不错的IOS学习网站
  18. 用X64 Native tools command promt for vs安装ROS
  19. android中app分享小程序卡片及跳转回app
  20. OpenGl法向量计算

热门文章

  1. mysql 联合主键 null_MySQL联合主键的索引使用
  2. echart-pie
  3. Shel相关编程(四)
  4. Linux内核Makefile.txt文件翻译
  5. Android电源管理框架
  6. 软件测试与质量保障之间的关系
  7. 关于DBF文件格式的详细说明
  8. 特朗普Twitter账号解封!马斯克:人民的声音,上帝的声音
  9. 什么叫图像或轮廓的空间矩、中心矩、归一化中心矩?并利用OpenCV的类Moments计算轮廓的这几个矩和质心位置
  10. SourceInsight4.0黑色背景主题