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