• 神经网络前向和后向传播推导(二):全连接层


    大家好~本文推导全连接层的前向传播、后向传播、更新权重和偏移的数学公式,其中包括两种全连接层:作为输出层的全连接层、作为隐藏层的全连接层。

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

    构建神经网络

    我们构建一个三层神经网络,由一层输入层+两层全连接层组成:
    image

    输入层有三个节点,我们将其依次编号为1、2、3;隐藏层的两个节点,编号依次为4、5;输出层的两个节点编号为6、7。因为我们这个神经网络是全连接网络,所以可以看到每个节点都和上一层的所有节点有连接。比如,我们可以看到隐藏层的节点4,它和输入层的三个节点1、2、3之间都有连接,其连接上的权重分别为w41,w42,w43
    (注意:权重的序号的命名规则是下一层的序号在上一层的序号之前,如为w41而不是w14

    推导前向传播

    节点4的输出值y4的计算公式为:

    y4=f(w4Tx)

    其中:

    w4=[wb4,w41,w42,w43]

    x=[1x1x2x3]

    f

    推导隐藏层的前向传播
    我们把隐藏层的权重向量组合在一起成为矩阵,就推导出隐藏层的前向传播计算公式了:

    y=f(Wx)

    其中:

    W=[w4w5]=[wb4,w41,w42,w43wb5,w51,w52,w53]

    x=[1x1x2x3]

    y=[y4y5]

    推导输出层的前向传播
    同理,可推出输出层的前向传播计算公式:

    y=f(Wy)

    其中:

    W=[w6w7]=[wb6,w64,w65wb7,w74,w75]

    y=[y4y5]

    y=[y6y7]

    推导后向传播

    我们先来看下输出层的梯度下降算法公式:

    wkj=wkjηdEdwkj

    其中:k是输出层的节点序号,j是隐藏层的节点序号,wkj是输出层的权重矩阵W的权重值,dEdwkj是节点k的梯度

    netk函数是节点k的加权输入:

    netk=wkTy=jwkjyj

    因为Ey的函数,ynetk的函数,netkwkj的函数,所以根据链式求导法则,可以得到:

    dEdwkj=dEdnetkdnetkdwkj=dEdnetkdjwkjyjdwkj=dEdnetkyj

    定义节点k的误差项δk为:

    δk=dEdnetk

    因为yj已知,所以只要求出δk,就能计算出节点k的梯度

    同理,对于隐藏层,可以得到下面的公式:

    wji=wjiηdEdwjidEdwji=dEdnetjxiδj=dEdnetj

    其中:j是隐藏层的节点序号,i是输入层的节点序号,wji是隐藏层的权重矩阵W的权重值,dEdwji是节点j的梯度

    因为xi已知,所以只要求出δj,就能计算出节点j的梯度

    推导输出层的δk

    因为节点k的输出值yk作为y的一个值,并没有影响y的其它值,所以节点k直接影响了E。也就说Eyk的函数,yknetk的函数,所以根据链式求导法则,可以得到:

    δk=dEdnetk=dEdykdykdnetk

    考虑上式的第一项:

    dEdyk=dE(y)dyk

    上式的第二项即为求激活函数f的导数:

    dykdnetk=df(netk)dnetk

    将第一项和第二项带入dEdnetk,得到:

    δk=dE(y)dykdf(netk)dnetk

    只要确定了E和激活函数f,就可以求出δk
    一般来说,E可以为softmaxf可以为relu

    推导隐藏层的δj

    因为节点j的输出值yj作为输出层所有节点的一个输入值,影响了y的每个值,所以节点j通过输出层所有节点影响了E。也就说E是输出层所有节点的net的函数,每个net函数netk都是netj的函数,所以根据全导数公式,可以得到:

    δj=dEdnetj=kdEdnetkdnetkdnetj=kδkdnetkdnetj

    因为netkyj的函数,yjnetj的函数,所以根据链式求导法则,可以得到:

    dnetkdnetj=dnetkdyjdyjdnetj=djwkjyjdyjdyjdnetj=wkjdyjdnetj=wkjdf(netj)dnetj

    代入,得:

    δj=kδkwkjdf(netj)dnetj

    只要确定了激活函数f和得到了每个δk,就可以求出δj

    后向传播算法

    通过上面的推导,得知要推导隐藏层的δj,需要先得到出下一层(也就是输出层)每个节点的误差项δk
    这就是反向传播算法:需要先计算输出层的误差项,然后反向依次计算每层的误差项,直到与输入层相连的层

    推导权重和偏移更新

    经过上面的推导,可以得出输出层的更新公式为:

    wkj=wkjηδkyj

    隐藏层的更新公式为:

    wji=wjiηδjxi

    总结

    我们在推导隐藏层的误差项时,应用了全导数公式,这是一个难点

    参考资料

    零基础入门深度学习 | 第三章:神经网络和反向传播算法

  • 相关阅读:
    Mac M1 安装Docker打包arm64的python项目的镜像包
    TCP协议
    Mysql之innodb
    【C++进阶之路】第十一篇:C++的IO流
    Python多线程和多进程:初步了解
    前端也学一下 Lua 呀
    Qt文本编辑器避免在新窗口打开链接的设置方法
    Flask 专题
    Spark: 单词计数(Word Count)的MapReduce实现(Java/Python)
    dBm dBi dBd dB dBc解释
  • 原文地址:https://www.cnblogs.com/chaogex/p/16350439.html