1. 优化目标
在监督学习中, 很多监督学习算法的性能都非常相似, 所以经常要考虑的东西, 不是选择算法, 而是更多的去考虑, 你构建这些算法时所使用的数据量, 这就体现了你使用这些算法的技巧.
特征选择
正则化参数的选择
..
支持向量机 (SVM), 更清晰更强大的算法.
优化目标:
从 logistic 回归开始, 看看如何作一些小小的改动来得到一个支持向量机.
考虑单独一项对 logistic 回归总体代价函数的贡献:
画一条直线, 它和 logistic 代价函数的曲线非常相似, 两端直线组成. 它的效果将和 logistic 回归非常相似, 但是支持向量机将拥有计算上的优势, 并且使得之后的优化问题变得简单, 更容易解决.
有了定义以后, 构建支持向量机:
和 logistic 回归控制权衡的方式不同, 在 A 前面加上系数 C, 这是一种不同的参数设置方法, 来决定我们是更关心第一项的优化还是第二项的优化
和 logistic 回归不同的是, SVM 并不会输出概率, 相对的我们得到的是通过优化这个代价函数, 得到一个参数θ, 支持向量机所做的是进行了一个直接的预测, 预测 y = 0/1. 这就是支持向量机的假设函数形式:
2. 直观上对大间隔的理解
支持向量机: 大间距分类器, 如何通过直观的图像理解 SVM 假设?
性质: 如果你有一个正样本, 比如 y = 1, 我们只需要使θ的转置乘以 x 大于等于 0 就能正确的进行分类. 如果你有一个负样本, 比如 y = 0, 我们只需要使θ的转置乘以 x 小于 0 就能正确的进行分类. 但是支持向量机不是恰好能正确分类就行了, 我们需要的是比 0/1 大很多. 这就相当于在 SVM 中构建了一个安全因子, 一个安全间距. 在支持向量机中, 这个因子会产生什么影响?
当然, 逻辑回归做了类似的事情. 但是让我们看一下, 在支持向量机中, 这个因子会导致什么结果. 具体而言, 我接下来会考虑一个特例. 我们将这个常数 C 设置成一个非常大的值. 比如我们假设 C 的值为 100000 或者其它非常大的数, 然后来观察支持向量机会给出什么结果?
因此你会得到一个很有趣的决策边界:
黑线看起来是更稳健的决策边界, 能更好的分开正样本和负样本. 从数学上说, 黑色直线拥有更大的距离, 这个距离叫做间距, 它和训练样本的最小距离要更大一些.
支持向量机的间距, 这使得支持向量机具有鲁棒性. 因为它在分离数据时, 会尽量用大的间距去分离, 因此有时被称为大间距分类器.
为什么这个优化问题能得到这个大间距分类器?
此外, 当你使用大间距分类器的时候, 这时你的学习算法对异常点会很敏感. 黑线变成粉红线, 这是 C 非常大的情况. 如果 c 不是非常大, 那么会变回黑线 (忽略异常点).
3. 大间隔分类器的数学原理
支持向量机的优化问题和大间距分类器之间的联系?
用向量内积的形式尝试理解支持向量机的优化目标函数.
对优化目标函数来说, 支持向量机做的就是最小化参数向量θ的范数的平法, 或者说是长度的平方.
数向量θ事实上是与决策边界 90 度正交的, 令θ = 0, 那么决策边界必须过原点.
支持向量机优化目标函数最终会找到大间距分类器: 试图最大化这些 p^(i) 的范数, 也就是训练样本到决策边界的距离.
4. 核函数
改造向量机算法来构建复杂的非线性分类器, 主要的技巧就是被称为 "核" 的东西. 核函数是什么以及如何使用它?
回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题:
对于计算机视觉, 输入是一个由大量像素组成的图像, 我们也见到了高阶的多项式, 运算量将是非常大的, 因为有很多高阶多项式, 我们是否有不同的或者是更好的特征的选择, 我们可以用来嵌入到假设函数中, 有一个可以构造新特征 f1,f2,f3 的方法:
引入相似度度量 similarity, 相似度函数 similarity 就是一个核函数 (高斯核函数).
k(x, l(i))
核函数到底做了什么?
给定一个训练样本 x, 我们可以计算三个新的特征 f1,f2,f3(基于之前给的三个标记).
衡量的是特征变量的值减小的速度.
上图就是我们如何定义标记点和核函数来训练出非常复杂的非线性决策边界的方法. 我们是如何使用核函数的呢? 我们通过标记点和相似性函数来定义新的特征变量, 从而训练复杂的非线性边界.
5. 核函数 2
如何在实际中应用这些思想? 例如, 如何处理支持向量机中的偏差方差折中?
如何选择标记点? 在一些复杂的数学问题中, 也许我们需要更多的标记点?
我们拥有的每一个样本点, 只需要直接使用它们, 直接将训练样本作为标记点. 即每一个标记点的位置都与每一个样本点的位置相对应. 这说明特征函数基本上实在描述每一个样本距离与样本集中其他样本的距离.
给定核函数和相似度函数后, 我们如何使用更简单的支持向量机?
通过解决最小化问题, 就得到了支持向量机的参数. 这就是支持向量机的学习算法.
大多数支持向量机在实现的时候, 其实是替换掉θTθ, 用θT 乘以某个矩阵 M, 这依赖于你采用的核函数, 再乘以θ^T. 这其实是另一种略有区别的距离度量方法, 我们用一种略有变化的度量来取代θ的模的平方, 这意味着我们最小化了一种类似的度量. 这是参数向量θ的缩放版本并取决于核函数. 这个数学细节, 使得支持向量机能够更有效率的运行. 为什么支持向量机做这种修改, 这可以使它应用更大的数量集. 这个具体的实现细节, 尽管略微改变了优化目标, 但它主要是为了计算效率.
核函数不太好应用到线性回归和逻辑回归上, 但是可以和支持向量机相得益彰.
你不需要知道怎么去写一个软件来最小化代价函数, 因为你可以找到很好的软件做这些, 而应该使用人们开发的成熟的软件包. 这些软件包已经包含了那些数值优化技巧.
另外一个问题, 当你选择使用支持向量机时, 怎么选择支持向量机中的参数?
偏差方差折中
大 C: 过拟合
小 C: 欠拟合
大σ: 更平滑, 高偏差低方差
大σ: 不平滑, 低偏差高方差
6. 使用 SVM
为了运行或者运用 SVM, 你实际上所需要的一些东西?
特别优化问题, 不要自己写代码求解参数θ... 只需要调用相关库函数实现相应功能.
你需要:
1. 参数 C 的选择
2. 选择内核函数或你想要使用的相似函数 (没有核函数, 即线性核函数, 标准的线性分类器)
为什么会选择使用线性核函数?
如果你有大量的特征, n 很大, 且 m 即训练的样本数很小, 那么你有大量的特征, 却只有很少的训练数集, 那么你只想拟合一个线性的判定边界, 而不去拟合一个非常复杂的非线性函数, 因为没有足够的数据, 你可能会过度拟合. 例如, 在一个非常高维的特征空间中尝试拟合非常复杂的函数, 但是如果你的训练集样本很小的话, 这将变成一个合理的设置.
3. 如果选择高斯函数, 选择参数σ^2
什么时候选择高斯函数?
如果你忽略了特征值 x 输入 R^n, 如果 n 值很小, 理想情况下, 如果 m 值很大, 那么如果我们有, 比如一个二维的训练集, 那么 n = 2, 但是有很多的训练数据, 然后你想用核函数去拟合相当复杂非线性决策边界, 高斯核函数是一个不错的选择.
但是如果你决定使用高斯核函数, 接下来就是需要根据使用的支持向量机软件包, 需要你实现一个核函数或者实现相似函数, 因此如果你用 Octave 或者 matlab 来实现支持向量机的话, 就需要你提供一个函数来计算核函数的特征值. 因此对应一个 i, 需要计算 fi, 你需要做的是写一个核函数, 让它把向量 x 作为输入, 把输入作为一种标识, 即将 x1,x2 作为输入的软件, 并用它们来计算这个相似函数, 之后返回一个实数.
因此很多 SVM 包需要用户提供一个核函数, 能够实现 x1,x2, 并返回一个实数, 从这里开始, 它将自动地生成所有特征变量. 自动利用特征向量 x 并且映射到 f1,f2... 一直到 fm, 并且生成所有特征变量, 并从这开始训练支持向量机. 但是有些时候你要自己提供这个函数, 如果你使用高斯核函数, 一些 SVM 的函数实现也会包括高斯核函数以及其他的核函数. 到目前为止, 高斯核函数和线性核函数是最为常用的核函数. 一个实现函数的注意事项, 如果你有大小很不一样的特征变量, 很重要的一件事就是在使用高斯函数之前, 将这些特征变量的大小按比例归一化, 就需要进一步的缩放比例, 这将会保证 SVM 能考虑到所有不同的特征向量, 而不只是像例子中这样, 房子的大小影响特别大.
警告: 不是所有你可能提出来的相似函数都是有效的核函数, 高斯核函数, 线性核函数以及你有时可能会用到的核函数, 这些函数都需要满足一个技术条件, 它叫做默塞尔定理. 需要满足这个条件的原因是因为支持向量机算法或者 SVM 的实现函数有许多熟练地数值优化技巧. 为了有效的求解参数θ, 在最初的设想里, 这些决策都将我们的注意力仅仅限制在可以满足默塞尔定理的核函数上. 这个定理所做的是确保所有的 SVM 包, 所有的 SVM 软件包能够用大类的优化方法, 从而迅速得到参数θ. 大多数人最后要做的是用线性核函数或者高斯函数, 但是也有满足默塞尔定理的其他核函数, 我个人很少使用.
多项式核函数 (常数和指数)
有字符串核函数
卡方核函数
直方相交核函数
...
最后两个细节:
1. 在多类分类中, 很多 SVM 包中已经内置了多分类的函数, 因此, 如果你使用一个类似于这样的一个模式, 你只是用了这样的函数, 且应该会做的比较好.
除此之外, 一个多分类的问题, 可以使用 one-vs-all 方法, 我们之前在讲逻辑回归的时候讨论过, 所以你要做的是训练 KSVM, 如果你有 k 个类别, 用以将每个类别从其他类别中区分开来. 它会给你 k 参数的向量,θ1, 它会尝试从所有类别中, 识别出 y = 1 的类别, 之后θ2, 识别出 y = 2 作为正类别, 参数向量θ(k) 是用于识别最后一个类别参数向量. 与逻辑回归中一对多的方法类似, 在逻辑回归中, 我们是用最大的θTx 来预测类别 i.
多分类的范式: 对大多数情况来说, 无论使用, 在软件包内部已经有实现好的内置多分类函数, 不用担心.
2. 我们从逻辑回归开始创造了 SVM, 然后更改了一下代价函数, 当你要使用两者之一的算法时, 比如 n 代表特征的数量, m 是训练样本的数量. 如何选择两者中的一个呢?
当 n 的值比训练样本个数多, 有大量的特征远大于 m. 那么就选择逻辑回归或者不带核函数的 SVM, 因为如果你有比较多的特征变量, 而只有相对较小的训练集, 线性函数可能会工作的很好, 而且你也没有足够的数据来拟合非常复杂的非线性函数.
如果 n 很少, 而 m 大小适中, 这里的 n 可能是 1-1000 之间的任何数, 那么线性核函数的 SVM 会工作得很好.
n 很小, m 很大, 现在的带有高斯函数 SVM 包, 高斯函数的 SVM 运算速度会很慢, 我通常会做的是手动地创建, 拥有更多的特征变量, 然后用逻辑回归或者不带核函数的支持向量机.
逻辑回归为什么和支持向量机放到一起?
因为逻辑回归和不带核函数的支持向量机, 它们是非常相似的算法, 都会做相似的事情, 并给出相似的结果. 但是根据实际情况, 其中一个可能会比另一个更加有效. 但是随着 SVM 复杂度的增加, 当你使用不同的内核函数来学习复杂的非线性函数时, 你特征变量的数量是相当大的, 那是一个非常常见的体系, 也许在这个体系里, 带有核函数的支持向量机就会表现的相当突出.
什么时候使用神经网络?
对所有的这些问题, 对于不同的设计, 设计良好的神经网络, 可能会非常有效, 有一个缺点或者说有时可能不会使用神经网络的原因, 对于许多这样的问题, 神经网络训练起来可能会特别慢, 但是如果你有一个非常好的 SVM 实现包, 可能会运行的很快, 比神经网络快很多. SVM 具有的问题是一种凸优化问题, 好的 SVM 软件包总是会找到全局最小值或者接近它的值. 对于 SVM, 你不需要担心局部最优, 而在神经网络中, 局部最优是一个不大不小的问题. 所以这是你在使用 SVM 的时候不需要太去担心的一个问题. 根据你的问题, 神经网络可能会比 SVM 慢.
迷茫! 该用什么算法??? 这个没有太大关系, 当我遇到机器学习问题的时候, 有时它确实不清楚这是否是最好的算法, 但是就如在之前视频中看到的算法确实很重要, 但是更加重要的是你有多少数据, 你有多熟练, 是否擅长做误差分析和排除学习算法, 指出如何设定新的特征变量, 弄明白你的学习算法输入哪些特征, 通常这些方面会比你使用逻辑回归还是 SVM 这方面更加重要.
SVM 仍然被广泛认为是最强大的学习算法之一. 这是一个体系, 包含了一个有效的方法去学习复杂的非线性函数. 实际上, 逻辑回归, 神经网络与 SVM 一起使用来提高学习算法, 创造最新的机器学习系统作为一个非常强大的算法工具, 可以应用到很多地方.
高性能的机器学习系统!
来源: http://www.jianshu.com/p/a1c5a328bd69