欢迎光临散文网 会员登陆 & 注册

从零开始的机器学习笔记(一)第一代神经网络——感知机

2023-06-18 17:13 作者:安培利亚  | 我要投稿


妲宝镇楼

写在前面

本文是我的机器学习笔记,也是我根据我自己所学的知识总结的,对机器学习的零门槛入门读物。由于是我自己总结的,内容或多或少都有些错误。如果有不懂的问题或发现我文中的错误,欢迎大家及时批评指正!

本文会带大家从感知机一路讲到神经网络的训练,在过程中,我会对所需要的前置知识进行讲解。希望大家在看完之后,也能亲手训练出自己的第一个神经网络!

机器学习中的分类问题

机器学习最常见的任务是分类任务,即给出属于某个样本的一组特征,使机器给出这个样本所属的类别。例如,对动物进行分类,若这个动物是短脖子、长耳朵、没翅膀,那么大概率是兔子;长脖子、短耳朵、没翅膀,那大概率是长颈鹿;长脖子、短耳朵、有翅膀,那么大概率是鸭子……让机器学会根据特征对样本进行分类,就是机器学习中最简单也是最常见的任务。

在本章中,我们需要完成这么一个分类任务:每个学生的分班考试都会考两个科目:一个是语文,一个是数学。当考完两门科目时,根据它们的成绩,对每个学生进行分班。学校并没有给出具体的分班标准,但给出了以往50名学生的语文、数学成绩与它们的分班结果。

以往50名学生的语文、数学成绩如下所示:

我们将它定义为变量x,x的长度为50,其中每一个元素都是一个特征向量,里面记录了样本的特征(语文和数学成绩);

他们的分班结果如下所示:

我们将它定义为变量y,y的长度也为50,其中每一个元素都是标签,在此处,标签即为学生的分班结果(学生被分进1和-1两个班)。

红色为一个班,蓝色为另一个班;可以看出,它们是线性可分的(可以用一条直线分隔开)

乍一看,根本不会清楚分班的标准究竟是什么。通过图片得知,它似乎是线性的。借助感知机,我们便能够找到这些特征之间隐含的规律,进而使机器学会如何分类。

感知机的构建

感知机最适用于线性可分的数据集。线性可分指的是样本的类别可以由线性函数y%3Dw_%7B1%7Dx_%7B1%7D%2Bw_%7B2%7Dx_%7B2%7D%2B%5Cdots%2Bw_%7Bn%7Dx_%7Bn%7D%2Bb得到。在本文的实例中,特征向量的长度为2,因此我们根据公式

y%3Dw_%7B1%7Dx_%7B1%7D%2Bw_%7B2%7Dx_%7B2%7D%2Bb

构造我们的感知机。

我们初始化w_%7B1%7D%3D0.8w_%7B2%7D%3D-0.2b%3D0,计算所有的样本,得到的分类结果如下图所示:


当我们随手构造分类器时,它把所有的点都分类到黄色直线w1x1+w2x2+b=0的下方去了

可以看到,我们随手构造的分类器把所有的点都分类到黄色直线(w_%7B1%7Dx_%7B1%7D%2Bw_%7B2%7Dx_%7B2%7D%2Bb%3D0)下方去了,相当于把所有的学生都分到了一个班级,这很显然不是我们最终想要得到的感知机。我们最终期望的感知机能够完美分割属于两个不同班级的样本(如图中的红点和蓝点所示)。因此,我们必须要让感知机根据那些分类错误的点修正自己的参数。

感知机的训练

如果希望训练感知机,就必须要让它知道它所输出的结果有多么离谱。这里我们设所预测的标签为%5Chat%7By%7D%3Dw_1x_1%2Bw_2x_2%2Bb,真实的标签为y,那么我们要让输出的标签尽可能地靠近真实标签,就需要给它减去我们的偏差dy,即

%5Chat%7By%7D-dy%3Dy

因此,我们可以推知,我们训练这个感知机时所需要用到的梯度dy可以使用

