从少量迭代开始(实际上更传统的方法是计算 'epochs' 而不是迭代——'epochs' 是指用于训练的整个数据集的迭代次数网络)。 “小”可以说是 50 个 epoch。这样做的原因是您想了解总误差如何随着每个额外的训练周期(epoch)而变化——希望它会下降(更多关于下面的“总误差”)。
显然,您对下一个附加 epoch 不会导致总误差进一步降低的点(epoch 数)感兴趣。所以从少量的时期开始,这样你就可以通过增加时期来接近那个点。
你开始的学习率不应该太细或太粗,(显然是主观的,但希望你对什么是大学习率和小学习率有一个粗略的认识)。
接下来,在您的感知器中插入几行测试代码——实际上只是一些放置良好的“打印”语句。对于每次迭代,计算并显示增量(训练数据中每个数据点的实际值减去预测值),然后将训练数据中所有点(数据行)的各个增量值相加(我通常取delta,或者你可以取平方差之和的平方根——没关系。称这个总和值为“总误差”——为了清楚起见,这是总误差(误差之和所有节点)每个时期。
然后,将总误差绘制为历元数的函数(即,x 轴上的历元数,y 轴上的总误差)。当然,最初,您会看到左上角的数据点呈向下和向右趋势,并且斜率减小
让算法根据训练数据训练网络。 增加 epochs(例如,每次运行增加 10 个)直到看到曲线(总误差与 epoch 数的关系)扁平化--即,增加迭代不会导致总误差减少。
所以曲线的斜率很重要,它的垂直位置也很重要——即,你有多少总误差,以及它是否会随着更多的训练周期(时期)继续呈下降趋势。如果在增加 epoch 之后,您最终注意到错误增加,请以较低的学习率重新开始。
学习率(通常介于 0.01 和 0.2 之间)肯定会影响网络的训练速度——即,它可以更快地将您移动到局部最小值。它也可能导致你跳过它。所以编写一个训练网络的循环,假设是五次不同的时间,每次使用固定数量的 epoch(和相同的起点),但将学习率从例如 0.05 更改为 0.2,每次将学习率提高0.05.
这里还有一个很重要的参数(虽然不是绝对必要的),'momentum'。顾名思义,使用动量项将帮助您更快地获得经过充分训练的网络。本质上,动量是学习率的乘数——只要错误率在下降,动量项就会加速进步。动量项背后的直觉是“只要你向目的地行驶,就增加你的速度”。动量项的典型值为 0.1 或 0.2。在上面的训练方案中,你应该在改变学习率的同时保持动量不变。