Encog3 in Java : 第五章 传播训练

11 篇文章 1 订阅
5 篇文章 0 订阅

第五章 传播训练 - 一枚码农Encog是一个JAVA和.Net的机器学习框架,最初,Encog仅仅支持神经网络,在后来的版本更新中扩展了其他更多通用的机器学习算法,本教程主要讲解其神经网络算法。icon-default.png?t=M1FBhttp://www.javagame.top/column/1/DXBLOG202202160931524781127/detail.html

• 传播训练是如何工作的

• 传播训练的类型

• 训练和方法工厂

• 多线程训练

训练是一种神经网络调节权重已得到令人满意输出的方式,这本书包括了监督和无监督两种方式,这章将讨论传播训练,一种监督训练的形式, 需要提供预期输出给训练算法。

Encog也支持无监督训练,对于无监督训练,不需要向神经网络提供预期输出,当然,神经网络对于有限方向的数据进行学习和洞察。第十章将讨论无监督训练。

传播训练对于前馈,简单递归和其他类型的神经网络训练非常有效,这里有几种不同形式的传播训练,这章将重点放在Encug当前所支持的传播形式,这六种形式如下所示:

• 反向传播训练

• 快速传播训练(QPROP)

• 曼哈顿更新规则

• 弹性传播训练(RPROP)

• 量化共轭梯度法(SCG)

• 利文贝格.马夸特(LMA)

所有者六中方法工作有点类似,然而,也有一些重要的不同,下一节将探索一般的传播训练。

5.1 理解传播训练

传播训练算法使用监督训练,这意味着训练算法被赋予一组训练输入和每个输入的想想输出。传播训练算法通过一系列的迭代,很有可能在一定程度上将更好地改进神经网络的错误率,错误率是神经网络的实际输出与训练数据所提供的理想输出之前的百分差,每次迭代都会完全通过训练数据循环。对于每一项训练数据,都会对计算权重矩阵产生一些变化。

每个训练迭代首先遍历训练集中所有的训练元素,对于每一项训练数据,都会对计算权重举证产生一些变化。这些变化将被应用在Encog批量批次训练中,因此,在一个迭代结束时Encog更新权重矩阵的值。

每个训练迭代开始遍历所有的训练内容,对于每一个训练元素,执行两个传输过程:正向传输和反向传输。

前向传递只是将数据呈现给神经网络,像没有训练是它通常做的一样,输入数据和算法计算误差,即实际输出和理想输出之间的差异,每个层的输出也保存在这次传输中。这使得训练算法能够看到神经网络每个层的输出。

反向传递从输出层开始,并返回到输入层,反向传递开始于检查每个神经元的理想输出和实际输出之间的差异,然后计算此误差的梯度,为了计算这个梯度,将神经网络的实际输出应用于该层的激活函数的导数,然后这个值乘以误差。

由于该算法使用激活函数的导数,所以传播训练只能用于实际具有导数函数的激活函数。这个导数计算神经网络中每个连接的误差梯度。这个值是如何使用的取决于所使用的训练算法。

5.1.1 理解反向传播

反向传播是前馈神经网络一种古老的训练方法,反向传播使用了两个参数,与前一节计算的梯度下降相结合。第一个参数是学习率,本质上是一个百分数,它决定了梯度下降法如何直接应用于权重矩阵,梯度乘以学习率,然后加入到权重矩阵中。这缓慢地将权重优化为会产生较低误差的值。

反向传播算法的一个问题是梯度下降算法会找出局部极小值。这些局部极小值是低误差点,但可能不是全局最小值。反向传播算法提供的第二个参数有助于反向传播走出局部极小。第二个参数叫做动量。动量指定要将之前迭代权重变化应用于当前迭代的程度。

动量参数基本上是百分数,就像学习率一样。为了利用动量,反向传播算法必须跟踪以前的迭代中应用于权重矩阵的变化。除了由动量参数缩放,这些变化将被重新应用到当前迭代。通常,动量参数将小于1,因此从以前的训练迭代中得到的权重变化的意义比当前迭代计算的变化意义要小。例如,将动量设置为0.5会使先前训练迭代的50%的变化应用于当前权重矩阵的权重。

下面的代码将设置一个反向传播训练器,给定一个训练集和神经网络。

 

上面的代码将创建一个反向传播训练器,学习率为0.7,动量为0.3。一旦设置,训练对象就准备好进行迭代训练。encog迭代训练实例:

 

