机器学习中的最优化方法-以梯度下降为例

机器学习中的最优化方法

最优化方法就是寻找函数的极值点。机器学习和深度学习模型的训练本质上就是在通过已有的数据拟合一个函数,使这个函数能尽可能地反应出数据的内在规律,从而能更好的预测给定输入的输出结果。函数都会有自变量、因变量和参数,当一个函数的参数确定了,那函数的形状就确定了,因此模型训练就是在训练参数。

以线性回归为例:y=\theta x+b

模型所做的工作就是确定一条直线的参数,也就是斜率和截距,使这条直线尽可能多的穿过数据点,或者是到数据点的距离之和尽可能地小。

这个直线到每个点的距离之和就是损失函数,这里的损失函数取平方损失函数:Loss(\theta,b)=\sum_{i=1}^{n}[{y_{i}}'-y_{i}]^{2}=\sum_{i=1}^{n}[{y_{i}}'-(\theta x_{i}+b)]^2

Loss(\theta,b)是关于直线参数\thetab的函数,对于每个输入数据x_i,模型预测数据为y_i,真实数据为{y_i}',因此模型(直线)对一个点的平方误差就是[{y_{i}}'-y_{i}]^{2},但是模型(直线)不能只考虑对一个点的误差,它要考虑对一整批数据的整体误差,因此要对n个数据的误差求和。模型训练最终的目标是使模型预测准确率尽可能地高,也就是误差尽可能地小。因此线性回归问题的模型训练就是找到使Loss(\theta,b)相对较小(要考虑过拟合问题)的参数\thetab,也就是寻找Loss(\theta,b)的极值点,这就需要用到最优化方法。

最优化方法

最优化方法通常采用的是迭代法,它从一个初始参数 \vec{​{\theta}_0} 反复使用某种规则从\theta_k移动到下一个点\theta_{k+1},直至到达函数的极值点。这些规则一般是使用\theta_k的一阶导数信息即(梯度下降法)或者二阶导数信息即Hessian矩阵(牛顿法)。

1.梯度下降法

1.1梯度下降法算法核心

梯度下降法基于迭代法并利用函数的梯度来寻找极小值点,每一次所做的核心工作实际上就是调整参数变量,使得Loss(\vec{\theta})减小为Loss(\vec{\theta}+\vec{\Delta \theta })Loss(\vec{\theta })\xrightarrow[Adjustment\ parameters]{\theta +\Delta \theta }Loss(\vec{\theta }+\vec{\Delta \theta }).

那如何调整参数变量使得损失函数更快的减小到极值呢?由于梯度下降是基于迭代的,也就是要经过好多次运算才能得到极值,而我们不可能每次都手动的设置\vec{\Delta \theta }。将梯度下降比作机器人下山,我们只能指定他每次迈出的距离是多大,而不可能指定他每次走的方向,每次行走的方向,需要他根据实际情况判断,比如找最陡峭的方向行走。梯度下降也是一样,当损失函数是一元函数,我们只能指定\Delta \theta的大小,然后由算法来决定\Delta \theta的正负,比如x点的导数值是正的,说明朝x轴正向走函数值增大,那算法就将\Delta \theta设置为负值,这样就可以往函数之减小的方向调整。一元函数可能看上去不太明显,并且这看上去好像仅仅是一个标量的正负号的变化,我们完全可以通过判断导数的正负来判断\vec{\Delta \theta }的正负。但是当问题扩展到二维函数,情况就有所不同。在每个\vec \theta = \vec \theta + \vec{\Delta \theta }处,有无数个方向可以调整,而不是仅仅正、负两个方向,并且\Delta \theta也变成了一个矢量,那如何确定\Delta \theta使损失函数下降最快呢?这时候就需要用到梯度,通常来说梯度是一元函数的导数在多元函数的扩展,是一个矢量,方向指向\theta点函数值增长最快的方向,由于我们希望调整\theta使损失函数下降最快,因此我们就可以让\theta朝着梯度的反方向移动,也就是令\vec{\Delta \theta} = -\gamma \triangledown Loss(\vec{\theta})\gamma是步长,指定\vec{\Delta \theta}的模,也就是长度,\triangledown Loss(\vec{\theta})指定\vec{\Delta \theta}的方向。得到\vec{\Delta \theta}以后,我们只需要令\vec \theta = \vec \theta + \vec{\Delta \theta }=\vec \theta -\gamma \triangledown Loss(\vec{\theta}),并计算出Loss(\vec{\theta}+\vec{\Delta \theta }),就完成了一次迭代。

fig1.一元损失函数梯度下降法演示
查看源图像
fig2.二元损失函数梯度下降法演示

上面两图是梯度下降法在一元损失函数和二元损失函数中的演示,每一个箭头都是一次迭代,但是箭头的方向就是各个点梯度的方向。

1.2梯度下降法的局限性

Ⅰ.传统的批梯度下降算法(batch SGD)每次调整参数需要计算对全部数据的误差并求平均值,导致消耗内存大,计算时间长,对于这个问题有一些改进措施,比如随机梯度下降算法(SGD)和小批量随机梯度下降算法(Mini-Batch SGD),其中SGD算法是每计算出一个数据的误差,就用这个误差信息来调整参数,这样的话每次迭代的速度就会比BGD快很多,假设样本有20w个数据,BGD迭代一次是1x20w,而SGD迭代20w次是1x20w,而SGD一定会在远小于20w次的迭代中找到最优解,虽然BGD比SGD慢,但它每次迭代是基于全局误差,因此最后可以得到全局最优解,而SGD每次迭代基于一个数据,并且由于选取数据的随机性,导致SGD的损失函数波动较大,并可能会陷入局部最优解。一种折中的方法是使用小批量随机梯度下降算法(Mini-Batch SGD),假设有N个样本,MB-SGD首先将N个样本平均分为多组,每组M个样本,满足M远小于N,每次对M个样本的平均误差进行梯度下降,计算速度较快并且下降方向较为准确,损失函数的波动不大。

fig3.三种梯度下降法直观对比
fig4.三种梯度函数损失函数对比,从左到右分别为BGD、SGD、MB-SGD
横轴为迭代次数

Ⅱ.在进行梯度下降的时候要指定步长,而步长太大会导致震荡,步长太小会导致收敛缓慢,对于步长的改进算法有最速梯度下降,它在初始时指定一组步长,如[0.001 , 0.01 , 0.1],每次迭代的时候选择下降最快的步长。

Ⅲ.局部最优解问题

fig5.局部最小和全局最小

 

对于局部最小值问题,有两种比较简单的解决方案,一种是使用多组初始参数,第二种是使用模拟退火算法。局部最小值还有鞍点问题,具体解决方法请看梯度下降优化算法综述

待补充

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值