美文网首页深度学习锦集
锦鲤一《线性相关+梯度优化》

锦鲤一《线性相关+梯度优化》

作者: 灿烂的GL | 来源:发表于2018-11-25 12:29 被阅读0次

    一、线性相关

    先看一个常见的神经网络模型

    图1神经网络模型

    其中模型的数学关系式如图2所示:

    图2 数学关系式

    激励函数f()中的关系式可以刨离出来,就是一个线性组合

    S=x_{1} \times w_{1} +x_{2} \times w_{2}+...+x_{k} \times w_{k}

    s变量是对变量x的加权线性"混合"。因此,将s定义为变量的线性组合,定义每个x_{i} 是一个矢量,因此,它们的线性组合s也是一个矢量。当然.每个矢量必须有相同数量的元素。请注意,s的每个分量都是一个由被组合矢量的相对应元素构成的线性组合。

    二、基于梯度的优化算法

    问题:深度学习算法在做模型调整的时候会涉及优化函数,通常把需要最小化的目标函数称为代价函数/损失函数/误差函数

    解决思路:下面从导数和偏导数的基本层面来看下这个问题

    假设函数y=f(x),函数导数表示缩放输入的大小才能在输出获得相应变化即:f(x+\epsilon )\approx f(x)+\epsilon \frac{dy}{dx}

    可见导数对我们很有用,因为它可以告诉我们如何更改x 来略微的改善 y, 具体而言,我们想要找到y的最小值,沿着导数的负方向移动一个足够小的\varepsilon , 得到的 f(x-\epsilon \frac{dy}{dx} ) 肯定是比 f(x)要小的,我们就这样沿着导数的负方向一步一步挪来减小f(x), 去接近最低点。这种技术就是 梯度下降(gradient descent)。

    图3 通过导数进行梯度下降

    我们常见的是多维情况,即存在多个局部最小值点,如图4所示:

    图4 多维函数情况

    针对多维输入函数,需要通过偏导数。之前我们已经知道,梯度向量指向上坡,负梯度方向指向下坡。我们在负梯度方向上移动x 可以减小 y.这被称为最速下降法(method of steepest descent) 或 梯度下降(gradient descent) . 应用最速下降法,在x点处建议的下一个更新的点是 x′=x−ε∇xf(x). 其中 ε是 学习率(learning rate), 是一个确定移动步长大小的正标量。ε的选择是一个技术活儿,有几种不同的策略来找到最佳的 ε.

    一种是直接设置为一个小常数。 

    一种是通过计算,选择使得方向导数消失的步长。

    一种是根据几个 ε是试探计算 f(x−ε∇xf(x)), 并选择其中能产生最小目标值函数值得 ε。 

    最速下降法在梯度的每一个元素都为 0的时候收敛(或者在实践中,很接近0 时)。 在有些情况下,我们也许能够避免运行迭代求解,而是通过解方程 ∇xf(x)=0直接跳到临界点。

    以上说的梯度下降法,都是针对连续空间中的优化问题,但是其背后的解决问题的思路 – 不断地向更好的情况移动一小步–可以拓展到离散空间。 例如,递增带有离散参数的目标函数被称作爬山算法(hill climbing).

    问题:病态曲率,如图5所示。

    图5 损失曲面

    放大的图如6所示。

    图6 梯度下降

    解决分析:上文已经看见一阶优化解决梯度问题,再看下二阶导数。

    一阶导数表征的是曲线的斜率, 同理我们可以认为二阶导数表征的是曲线(或曲面)的曲率. 借助物理来理解,就是函数表征的是位移和时间的对应关系,一阶导数就是速度,二阶导数就是加速度。

    对于一个一次函数而言,比如 y=kx, 其一阶导数就是常数k, 而二阶导数就是 0, 或者说匀速直线运动,速度恒定,没有加速度。

    对于一个二次函数而言,比如自由落体运动 \frac{y=1}{2gx^2 } , 其一阶导数就是xt, 二阶导数就是常数 g, 也就是说有随x变化的斜率和固定的曲率,或者说有固定的加速度然后有随时间变化的速度。

    回到优化算法中,我们之前使用的梯度下降法,相当于以当前的速度匀速直线前进一个δx时间,作为估计的 \hat{y} , 当然这个和真实的y 肯定是有差距的。二阶导数信息就可以用来预知这个差距的大小:

    如果二阶导数/曲率 为0, 也就是没有加速度,匀速直线运动,那么我们用梯度进行预测就是很准确的。

    如果二阶导数/曲率 为负, 也就是减速运动,那么我们用梯度进行预测的值就会比真实值大。

    如果二阶导数/曲率 为正, 也就是加速运动, 那么我们用梯度进行预测的值就会比真实值小。

    介绍下Hessian 矩阵,Hessian 矩阵如下:

    H(f)(x)_{i,j} =\frac{d^2 }{dx_{i} dx_{j} } f(x)

    图7 Hessian 矩阵

    其中H_{i,j} =H_{j,i}

    利用 Hessian 矩阵的特征值分解,我们可以将二阶导数测试扩展到多维情况。在临界点处 ∇xf(x)=0, 我们通过检测 Hessian 的特征值来判断该临界点是一个局部极大点,局部极小点还是鞍点。

    回到病态曲率的问题,Hessian提供了损失曲面每一点上的曲率估计。正曲率意味着随着我们的移动,损失曲面变得不那么陡峭了。负曲率则意味着,损失曲面变得越来越陡峭了。注意,如果这一步的计算结果是负的,那就意味着我们可以切换回原本的算法。这对应于下面梯度变得越来越陡峭的情形,然而,如果梯度变得越来越不陡峭,那么我们也许正向病态曲率的底部移动。这时牛顿算法提供了一个修正过的学习步幅,和曲率成反比。换句话说,如果损失曲面变得不那么陡峭,学习步幅就下降

    问题:Hessian矩阵需要我们计算损失函数在所有权重组合上的梯度。也就是说,需要做的计算的数量级是神经网络所有权重数量的平方。

    解决分析:基于之前梯度的信息使用启发式算法引导优化过程,这就可以用动量方法来解决,动量算法参考下边文献[3]

    小结:以上从数学层面介绍了神经网络实现的基本公式,以及网络梯度优化的基本算法。


    文章为学习整理笔记,仅供参考

    参考文献:

    【1】线性代数知识

    【2】梯度优化方法

    【3】优化算法(动量等)

    【4】牛顿算法

    相关文章

      网友评论

        本文标题:锦鲤一《线性相关+梯度优化》

        本文链接:https://www.haomeiwen.com/subject/dxbqqqtx.html