通过修改上面的弹性传播训练代码行,上面的例子可以很容易地被修改为使用反向传播训练。

5.1.2 理解曼哈顿更新规则

反向传播训练算法的一个问题是权值变化的程度。梯度下降通常对权重矩阵的变化太大。曼哈顿更新规则和弹性传播训练算法只使用梯度符号。量级被丢弃了。这意味着只有梯度是正的、负的或接近零的才是重要的。

对于曼哈顿更新规则,这个量级用于确定如何更新权重矩阵值。如果量级接近于零,那么权重就不会发生变化。如果量级是正的,那么权重就会增加一个特定的量。如果数量是负数,那么权重值就会减少一个特定的量。权重值被改变的量被定义为常数。您必须为曼哈顿更新规则算法提供这个常量。

下面的代码将设置一个训练集和神经网络的曼哈顿更新训练器。

 

上面的代码将创建一个学习速度为0.00001的曼哈顿更新规则训练器。曼哈顿的传播通常需要很小的学习率。一旦安装完成,训练对象就准备好进行迭代训练。encog迭代训练实例:

 

通过替换上面的弹性传播训练代码行,上面的例子可以很容易地被修改为曼哈顿传播训练。

5.1.3 理解快速传播训练

快速传播(QPROP)是另一个传播训练。快速传播是基于牛顿的方法,它是寻找函数根的一种方法。这可以适用于最小化神经网络误差的任务。通常QPROP比BP更好。用户必须提供学习率参数给qprop。然而,没有动量参数,QPROP通常有更高的学习效率。2.0的学习率通常是一个很好的起点。

下面的代码将设置一个快速传播训练器,并给定一个训练集和神经网络。

 

上面的代码将创建一个2.0学习率的QPROP。QPROP一般可以得到较高的学习速率。一旦设置,训练对象就准备好进行迭代训练。encog迭代训练实例:

 

通过替换上面的弹性传播训练代码行,上面的例子可以很容易地被修改为快速传播训练。

5.1.4 理解弹性传播训练

弹性传播(RPROP)训练算法通常是encog提供的监督前馈神经网络最有效的训练算法。一个特别的优势,使用前,RPROP算法是不需要参数设置。没有需要事先确定的学习率、动量值或更新常数。这很好,因为很难确定精确的最优学习率。

RPROP算法的工作原理类似于曼哈顿的更新规则,只使用下降的幅度。然而,RPROP算法不是使用固定的常量来更新权重值,而是使用了更细粒度的方法。这些改变量将不会像曼哈顿更新规则或反向传播算法那样保持不变。相反,这些改变量会随着训练的进展而改变。

RPROP不保持一个全局的更新值,或变化量。相反,每个权重矩阵值都保留单独的增量。这些增量首先初始化为非常小的数目。每一次迭代RPROP算法根据这些变化量更新权重值。然而,如前所述,这些变化量并不保持固定。梯度用于确定它们该如何改变使用的量级,以确定如何进一步修改变化量。这允许每个单独的权值矩阵值被单独训练,这不是反向传播算法或曼哈顿更新规则所提供的优点。

下面的代码将设置一个弹性传播训练器,给定一个训练集和神经网络。

 

上面的代码将创建一个弹性传播训练器。RPROP不需要参数设置开始训练。这是这个新训练算法的主要优点。一旦设置,训练对象就准备好进行迭代训练。

encog迭代训练实例:

 

上面的例子中已经使用RPROP训练。

有四种主要的Encog支持的RPROP算法变体:

 

默认的,encog使用RPROP +,最标准的RPROP。一些研究表明,irprop +是最高效的算法。设置encog使用irprop +使用下面的命令。

 

5.1.5 理解SCG训练

对于Encog,量化共轭梯度法(SCG)是一种快速、高效的培训。SCG基于称为共轭梯度法(CGM)优化算法。SCG并不适用于所有的数据集。当它在适用范围内使用时,它是相当有效的。与RPROP有同样的优势,SCG没有参数必须设置。

下面的代码将设置SCG教练,给定一个训练集和神经网络。

 

上面的代码将创建一个SCG教练。一旦设置,训练对象就准备好进行迭代训练。

encog迭代训练实例:

 

通过替换上面的弹性传播训练代码行,上面的例子可以很容易地被修改为快速传播训练

5.1.6 理解LMA训练

