Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 感知器学习算法的参数整定_Performance_Machine Learning_Deep Learning_Perceptron - Fatal编程技术网

Performance 感知器学习算法的参数整定

Performance 感知器学习算法的参数整定,performance,machine-learning,deep-learning,perceptron,Performance,Machine Learning,Deep Learning,Perceptron,我在试图找出如何调整感知器算法的参数时遇到了一些问题,以便它在看不见的数据上表现相对较好 我已经实现了一个有效的感知器算法,我想找出一种方法,通过它我可以调整感知器的迭代次数和学习速率。这是我感兴趣的两个参数 我知道感知器的学习速度并不影响算法是否收敛和完成。我正在努力掌握如何改变n。太快,它会摆动很多,太低,它会花更长的时间 至于迭代次数,我不完全确定如何确定理想的迭代次数 无论如何,任何帮助都将不胜感激。谢谢。从少量迭代开始(实际上,计算'epoch'比计算迭代更为传统--'epoch'指用

我在试图找出如何调整感知器算法的参数时遇到了一些问题,以便它在看不见的数据上表现相对较好

我已经实现了一个有效的感知器算法,我想找出一种方法,通过它我可以调整感知器的迭代次数和学习速率。这是我感兴趣的两个参数

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

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


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

从少量迭代开始(实际上,计算'epoch'比计算迭代更为传统--'epoch'指用于训练网络的整个数据集的迭代次数)。用“小”来形容50个时代。这样做的原因是,您希望看到总误差是如何随着每个额外的训练周期(历元)而变化的——希望它会下降(下面更多关于“总误差”的内容)

显然,您对下一个附加历元不会导致总误差进一步减小的点(历元数)感兴趣。所以从少量的历代开始,这样你就可以通过增加历代来接近这一点

你开始的学习率不应该太细或太粗(显然是主观的,但希望你对什么是大学习率和小学习率有一个粗略的认识)

接下来,在您的感知器中插入几行测试代码——实际上只是几个位置良好的“打印”语句。对于每次迭代,计算并显示增量(训练数据中每个数据点的实际值减去预测值),然后对训练数据中所有点(数据行)的单个增量值求和(我通常取delta的绝对值,或者你可以取差值平方和的平方根,这没什么大不了的。把这个求和的值叫做“总误差”——只是为了清楚,这是每个历元的总误差(所有节点的误差之和)

然后,将总误差绘制为历元数的函数(即,x轴上的历元数,y轴上的总误差)。当然,开始时,您会看到左上角的数据点向下、向右并以逐渐减小的斜率变化

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

因此,曲线的斜率很重要,它的垂直位置也很重要——即,你有多少总误差,以及它是否会随着训练周期(历次)的增加而继续下降。如果在历次增加后,你最终发现误差增加,就以较低的学习率重新开始

学习率(通常是0.01到0.2之间的一小部分)肯定会影响网络的训练速度,也就是说,它可以更快地将您移动到局部最小值。它还可以使您跳过它。因此,编写一个循环,使用固定的历元数训练网络,比方说五次(和a)每次相同的起点,但学习率从0.05变为0.2,每次增加0.05的学习率


这里还有一个参数很重要(虽然严格来说不是必需的),“动量”。顾名思义,使用动量项可以帮助你更快地建立一个训练有素的人际网络。本质上,动量是学习速度的倍增——只要错误率降低,动量项就会加速进步。动量项背后的直觉是“只要你旅行”朝着目的地前进,提高速度。动量项的典型值为0.1或0.2。在上面的训练方案中,在改变学习速率时,您可能应该保持动量不变。

关于学习速率不影响感知器是否收敛-这不是真的。如果您选择学习速率t太高,你可能会得到一个发散的网络。如果你在学习过程中改变学习速率,并且它下降得太快(即大于1/n),你也可以得到一个永远不会收敛的网络(这是因为从1到inf的n(t)与t之和是有限的。这意味着权重向量只能改变有限的数量)


理论上可以证明,对于简单的情况,根据1/t改变n(学习率)(其中t是给出的示例数)应该是有效的,但我实际上发现,在实践中,最好的方法是找到好的高n值(不会使你的学习偏离的最高值)和低n值(这是一个很难理解的数字。这取决于数据和问题),然后让n随时间从高n到低n线性变化。

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

将数据标准化为零平均值、单位方差或0-1或任何其他标准形式有助于选择学习率的值。如doug所述,学习率在0.05和0.2之间通常效果良好

这也将有助于使算法更快地收敛

资料来源:Juszczak,p.;D.M.J。