1.3 机器学习方法三要素
机器学习方法都是由模型、策略和算法三要素构成的,可以简单表示为
机器学习方法=模型+策略+算法
下面进行详细的讲解。
1.3.1 模型
先举个例子来形象地认识一下模型。
假设我们现在要帮助银行建立一个模型用来判别是否可以给某个用户办理信用卡,我们可以获得用户的性别、年龄、学历、工作年限和负债情况等基本信息,如表1-2所示。
表1-2 用户信用模型数据
如果将用户的各个特征属性数值化(比如性别的男女分别用1和2来代替,学历特征高中、本科、硕士、博士分别用1,2,3,4来代替),然后将每个用户看作一个向量xi,其中i=1,2,…,M,向量xi的维度就是第i个用户的性别、年龄、学历、工作年限和负债情况等特征,即,那么一种简单的判别方法就是对用户的各个维度特征求一个加权和,并且为每一个特征维度赋予一个权重wj,当这个加权和超过某一个门限值(threshold)时就判定可以给该用户办理信用卡,低于门限值就拒绝办理,如下:
● 如果,则准予办理信用卡。
● 如果,则拒绝办理信用卡。
进一步,我们将“是”和“否”分别用“+1”和“-1”表示,即
上式刚好可以用一个符号函数来表示,即
符号函数的图像如图1-13所示。
图1-13 符号函数的图像
f(xi)就是我们对上述用户信用卡额度问题建立的一个模型,有了该模型后,每当有一个新的用户来办理信用卡时,我们就可以将其填写的基本信息输入该模型中自动判别是否同意给其办理。
但别高兴得太早,因为其实还有一个问题没有解决:上面模型中有一些未知参数wj,如果不知道这些参数的值,我们是无法计算出一个新用户对应的值的。
所以下一步我们的目标就是想办法求解这些未知参数wj,j=1,2,…,N的值,我们采取的方法就是通过训练集(即一批我们已经知道结果的用户数据)将其学习出来。至于为什么可以由训练集数据学习出来wj,以及如何学习wj,就是下面要讲的策略问题。
1.3.2 策略
训练集指的是一批已经知道结果的数据,它具有和预测集相同的特征,只不过它比预测集多了一个已知的结果项。还是以上面的例子为例,它对应的训练集可能如表1-3所示。
表1-3 用户信用模型数据(训练集)
要由给定结果的训练集中学习出模型的未知参数wj,j=1,2,…,N,我们采取的策略是为模型定义一个“损失函数”(Loss Function)(也称作“风险函数”),该损失函数可用来描述每一次预测结果与真实结果之间的差异,下面先介绍损失函数的基本概念,以及机器学习中常用的一些损失函数。
(1)0-1损失函数
0-1损失函数在朴素贝叶斯模型的推导中会用到。
(2)绝对损失函数
L(Y,f(X))=|Y−f(X)|
(3)平方损失函数
L(Y,f(X))=(Y−f(X))2
平方损失函数一般用于回归问题中。
(4)指数损失函数
L(Y,f(X))=e−Yf(X)
指数损失函数在AdaBoost模型的推导中会用到。
(5)Hinge损失函数
L(Y,f(X))=max(0 ,1−Yf(X))
Hinge损失函数是SVM模型的基础。
(6)对数损失函数
L(Y,P(Y|X))=−log P(Y|X)
对数损失函数在Logistic回归模型的推导中会用到。
对于上面的例子,我们可以采用平方损失函数,即对于训练集中的每一个用户xi,我们可以由上面建立的模型对其结果产生一个预测值f(xi)=(yi−f(xi))2,那么对于训练集中所有M个用户,我们得到模型的总体损失函数为
上面式子中的w指的就是模型中的权重参数向量,b就是设置的门限值。得到上面关于模型未知参数的损失函数表达式后,很明显,我们的目标就是希望这个损失函数能够最小化。因为损失函数越小,意味着各个预测值与对应真实值之间越接近,所以,求解模型未知参数的问题其实就转化为求解公式:
1.3.3 算法
通过定义损失函数并采用最小化损失函数策略,我们成功地将上面的问题转化为一个最优化问题,接下来我们的目标就是求解该最优化问题。
注意:有些初学者可能会把“机器学习”称为“机器学习算法”,实际上,这是不大妥当的。机器学习理论上来说还是偏模型一些,算法只是模型中用来求解优化问题的。所以准确来说,这里的“算法”其实指的是求解最优化问题的算法。
求解该问题的优化算法很多,最常用的就是梯度下降法。下面介绍优化问题中几种典型的求解算法,这个问题在面试过程中经常会被问到。
1.梯度下降法
(1)引入
前面讲解数值计算的时候提到过,计算机在运用迭代法做数值计算(比如求解某个方程组的解)时,只要误差能够收敛,计算机经过一定次数的迭代后是可以给出一个跟真实解很接近的结果的。进一步考虑:目标函数按照哪个方向迭代求解时误差的收敛速度会最快呢?答案就是沿梯度方向,这就引入了我们的梯度下降法。
(2)梯度下降法原理
在多元微分学中,梯度就是函数的导数方向。梯度法是求解无约束多元函数极值最早的数值方法,很多机器学习的常用算法都是以它作为算法框架进行改进的,从而导出更为复杂的优化方法。
在求解目标函数L(w,b)的最小值时,为求得目标函数的一个凸函数,在最优化方法中被表示为
min L(w,b)
根据导数的定义,函数 L(w,b)的导函数就是目标函数在变量w和b上的变化率。在多元的情况下,目标函数L(w,b)在某点的梯度 是一个由各个分量的偏导数构成的向量,负梯度方向是L(w,b)减小最快的方向。
二维情况下函数f(x)的梯度如图1-14所示(为了方便,下面推导过程均假设是在二维情况下)。
图1-14 函数f(x)的梯度
如图1-14所示,当需要求f(x)的最小值时,我们就可以先任意选取一个函数的初始点x0,让其沿着途中红色箭头(负梯度方向)走,依次到x1,x2,…,xn,这样即可最快到达极小值点。
(3)梯度下降法的推导
先将f(x)在x=xk处进行一阶泰勒展开,即
f(x)≈f(xk)+∇f(xk)(x−xk)
再取x=xk+1,得:
f(xk+1)≈f(xk)+∇f(xk)(xk+1−xk)
整理得:
f(xk+1)−f(xk)≈∇f(xk)(xk+1−xk)
又因为要使f(x)下降,使得f(xk+1)≤f(xk)恒成立;结合上式即等价于要使f'(xk)(xk+1−xk)≤0恒成立。
显然,当我们取
xk+1−xk=−λ∇f(xk)
即
xk+1=xk−λ∙∇f(xk)
时,上面的等式是恒成立的。
(4)梯度下降法过程
输入:目标函数f(x),每一次的迭代步长为λ,计算精度为ε。
输出: f(x)的极小值点x∗。
步骤如下。
第1步:任取初始值x0,即置k=0。
第 2 步:计算f(x)在xk处的函数值f(xk)和f(x)在xk处的梯度值。
第3步:若∇f(xk)<ε,则停止迭代,极小值点为x∗=xk。
第4步:置xk+1=xk−λ∙∇f(xk),计算f(xk+1)。
第5步:若|f(xk+1)−f(xk)|<ε或|xk+1−xk|<ε时,停止迭代,极小值点为x∗=xk+1。
第6步:否则,置k=k+1,转到第2步。
对于多维情况,如上面的损失函数L(w,b),利用梯度下降法求解的步骤也是如此,只不过每次求解时,上述过程中的梯度应换成各自的偏导数。
上面的过程称为批量梯度下降法。
(5)随机梯度下降法
从上述过程可知,在梯度下降法的迭代中,除梯度值本身的影响外,每一次取的步长λ也很关键:步长值取得越大,收敛速度就越快,但是带来的可能后果就是容易越过函数的最优点,导致发散;步长值取得太小时,算法的收敛速度又会明显降低。因此,我们希望找到一种比较好的平衡方法。
另外,当目标函数不是凸函数时,使用梯度下降法求得的结果可能只是某个局部最优点,因此我们还需要一种机制,避免优化过程陷入局部最优。
为解决上述两个问题,引入了随机梯度下降法。随机梯度下降法原理与批量梯度下降法原理相同,只不过做了如下两个小的改进:
● 将固定步长λ改为动态步长λk,具体动态步长如何确定可参见下文随机梯度下降法的过程,这样做可保证每次迭代的步长都是最佳的。
● 引入随机样本抽取方式,即每次迭代只是随机取了训练集中的一部分样本数据进行梯度计算;这样做虽然在某种程度上会稍微降低优化过程的收敛速度并导致最后得到的最优点可能只是全局最优点的一个近似,但却可以有效避免陷入局部最优的情况(因为批量梯度下降法每次都使用全部数据,一旦到了某个局部极小值点可能就停止更新了;而随机梯度下降法由于每次都是随机取部分数据,所以就算到了局部极小值点,在下一步也还是可以跳出的)。
两者的关系可以这样理解:随机梯度下降法以损失很小的一部分精确度和增加一定数量的迭代次数为代价,保证了迭代结果的有效性。
(6)随机梯度下降法过程
输入:目标函数f(x),计算精度ε。
输出: f(x)的极小值点x∗。
步骤如下。
第1步:任取初始值x0,即置k=0。
第2步:计算f(x)在xk处的函数值f(xk)和f(x)在xk处的梯度值。
第3步:若∇f(xk)<ε,则停止迭代,极小值点为x∗=xk。
第4步:否则求解最优化问题:min f(xk−λk∙∇f(xk)),得到第k轮的迭代步长λk;再置xk+1=xk−λk∙∇f(xk),计算f(xk+1)。
第5步:当|f(xk+1)−f(xk)|<ε或|xk+1−xk|<ε时,停止迭代,极小值点为x∗=xk+1。
第6步:否则,置k=k+1,转到第2步。
2.牛顿法
(1)牛顿法介绍
牛顿法也是求解无约束最优化问题的常用方法,最大的优点是收敛速度快。
(2)牛顿法的推导
将目标函数f(x)在x=xk处进行二阶泰勒展开,可得:
因为目标函数f(x)有极值的必要条件是在极值点处一阶导数为0,即f'(x)=0,所以对上面的展开式两边同时求导(注意,x是变量,xk是常量,f(xk)、∇f(xk)和∇2f(xk)都是常量),并令f'(x)=0,可得:
f'(x)=∇f(xk)+∇2f(xk)(x−xk)=0
取x=xk+1,可得:
∇f(xk)+∇2f(xk)(xk+1−xk)=0
整理后得到:
xk+1=xk−∇2f(xk)−1∙∇f(xk)
上式中,∇f(x)是关于未知变量x(1),x(2),…,x(N)的梯度矩阵表达式,即
∇2f(x)是关于未知变量x(1),x(2),…,x(N)的Hessen矩阵表达式,一般记作H(f),即
(3)牛顿法的过程
输入:目标函数f(x),计算精度ε。
输出: f(x)的极小值点x∗。
步骤如下。
第1步:任取初始值x0,即置k=0。
第2步:计算f(x)在xk处的函数值f(xk),f(x)在xk处的梯度值, f(x)在xk处的Hessen矩阵值∇2f(xk)。
第3步:若−∇2f(xk)−1∙∇f(xk)<ε,则停止迭代,极小值点为x∗=xk。
第4步:置xk+1=xk−∇2f(xk)−1∇f(xk),计算f(xk+1)。
第5步:当|f(xk+1)−f(xk)|<ε或|xk+1−xk|<ε时,停止迭代,极小值点为x∗=xk+1。
第6步:否则,置k=k+1,转到第2步。
现在可以回答开始时的那个问题了,即为什么牛顿法收敛速度比梯度下降法快?
从本质上看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法更快。
通俗地讲,比如你想找一条最短的路径走到一个盆地的底部,梯度下降法是每次从你当前所处位置选一个坡度最大的方向走一步,而牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。也就是说,牛顿法比梯度下降法看得更远一点,因此能更快地走到底部。
或者从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径更符合真实的最优下降路径。
(4)阻尼牛顿法
但是牛顿法有一个问题:当初始点x0远离极小值点时,牛顿法可能不收敛。原因之一是牛顿方向d=−∇2f(xk)−1∙∇f(xk)不一定是下降方向,经迭代,目标函数值可能上升。此外,即使目标函数值是下降的,得到的点xk+1也不一定是沿牛顿方向最好的点或极小值点。因此人们提出阻尼牛顿法对牛顿法进行修正。
阻尼牛顿法在牛顿法的基础上增加了动态步长因子λk,相当于增加了一个沿牛顿方向的一维搜索。阻尼牛顿法的迭代过程如下。
(5)阻尼牛顿法的过程
输入:目标函数f(x),计算精度ε。
输出: f(x)的极小值点x∗。
步骤如下。
第1步:任取初始值x0,即置k=0。
第2步:计算f(x)在xk处的函数值f(xk),f(x)在xk处的梯度值∇f(x)|x=xk=∇f(xk),f(x) 在xk处的Hessen矩阵值∇2f(xk)。
第3步:若−∇2f(xk)−1∇f(xk)<ε,则停止迭代,极小值点为x∗=xk。
第4步:否则求解最优化问题:min f(xk−λk∙∇2f(xk)−1∇f(xk)),得到第k轮的迭代步长λk;再置xk+1=xk−∇2f(xk)−1∇f(xk),计算f(xk+1)。
第5步:当|f(xk+1)−f(xk)|<ε或|xk+1−xk|<ε时,停止迭代,极小值点为x∗=xk+1。
第6步:否则,置k=k+1,转到第2步。
3.拟牛顿法
(1)概述
拟牛顿法的优势是收敛较快,但是从上面的迭代式中可以看到,每一次迭代都必须计算Hessen矩阵的逆矩阵,当函数中含有的未知变量个数较多时,这个计算量是比较大的。为了克服这一缺点,人们提出用一个更简单的式子去近似拟合式子中的Hessen矩阵,这就有了拟牛顿法。
(2)拟牛顿法的推导
先将目标函数在x=xk+1处展开,得到:
两边同时取梯度,得:
∇f(x)=∇f(xk+1)+∇2f(xk+1)(x−xk+1)
取x=xk,得:
∇f(xk)=∇f(xk+1)+∇2f(xk+1)(xk−xk+1)
即
∇2f(xk+1)(xk+1−xk)=∇f(xk+1)−∇f(xk)
记:
pk=xk+1−xk
qk=∇f(xk+1)−∇f(xk)
则有:
∇2f(xk+1)pk=qk
推出:
pk=∇2f(xk+1)−1qk
上面这个式子称为“拟牛顿条件”,这样,每次计算出pk和qk后,就可以根据上式估计出Hessen矩阵的逆矩阵表达式∇2f(xk+1)−1。
1.3.4 小结
从上面的过程可以看出,机器学习方法从数学的角度来看其实就是:模型+策略+算法。模型就是对一个实际业务问题进行建模,将其转化为一个可以用数学来量化表达的问题。策略就是定义损失函数来描述预测值与理论值之间的差距,将其转化为一个使损失函数最小化的优化问题。算法指的是求解最优化问题的方法,我们一般将其转化为无约束优化问题,然后利用梯度下降法和牛顿法等进行求解。