利文贝格.马夸特算法(LMA)是一种神经网络的非常有效的训练方法。在许多情况下,LMA会超越弹性传播。LMA是一种混合算法基于牛顿法和梯度下降法(BP),整合双方的优势。梯度下降保证收敛到一个局部极小值,尽管缓慢。GNA相当快,但往往不能收敛。通过使用阻尼因子在两者之间进行插值,建立了一种混合方法。

下面的代码显示了如何使用LMA:

 

上面的代码将创建LMA,具有可能不需要调整的默认参数。一旦设置,训练对象就准备好进行迭代训练。encog迭代训练实例:

 

通过替换上面的弹性传播训练代码行,上面的例子可以很容易地被修改为LMA训练。

5.2 Encog方法 & 训练工厂

本章说明如何实例化许多不同的训练方法,如Backpropagation,scaledconjugategradient或resilientpropagation。在前面的章节中,我们学会了使用BasicNetwork和BasicLayer创造不同类型的神经网络。我们也可以使用工厂创建训练方法和神经网络。

工厂从文本字符串中创建神经网络和训练方法,通过省去除非必要的实例化所有对象来节省时间。有关工厂使用的示例,请参见:

 

上面的例子使用工厂来创建神经网络和训练方法。本节将展示如何使用工厂创建神经网络和培训方法。

5.2.1 使用工厂创建神经网络

下面的代码使用工厂来创建前馈神经网络:

 

上面的代码创建了一个具有两个输入神经元和一个输出神经元的神经网络。有四个隐藏的神经元。偏置神经元放置在输入和隐藏层上。象典型的神经网络那样,输出层上没有偏置神经元。在输入和隐藏神经元之间,以及隐藏层和输出层之间都使用sigmoid激活函数。

您可能会注意到神经网络体系结构字符串中的两个问号。在创建方法中这些内容指定输入和输出层大小,并且是可选的。您可以硬编码输入和输出大小。在这种情况下,创建调用中指定的数字将被忽略。

5.2.2 使用工厂创建训练方法

也可以使用工厂创建培训方法。下面的代码使用工厂创建反向传播训练器。

 

上面的代码创建了一个反向传播训练器,学习率为0.7,动量为0.3。

5.3 多线程训练是如何工作的

多线程训练特别适用于大型训练集和多核机器。如果Encog没检测到两者的存在,它会回落到单线程。当有一个以上的处理核心和足够的训练集项目来保持忙碌时,多线程的训练将比单线程运行得更快。

本章已经介绍了三种传播训练技术,所有这些技术都是相似的。无论是反向传播,弹性传播或曼哈顿更新规则,技术是相似的。有三个不同的步骤:

 

首先,执行一个常规的前馈传递。每个级别的输出保持不变,所以每个级别的误差都可以独立评估。其次,在每一层的计算误差和每个激活函数的导数来计算梯度下降。这些梯度显示了必须修改权重的方向,以改善网络的误差。这些梯度将在第三步中使用。

第三步是不同的训练算法不同。BP通过学习率简单缩放梯度下降。然后缩放梯度下降直接应用于权重。曼哈顿更新规则只使用梯度标志来决定哪个方向影响权重。然后在正的或负的方向按固定值改变权重。

RPROP为每个权重都持有一个独立的变化量,只使用梯度下降的符号增加或减少变化量。然后将变化量应用于权重。

多线程算法使用线程执行步骤1和步骤2。训练数据被分解成多个数据包分布在线程之间。在每次迭代开始时,线程开始处理这些包中的每一个。一旦所有线程都完成了,一个线程将聚合所有结果并将它们应用到神经网络中。在迭代结束时,只有一个线程在执行的时间非常短。从图5.1中可以看出这一点。

 

在上面的图片所示,i7目前运行在100%。每一次迭代的结束都清楚地被每个处理器简单地划分出来。幸运的是,这是一个非常短暂的时间,并没有对整体训练效率有很大的影响。在试图克服这一点时,各种测试都没有强制线程在迭代结束时等待重新同步。此方法没有提供更有效的训练,因为传播训练算法需要在下一次迭代开始之前应用所有更改。

5.4 使用多线程训练

要想看到能闪亮的多线程训练,需要一个更大的培训集。在下一章中我们将看到encog使用更大的训练集时如何收集信息。然而,现在,我们将看一个简单的基准测试的例子,随机产生一个训练集,比较多线程和单线程的训练时间。