dy%3D%5Chat%7By%7D-y

求解得到。利用减去梯度来更新参数的方法在机器学习中就叫做梯度下降法。

求解得到了梯度之后,如何去更新我们的所有参数x呢?我们知道,函数在某一点导数的几何意义是函数在该点切线的斜率。同样地,在很小一段范围之内,可以近似地讲函数(曲线)看作一小段直线,它可以和dydx组成一个直角三角形。

借助导数,可以在很小的范围内将曲线近似地看作直线

也正是因此,我们可以使用如下公式来更新我们的参数:

dy%3D%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20x%7Ddx

该公式利用偏导值,将输出标签与真实标签的偏差转换为各个参数所需要更新的大小。对于所需要更新的参数w_1w_2b,利用求导法则,可以得到如下公式:

dw_1%3D%5Cfrac%7Bdy%7D%7B%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20w_1%7D%7D%3D%5Cfrac%7Bdy%7D%7Bx_1%7D

dw_2%3D%5Cfrac%7Bdy%7D%7B%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20w_2%7D%7D%3D%5Cfrac%7Bdy%7D%7Bx_2%7D

db%3D%5Cfrac%7Bdy%7D%7B%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20b%7D%7D%3Ddy

在更新参数时,只需要让对应的参数减去所需要更新的值即可。需要注意的是,所求出的dw_1dw_2db仅仅代表参数更新的趋势(这样更新参数可以使得结果向更准确的方向靠近),并不代表实际更新参数的时候,一定要减去这么多的值(有可能会直接减过头)。因此,加入一个超参数:学习率lr,指定一次参数更新所更新的大小。学习率一般为一个很小的值,如0.001,加入学习率之后,参数的更新如下所示:

w_1%20%5Cleftarrow%20w_1-lr%C3%97dw_1

w_2%20%5Cleftarrow%20w_2-lr%C3%97dw_2

b%20%5Cleftarrow%20b-lr%C3%97db

通过上述公式推导,我们便可以写出训练感知机的具体方法:

经过训练之后,感知机的输出结果如下所示:

经过训练之后,感知机能达到一个较高的准确率。图中黄色直线代表训练结束之后感知机中w1x1+w2x2+b=0的位置,黄色直线两端分别代表两种类别,其中绿色点代表分类正确的样本,红色点代表分类错误的样本

编写训练代码如下:

我们便可以得到我们的训练结果:

训练的准确率随轮次的变化图

可以看出,在训练了几轮之后,准确率就已经逼近0.9左右,但随后的轮次中,准确率逐渐回落;因为凭机器很难找到最佳的分类函数,但机器会不断学习,在学习时,就有可能偏移最佳的迭代路线。因此出现各种各样用于优化训练的优化器,如ADAM等;同时,通过引入学习率衰减机制,适当地在准确率较高的情况下衰减学习率,也能够维持住准确率。

线性不可分与核函数

前面说到,感知机最适合解决线性可分的问题。对于线性不可分的问题,感知机解决起来就会十分吃力。比如说,一个钢铁厂,生产了一批铁棍,要求铁棍的长度在一定长度(允许有一定范围的误差)才能过关。但是现在不知道长度是多少,只知道过往的一批记录中铁棍的长度及其合格与否。

铁棍的长度如下所示:

铁棍是否通过如下所示:

我们通过画图可以得知,只会通过铁棍长度为15周边的那一段。

只有15周边的那一段是被通过的,很显然没法用线性函数y=wx+b简单分开。

因此,我们设置一个核函数

%5CPhi%20(x)%3D(x-15)%5E%7B2%7D

通过这个核函数,我们可以使代表铁棍的一维的长度特征变成二维的特征。

通过核函数,将其转换为二维的特征

由图即可看出,将其通过核函数投影至更高维的特征空间后,就存在通过感知机将其正确分类的可能。

从零开始的机器学习笔记(一)第一代神经网络——感知机的评论 (共 条)

分享到微博请遵守国家法律