前言
如果你能找到这里,真是我的幸运~这里是蓝白绛的学习笔记,本集合主要针对《百面机器学习——算法工程师带你去面试》这本书。主要记录我认为重要的知识点,希望对大家有帮助。
第七章 优化算法
引导语
机器学习算法=模型表征+模型评估+优化算法。
优化算法就是要在模型表征空间中找到模型评估指标最好的模型。
注:也就是机器学习算法=模型+目标函数+优化算法。
1、有监督学习的损失函数
-
书中介绍的二分类损失函数有:0-1损失、Hinge损失、Logistic损失、交叉熵损失等,如下图。
7-1 二分类问题损失函数.jpg
- 0-1损失函数:即错误率,公式如下:其中为指示函数,当为真时为1,为假时为0。
由于其非凸、非光滑的特点,使得算法很难直接对该函数进行优化。 - Hinge损失函数:公式如下:Hinge损失是0-1损失相对紧的凸上界,且当时,不做任何惩罚。Hinge损失在处不可导,因此不能用梯度下降法进行优化,而是用次梯度下降法(Subgradient Descent Method)。
- Logistic损失函数:公式如下:Logistic损失也是0-1损失的凸上界,该函数处处光滑,因此可以用梯度下降优化,但该损失函数对所有样本点都有惩罚,因此对异常值相对更敏感。
- 交叉熵损失函数(cross entropy):公式如下:交叉熵损失函数也是0-1损失的光滑凸上界。
-
书中介绍的回归问题损失函数有:平方损失函数、绝对损失函数、Huber损失函数。如下图:
7-1 回归问题损失函数.jpg
- 平方损失函数:公式如下:平方损失函数是光滑函数,能用梯度下降优化。但是当预测值与真实值较远时,平方损失函数的惩罚力度越大,因此对异常点敏感。
- 绝对损失函数:公式如下:为了解决平方损失函数对异常点敏感的问题,则有了绝对损失函数。绝对损失函数相当于是在做中值回归,而平方损失函数是做均值回归,所以绝对损失函数对异常点更鲁棒。但是绝对损失函数在处无法求导。
- Huber损失函数:公式如下:
综合考虑了可导性和对异常点的鲁棒性。在较小时为平方损失,在较大时为线性损失,处处可导,且对异常点鲁棒。
2、机器学习中的优化问题
- 凸函数:凸函数的严格定义为:函数是凸函数当且仅当对定义域中的任意两点,和任意实数总有直观解释是,凸函数曲面上任意两点连接而成的线段,线段上任意一点都不会处于该曲线的下方。如下图所示为凸函数。
7-2 凸函数示意图.jpg - 逻辑回归,经过对参数(或为)求二阶导数,可以得到其Hessian矩阵满足半正定的性质,因此函数对应的优化问题是凸优化问题。
- 主成分分析对应的优化问题是非凸优化问题。一般来说,非凸优化问题是比较难求解的问题,但主成分分析是一个特例,可以借助SVD奇异值分解直接得到主成分分析的全局极小值。
- 凸优化问题有:逻辑回归、支持向量机、线性回归等线性模型。
非凸优化问题有:主成分分析、低秩模型(如矩阵分解)、深度神经网络模型等。
3、经典优化算法
- 经典的优化算法可以分为:直接法和迭代法。
- 直接法:能够直接给出优化问题最优解的方法(梯度为0的点)。它不是万能的,它要求目标函数满足两个条件:凸函数和闭式解。
(1) 是凸函数。如果是凸函数,则是最优解的充分必要条件为在处梯度为0,即
(2) 为了能直接求出,上式要有闭式解。
直接法的经典例子是岭回归(Ridge Regression)。 - 迭代法:迭代地修正对最优解的估计。分为一阶法(梯度下降法)和二阶法(牛顿法)。
(1) 一阶法:迭代公式为:一阶法也称梯度下降法,梯度是目标函数的一阶信息。
(2) 二阶法:迭代公式为:二阶法又称牛顿法,Hessian矩阵就是目标函数的二阶信息。
二阶法的收敛速度一般远快于一阶法,但是在高维情况下,Hessian矩阵求逆计算复杂度很大,而且当目标函数非凸时,二阶法有可能会收敛到鞍点。
4、梯度验证
注:这一节讲的是,写出求梯度的代码之后,如何验证自己写的代码是正确的。这里我们平常都用已有的框架,里面求梯度的代码已经写好了,所以没有考虑过这个问题。
- 在用梯度下降法求解优化问题时,最重要的操作就是计算目标函数的梯度。写出计算梯度的代码之后,通常要验证自己写的代码是否正确。
这里公式较多,我只写最后的结论。我们验证下式:其中为一个非常小的增量,为单位向量,其中只有第个分量为1,与对应,为了验证的第个分量。其中的有关于和泰勒展开的拉格朗日余项的差,经过推导我们认为前面的数非常接近0,因此近似用常数代替。
当较小时,每减小为原来的,近似误差约为原来的,即近似误差是的高阶无穷小。
实际应用中,我们随机初始化,取为较小的数(如),对,依次验证是否成立,如果对应某个下标该式不成立,则有以下两种可能:
(1) 该下标对应的过大。
(2) 该梯度分量计算不正确。
可以固定,将减少为原来的,再次计算近似误差,若近似误差约减小为原来的,则对应过大这种情况,可以用更小的再次做梯度验证。否则梯度分量计算不正确。
5、随机梯度下降
- 随机梯度下降法:经典的梯度下降法采用所有训练数据的平均损失来近似目标函数,当数据量很大时,需要很大的计算量,耗费很长时间。为了解决这个问题,随机梯度下降法(Stochastic Gradient Descent,SGD)用单个训练数据的损失来近似平均损失,大大加快了收敛速度。该方法也非常适用于数据源源不断到来的在线更新场景。
- 小批量梯度下降法:为了降低随机梯度的方差,使迭代算法更加稳定,也为了充分利用高度优化的矩阵运算操作,在实际运用中我们用小批量梯度下降法(Mini-Batch Gradient Descent),同时处理小批量的训练数据。其中时远小于数据总量的常数,这样能大大加快训练过程。
小批量梯度下降法使用的注意事项:
- 如何选取参数。不同的应用最优的通常不一样,需要通过调参选取。一般取2的次幂能充分利用矩阵运算操作,如32、64、128、256等。
- 如何挑选个训练数据。为了避免数据的特定顺序给算法收敛带来影响,一般会在每次遍历前对所有数据随机排序,在每次迭代时按顺序挑选个训练数据直至遍历完所有数据。
- 如何选取学习速率。为了加快收敛速率,同时提高求解精度,通常用衰减学习率的方法。最优的学习速率方案也通常需要调参才能得到。
小结
这是本章的第一部分,第一部分讲的内容比较容易理解,并且可能在这之前见过,稍微有些了解。例如常见的损失函数、常见的优化方法、批量梯度下降、随机梯度下降、小批量梯度下降。后面的第二部分讲了随机梯度下降的加速,即一些改进的优化方法,如动量方法、AdaGrad方法、Adam方法,还讲了L1正则化产生稀疏解的原因。第二部分涉及较多的优化技巧,放到下一篇中整理。
结尾
如果您发现我的文章有任何错误,或对我的文章有什么好的建议,请联系我!如果您喜欢我的文章,请点喜欢~*我是蓝白绛,感谢你的阅读!
网友评论