2010-05-04 41 views
10

我有一个问题,试图弄清楚如何调整我的感知器算法的参数,使其在看不见的数据上表现相对较好。感知器学习算法的参数调整

我已经实现了一个验证的工作感知器算法,我想弄清楚一种方法,我可以调整迭代次数和感知器的学习速率。这些是我感兴趣的两个参数。

我知道感知器的学习速度并不影响算法是否收敛和完成。我正在努力掌握如何改变n。太快,它会摆动很多,太低而且需要更长的时间。

至于迭代的次数,我不完全确定如何确定一个理想的数字。

无论如何,任何帮助,将不胜感激。谢谢。

回答

13

从少量迭代开始(它实际上更常规地计数'纪元'而不是迭代 - '纪元'是指通过用于训练网络的整个数据集的迭代次数。 “小”让我们说50个时代的东西。原因是你想看看每个额外的训练周期(时代)总误差是如何变化的 - 希望它会下降(更多关于下面的“总误差”)。

很明显,您对下一个新纪元不会导致总误差进一步下降的时间点(时代数量)感兴趣。因此,从少数时代开始,您可以通过增加时代来接近这一点。

你开始的学习速度不应该太细或太粗糙(显然是主观的,但希望你对大到小的学习率有一个粗略的理解)。

接下来,在您的感知器中插入几行测试代码 - 实际上只是几个恰当的“打印”语句。对于每次迭代,计算并显示增量(训练数据中每个数据点的实际值减去预测值),然后对训练数据中所有点(数据行)上的各个增量值进行求和(我通常取绝对值的绝对值delta,或者你可以取平方差之和的平方根 - 无关紧要,称之为总和值“总误差” - 只要清楚,这就是总误差(总误差所有节点)每时期

然后,情节的总误差为时期号的函数(即,在x轴上时期号,在y轴上总误差)。最初的过程中,你”将会看到左上角的数据点向下和向右倾斜,并且以递减的斜率

让算法训练网络对训练数据。 增加(通过例如每次运行10次),直到看到曲线(总误差与历元数)变平 - 即,额外的迭代不会导致总误差减小。

所以这条曲线的斜率很重要,它的垂直位置也是很重要的 - 也就是说,你有多少总的错误,以及它是否继续向下倾斜更多的训练周期(epochs)。如果在增加新纪元之后,你最终会注意到错误的增加,从较低的学习率再次开始。

学习率(通常是0.01到0.2之间的一个分数)肯定会影响网络训练的速度 - 也就是说,它可以更快地将您移动到本地最小值。它也可能导致你跳过它。因此,编码一个训练网络的循环,让我们说五个不同的时间,每次使用固定数量的时代(和相同的起点),但是将学习速率从例如0.05变化到0.2,每次增加学习速率0.05。

此处还有一个参数很重要(虽然不是绝对必要),'势头'。顾名思义,使用动量术语可以帮助您更快速地获得训练有素的网络。实质上,动量是学习率的倍数 - 只要错误率下降,动量项加速了进度。只要你前往目的地,增加速度',动量项背后的直觉就是''。动量项的典型值是0.1或0.2。在上面的训练方案中,你应该保持动量不变,同时改变学习速率。

+0

这是正确的答案,但不要限制你的学习速度和动量到一个域的限制(缩放)。生成一个随机网络,以0.05步骤训练0.01-0.99。如果您无法以这种方式摆脱全球最低标准,请确保您正确地对输入进行标准化。我是Log的忠实粉丝! – deepelement 2014-05-30 01:57:01

3

关于学习率不影响感知器是否收敛 - 这是不正确的。如果您选择的学习率过高,您可能会得到一个分歧网络。如果你在学习期间改变了学习速率,并且速度下降得太快(即比1/n更强),你也可以得到一个永不收敛的网络(这是因为从1到inf的t(t)之和是有限的。这意味着权重向量只能以有限的量改变)。

理论上可以示出为简单的情况下,根据变更N(学习率)1 /吨(其中t是提出的示例的数量)应该工作很好,但事实上,我发现,在实践中,最好要做到这一点,就是要找到好的高n值(不会让你的学习发散的最高值)和低n值(这是一个比较狡猾的数字,实际上取决于数据和问题),然后让n随着时间从高到低n线性变化

1

学习率取决于数据的典型值。一般来说,没有经验法则。特征缩放是一种用于标准化自变量或数据特征范围的方法。在数据处理中,它也被称为数据标准化,并且通常在数据预处理步骤期间执行。

将数据标准化为零均值,单位方差或0-1或任何其他标准形式可以帮助选择学习率的值。正如道格提到的,0.05到0.2之间的学习率一般很好。

此外,这将有助于使算法更快地收敛。

来源:Juszczak,P .; D. M. M. J. Tax和R. P. W. Dui(2002)。 “支持矢量数据描述中的特征缩放”。 PROC。第八届。 CONF。进阶学校计算机。成像:95-10。