一个简单的基准是利用40个神经元的输入层、60个神经元的隐藏层和20个神经元的输出层。使用了50000个元素的训练集。此示例可在以下位置找到。

 

超线程四核i7执行这个程序产生以下结果:

单线程运行20个迭代

iteration #1 Error :1.0594453784075148
iteration #2 Error :1.0594453784075148
iteration #3 Error :1.0059791059086385
iteration #4 Error :0.955845375587124
iteration #5 Error :0.934169803870454
iteration #6 Error :0.9140418793336804
iteration #7 Error :0.8950880473422747
iteration #8 Error :0.8759150228219456
iteration #9 Error :0.8596693523930371
iteration #10 Error :0.843578483629412
iteration #11 Error :0.8239688415389107
iteration #12 Error :0.8076160458145523
iteration #13 Error :0.7928442431442133
iteration #14 Error :0.7772585699972144
iteration #15 Error :0.7634533283610793
iteration #16 Error :0.7500401666509937
iteration #17 Error :0.7376158116045242
iteration #18 Error :0.7268954113068246
iteration #19 Error :0.7155784667628093
iteration #20 Error :0.705537166118038
RPROP Result : 3 5.1 3 4 seconds .
Final RPROP error: 0.6952141684716632
Training 20 iteration s with Multithreading 
多线程运行20个迭代
Iteration #1 Error :0.6952126315707992
Iteration #2 Error :0.6952126315707992
Iteration #3 Error :0.90915249248788
Iteration #4 Error :0.8797061675258835
Iteration #5 Error :0.8561169673033431
Iteration #6 Error :0.7909509694056177
Iteration #7 Error :0.7709539415065737
Iteration #8 Error :0.7541971172618358
Iteration #9 Error :0.7287094412886507
Iteration #10 Error :0.715814914438935
Iteration #11 Error :0.7037730808705016
Iteration #12 Error :0.6925902585055886
Iteration #13 Error :0.6784038181007823
Iteration #14 Error :0.6673310323078667
Iteration #15 Error :0.6585209150749294
Iteration #16 Error :0.6503710867148986
Iteration #17 Error :0.6429473784897797
Iteration #18 Error :0.6370962075614478
Iteration #19 Error :0.6314478792705961
Iteration #20 Error :0.6265724296587237
Multi?Threaded Result :8.793 seconds .
Final Multi?thread error : 0.6219704300851074
Factor improvement :4.0106783805299674

如上所示的结果,单线程算法完成在128秒和多线程算法结束只有31秒。多线程的性能提高了四倍。运行上述示例的结果将取决于您的计算机拥有多少个核心。如果你的电脑是单核没有超线程,那么倍数将接近1。这是因为第二次多线程训练将回到一个线程中。

5.5总结

这章探索了怎样使用Encog的几个传播训练算法,传播训练是监督训练中一个非常常用的算法,弹性传播训练通常是一个最好的选择,然而,曼哈顿更新规则和反向传播也许在某些情况下很有用,SCG和QPROP也是一个可靠的训练算法。

反向传播是神经网络中一个最原始的训练算法,虽然Encog支持它主要是由于历史目的,但它有时能使用来进一步改进弹性传播之后的神经网络,反向传播训练使用一个学习率和动量,学习率定义显示神经网络的学习程度,动量帮助网络摆脱局部最小值。

曼哈顿更新规则使用delta值去更新权重值,它能够选择不同恰当的delta值,过高的值将导致网络什么也学不到。

弹性传播(RPROP)是Encog提供的一个最好的训练算法,像另外两个传播训练算法,它不要求你提供训练参数,这使得它很容易使用,此外,弹性传播比曼哈顿更新规则和反向传播更有效。

SCG和QPROP也是一个非常有效的训练方法,SCG并不适合所有训练数据集,但是它工作时非常有效,QPROP工作类似于RPROP,,它也是一种有效的训练方法,然而,QPROP要求使用者选择一个学习率。

多线程训练是一个训练技术,它可以利用多核计算机更快地完成传播训练,给定一台多核计算机和一个足够大的训练集,多线程训练速度大大地快于单核训练,Encog可以自动设置线程数的优化。如果这些条件不存在,Encog将回落到单线程的训练。

传播训练不是Encog使用的唯一监督训练,下一章介绍其他一些监督训练类型训练算法,将探索怎样使用例如模拟退火和遗传算法训练技术。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚码农404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值