机器学习的目标是给出一个模型(一般是映射函数),然后定义对这个模型好坏的评价函数(目标函数),求解目标函数的极大值或者极小值,以确定模型的参数,从而得到我们想要的模型。
在这三个关键步骤(定义模型,目标函数,求解极值)中,前两个是机器学习要研究的问题,建立数学模型。第三个问题是纯数学问题,即最优化方法。
1.有监督学习:目标函数的极值
对于有监督学习,我们要找到一个最佳的映射函数f(x),使得对训练样本的损失函数最小化。
N为训练样本数,L是对单个样本的损失函数,w是要求解的模型参数,是映射函数的参数, 为样本的特征向量, 为样本的标签值。
2.有监督学习:最大似然估计
或是找到一个最优的概率密度函数p(x),使得对训练样本的对数似然函数极大化(最大似然估计):
是要求解的模型参数,是概率密度函数的参数。
3.无监督学习
以聚类算法为例,算法求解每个类的样本离类中心的距离之和最小化:
在这里k为类型数,x为样本向量, 为类中心向量, 为第i个类的样本集合。
4.强化学习
找到一个最优的策略,即状态s到动作a的映射函数(确定性策略,对于非确定性策略,是执行每个动作的概率):
使得任意给定一个状态,执行这个策略函数所确定的动作a之后,得到的累计回报最大化:
这里使用的是状态价值函数。
好的优化算法需要满足:能正确的找到各种情况下的极值点,并且速度快。优化算法分成两种类型:公式解,数值优化。前者给出一个最优化问题精确的公式解,也称为解析解,一般是理论结果。后者是在要给出极值点的精确计算公式非常困难的情况下,用数值计算方法近似求解得到最优点。
下图给出了这些算法的分类与它们之间的关系:
费马定理
对于一个可导函数,寻找其极值的统一做法是寻找导数为0的点,即费马定理。
对于多元函数,则是梯度为0:
导数为0只是函数取得极值的必要条件而不是充分条件,它只是疑似极值点。是不是极值,是极大值还是极小值,还需要看更高阶导数。
对于一元函数,假设x是驻点:
1.如果 (x)>0,则在该点处去极小值
2.如果 (x)<0,则在该点处去极大值
3.如果 (x)=0,还要看更高阶导数
对于多元函数,假设x是驻点:
1.如果Hessian矩阵所有特征值均大于0,矩阵正定,函数在该点有极小值
2.如果Hessian矩阵所有特征值均小于0,矩阵负定,函数在该点有极大值
3.如果Hessian矩阵所有特征值均等于0,矩阵不定,则不是极值点
注意:
1.鞍点:在导数为0的点,函数可能不取极值
2.局部极值:一个驻点是极值点,但不是全局极值
如果我们对最优化问题加以限定,可以有效的避免这两种问题。典型的是凸优化,它要求优化变量的可行域是凸集,目标函数是凸函数。
拉格朗日乘数法
对于带等式约束的极值问题,经典的解决方案是拉格朗日乘数法。
构造拉格朗日乘子函数:
在最优点处对x和乘子变量 的导数都必须为0:
机器学习中用到拉格朗日乘数法的地方有:主成分分析、线性判别分析、流形学习中的拉普拉斯特征映射、隐马尔可夫模型。
KKT条件
KKT条件是拉格朗日乘数法的推广,用于求解既带有等式约束,又带有不等式约束的函数极值。对于如下优化问题:
KKT条件构如下乘子函数:
和 称为KKT乘子。在最优解处 应该满足如下条件:
等式约束 ( )=0和不等式约束 ( ) 0是本身应该满足的约束, L( )=0和之前的拉格朗日乘数法一样。唯一多了关于 (x)的条件:
在机器学习中用到KKT条件的地方有:支持向量机(SVM)。
对绝大多数函数来说,梯度等于0的方程组是没法直接解出来的,如方程里面含有指数函数、对数函数之类的超越函数,我们只能求解近似解。如果采用目标函数的一阶导数,则称为一阶优化算法。如果使用了目标函数的二阶导数,则称为二阶优化算法。
工程上实现时通常采用的是迭代法,它从一个初始点 开始,反复使用某种规则从 移动到下一个点 ,构造这样一个数列,直到收敛到梯度为0的点处。即有下面的极限成立:
利用一阶导数信息即梯度,或者二阶导数信息即Hessian矩阵。这样迭代法的核心是得到这样的由上一个点确定下一个点的迭代公式:
梯度下降法(又称为最速下降法)
梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。利用了函数的一阶导数信息:
学习率 设置为一个非常小的正数,保证迭代之后的 位于迭代之前的值 的邻域内,从而可以忽略泰勒展开中的高次项,保证迭代时函数值下降。
缺点:梯度下降法的收敛取决于设置的学习率的大小,太小则收敛慢,太大则不收敛。
梯度下降法及其变种的应用:深度学习。
动量项
优点:加快梯度下降法的收敛速度,减少震荡。
动量项累积了之前迭代时的梯度值,迭代时沿着之前的惯性方向向前走,加上此项之后的参数更新公式为:
其中 是动量项,它取代了之前的梯度项。动量项的计算公式为:
其中 是学习率, 是动量项系数,t时刻的动量项与t+1时刻的梯度值的加权平均值。按照时间t进行展开,则第t次迭代时使用了从1到t次迭代时的所有梯度值, 系数呈指数级衰减:
AdaGrad算法
AdaGrad算法是梯度下降法最直接的改进。
AdaGrad算法根据前几轮迭代时的历史梯度值动态调整学习率,且优化变量向量x的每一个分量 都有自己的学习率。参数更新公式为:
是学习率, 是第t次迭代时参数的梯度向量, 是一个很小的正数,为了避免除0操作,下标i表示向量的分量。
和标准梯度下降法唯一不同的是多了分母中的这一项,它累积了到本次迭代为止梯度的历史值信息用于生成梯度下降的系数值。历史导数值的绝对值越大,分量学习率越小。
优点:自动变更学习率,(学习率)与(以往参数模和的开方)成反比
缺点:需要人工指定的全局学习率 ,长期累积梯度值,分母会越来越大,导致学习率趋向于0,参数无法有效更新。
RMSProp算法
RMSProp算法是对AdaGrad的改进。
由梯度值构造一个向量RMS,初始化为0,按照衰减系数累积了历史的梯度平方值。更新公式为:
AdaGrad直接累加所有历史梯度的平方和,而这里将历史梯度平方值按照 衰减之后再累加。参数更新公式为:
其中 是人工设定的参数,与AdaGrad一样,这里也需要人工指定的全局学习率 。
优点:缓解学习率下降较快(AdaGrad)
缺点:需要人工指定的全局学习率
AdaDelta算法
AdaDelta算法也是对AdaGrad的改进,避免了长期累积梯度值所导致的学习率趋向于0的问题,另外,还去掉了对人工设置的全局学习率的依赖。
假设要优化的参数为x,梯度下降法第t次迭代时计算出来的参数梯度值为 。算法首先初始化如下两个向量为0向量:
其中E[ ]是梯度平方(对每个分量分别平分)的累计值,更新公式为:
是向量每个元素分别计算平方,后面所有的计算公式都是对向量的每个分量进行。接下来计算如下RMS量:
计算参数的更新值:
RMS 的计算公式和这个类似。这个更新值同样通过梯度来构造,只不过学习率是通过梯度的历史值确定的。更新公式为:
参数更新的迭代公式为:
优点:避免了长期累积梯度值所导致的学习率趋向于0的问题,去掉了人工设置的全局学习率的依赖。
Adam算法
Adam算法整合了自适应学习率v(累积了梯度的平方和)与动量项m。它们的初始值为0,更新公式为:
其中 , 是人工指定的参数,i为向量的分量下标。依靠这两个值构造参数的更新值,参数的更新公式为:
优点:利用一阶矩估计和二阶矩估计来动态调整每个参数的学习率,偏置校正后,学习率的迭代有范围,较为平稳。
随机梯度下降法、批量梯度下降
基于梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。
为了降低计算成本,批量随机梯度下降法在每次迭代中使用随机逼近值,即只使用M个随机选择的样本来近似计算损失函数。在每次迭代时要优化的目标函数为:
L(w, , )是对单个训练样本( , )的损失函数,w是需要学习的参数,r(w)是正则化项, 是正则化项的权重。
随机梯度下降法在概率意义下收敛。
牛顿法
牛顿法利用了函数的一阶和二阶导数信息,直接寻找梯度为0的点。牛顿法的迭代公式为:
其中H为Hessian矩阵,g为梯度向量。学习率 设置为一个非常小的正数,通常采用直线搜索(line search)技术,保证迭代之后的 位于迭代之前的值 的邻域内,从而可以忽略泰勒展开中的高次项,保证迭代时函数值下降。
在实现时,一般不直接求Hessian矩阵的逆矩阵,而是求解下面的线性方程组:
其解d称为牛顿方向。迭代终止的判定依据是梯度值充分接近于0,或者达到最大指定迭代次数。
应用:logistic回归,AdaBoost算法
优点:比梯度下降法有更快的收敛速度,收敛速度快,迭代次数少
缺点:不能保证每次迭代时函数值下降;也不能保证收敛到极小值点;靠近极小值时收敛速度减慢,可能会“之字形”地下降;需要设置学习率(line search);Hessian矩阵很稠密时,每次迭代计算Hessian矩阵的计算量很大,随着数据规模增大,Hessian矩阵也会变大,需要更多的存储空间以及计算量;Hessian矩阵不可逆则该方法失效。
拟牛顿法
构造一个近似Hessian矩阵或其逆矩阵的正定对称矩阵,用该矩阵进行牛顿法的迭代。
引入了Hessian矩阵的近似矩阵,避免了每次都计算Hessian矩阵的逆,在拟牛顿法中搜索,用Hessian矩阵的逆矩阵来代替Hessian矩阵,虽然不能像牛顿法那样保证最优化的方向,但其逆矩阵始终是正定的,因此算法始终朝最优化的方向。
优点:构造近似Hessian矩阵逆的矩阵
可信域牛顿法
调整牛顿方向的步长来实现收敛到最优解和序列递减,目前常用的方法有两种:直线搜索和可信区域法。可信域牛顿法是截断牛顿法的一个变种,用于求解带界限约束的最优化问题。在可信域牛顿法的每一步迭代中,有一个迭代序列 ,一个可信域的大小 ,以及一个二次目标函数:
这个式子可以通过泰勒展开得到,忽略二次以上的项,这是对函数下降值的近似:
算法寻找一个 ,在满足约束条件丨丨s丨丨 下近似最小化 (s)。接下来检查比值以更新 和 :
和 是函数值的实际减少量和二次近似模型预测方向导致的函数减少量的比值。根据之前的计算结果,再动态调整可信域的大小。
应用:logistic回归,线性支持向量的求解(liblinear开源库)。
分治法是一种算法设计思想,它将一个大的问题分解成子问题进行求解。根据子问题解构造出整个问题的解。在最优化方法中,具体做法是每次迭代时只调整优化向量x的一部分分量,其他的分量固定住不动。
坐标下降法
坐标下降法的基本思想是每次对一个变量进行优化,这是一种分治法。假设要求解的优化问题为:
坐标下降法求解流程为每次选择一个分量 进行优化,将其他分量固定住不动,这样将一个多元函数的极值问题转换为一元函数的极值问题。如果要求解的问题规模很大,这种做法能有效的加快速度。
应用:logistic回归,线性支持向量的求解(liblinear开源库)。
SMO算法
SMO算法也是一种分治法,用于求解支持向量机的对偶问题。加上松弛变量和核函数后的对偶问题为:
SMO算法的核心思想是每次在优化变量中挑出两个分量 和 进行优化,让其他分量固定即当成常数,这样能保证满足等式约束条件。之所以要选择两个变量进行优化而不是选择一个变量,是因为这里有等式约束,如果只调整一个变量的值,将会破坏等式约束。
分阶段优化
分阶段优化的做法是在每次迭代时,先固定住优化变量x一部分分量a不动,对另外一部分变量b进行优化;然后再固定住b不动,对b进行优化。如此反复,直至收敛到最优解处。
AdaBoost算法是这种方法的典型代表。AdaBoost算法在训练时采用了指数损失函数:
由于强分类器是多个弱分类器f的加权和,代入上面的损失函数中,得到算法训练时要优化的目标函数为:
指数损失函数包含已有的强分类器 和当前弱分类器f对训练样本的损失函数。把强分类器看作常数,目标函数简化为:
分两步求解,首先将弱分类器权重 看成常数,得到最优的弱分类器f。得到弱分类器之后,再优化它的权重系数 。
动态规划算法
将一个问题分解成子问题求解,如果整个问题的某个解是最优的,则这个解的任意一部分也是子问题的最优解。这样通过求解子问题,得到最优解,逐步扩展,最后得到整个问题的最优解。
应用:隐马尔可夫模型的解码算法(维特比算法),强化学习中的动态规划算法。