「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」。
离散单感知机是一个简单的线性函数,用于实现对数据集的二分类。一般对于单感知机,其激活函数会被取为一个符号函数。假设 x 是线性函数的结果, 激活函数则是 x >= 0 ,这样实数域被映射到了 0,1 两类,以用于表明类别。
从几何意义上来看,单感知机相当于是一个超平面,将空间切割成两部分,也就是两类。为了进一步的理解,可以尝试从实例入手。
为了实现二分类,我们需要一个线性可分的数据集,可以选择使用 IRIS 数据集。在 IRIS 数据集中,任意选取两个特征,可以获得一个线性可分数据集。所以这里的单感知机的输入维度为 2 。
接下来我们考虑训练或者说参数调整的过程,由于我们是线性模型,所以只有三个参数 w1 , w2 , b。具体的学习过程是这样的: 当得到的预测值和真实值不一致时,尝试做个调整。
具体的做法是这样:
对于权值向量 , 使用公式 调整。其中 error 为真实值与预测值之间的差值 ,而对于 偏置,则使用 。error 意义同上。
如果把偏置 b 看作是权值向量 w 的一部分(假设特征x中多一列与 b 相乘,其值全为1),可以再考虑下训练过程的原理。
按上述方式,需要调整的仅仅只有一个权值向量 w ,而它相当于是直线的斜率(注意这里已经把偏置同样当作斜率考虑了),当预测值小于真实值时,需要让预测值更大,也就是让 w 更大,做法是让它加上 此时误差一定是大于 0 的。另一种情况同理。
显然,当 的情况下,是容易理解的,比较困惑的是当 的时候, 直觉上会让人以为值被缩小了。可以这样考虑,当调整之后计算结果与原来相比较有 ,显然是正确的方向调整了。同样的,另一种情况同理。
或者换一种解释的角度的话,从某种意义上来说,这里可以看成是梯度下降法的应用。如果把损失函数看作是方差的一半,那么上述的过程可以看作是将参数向负梯度的方向调整,不过学习率之类的体现。
所以从代码上,可以这样实现:
def train_on_one_sampler(i: int):
global w, b
error = target - active(line_function(x))
w += x[i] * error
b += error
这是每次使用一个样本进行训练的过程,如果考虑要进行批量的训练,可以先求和,再使用平均值做调整。
还有一个值得注意的部分是何时收敛。实际上感知机有个相当好的特点是当数据集线性可分时,它一定是绝对收敛的。需要的是一个检测的方式,比如说整体误差为 0 。或者不需要调整的测试为样本的大小。
最后总结一下,感知机的好处是绝对收敛,坏处则是它一般依赖数据的线性可分。