• 神经网络前向和后向传播推导(一):概览


    大家好~本文介绍了前向传播、梯度下降算法,总结了神经网络在训练和推理阶段执行的步骤。

    在后面的文章中,我们会从最简单的神经网络开始,不断地增加不同种类的层(如全连接层等),推导每种层的前向传播、后向传播、梯度计算、权重和偏移更新的数学公式

    神经网络前向和后向传播推导(一):前向传播和梯度下降
    神经网络前向和后向传播推导(二):全连接层

    神经元

    image
    如上图所示,一个神经元具有一个偏移值b和多个权重值w,接受多个输入值x,返回一个输出值y

    计算公式为:

    y=f(wTx+b)
    y=f(w⃗ Tx⃗ +b)

    其中:

    w=[w1,w2]
    w⃗ =[w1,w2]

    x=[x1x2]

    f

    我们可以将b表示为wb,合并到w中;并且把y表示为向量。这样就便于向量化编程
    计算公式变为:

    y=f(wTx)

    其中:

    w4=[wb,w1,w2]

    x=[1x1x2]

    y=[y]

    神经网络

    一个神经网络由多层组成,而每层由多个神经元组成。
    如下图所示是一个三层神经网络,由一层输入层+两层全连接层组成:
    image

    这个网络中最左边的层称为输入层,包含输入神经元;最右边的层称为输出层,包含输出神经元;中间的层则被称为隐藏层

    本文以该神经网络为例进行推导

    前向传播

    从输入层开始,输入层的输出作为隐藏层的输入传入隐藏层,计算出输出:y
    y作为输出层的输入传入输出层,计算出输出:y,作为整个网络的输出。

    公式为:

    y=f(Wx)

    y=f(Wy)

    其中:W为权重矩阵

    这就是前向传播算法,也就是从输入层开始,依次传入每层,直到输出层,从而得到每层的输出。

    前向传播用来做什么呢?它在训练和推理阶段都有使用:
    在训练阶段,前向传播得到了输出层的输出和其余各层的输出,其中计算正确率需要前者,计算后向传播需要前者和后者;
    在推理阶段,前向传播得到了输出层的输出,作为推理的结果。比如根据包含一个人的体重、身高这样的一个样本数据,得到了这人是男人还是女人的输出。

    梯度下降

    推理阶段使用前向传播得到输出值,而前向传播需要知道每层的权重和偏移。
    为了在推理阶段能够得到接近真实值的输出值,每层的权重和偏移应该是某个合适的值。那么合适的值应该是多少呢?
    我们可以在训练阶段给每层一个初始的权重和偏移(比如说都设为0);然后输入大量的样本,不断地更新每层的权重和偏移,使得它们逐渐接近合适的值。
    那么,什么值才是合适的值呢?
    我们可以构建一个目标函数,用来在训练阶段度量输出层的输出值和真实值的误差大小:

    e=E(y,y)

    其中y为输出层的输出值,y为真实值,E为目标函数,e为误差

    当误差e最小时,输出层的输出值就最接近真实值。因为E是输出层的权重和偏移(w))的函数(因为Ey的函数,而y又是w的函数,所以Ew的函数),所以此时的w就是合适的值

    如何求E的最小值点呢?对于计算机来说,可以一步一步的去把函数的极值点试出来,如下图所示:
    image

    首先,我们随便选择一个点开始,比如上图的x0。接下来,每次迭代修改Xx1,x2,x3......经过数次迭代后最终达到函数最小值点。

    你可能要问了,为啥每次修改X,都能往函数最小值那个方向前进呢?这里的奥秘在于,我们每次都是向函数y=f(x)的梯度的相反方向来修改X
    什么是梯度呢?梯度是一个向量,它指向函数值上升最快的方向。显然,梯度的反方向当然就是函数值下降最快的方向了。
    我们每次沿着梯度相反方向去修改X,当然就能走到函数的最小值附近。
    之所以是最小值附近而不是最小值那个点,是因为我们每次移动的步长不会那么恰到好处,有可能最后一次迭代走远了越过了最小值那个点。步长的选择是门手艺,如果选择小了,那么就会迭代很多轮才能走到最小值附近;如果选择大了,那可能就会越过最小值很远,收敛不到一个好的点上。

    按照上面的讨论,我们就可以写出梯度下降算法的公式:

    xnew=xoldηdf(x)dx

    其中df(x)dx是梯度,η是步长,也称作学习率

    只要把f替换为EX分别替换为WWx0分别替换为初始的w、初始的w,就可以得到使E达到最小值的梯度下降算法的公式:

    Wnew=WoldηdEdwWnew=WoldηdEdw

    其中Wnew为输出层的权重矩阵,Wnew为隐藏层的权重矩阵,w为输出层的权重值,w为隐藏层的权重值,

    总结

    神经网络的使用可以分成两个阶段:
    训练和推理

    训练阶段

    先进行前向传播,得到每层的输出;
    然后进行后向传播,根据每层的误差项而计算出上一层的误差项,并且计算每层的梯度(关于后向传播详见神经网络前向和后向传播推导(二):全连接层->推导后向传播);
    最后按照梯度下降算法,更新每层的权重和偏移。

    可以用下面的公式来表达训练:
    每层的权重和偏移=训练(大量的样本)

    W=(i)

    其中W为包含每层的权重和偏移向量的矩阵

    推理阶段

    使用训练阶段得到的每层的权重和偏移,进行前向传播,得到输出层的输出作为推理结果。

    可以用下面的公式来表达推理:

    y=(i,W)

    参考资料

    零基础入门深度学习 | 第二章:线性单元和梯度下降
    零基础入门深度学习 | 第三章:神经网络和反向传播算法

  • 相关阅读:
    java与es8实战之三:Java API Client有关的知识点串讲
    IntelliJ IDEA 2023:创新不止步,开发更自由 mac/win版
    C++笔试题复习
    Effective C++条款22——将成员变置声明为private(设计与声明)
    【P15 Python基础】Pandas
    专访|OpenTiny 社区 Mr 栋:结合兴趣,明确定位,在开源中给自己一些技术性挑战
    JS原生复制功能
    后端程序员必备:书写高质量SQL的30条建议
    Win11安装权限在哪里设置?Win11安装权限设置的方法
    MySQL -- DQL
  • 原文地址:https://www.cnblogs.com/chaogex/p/16343664.html