我有一个问题,试图找出如何调整我的感知器算法的参数,以便它在看不见的数据上表现得相对较好。
我已经实现了经过验证的工作感知器算法,我想找出一种方法,通过该方法我可以调整迭代次数和感知器的学习率。这是我感兴趣的两个参数。
我知道感知器的学习率不会影响算法的收敛和完成。我正试图掌握如何改变n。它太快了,它会绕很多摆动,太低而且需要更长的时间。
至于迭代次数,我不完全确定如何确定理想数字。
无论如何,任何帮助将不胜感激。感谢。
答案 0 :(得分:13)
从少量迭代开始(实际上更常规地计算'epochs'而不是迭代 - 'epochs'指的是用于训练的整个数据集的迭代次数网络)。通过'小'让我们说50个时代。这样做的原因是你希望看到每个额外的训练周期(时期)总误差是如何变化的 - 希望它会下降(更多关于下面的'总误差')。
显然,您对下一个附加时期不会导致总误差进一步减少的点(时期数)感兴趣。因此,从少量时期开始,您可以通过增加时期来接近这一点。
你开始学习的速度不应该太精细或太粗糙(显然是主观的,但希望你对大学习率和小学习率有一个粗略的感觉)。
接下来,在你的感知器中插入几行测试代码 - 实际上只是一些很好的'print'语句。对于每次迭代,计算并显示增量(训练数据中每个数据点的实际值减去预测值)然后对训练数据中所有点(数据行)的各个增量值求和(我通常采用的绝对值) delta,或者你可以得到平方差的总和的平方根 - 无关紧要。调用该求和值“总误差” - 只是为了清楚,这是总误差(误差的总和)所有节点)每个纪元。
然后,将总误差绘制为时期数的函数(即x轴上的纪元数,y轴上的总误差)。当然,最初你会看到左上角的数据点向下和向右倾斜并且斜率下降
让算法根据训练数据训练网络。 增加时期(例如,每次运行10次)直到您看到曲线(总误差与纪元数量)展平 - 即附加迭代不会导致总误差减少。
因此,该曲线的斜率是重要的,它的垂直位置也是如此 - 即,你有多少总误差以及它是否会继续向下趋势以及更多的训练周期(时期)。如果在增加时期后,您最终会发现错误增加,请以较低的学习率重新开始。
学习率(通常在0.01到0.2之间的分数)肯定会影响网络的训练速度 - 也就是说,它可以更快地将您带到局部最小值。它也可以让你跳过它。因此编码一个训练网络的循环,假设每次使用固定数量的历元(和相同的起始点),但每次改变学习率,例如0.05到0.2,每次增加学习率0.05。
此处还有一个参数很重要(虽然不是绝对必要的),'动量'。顾名思义,使用动量术语可以帮助您更快地获得训练有素的网络。从本质上讲,动量是学习率的乘数 - 只要误差率下降,动量项就会加速进度。动量项背后的直觉是',只要你朝着目的地行进,增加你的速度'。动量项的典型值是0.1或0.2。在上面的训练计划中,你应该在改变学习率的同时保持动量不变。
答案 1 :(得分:3)
关于不影响感知器是否收敛的学习率 - 这不是真的。如果您选择的学习率过高,您可能会获得分歧网络。如果你在学习过程中改变了学习速度,并且它下降得太快(即强于1 / n),你也可以获得一个永不收敛的网络(这是因为从1到inf的N(t)总和是有限的。这意味着权重向量只能改变有限的数量)。
理论上可以显示,对于简单的情况,根据 1 / t (其中t是所示示例的数量)来改变n(学习率)应该可以正常工作,但我实际上发现了练习,这样做的最好方法是找到良好的高n值(不会使你的学习发散的最高值)和低n值(这个很难实现。真的取决于数据和问题),然后让n随着时间的推移从高n到低n 线性。
答案 2 :(得分:1)
学习率取决于典型的数据值。一般来说没有经验法则。特征缩放是一种用于标准化独立变量或数据特征范围的方法。在数据处理中,它也称为数据规范化,通常在数据预处理步骤中执行。
将数据标准化为零均值,单位方差或0-1或任何其他标准形式可以帮助选择学习率的值。正如道格提到的,学习率在0.05和0.2之间通常都很有效。
这也有助于使算法更快收敛。
来源: Juszczak,P。; D. M. J. Tax和R. P. W. Dui(2002)。 “支持向量数据描述中的特征缩放”。 PROC。 8日。 CONF。进阶学校计算。成像:95-10。