从感知机到 SVM,再到深度学习(二)
2018-04-09 22:35 xinchen1111 阅读(1296) 评论(0) 编辑 收藏 举报 这篇博文承接上一篇,详细推导了 SVM 算法,包括对偶算法,SMO 优化算法,核函数技巧等等,最后还提到用高度非线性的曲线代替超平面,就是神经网络的方法。
在第一篇中已经得到了最优间隔分类器的目标函数:
接下来的任务就是要求解这个目标函数了。为了求解这个,很多优化知识是避不开的,所以如果对 KKT 条件,强对偶等不熟悉的先看下这篇博文吧~
这里因为有 \(||w||\) 做了分母,所以约束条件是非凸函数(可以用定义验证一下)。
这里需要进行一些转化,比如由于超平面 \(wx+b=0\) 可以任意同比例放缩,就限制 ||w|| = 1(在第一篇中解释过,这样做没有问题) 。所以就有:
但是 \(||w|| = 1\) 的表示解的可行域在一个球面上,也是非凸的,所以这样转化不行。其中比较讨厌的是 ||w|| 这个约束,可以把它放到优化条件中,这样通过优化条件的同含义转化有可能能把它转化为凸函数。
这样优化条件表示几何距离,\(\gamma\)原来表示几何距离,现在表示为函数距离了。这里需要注意,我们的目标肯定是几何距离,函数距离能因为系数放缩而变化。而应为函数距离能因为系数放缩而变化,所以可以限制 \(\gamma=1\) 的,得到:
这样因为目标函数不是凸函数,所以还是不是凸规划的。最后目标函数同含义转化一下就行了:
目标函数加上 \(\frac{1}{2}\) 的系数对结果没有影响,但是一会肯定会对 \(w\) 求导多出 2 的系数,所以为了方便把这个系数除掉了。这个是凸函数,因为 \(\frac{1}{2}||w||^2=\sum_{i=1}^{n}w_{i}^2\) 是凸函数(可以验证),约束也是线性的,整个规划就是一个典型的二次规划问题。这个问题直接写出它的 KKT 条件为:
其中 \(n\) 为训练样本个数,这个问题有非常多(每个训练样本都对它有约束)约束条件,很难直接求解。对于这类二次规划问题可以用专门的软件求解,但是由于约束太多,时空复杂度都很大。但是因为这个问题是满足 Slater 条件的(问题是凸规划,而且训练集为线性可分的,就一定存在解满足所有不等式约束)。所以只要解决它的对偶问题就可以了。
如果求解上面的原问题的话和之前的二次规划难度一样。求解对偶问题时先求解:
用求无约束极值的方法,得到方程组:
所以有两个关系式:
先把 \(L(w,b,\mu)\) 化简一下,然后将它们带入进去:
这样之前的问题就变成了极大化这个式子,还要把之前得到的所有关于 \(u\)、\(y\)和\(x\)的约束都加进去,然后取反把问题变成求最小值的问题,问题就变成了:
这个问题其实还是一个二次规划的问题,但是相比之前的那个问题而言约束简单了很多。其中需要优化的变量有 \(\mu_{1},...,\mu_{n}\)这 \(n\) 个。对于这类问题可能会用 解二次规划的方法处理。但是这里因为这两个约束都很简单,所以直接用一般的梯度下降法或者坐标下降法的思路去做。在每一次迭代的时候,得到的所有 \(\mu\) 都必须满足那两个约束条件。而第二个约束说明每次迭代至少要改变两个 \(\mu\) 才有可能满足。梯度下降法每次修改所有 \(n\) 个 \(\mu\),不好控制,而坐标下降法每次修改一个,在这里有不能用。所以最好的方法是每次修改两个 \(\mu\),由于有 \(\sum_{i=1}^{n}u_{i}y_{i}=0\) 的关系,这两个 \(\mu\) 的自由度其实只有 1,也就是说一个可以由另一个表示,所以其实可以用坐标下降法的思路进行优化。步骤就是:
- 随机给出初始的 \(\mu\) 值(给出的需不需要满足那个约束)
- 选择两个要优化的 \(\mu\),比如选择了 \(\mu_{1}\) 和 \(\mu_{2}\) 值
- 由等式约束得到:
因为 \(-\sum_{i=3}^n\mu_iy_i\) 是常数,用 \(\zeta\) 代替,得到:
同样,先将目标函数中的 \(\mu_1\) 和 \(\mu_2\) 提取出来,并化简,然后将它带入进去,得到:
为了方便,将系数用符号代替,\(v_i=\sum_{j=3}^{n}\mu x_ix_j,i=1,2\)。这个式子就变成:
将 \(\mu_1=(-\sum_{i=3}^n\mu_iy_i-\mu_2y_2)y_1\) 带入:
然后需要对这个式子求极大值,直接求偏导为 0 的点就行了:
由于 \(f(x)=wx+b\),将上面得到的 \(w\) 的表达式带入,得到 \(f(x)=\sum_{i=1}^n\mu_iy_ix_ix+b\) ,这个就是点 x 的预测值,它与真实值的误差是 \(E_i=f(x_i)-y_i\) 解出来有:
所以也可以得到 \(\mu_{1}^{new}\)
这样就求出来了新的 \(\mu_{1}\) 和 \(\mu_{2}\),表示为 \(\mu_{1}^{new}\) 和 \(\mu_{2}^{new}\)。
但是这里对于 \(\mu \geq0\) 的约束没有约束进去。对于小于 0 的 \(\mu_{1}\) 和 \(\mu_{2}\) 要裁剪一下:
这个优化算法叫 SMO 算法。
有了 \(\mu^{*}\)之后可带入上面 \(w\) 的表达式从而得到 \(w*\)。\(b*\) 求解比较麻烦,但是现在已知所有的 \(\mu\) 和 \(w\),所以在原问题中可以直接
求解得到最优的 \(b*=-\frac{max_{i:y_i=-1}w*x_i+min_{i:y_i=1}w*x_i}{2}\)
但是这个分类器其实不允许任何一个点分错,这一点通过每个点 \(i\) 的约束 \(y_i(wx_i+b) \geq 1\) 中已经体现出来了。如果数据是线性不可分的,这个最优化问题其实是无解的,也不满足 Slater 条件,也就是说用 SMO 算法求解出来的结果是没有保证的。所以目标函数应该权衡分对的点的个数,和离直线最近的点的距离,从而得到一个最优的直线。那么如何把这个转化为优化问题呢,只要让原来目标函数中的约束宽容一些就行了。
这个表示允许超平面对约束条件有一些不满足,但是这会在目标函数中对它做出惩罚。不满足的约束越多,不满足的程度越大,惩罚就越大。所以超平面权衡全局,尽量满足约束,但是如果不满足约束会在 \(\frac{1}{2}||w||^2\) (最小间隔最大)处得到更大的利益,也会怎么做。
这个优化问题的解法和硬间隔的问题流程几乎一样,唯一的区别就是最后一步解对偶问题时求解的 max 问题是这样的:
在 SMO 中也只是在 \(\mu_{1}^{new}\) 和 \(\mu_{2}^{new}\) 截取的时候有区别:
其中对于 \(\mu_i\) , \(\mu_j\) 的选择可以随机选择,但是其实可以更加精细。选择时需要依次选择 \(\mu_i\) 和 \(\mu_j\)。步骤就是:
- 对于 \(\mu_i\) 可以选择样本点违反 KKT 条件最严重的一个。一个 \(\mu_i\) 代表一个数据点对目标的约束的系数。那么最优的 \(\mu_i\) 满足:
1. \(C \gt \mu_i^* \gt 0 => y_ih_i - 1= 0\)
2. \(\mu_i^* = 0 => y_ih_i - 1 \geq 0\)
3. \(\mu_i^* = C => y_ih_i - 1 \leq 0\)
先尽量选择不满足第 1 条的 \(\mu_i\),因为这个经过裁剪后改动可能会更大,另外的经过裁剪可能还是在边界上。 - 然后在用这个 \(\mu_i\) 查找 \(\mu_j\) ,选择 \(|E_i-E_j|\) 最大的
- 重复 2,直到找不到比较大的 \(|E_i-E_j|\),那么重复 1,2,3。就是要重新选择 \(\mu_i\)。
这个是软间隔的最优间隔分类器。到这里为止,已经把最优间隔分类器的优化问题解决了。但是还记得之前关于 logistic 回归的两个缺点吗,现在已经解决了第二个问题。但是它的分隔面毕竟还是一个超平面,对于类似如下的数据集还是无能为力。
这个的解决办法是用核函数的方法,它的思路是把数据投影到更高维度的空间,那么原本线性不可分的数据就有可能线性可分了。
它作用的对象是点的内积,在
中,由于目标函数中是关于 \(x_{i}\) 和 \(x_{j}\) 的内积,那么就可以把它替换成一个核函数 \(K(x_i,x_j)\)。核函数就是由于这个表达式中有所有关于 \(x\) 的运算只有 \(x_ix_j\),也就是两个数据点做内积。这种情况下把 \(x_i\)
和 \(x_j\) 的维度升高,比如为原本有:\(x=[x_1,x_2,x_3],y=[y_1,y_2,y_3]\)
那么 \(x_1x_2=x_1y_1+x_2y_2+x_3y_3\),那么如果把他们维度升高为 \(x^*=[x_1x_1,x_1x_2,x_1x_3,x_2x_1,x_2x_2,x_2x_3,x_3x_1,x_3x_2,x_3x_3]\) 和
\(y^*=[y_1y_1,y_1y_2,y_1y_3,y_2y_1,y_2y_2,y_2y_3,y_3y_1,y_3y_2,y_3y_3]\) 那么 \(x\) 和 \(y\) 就到了更高的维度,然后做点积就行了。但是这样把 \(x^*\), \(y^*\) 写出来再算比较慢,复杂度是 \(O(n^2)\)。其实 \(x^*y^*\) 就相当于 \((xy)^2\), 这样结果是一样的,复杂度变成了 \(O(n)\)。所以具体操作的时候都会用一个函数代替原来的点积,效果就和升维,然后点积是一样的。这个函数叫做核函数,比如这里的 \((xy)^2\) 就是一个核函数。常用的核函数有:
- 多项式核函数。
- 高斯核函数。它可以把维度升高到无限维。
- 字符串核函数。
那么是不是所有关于 \(x,y\) 的函数都可以做核函数呢。其实核函数必须满足 \(f(x_i,y_j)\) 构成的矩阵是半正定的。这个就是 Mercer 定理。核函数不只适用于 SVM,任何最后形式中有内积的形式的式子都能用核函数代替内积,可能会改善效果。
有了核函数之后,上面关于训练的推导都不用变,只需要将结论中的 \(x_ix_j\) 替换成核函数 \(K(x_i, x_j)\) 就行了。到现在为止都是在讲训练,那么如何用训练好的模型(就是那个 \(f(x) = wx+b\) 的超平面)进行预测?如果是不带核函数的,那么直接判断 wx+b 的正负就行了。如果是带核函数的话,用 \(w = \sum_{i=1}^{n}\mu_iy_ix_i\) 带入,得到: \(\sum_{i=1}^{n}\mu_iy_ix_ix+b\), 然后将内积用核函数替换掉 \(\sum_{i=1}^{n}\mu_iy_iK(x_i,x)+b\),然后判断正负就行了。根据 KKT 条件,其中只有 \(y_i(wx_i+b) - 1 = 0\) 对应的 \(u_i\) 是不为 0 的,其余的都为 0。所以预测的时候只要算离超平面距离是 1 的点就行了,也就是\(\sum_{距离为 1 的点 i}\mu_iy_iK(x_i,x)+b\) 这样就大大提高了预测性能。这些点就是支持向量。
正是因为预测的时候只需要用到少数的几个支持向量,这个算法也叫支持向量机(SVM)。在训练的时候,其实在某一侧加上一些数据点对于最终得到的模型是没有影响的。相对于 logistic 回归它在小数据集上的表现非常好。
支持向量机已经是一个很好的算法了。它解决了上面提到的两个问题。但是也可以从另一个角度出发,我们可以考虑用其它方法解决 logisitic 和感知机只能解决线性可分数据的问题。一个比较自然的想法是将分隔函数从线性函数变成更加复杂的函数,它可以拟合更为复杂的数据集。
为此,可以将多个 logistic 或者 感知机组合起来。比如下图:图中的每一个节点表示一个logistic 回归或者感知机,然后前面一层的输出又作为后面一层的输入。这样其实就代表了一个非常复杂的复合函数,比如有四层,那么这个复合函数就是:
其中 \(f_1\) 和 \(f_2\) 是可以是 sigmod 函数或者感知机的阶跃函数等等非线性函数,所以整个函数 \(g\) 是高度复杂和非线性的。
这个结构叫做神经网络(因为和大脑中的神经结构有点像),中的第一层就叫做输入层,中间的是隐藏层,最后一层叫做输出层。它相当于用对应的高度复杂非线性的函数来拟合训练数据,然后用于预测。理论上已经证明了有一个隐藏层的神经网络就能拟合大部分的曲线了,有两个隐藏层的能拟合所有函数了,包括分段函数。
对于神经网络的损失函数和调优下次再说吧。
参考链接:
如需转载,请注明出处.
出处:http://www.cnblogs.com/xinchen1111/p/8763448.html