• 神经网络入门——11梯度下降算法


    梯度下降算法

    我们已经了解到,类似图中的简单神经网络输出数据的具体过程,我们构建神经网络是为了输出预测结果。但提前不知道权重,就没法正确预测结果。

    我们可以先输入正确的参数,然后根据结果调整权重。首先我们要选取衡量预测误差的标准。最容易想到的是用实际目标值y减去网络预测值 ^y   。

    用两者的差值来衡量误差。但是当预测值高于目标值时,误差为负。预测值低于目标值时,误差为正。我们希望误差能保持符号一致。让误差值为正,可以采用误差的平方。这里为什么不用绝对值?因为使用平方值时,异常数值会赋予更高的惩罚值,而较小的误差惩罚值低。而且使用平方值還能简化后面的计算。但目前我们仅仅得到单次输入预测的误差,我们希望求出全体数据的所有误差,那么可以对每一项误差进行求和。

    u表示所有数据的个数。这样就得到了所有数据的整体误差。

    在式子前面加上1/2,以便简化后面的计算。

    上图这个公式称为 ”误差平方和“  简称SSE,就是对差值取平方再求和。

    预测值^y 为权重值和输入值的线性组合。

    再传入激活函数

    可以看到所有数据的误差平方和与权重和输入有关,可以将这些数据看作矩阵,便于理解,一组包含输入,一组包含目标值y.

    可以逐行计算误差平方和,然后对所有结果求和。误差平方和可以用来评估神经网络的预测效果,误差平方和越大说明效果越差,越小说明预测效果好。

    因而希望降低误差平方和。

    以一行数据为输入举例:

    可以看出权重是误差函数的参数,因此权重可以被当作控制按钮来调整预测值,从而影响整体误差我们的目标是找到整体误差最小的权重值。

    下面是单一权重误差函数的简化图形,

    我们的目标是求取图形碗底对应的权值,从某一个随即权值出发,逐步向误差最小值的方向前进,这个方向与梯度相反,只要沿着梯度方向,反复下降,

    最终能求得误差平方和最小的最终的权值

    这个过程是梯度下降的过程。

    下面我们来更新权值,新的权值wi为旧的权值加上更新步长。

    更新步长与梯度成正比

    而”梯度等于误差关于每个权重wi的偏导数“,公式中还需添加一个缩放系数变量,用来控制梯度下降过程中下降的步长

    该系数称为学习率,下面我们展开计算梯度

    相当于对误差平方和求权重的偏导数。鉴于输出值^y是权重的函数,这里相当于计算复合函数的偏导数。

    其参数仍是权重wi,这种情况需要使用链式求导。

    链式求导如上所示。

    具体到问题中,可以将q设为预测差值。

    p设为误差的平方

    然后逐项求关于wi的偏导,首先p关于q的偏导等于预测值本身。因为指数2提下来与1/2抵消,然后在求预测差值关于wi的偏导。

    y是常数,^y是wi的函数,应用链式法则求导过程如下:

    下面在对^y求偏导

    在求和的式子中,每个权重仅是单个子项的参数。

    可以看出w1仅是x1的自变量,所以总和关于wi的偏导就是x1

    因此,总和关于wi的偏导就是xi.

    综合看来,误差平方关于wi的偏导数等于负的预测差值-(y-^y)乘以h激活函数的导数,在乘以输入值xi

    更新步长等于学习率乘以预测差值,再乘以激活函数的导数,乘以输入值xi.

    为了方便后续应用,我们将预测差值乘以激活函数的导数命名为误差项,用符号表示。

    那么权值公式可以写为

    你的神经网络可能有多个输出单元,可以将其视为多个单独网络的对叠。但需要将输入单元链接到输出单元。

    这时整体误差等于每个输出单元的误差之和。

    梯度下降法可以扩展适用于这种情况,只需分别计算每一个输出单元的误差项,

  • 相关阅读:
    Linux Shell系列教程之(十七) Shell文件包含
    Linux Shell系列教程之(十六) Shell输入输出重定向
    Linux Shell系列教程之(十五) Shell函数简介
    Linux Shell系列教程之(十四) Shell Select教程
    Linux Shell系列教程之(十三)Shell分支语句case … esac教程
    Linux Shell系列教程之(十二)Shell until循环
    Linux Shell系列教程
    算法系列:链表
    C++ 系列:Boost Thread 编程指南
    C++:多线程002
  • 原文地址:https://www.cnblogs.com/fuhang/p/8930743.html
Copyright © 2020-2023  润新知