\(XOR\)又称为异或,它的逻辑如下:
变量1 变量2 逻辑运算结果0 0 0
0 1 1
1 0 1
1 1 0
这是个比较奇怪的逻辑,变量之间当且仅当不相等时为真。
凭着几何直觉,我们很快就能发现,不可能有这样的超平面,能准确的分开红色和蓝色两类样本。
这里小结一下:
感知机可以解决完全线性可分的问题。
这似乎是一句废话,但是感知机背后强大的思想确衍生出了支持向量机这个传统机器学习的巅峰。而对于线性不可分的样本,可以使用多层神经网络(\(Multi \space Layer \space Network\))或者使用核感知机,事实上两层的感知机就可以解决\(XOR\)问题
4. 感知机是如何工作的?在上面这个略显啰嗦的例子,我们看到了感知机的工作方法。它的算法流程可以概括如下:
选取初始值\(w_0, b_0\)
在训练集中选取一个数据点\((x_i,y_i)\)
检查在这个样本点上,模型是否会错误分类,如果错误分类,则更新\(w_i,b_i\)
回到第2步,直到整个训练集中没有误分类点
从上面的算法,我们至少能读出这么几层意思:
初始值是随机给的,赋值为0是一个简便的做法,但通常设置为一个很小的随机值,后面会详细讨论
每次训练其实只用到一个样本点,即使训练集中有很多数据点亦是如此。这和 \(w_ix_i\)这个表达式的计算方式有关,详见上面的数值例子。
算法的重点在误分类这里,那么如何定义误分类就非常要紧了。
算法是一个迭代的过程,且要满足所有样本点都分类正确才停机。反过来理解,就是感知机算法只能运用于完全线性可分的数据集。如果数据集是不能完全线性可分的,感知机永远不会停机,除非训练之前先设置好停机条件,常见的比如设置训练次数或者误差上界(一旦误差小于$ \varepsilon $ 即可停机)。
显然,如何定义错误是感知机算法里的头等大事。
5. 该如何定义错误?通俗定义:映射函数\(sign(wx + b)\)求解得到的值和原始标签值异号,即表示分类错误。
根据这个表述,我们可以很容易地将数据集分类:正确分类和错误分类。显然我们要做的事就是想办法让模型把分错的样本点分对,同时对于原本已经分对的点不能又分错了。
如果采用几何作图的方法,可以不断调整超平面(即上面提到的直线,术语上通称为超平面)来达到目标,只要给定的数据集是完全线性可分的。但是,如果是高维空间的数据集,几何直觉就不灵了,这时需要引入代数工具。而引入损失函数就是这样的工具,它和我们依靠几何直觉做的事情是相同的:把所有点分对 \(\iff\) 将损失函数降到最小。
损失函数的定义可以凭直觉而为:计算误分类样本的个数。例如样本空间共有\(M\)个样本,其中错误分类的样本属于区域\(E\),显然损失函数就是 \(\sum\limits_{i\in E}x_i\) 。但问题随之而来,我们没有工具来优化这个函数,使之向最小值运动。于是自然地想到,计算所有误分类点到超平面的距离,对距离之和做优化。具体的思路是这样的:
找到描述样本点到超平面距离的计算式
正确分类的样本点的距离和丢弃不看
定义误分类的距离和,对它求最小值
在\(R^n\)空间中,任何一个样本点\(x_0\)到超平面的距离公式 \(\frac{1}{||w||}|w\cdot x + b|\)。对于误分类来说,\(y_i(w \cdot x + b) < 0\),于是如果有一个误分类点\(x_0\),那么它到超平面的距离可以写作 \(-y_i\frac{1}{||w||}|w\cdot x + b|\)。对于所有的误分类来说,自然可以写出下面的损失函数:\[L(w,b) = -\sum\limits_{i\in E} y_i \frac{1}{||w||}|w\cdot x + b|\]。这里添加负号的目的是使得损失函数的值恒为正数,这样对它求最小值可以使用凸优化工具。显然地,误分类样本点越少,\(L(w,b)\)越小;误分类点离超平面的距离越小,\(L(w,b)\)越小。