数与图(20)——机器学习.下

在《数与图(19)》中,我们明确了机器学习的基本方法——训练,并就关键的技术问题给予了简要的解释,在此基础上,写出了部分程序,包括训练数据列表、求真假y列表过程、求方差过程以及求方差对系数求导过程。本文的目标是利用上述数据及过程,实现对模型的训练,并绘制误差曲线。

一、训练系数

首先创建一个无返回值过程——训练系数,该过程的参数为“训练次数”,代码如图1所示。

图1 无返回值过程——训练系数

如果你理解了《数与图(19)》中讲述的内容,那么理解上述过程应该是不困难的。顺便说一下,这是经过优化的算法——内外两层循环。最初的程序只有内层循环,在训练过程中,发现系数无法收敛到目标值,即便设定了再多的训练次数,也无法实现目标。这是因为a、b、c三个系数之间相互影响,在b=1及c=1的前提下,a永远都不能收敛到0。而采用两层循环的方法,让a、b、c轮流调整,使得b、c的调整结果更有利于a的快速收敛。

下面编写训练按钮的点击事件处理程序,首先初始化系数,然后调用训练系数过程,最后将训练结果显示在标签上,代码如图2所示。

图2 训练按钮的点击事件处理程序

对上述程序进行测试,设训练次数为400,测试结果如图3所示。

图3 测试:显示训练结果

测试结果与《数与图(19)》中的⑴式完全吻合,其中a的值无法精确地收敛到0,但是10-16与32比起来完全可以忽略不计。图3中还显示了绘图参数的变化,这是为稍后绘制误差曲线所作的准备。

二、绘制误差曲线

在训练系数过程里,如图1所示,每个内层循环中的最后一行代码,是将计算出的方差分别保存到三个误差列表中,我们会在坐标系中绘制出误差随训练次数变化的曲线,观察误差的收敛速度。

首先创建一个无返回值过程——画误差曲线,代码如图4所示。注意不同颜色所代表的系数,abc的颜色依次是红绿蓝。图中还显示了两个有返回值过程——x的画布坐标及y的画布坐标,其实在《数与图》系列的早期文章中,就应该创建这两个过程,因为每个项目中都涉及数学坐标向画布坐标的转换。

图4 无返回值过程——画误差曲线

然后在训练按钮的点击事件中,调用上面的过程,代码如图5所示。

图5 在训练按钮的点击事件中调用画误差曲线过程

测试结果如图6所示。从测试结果中看出,在系数a的调整过程中,误差值呈现出振荡的特点,而系数b的调整过程呈现出阶梯状,说明对系数a调整并没有对b产生明显的影响,这里只有系数c的调整对误差产生了显著的影响,并对下一次b的调整产生了影响。综合分析误差的收敛特点,可以判断出a与b、c之间的相关性较弱,而b与c之间的相关性较强。

图6 绘制误差曲线的测试结果

下面我们做一项尝试,保持总的训练次数不变,但增加外层循环次数,减少内层循环次数,调整后的训练系数过程如图7所示。

图7 调整内外层循环的次数

调整之后外层循环为8次(400/50),内层循环为50次,总的训练次数仍然是400次,下面绘制误差曲线,这样调整是为了让一个系数的调整结果尽早地体现在其他系数的调整结果中。测试结果如图8所示。

图8 调整之后的测试结果

如果放大图6与图8观察误差收敛到零的点,会发现图8更早收敛到零,那么继续增大外层循环次数,减小内层循环次数,结果会怎样呢?收敛次数是否会继续减少呢?这个问题留给读者,希望你能找到最小的训练次数。

文章写到这里,应该可以结束了,不过我希望给出一个小结,来加深对机器学习方法的理解。机器学习的操作步骤:

  1. 准备数据;

  2. 给出假设的模型;

  3. 针对假设模型给出误差和导数的计算方法;

  4. 开始训练:根据导数调整模型系数,根据误差的收敛特点调整训练方法。

实际上这个过程不仅是机器学习的步骤,也是人类学习的步骤:人类在面临未知事物时,通常会建立一个假设,然后根据观察到的事实,对假设进行验证,无论验证的结果如何,人的经验世界都会因此而有所收获。

(0)

相关推荐