二.嚼烂python神经网络编程理论篇-阅读笔记Two简单分类器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_35289736/article/details/93867492

原理解析与基础知识

2. 微观上:

2.2 由之前的预测器推出分类器:

因为上述的简单机器接受了一个输入,并做出应有的预测,输出结果,所以我们将其称为预测器。我们根据结果与已知真实实例所比较得到的误差,调整内部参数,使预测更加精确。现在,我们来看看测量得到的花园中小虫子的宽度和长度。
在这里插入图片描述
在上图中,你可以清楚地看到两群小虫。毛虫细而长,瓢虫宽而短。
在这里插入图片描述
我们随机画一条直线,多次尝试,直到这条直线整齐地将瓢虫与毛虫区分开来。现在,我们可以用这条直线作为小虫的分类器。
设想一下,下一次,计算机使用机器手臂抓起一只新的小虫,测量其宽度和长度,然后它可以使用上面的分界线,将小虫正确归类为毛虫或瓢虫。
看看下图,你可以看到未知的小虫位于直线之上,因此这是一条毛虫。这种分类非常简单,但是非常强大!
在这里插入图片描述
我们已经看到了,在简单的预测器中,如何使用线性函数对先前未知的数据进行分类。但是,我们忽略了一个至关重要的因素。我们如何得到正确的斜率呢?我们如何改进不能很好划分这两种小虫的分界线呢?
这个问题的答案处于神经网络学习的核心地带。

2.3 训练简单的分类器:

我们希望训练线性分类器,使其能够正确分类瓢虫或毛虫。在2.2节的图中,根据观察,我们知道要做到这一点,简单说来,就是要调整分界线的斜率,使其能够基于小虫的宽度和长度将两组点划分开来。
我们如何做到这一点呢?
我们确实需要一些可以借鉴的实例。为了简单化这项工作,下表显示了两个实例。
在这里插入图片描述
我们有宽度为3.0和长度为1.0的一只小虫,我们知道这是瓢虫。我们还有长度较长(为3.0)、宽度较小(为1.0)的一只小虫,这是一条毛虫。我们知道这组实例是正确的。这些实例帮助我们调整分类函数的斜率。用来训练预测器或分类器的真实实例,我们称为训练数据
在这里插入图片描述
让我们使用一条随机的分界线开始我们的讨论。回顾一下,在千米转换为英里预测器的实例中,我们有一个调整了参数的线性函数。此处,由于分界线是一条直线,因此我们也可以进行相同的处理:
y =Ax
由于严格来说,此处的直线不是一台预测器,因此我们有意使用名称y和x,而不使用名称长度和宽度。与先前我们将千米转换为英里不一样,这条直线不将宽度转换为长度。相反,它是一条分界线,是一台分类器。
让我们尝试从A = 0.25开始,分界线为y = 0.25x。在与训练数据的同一张图中,我们绘制这条直线,观察一下这是一种什么情况。
在这里插入图片描述
无需任何计算,我们可以观察到直线y = 0.25x不是一台很好的分类器。这条直线未将两种类型的小虫区分开来。由于瓢虫也处在直线之上,因此我们不能说“如果小虫在直线之上,则这是一条毛虫”。让我们观察第一个训练样本数据:宽度为3.0和长度为1.0瓢虫。如果我们使用这个实例测试函数y =Ax,其中x为3.0,我们得到:
y =0.25*3.0= 0.75
在这个函数中,我们将参数A设置为初始随机选择的值0.25,表明对于宽度为3.0的瓢虫,其长度应为0.75。但是,由于训练数据告诉我们这个长度必须为1.0,因此我们知道这个数字太小了。
现在,我们有了一个误差值。正如先前将千米转换为英里的预测器实例一样,我们可以利用这个误差值来搞清楚如何调整参数A。
在我们调整参数A之前,让我们考虑y应该是什么值。如果y为1.0,那显然分类器无法起到任何作用,y值应该比1大些,我们假设它为1.1
在这里插入图片描述
让我们暂停下来提醒一下自己,将误差值、期望的目标值和计算值的意义在图上表示出来。
在这里插入图片描述
现在,我们需要对这个E做些什么,才能更好地指导我们调整参数A呢?这是一个重要的问题。
我们先从分类器的线性函数开始:
y =Ax
我们知道,A的初始猜测值给出了错误的y值,y值应该等于训练数据给定的值。我们将正确的期望值t称为目标值。为了得到t值,我们需要稍微调整A的值。数学家使用增量符号Δ表示“微小的变化量”。下面我们将这个变化量写出来:
t = (A+ ΔA)x
让我们在图中将其画出来,以使其更容易理解。在图中,你可以看到新的斜率(A+ΔA)。
在这里插入图片描述
根据误差值E,我们希望知道需要将A调整多少,才能改进直线的斜率,得到一台更好的分类器。要做到这一点,我们只要重新调整上一个方程,将 ΔA算出:
ΔA= E / x
这就可以了!这就是我们一直在寻找的神奇表达式。我们可以使用误差值E,将所得到的ΔA作为调整分界线斜率A的量。
唷!我们做到了!我们找到了基于当前的误差值调整参数的方法。
让我们继续前进吧!
现在,我们已经完成了一个实例训练,让我们从下一个实例中学习。此时,我们已知正确值对为x = 1.0和y = 3.0。当线性函数使用更新后的A = 0.3667,并把x = 1.0代入到线性函数中时,让我们观察会发生什么情况。我们得到
y= 0.3667 * 1.0 = 0.3667。这与训练样本中y = 3.0相去甚远。
基于与先前同样的推理,我们希望直线不要经过训练数据,而是稍微高于或低于训练数据,我们将所需的目标值设置为2.9。这样,毛虫的训练样本就在直线上方,而不是在直线之上。误差值E为2.9-0.3667= 2.5333。
与我们先前所做的一样,让我们再次改进A。ΔA为E / x,即2.5333 /1.0 = 2.5333。这意味着较新的A为0.3667 + 2.5333 = 2.9。这也意味着,对于x = 1.0,函数得出了2.9的答案,这正是所期望的值。
下图显示出了初始直线、向第一个训练样本学习后的改进直线和向第二个训练样本学习后的最终直线。
在这里插入图片描述
等等,这是什么情况啊!看着这幅图,我们似乎并没有做到让直线以我们所希望的方式倾斜。这条直线没有整齐地划分出瓢虫和毛虫。
继续这样操作,使用各个训练数据样本进行改进,那么我们所得到的是,最终改进的直线与最后一次训练样本非常匹配。实际上,最终改进的直线不会顾及所有先前的训练样本,而是抛弃了所有先前训练样本的学习结果,只是对最近的一个实例进行了学习。
好吧,让我们重新使用这种方法。但是这一次,在改进公式中,我们将添加一个调节系数:
ΔA= L(E / x)
调节系数通常被称为学习率(learning rate),在此,我们称之为L。我们就挑L = 0.5作为一个合理的系数开始学习过程。简单说来,这就意味着我们只更新原更新值的一半。
让我们再次观察初始直线、改进后的直线和最终直线,观察这种有节制的改进是否在瓢虫和毛虫区域之间是否得到了更好的分界线。
在这里插入图片描述
结果真的很不错!

猜你喜欢

转载自blog.csdn.net/qq_35289736/article/details/93867492