• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

常见优化方法的梳理

ml admin 9个月前 (03-08) 291次浏览 0个评论 扫描二维码

今天主要要说一下常见的几个优化方法分别是梯度下降、随机梯度下降、牛顿法和拟牛顿法


NO1 梯度下降

从字面意思理解就是沿着梯度下降的方向做些事情,做的啥事情?就是求解最优参数的事情。从二维的角度来看梯度,注意我们在计算梯度的时候是关注我们计算的那个的梯度,只涉及到点,二维平面可以用切线,三维可以用切面描述,高维另说。所以接下来的讨论都是关注在某一个点相关。

现在我们以一个线性模型来距离说明梯度下降,假设我们的模型如下所示:

\[ h(x)=\theta_0+\theta_1*x_1+\theta_2*x_2\]

\(x_1\)和\(x_2\)表示两个特征维度,\(\theta_0\)到\(\theta_3\)表示特征维度对应的权重系数
使用向量的表示方法上面的公式可以表示为
\[h_\theta(x)=\theta^{T}X \]
现在对于我们而言我们是不知道\(\theta\)的,因此我们需要求解出来得到最终的线性模型公式表达式。
那么我们如何求解的呢?现在我们手上有一些样本的信息,我们可以用我们当前的模型来拟合,将拟合的输出与真实的输出对比,这就是构造我们常见的代价函数
\[ J(\theta)=\frac{1}{2}\sum_{i=1}^{m}(h_\theta(x^{i}-y^{i})^2\]
\[ min J_\theta \]
上面的公式就是平方损失函数,也算是常见的损失函数
既然损失函数到手了,我们撸起袖子干活了,就是把这个损失降到最低,这也是变相的最优化理论。要注意损失降到最低得到的模型不一定是最好的,前提是看你的模型是否太复杂,如果你有一个高阶多项式模型来拟合一个杂乱无章的数据,的确使用平方损失函数得到的误差很小,但是你的模型不具有泛化能力,扯远了,回到原题
梯度下降法处理的流程如下:
(1)一开始我们是不知道\(\theta\)参数的数值的,类似迭代方法计算参数的过程我们都会给一个初始参数,那我们可以随机初始化参数
(2)对于每一个样本点我们都会计算相应的梯度,当然我们会使用梯度来更新我们的参数\(\theta\),我们的参数会用到所有的点的数据信息
\[ \frac{\partial J_\theta}{\partial \theta} = x^{i}(h_\theta(x)-y) \]
上面这个公式就是向量化的表示方法,下面使用的一般化的表示方法
\[ \frac{\partial J_\theta} {\partial \theta} = \frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{i})-y^{i})*x^{i}\]
由此可以看到我们迭代公式会利用到所有的样本数据信息,这样存在一个问题,我们在更新权重系数\( \theta\)时会使用所有样本,万一我们的样本超级大,那岂不是计算量也是超级大,哈哈,这个后面会有一个随机梯度下降来解决当前这个问题。
对应的\( \theta\)更新公式为:
\[ \theta=\theta-\alpha*\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{i})-y^{i})*x^{i} \]

NO2 随机梯度下降

随机梯度下降一般情况下会与梯度下降对比来看,二者的主要区别在于权重系数的迭代更新公式
随机梯度在迭代更新的时候每个系数只会使用样本中的一个来进行更新,因此相比于上面的梯度下降法速度有很大的提升
\[ \theta_j=\theta_j+\alpha*(h_\theta(x^{i})-y^{i})*x_j^{i} \]

很多人就会有想法了,为什么用一个样本就可以更新参数啊?我们可以来想一想,上面这个公式如果参数\( \theta\)算出来与真实的我们想要的值,那么\((h_\theta(x^{i})-y^{i})\)计算得到的偏差就会很小,那么参数更新的尺度就很小,其实这不就是达到我们的目的?
放上一张梯度算法经典的图

NO3 牛顿法

首先介绍一下牛顿法的概念,然后在介绍牛顿法在机器学习中的应用
现在我们需要求解一个方程的解\( f(x)=0\)
根据数学知识我们可以将其泰勒展开得到如下的式子
\[ f(x)=f(x_0)+\frac{f^{‘}(x_0)}{1!}(x-x_0)+\frac{f^{”}(x_0)}{2!}(x-x_0)+……\]
为了近似计算方程的解,我们只保留了前两项,因此可以得到
\[f(x)=f(x_0)+\frac{f^{‘}(x_0)}{1!}(x-x_0) \]
所以我们可以得到 x 的近似值为
\[ x=x_0 -\frac{f(x_0)}{f^{‘}(x_0)} \]
你要知道上述得到的 x 并不是真正的 x,相对来说离真正的方程解又进了一步,因此我们将刚才的值设为\(x_1\),此时我们可以继续在\(x_1\)继续使用泰勒公式分解得到\(x_2\)
依次类推我们可以得到 x 迭代的公式,这个就是牛顿法求解的全过程,那么看到这我们又该如何将牛顿法引入到机器学习算法中呢?

上面的方程看起来是不是有点像我们求解模型的代价函数?我们会经常遇到求解代价函数的最小值,那么就需要求解极值点,最基本的方法就是求导了,是不是就有点感觉在求导函数的解,但是很多时候我们并不会求到极值点
所得到的也只是不算逼近最优解的结果,哈哈,此时你会联想到上面介绍的泰勒公式计算方程最优解,本质上就是不断逼近最优解的过程,所以在这里我们也是可以用牛顿法来求解机器学习模型的参数问题。
\[ f(x+\bigtriangleup x)=f(x)+\frac{f^{‘}(x)}{1!}(\bigtriangleup x)+\frac{f^{”}(x)}{2!}(\bigtriangleup x^2)\]
上面的公式就是\(f(x+\bigtriangleup x)\)在 x 处泰勒展开式,当\(\bigtriangleup x\)趋向于 0 的时候我们可以得到
\[\bigtriangleup x =-\frac{f^{‘}(x)}{f^{”}(x)} \]
然后不断的迭代更新,迭代更新的公式为:

\[x_{n+1} =x_n-\frac{f^{‘}(x)}{f^{”}(x)} \]

上述描述的是简单的二维情况,当 x 的特征维度上升时,我们需要求解偏导数,此时需要构造一个海森矩阵,这里面包含了对不同维度的二阶偏导数

我们要知道海森矩阵是一个与 x 长度相同的方阵,而且在计算的过程中我们会求解方阵的逆矩阵操作,如果 x 长度较大,所求解的海森矩阵也是巨大的,在每一次的迭代过程当中都需要计算一次海森矩阵
所以这个消耗的代价是巨大的,因此这也是牛顿法欠缺的一个地方,当然它自身也是有有点,比如迭代的速度会更快,因为使用二阶导,相对于梯度一阶导数更快


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明常见优化方法的梳理
喜欢 (0)
admin
关于作者:

您必须 登录 才能发表评论!