精华内容
下载资源
问答
  • 反向传播算法实例

    2020-04-12 18:38:22
    反向传播算法实例Step1 前向传播 算例情景: 假设有一个如下图所示的三层结构的神经网络。其中,第一层是输入层,包含两个神经元 i1,i2i_1, i_2i1​,i2​ 和截距项 b1b_1b1​ ;第二层是隐藏层,包含两个神经元 h1,...

    反向传播算法实例


    算例情景:

    假设有一个如下图所示的三层结构的神经网络。其中,第一层是输入层,包含两个神经元 i 1 , i 2 i_1, i_2 i1,i2 和截距项 b 1 b_1 b1 ;第二层是隐藏层,包含两个神经元 h 1 , h 2 h_1, h_2 h1,h2 和截距项 b 2 b_2 b2 ;第三层是输出层,包含两个输出项 o 1 , o 2 o_1, o_2 o1,o2。每条线上标的 w i w_i wi表示层与层之间连接的权重,在本算例中激活函数默认选择 S i g m o i d Sigmoid Sigmoid函数。
    在这里插入图片描述
    接下来,对上面的神经网络模型赋初值,所得结果如下图所示:
    在这里插入图片描述
    赋初值的具体取值情形如下,其中:

    输入数据(原始输入): i 1 = 0.05 , i 2 = 0.10 ; i_1=0.05, i_2=0.10; i1=0.05,i2=0.10;
    输出数据(期望输出): o 1 = 0.01 , o 2 = 0.99 ; o_1=0.01, o_2=0.99; o1=0.01,o2=0.99;
    初始权重 w 1 = 0.15 , w 2 = 0.20 , w 3 = 0.25 , w 4 = 0.30 ; w_1=0.15, w_2=0.20, w_3=0.25, w_4=0.30; w1=0.15,w2=0.20,w3=0.25,w4=0.30;
    w 5 = 0.40 , w 6 = 0.45 , w 7 = 0.50 , w 8 = 0.55 ; \quad \quad \quad \quad w_5=0.40, w_6=0.45, w_7=0.50, w_8=0.55; w5=0.40,w6=0.45,w7=0.50,w8=0.55;
    截距项 b 1 = 0.35 , b 2 = 0.60 ; b_1=0.35, b_2=0.60; b1=0.35,b2=0.60;

    预期目标: 根据给定的输入数据 i 1 , i 2 ( 0.05 和 0.10 ) i_1, i_2(0.05和0.10) i1,i2(0.050.10),通过反向传播算法进行“权值修正”,使得实际输出与期望输出 o 1 , o 2 ( 0.01 和 0.99 ) o_1, o_2(0.01和0.99) o1,o2(0.010.99)最接近(即:实际输出与期望输出之间误差最小)。

    算法的基本原理:

    算法实现过程主要分两步:
    (1)前向传播: 求得初始状态下,实际输出和期望输出之间的总误差 Δ 0 Δ_0 Δ0;
    (2)反向传播: 根据 “链式求导法则” 对输出层、隐藏层的权值进行修正,从而缩小实际输出与期望输出之间的总误差。

    算法的求解过程:

    Step1 前向传播

    1. 输入层----> 隐藏层:

    由从神经网络第 l − 1 l-1 l1层的第 k k k个节点到神经网络第 l l l层的第 j j j个节点的输出结果的计算公式: z j l = ∑ k w j k l a k l − 1 + b j l z_j^l=\sum_kw_{jk}^la_k^{l-1}+b_j^l zjl=kwjklakl1+bjl 可知:

    本算例中,神经元 h 1 h_1 h1的输入加权和 n e t h 1 net_{h_1} neth1的计算如下:
    n e t h 1 = w 1 ∗ i 1 + w 2 ∗ i 2 + b 1 ∗ 1 = 0.15 ∗ 0.05 + 0.2 ∗ 0.1 + 0.35 ∗ 1 = 0.3775 \begin{aligned} net_{h_1}&=w_1*i_1+w_2*i_2+b_1*1\\ &=0.15*0.05+0.2*0.1+0.35*1\\ &=0.3775 \end{aligned} neth1=w1i1+w2i2+b11=0.150.05+0.20.1+0.351=0.3775
    引入激活函数Sigmoid,计算神经元 h 1 h_1 h1的输出 o u t h 1 out_{h_1} outh1
    o u t h 1 = 1 1 + e − n e t h 1 = 1 1 + e − 0.3775 = 0.59327 \begin{aligned} out_{h_1}&=\frac{1}{1+e^{-net_{h_1}}}\\ &=\frac{1}{1+e^{-0.3775}}\\ &=0.59327 \end{aligned} outh1=1+eneth11=1+e0.37751=0.59327
    同理,可以计算出神经元 h 2 h_2 h2的输出 o u t h 2 out_{h_2} outh2为:
    o u t h 2 = 0.59688 out_{h_2}=0.59688 outh2=0.59688
    2. 隐藏层----> 输出层:

    依次计算输出层神经元 o 1 o_1 o1 o 2 o_2 o2的实际输出值,方法同上:
    n e t o 1 = w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 2 ∗ 1 = 0.40 ∗ 0.59327 + 0.45 ∗ 0.59688 + 0.60 ∗ 1 = 1.105904 \begin{aligned} net_{o_1}&=w_5*out_{h_1}+w_6*out_{h_2}+b_2*1\\ &=0.40*0.59327+0.45*0.59688+0.60*1\\ &=1.105904 \end{aligned} neto1=w5outh1+w6outh2+b21=0.400.59327+0.450.59688+0.601=1.105904
    引入激活函数Sigmoid,计算神经元 o 1 o_1 o1的输出 o u t o 1 out_{o_1} outo1
    o u t o 1 = 1 1 + e − n e t o 1 = 1 1 + e − 1.105904 = 0.75136 \begin{aligned} out_{o_1}&=\frac{1}{1+e^{-net_{o_1}}}\\ &=\frac{1}{1+e^{-1.105904}}\\ &=0.75136 \end{aligned} outo1=1+eneto11=1+e1.1059041=0.75136
    同理可以计算神经元 o 2 o_2 o2的输出 o u t o 2 out_{o_2} outo2为:
    o u t o 2 = 0.772928 out_{o_2}=0.772928 outo2=0.772928
    至此,通过前向传播计算神经网络实际输出的过程就结束了。最终求得实际输出值为 [ 0.75136 , 0.772928 ] [0.75136, 0.772928] [0.75136,0.772928],与期望输出 [ 0.01 , 0.99 ] [0.01,0.99] [0.01,0.99]还相差甚远。因此,接下来需要我们通过误差反向传播算法来更新权值,重新计算输出,以缩小实际输出与期望输出之间的总误差。

    Step2 反向传播

    1. 计算总误差:

    本算例,引入均方根误差(MSE)求解实际输出与期望输出之间的总误差,计算公式为:

    E t o t a l = ∑ i = 1 n 1 2 ( t a r g e t − o u t p u t ) 2 E_{total}=\sum_{i=1}^n \frac{1}{2}(target-output)^2 Etotal=i=1n21(targetoutput)2

    备注: n n n表示输出神经元的个数 t a r g e t target target表示期望输出 o u t p u t output output表示实际输出

    在本算例中,神经网络有两个输出神经元,故 n = 2 n=2 n=2,总误差即为两者之和:
    E o 1 = 1 2 ( t a r g e t o 1 − o u t o 1 ) 2 = 1 2 ( 0.01 − 0.75136 ) 2 = 0.2748 \begin{aligned} E_{o_1}&=\frac{1}{2}(target_{o_1}-out_{o_1})^2\\ &=\frac{1}{2}(0.01-0.75136)^2\\ &=0.2748 \end{aligned} Eo1=21(targeto1outo1)2=21(0.010.75136)2=0.2748
    同理,可以计算 E o 2 E_{o_2} Eo2的值为:
    E o 2 = 0.02356 E_{o_2}=0.02356 Eo2=0.02356
    2. 输出层----> 隐藏层的权值更新:

    核心思想: 对于整个神经网络的总误差 E t o t a l E_{total} Etotal,通过 “链式求导法则” 依次对各权重 w i w_i wi求偏导,从而得知权重 w i w_i wi对总误差产生了多少影响。

    以总误差 E t o t a l E_{total} Etotal对权重 w 5 w_5 w5的偏导过程为例,其误差的反向传播过程如图所示:
    在这里插入图片描述
    根据“链式求导法则”,计算公式为:
    ∂ E t o t a l ∂ w 5 = E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ n e t o 1 ∗ ∂ n e t o 1 ∂ w 5 \frac{\partial E_{total}}{\partial w_5}=\frac{E_{total}}{\partial{out_{o_1}}}*\frac{\partial{out_{o_1}}}{\partial net_{o_1}}*\frac{{\partial{net_{o_1}}}}{\partial w_5} w5Etotal=outo1Etotalneto1outo1w5neto1
    接下来,分别计算每个偏导分式的值:

    (1)计算 E t o t a l ∂ o u t o 1 \frac{E_{total}}{\partial{out_{o_1}}} outo1Etotal的值:

    E t o t a l = 1 2 ( t a r g e t o 1 − o u t o 1 ) 2 + 1 2 ( t a r g e t o 2 − o u t o 2 ) 2 E_{total}=\frac{1}{2}(target_{o_1}-out_{o_1})^2+\frac{1}{2}(target_{o_2}-out_{o_2})^2 Etotal=21(targeto1outo1)2+21(targeto2outo2)2
    E t o t a l ∂ o u t o 1 = 2 ∗ 1 2 ( t a r g e t o 1 − o u t o 1 ) 2 − 1 ∗ ( − 1 ) + 0 = − ( t a r g e t o 1 − o u t o 1 ) = − ( 0.01 − 0.75136 ) = 0.74136 \begin{aligned} \frac{E_{total}}{\partial{out_{o_1}}}&=2*\frac{1}{2}(target_{o_1}-out_{o_1})^{2-1}*(-1)+0\\ &=-(target_{o_1}-out_{o_1})\\ &=-(0.01-0.75136)\\ &=0.74136 \end{aligned} outo1Etotal=221(targeto1outo1)21(1)+0=(targeto1outo1)=(0.010.75136)=0.74136

    (2)计算 ∂ o u t o 1 ∂ n e t o 1 \frac{\partial{out_{o_1}}}{\partial net_{o_1}} neto1outo1的值:
    o u t o 1 = 1 1 + e − n e t o 1 out_{o_1}=\frac{1}{1+e^{-net_{o_1}}} outo1=1+eneto11

    备注: 这一步实际上就是对Sigmoid函数求导。

    ∂ o u t o 1 ∂ n e t o 1 = o u t o 1 ( 1 − o u t o 1 ) = 0.75136 ∗ ( 1 − 0.75136 ) = 0.1868 \begin{aligned} \frac{\partial{out_{o_1}}}{\partial net_{o_1}}&=out_{o_1}(1-out_{o_1})\\ &=0.75136*(1-0.75136)\\ &=0.1868 \end{aligned} neto1outo1=outo1(1outo1)=0.75136(10.75136)=0.1868
    (3)计算 ∂ n e t o 1 ∂ w 5 \frac{{\partial{net_{o_1}}}}{\partial w_5} w5neto1的值:

    n e t o 1 = w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 2 ∗ 1 net_{o_1}=w_5*out_{h_1}+w_6*out_{h2}+b_2*1 neto1=w5outh1+w6outh2+b21

    ∂ n e t o 1 ∂ w 5 = o u t h 1 + 0 + 0 = o u t h 1 = 0.59327 \begin{aligned} \frac{{\partial{net_{o_1}}}}{\partial w_5}&=out_{h_1}+0+0\\ &=out_{h_1}\\ &=0.59327 \end{aligned} w5neto1=outh1+0+0=outh1=0.59327
    最终,根据 “链式求导法则” 将三者相乘得最终结果:
    ∂ E t o t a l ∂ w 5 = E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ n e t o 1 ∗ ∂ n e t o 1 ∂ w 5 = 0.74136 ∗ 0.1868 ∗ 0.59327 = 0.08216 \begin{aligned} \frac{\partial E_{total}}{\partial w_5}&=\frac{E_{total}}{\partial{out_{o_1}}}*\frac{\partial{out_{o_1}}}{\partial net_{o_1}}*\frac{{\partial{net_{o_1}}}}{\partial w_5}\\ &=0.74136*0.1868*0.59327\\ &=0.08216 \end{aligned} w5Etotal=outo1Etotalneto1outo1w5neto1=0.741360.18680.59327=0.08216
    至此,就完成了计算总体误差 E t o t a l E_{total} Etotal w 5 w_5 w5的求偏导全过程。

    回顾上述求解过程,发现:

    —————————————手动分割线—————————————

    ∂ E t o t a l ∂ w 5 = E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ n e t o 1 ∗ ∂ n e t o 1 ∂ w 5 = − ( t a r g e t o 1 − o u t o 1 ) ∗ o u t o 1 ( 1 − o u t o 1 ) ∗ o u t h 1 \begin{aligned} \frac{\partial E_{total}}{\partial w_5}&=\frac{E_{total}}{\partial{out_{o_1}}}*\frac{\partial{out_{o_1}}}{\partial net_{o_1}}*\frac{{\partial{net_{o_1}}}}{\partial w_5}\\ &=-(target_{o_1}-out_{o_1})*out_{o_1}(1-out_{o_1})*out_{h_1} \end{aligned} w5Etotal=outo1Etotalneto1outo1w5neto1=(targeto1outo1)outo1(1outo1)outh1

    —————————————手动分割线—————————————

    为了方便表达,用 δ o 1 \delta_{o_1} δo1来表示输出层的误差

    δ o 1 = E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ n e t o 1 = − ( t a r g e t o 1 − o u t o 1 ) ∗ o u t o 1 ( 1 − o u t o 1 ) \begin{aligned} \delta_{o_1}&=\frac{E_{total}}{\partial{out_{o_1}}}*\frac{\partial{out_{o_1}}}{\partial net_{o_1}}\\ &=-(target_{o_1}-out_{o_1})*out_{o_1}(1-out_{o_1}) \end{aligned} δo1=outo1Etotalneto1outo1=(targeto1outo1)outo1(1outo1)
    因此,总误差 E t o t a l E_{total} Etotal对权重 w 5 w_5 w5的偏导公式可以改写为:

    —————————————手动分割线—————————————

    ∂ E t o t a l ∂ w 5 = δ o 1 ∗ o u t h 1 \begin{aligned} \frac{\partial E_{total}}{\partial w_5}&=\delta_{o_1}*out_{h_1} \end{aligned} w5Etotal=δo1outh1

    —————————————手动分割线—————————————

    备注: 如果遇到输出层误差为负的情形,也可以将上述结果改写为:
    ∂ E t o t a l ∂ w 5 = − δ o 1 ∗ o u t h 1 \begin{aligned} \frac{\partial E_{total}}{\partial w_5}&=-\delta_{o_1}*out_{h_1} \end{aligned} w5Etotal=δo1outh1

    最后更新各个权重值:

    在本算例中,依旧以计算更新 w 5 w_5 w5的权重值为例:

    w 5 + = w 5 − η ∗ ∂ E t o t a l ∂ w 5 = 0.4 − 0.5 ∗ 0.08216 = 0.35892 \begin{aligned} w_5^+&=w_5-\eta*\frac{\partial E_{total}}{\partial w_5}\\ &=0.4-0.5*0.08216\\ &=0.35892 \end{aligned} w5+=w5ηw5Etotal=0.40.50.08216=0.35892

    备注: 此处, η \eta η表示学习率,这里假设 η = 0.5 \eta=0.5 η=0.5

    同理,可以计算更新 w 6 , w 7 , w 8 w_6, w_7, w_8 w6,w7,w8的值分别为:
    w 6 + = 0.40866 w 7 + = 0.51130 w 8 + = 0.56137 \begin{aligned} & w_6^+=0.40866\\ & w_7^+=0.51130\\ & w_8^+=0.56137 \end{aligned} w6+=0.40866w7+=0.51130w8+=0.56137

    3. 隐藏层----> 输入层的权值更新:

    核心原理: 计算隐藏层----> 输入层的权值更新的方法其实和计算输出层----> 隐藏层的权值更新方法类似。区别之处在于,上文在计算总误差对 w 5 w_5 w5的偏导时,是从 o u t o 1 → n e t o 1 → w 5 out_{o_1} → net_{o_1}→w_5 outo1neto1w5,但在计算隐藏层之间的权值更新时,是从 o u t h 1 → n e t h 1 → w 1 out_{h_1} → net_{h_1}→w_1 outh1neth1w1,然而 o u t h 1 out_{h_1} outh1会接受 E o 1 E_{o_1} Eo1 E o 2 E_{o_2} Eo2两个地方传递过来的误差,所以此处 E o u t h 1 E_{out_{h1}} Eouth1为二者的加和。 求解隐藏层 h 1 h_1 h1到输入层 i 1 i_1 i1的更新权值 w 1 w_1 w1的过程示意图如下:
    在这里插入图片描述
    计算过程:

    根据 “链式求导法则”,计算隐藏层 o u t h 1 out_{h_1} outh1 w 1 w_1 w1的偏导数公式为:

    ∂ E t o t a l ∂ w 1 = ∂ E t o t a l ∂ o u t h 1 ∗ ∂ o u t h 1 ∂ n e t h 1 ∗ ∂ n e t h 1 ∂ w 1 ↓ ∂ E t o t a l ∂ o u t h 1 = ∂ E o 1 ∂ o u t h 1 + ∂ E o 2 ∂ o u t h 1 \begin{aligned} \frac{\partial E_{total}}{\partial w_1}=&\frac{\partial E_{total}}{\partial{out_{h_1}}}*\frac{\partial{out_{h_1}}}{\partial net_{h_1}}*\frac{{\partial{net_{h_1}}}}{\partial w_1}\\ &\downarrow\\ &\frac{\partial E_{total}}{\partial{out_{h_1}}}=\frac{\partial E_{o_1}}{\partial{out_{h_1}}}+\frac{\partial E_{o_2}}{\partial{out_{h_1}}} \end{aligned} w1Etotal=outh1Etotalneth1outh1w1neth1outh1Etotal=outh1Eo1+outh1Eo2

    (1)计算 ∂ E t o t a l ∂ o u t h 1 \frac{\partial E_{total}}{\partial{out_{h_1}}} outh1Etotal

    接下来,分别计算 ∂ E o 1 ∂ o u t h 1 \frac{\partial E_{o_1}}{\partial{out_{h_1}}} outh1Eo1 ∂ E o 2 ∂ o u t h 1 \frac{\partial E_{o_2}}{\partial{out_{h_1}}} outh1Eo2

    根据公式

    —————————————手动分割线—————————————

    ∂ E o 1 ∂ o u t h 1 = ∂ E o 1 ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ n e t o 1 ∗ ∂ n e t o 1 ∂ o u t h 1 \begin{aligned} \frac{\partial E_{o_1}}{\partial{out_{h_1}}} &=\frac{\partial E_{o_1}}{\partial{out_{o_1}}}*\frac{\partial{out_{o_1}}}{\partial{net_{o_1}}}*\frac{\partial net_{o_1}}{\partial{out_{h_1}}} \end{aligned} outh1Eo1=outo1Eo1neto1outo1outh1neto1

    —————————————手动分割线—————————————

    其中,

    • 第一项

    由于
    E o 1 = 1 2 ( t a r g e t o 1 − o u t o 1 ) 2 E_{o_1}=\frac{1}{2}(target_{o_1}-out_{o_1})^2 Eo1=21(targeto1outo1)2
    所以,
    ∂ E o 1 ∂ o u t o 1 = − ( t a r g e t o 1 − o u t o 1 ) = − ( 0.01 − 0.75136 ) = 0.74136 \begin{aligned} \frac{\partial E_{o_1}}{\partial out_{o_1}}&=-(target_{o_1}-out_{o_1})\\ &=-(0.01-0.75136)\\ &=0.74136 \end{aligned} outo1Eo1=(targeto1outo1)=(0.010.75136)=0.74136

    • 第二项

    由于
    o u t o 1 = 1 1 + e − n e t o 1 out_{o_1}=\frac{1}{1+e^{-net_{o_1}}} outo1=1+eneto11
    所以,
    ∂ o u t o 1 ∂ n e t o 1 = o u t o 1 ( 1 − o u t o 1 ) = 0.75136 ∗ ( 1 − 0.75136 ) = 0.1868 \begin{aligned} \frac{\partial out_{o_1}}{\partial net_{o_1}}&=out_{o_1}(1-out_{o_1})\\ &=0.75136*(1-0.75136)\\ &=0.1868 \end{aligned} neto1outo1=outo1(1outo1)=0.75136(10.75136)=0.1868

    • 第三项

    由于
    n e t o 1 = w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 2 ∗ 1 net_{o_1}=w_5*out_{h_1}+w_6*out_{h_2}+b_2*1 neto1=w5outh1+w6outh2+b21
    因此,
    ∂ n e t o 1 ∂ o u t h 1 = w 5 = 0.04 \frac{\partial net_{o_1}}{\partial out_{h_1}}=w_5=0.04 outh1neto1=w5=0.04

    • 最后:
      ∂ E o 1 ∂ o u t h 1 = ∂ E o 1 ∂ o u t o 1 ∗ ∂ n e t o 1 ∂ o u t h 1 = 0.74136 ∗ 0.1868 ∗ 0.40 = 0.055399 \begin{aligned} \frac{\partial E_{o_1}}{\partial{out_{h_1}}} &=\frac{\partial E_{o_1}}{\partial{out_{o_1}}}*\frac{\partial net_{o_1}}{\partial{out_{h_1}}}\\ &=0.74136*0.1868*0.40\\&=0.055399\end{aligned} outh1Eo1=outo1Eo1outh1neto1=0.741360.18680.40=0.055399

    同理,可以计算出 ∂ E o 2 ∂ o u t h 1 \frac{\partial E_{o_2}}{\partial{out_{h_1}}} outh1Eo2:
    ∂ E o 1 ∂ o u t h 1 = − 0.019049 \frac{\partial E_{o_1}}{\partial{out_{h_1}}}=-0.019049 outh1Eo1=0.019049

    最终,二者相加得到总值:
    ∂ E t o t a l ∂ o u t h 1 = ∂ E o 1 ∂ o u t h 1 + ∂ E o 2 ∂ o u t h 1 = 0.055399 + ( − 0.019049 ) = 0.03635 \begin{aligned} \frac{\partial E_{total}}{\partial{out_{h_1}}}&=\frac{\partial E_{o_1}}{\partial{out_{h_1}}}+\frac{\partial E_{o_2}}{\partial{out_{h_1}}}\\ &=0.055399+(-0.019049)\\ &=0.03635 \end{aligned} outh1Etotal=outh1Eo1+outh1Eo2=0.055399+(0.019049)=0.03635

    (2)计算 ∂ o u t h 1 ∂ n e t h 1 \frac{\partial{out_{h_1}}}{\partial{net_{h_1}}} neth1outh1

    由于

    (a) n e t h 1 = w 1 ∗ i 1 + w 2 ∗ i 2 + b 1 ∗ 1 = 0.15 ∗ 0.05 + 0.2 ∗ 0.1 + 0.35 ∗ 1 = 0.3775 \begin{aligned} net_{h_1}&=w_1*i_1+w_2*i_2+b_1*1\\ &=0.15*0.05+0.2*0.1+0.35*1\\ &=0.3775 \end{aligned} neth1=w1i1+w2i2+b11=0.150.05+0.20.1+0.351=0.3775
    (b)
    o u t h 1 = 1 1 + e − n e t h 1 = 0.59327 out_{h_1}=\frac{1}{1+e^{-net_{h_1}}}=0.59327 outh1=1+eneth11=0.59327
    所以,
    ∂ o u t h 1 ∂ n e t h 1 = o u t h 1 ( 1 − o u t h 1 ) = 0.59327 ∗ ( 1 − 0.59327 ) = 0.2413 \begin{aligned} \frac{\partial out_{h_1}}{\partial net_{h_1}}&=out_{h_1}(1-out_{h_1})\\ &=0.59327*(1-0.59327)\\ &=0.2413 \end{aligned} neth1outh1=outh1(1outh1)=0.59327(10.59327)=0.2413
    (3)计算 ∂ n e t h 1 ∂ w 1 \frac{\partial{net_{h_1}}}{\partial w_1} w1neth1
    由于
    n e t h 1 = w 1 ∗ i 1 + w 2 ∗ i 2 + b 1 ∗ 1 \begin{aligned} net_{h_1}&=w_1*i_1+w_2*i_2+b_1*1 \end{aligned} neth1=w1i1+w2i2+b11
    所以,
    ∂ n e t h 1 ∂ w 1 = i 1 = 0.05 \begin{aligned} \frac{\partial{net_{h_1}}}{\partial w_1}&=i_1=0.05 \end{aligned} w1neth1=i1=0.05

    因此,求得 ∂ E t o t a l ∂ w 1 \frac{\partial{E_{total}}}{\partial w_1} w1Etotal

    ∂ E t o t a l ∂ w 1 = ∂ E t o t a l ∂ o u t h 1 ∗ ∂ o u t h 1 ∂ n e t h 1 ∗ ∂ n e t h 1 ∂ w 1 = 0.03635 ∗ 0.2413 ∗ 0.05 = 0.000438 \begin{aligned} \frac{\partial E_{total}}{\partial w_1}&=\frac{\partial E_{total}}{\partial{out_{h_1}}}*\frac{\partial{out_{h_1}}}{\partial net_{h_1}}*\frac{{\partial{net_{h_1}}}}{\partial w_1}\\ &=0.03635*0.2413*0.05\\ &=0.000438 \end{aligned} w1Etotal=outh1Etotalneth1outh1w1neth1=0.036350.24130.05=0.000438

    备注: 为了简化公式,可以使用 δ h 1 δ_{h_1} δh1来表示隐藏层单元 h 1 h_1 h1的误差:
    ∂ E t o t a l ∂ w 1 = ( ∑ o ∂ E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ n e t o 1 ∗ ∂ n e t o 1 ∂ o u t h 1 ) ∗ ∂ o u t h 1 ∂ n e t h 1 ∗ ∂ n e t h 1 ∂ w 1 = ( ∑ o δ o ∗ w h o ) ∗ o u t h 1 ( 1 − o u t h 1 ) ∗ i 1 = δ h 1 ∗ i 1 \begin{aligned} \frac{\partial E_{total}}{\partial w_1}&=\bigg(\sum_o\frac{\partial E_{total}}{\partial{out_{o_1}}}*\frac{\partial out_{o_1}}{\partial net_{o_1}}*\frac{\partial net_{o_1}}{\partial out_{h_1}}\bigg)*\frac{\partial{out_{h_1}}}{\partial net_{h_1}}*\frac{{\partial{net_{h_1}}}}{\partial w_1}\\ &=\big(\sum_oδ_o*w_{h_o}\big)*out_{h_1}(1-out_{h_1})*i_1\\ &=δ_{h_1}*i_1 \end{aligned} w1Etotal=(oouto1Etotalneto1outo1outh1neto1)neth1outh1w1neth1=(oδowho)outh1(1outh1)i1=δh1i1

    最终, 更新权重 w 1 w_1 w1的计算公式如下:

    —————————————手动分割线—————————————

    w 1 + = w 1 − η ∗ ∂ E t o t a l ∂ w 1 = 0.15 − 0.5 ∗ 0.000438 = 0.14978 \begin{aligned} w_1^+&= w_1-\eta*\frac{\partial E_{total}}{\partial w_1}\\ &=0.15-0.5*0.000438\\ &=0.14978 \end{aligned} w1+=w1ηw1Etotal=0.150.50.000438=0.14978

    —————————————手动分割线—————————————

    同理,可以分别求得 w 2 , w 3 , w 4 w_2, w_3, w_4 w2,w3,w4的更新权值:
    w 2 + = 0.19956 w 3 + = 0.24975 w 4 + = 0.29950 \begin{aligned} w_2^+&= 0.19956\\ w_3^+&= 0.24975\\ w_4^+&= 0.29950 \end{aligned} w2+w3+w4+=0.19956=0.24975=0.29950

    展开全文
  • BP算法是适用于多层神经网络的一种算法,它是建立在梯度下降法的基础上的,本文着重推导怎样利用梯度下降法来minimise Loss Function。

    BP算法是适用于多层神经网络的一种算法,它是建立在梯度下降法的基础上的。本文着重推导怎样利用梯度下降法来minimise Loss Function。

    给出多层神经网络的示意图:
    在这里插入图片描述

    1.定义Loss Function

    假设有一组数据样本 x 1 x^{1} x1 x 2 x^{2} x2,… ,每一个x都有很多个特征,输入x,会得到一个输出y,每一个输出都对应一个损失函数L,将所有L加起来就是total loss。
    那么每一个L该如何定义呢?这里还是采用了交叉熵,如下所示:
    在这里插入图片描述
    这里的 y i y^{i} yi是真实输出, y ^ y\hat{} y^是y target,是人为定义的。最终Total Loss的表达式如下:
    在这里插入图片描述

    2.Gradient Descent

    L对应了一个参数,即Network parameters θ(w1,w2…b1,b2…),那么Gradient Descent就是求出参数 θ ∗ \theta^{*} θ来minimise Loss Function,即:
    在这里插入图片描述
    梯度下降的具体步骤为:
    图源:李宏毅机器学习讲稿

    3.求偏微分

    从上图可以看出,这里难点主要是求偏微分,由于L是所有损失之和,因此我们只需要对其中一个损失求偏微分,最后再求和即可。
    先抽取一个简单的神经元来解释:在这里插入图片描述
    先理一理各个变量之间的关系:我们要求的是Total Loss对参数w的偏导,而Total Loss是一个个小的l累加得到的,因此,我们只需要求得 ∂ l ∂ w \frac{\partial l}{\partial w} wl,而 l = − y ^ l n y l=-\hat{y}lny l=y^lny,其中 y ^ \hat{y} y^是人为定义的,跟w没有关系,因此我们只需要知道 ∂ y ∂ w \frac{\partial y}{\partial w} wy。l跟z有关系,根据链式求导法则,我们需要求 ∂ l ∂ z \frac{\partial l}{\partial z} zl ∂ z ∂ w \frac{\partial z}{\partial w} wz,其中 ∂ z ∂ w \frac{\partial z}{\partial w} wz的求解较为容易,如下图所示:
    在这里插入图片描述
    ∂ l ∂ z \frac{\partial l}{\partial z} zl是一个难点,因为我们并不知道后面到底有多少层,也不知道情况到底有多复杂,我们不妨先取一种最简单的情况,如下所示:
    在这里插入图片描述

    4.反向传播

    在第一张图里面,我们经过正向传播很容易求出了 ∂ z ∂ w \frac{\partial z}{\partial w} wz,而对于 ∂ l ∂ z \frac{\partial l}{\partial z} zl,则并不是那么好求。上图其实就是运用了反向传播的思想, 对于上图中 ∂ l ∂ z \frac{\partial l}{\partial z} zl最后的表达式,我们可以换一种结构,如下所示:
    在这里插入图片描述
    l对两个z的偏导我们假设是已知的,并且在这里是作为输入,三角形结构可以理解为一个乘法运算电路,其放大系数为 σ ′ ( z ) \sigma {}'(z) σ(z)。但是在实际情况中,l对两个z的偏导是未知的。假设神经网络最终的结构就是如上图所示,那么我们的问题已经解决了:
    在这里插入图片描述
    其中:
    在这里插入图片描述
    但是假如该神经元不是最后一层,我们又该如何呢?比如又多了一层,如下所示:
    在这里插入图片描述
    那么我们只要知道 ∂ l ∂ z a \frac{\partial l}{\partial z_{a}} zal ∂ l ∂ z b \frac{\partial l}{\partial z_{b}} zbl,我们同样可以算出 ∂ l ∂ z ′ \frac{\partial l}{\partial z{}'} zl以及 ∂ l ∂ z ′ ′ \frac{\partial l}{\partial z{}''} zl,原理跟上面类似,如下所示:
    在这里插入图片描述
    ∂ l ∂ z b \frac{\partial l}{\partial z_{b}} zbl同样是l先对y求导,y再对 z b z_{b} zb求导。

    那假设我们再加一层呢?再加两层呢?再加三层呢?。。。,情况还是一样的,还是先求l对最后一层z的导数,乘以权重相加后最后再乘上 σ ′ ( z ′ ′ , z ′ ′ ′ , . . . ) \sigma {}'(z{}'',z{}''',...) σ(z,z,...)即可。
    最后给一个实例:
    在这里插入图片描述
    它的反向传播图长这样:
    在这里插入图片描述
    我们可以很轻松的算出 ∂ l ∂ z 5 \frac{\partial l}{\partial z_{5}} z5l ∂ l ∂ z 6 \frac{\partial l}{\partial z_{6}} z6l,算出这两个之后,根据上面我们找到的关系式,我们也可以轻易算出 ∂ l ∂ z 3 \frac{\partial l}{\partial z_{3}} z3l ∂ l ∂ z 4 \frac{\partial l}{\partial z_{4}} z4l,最后再算出 ∂ l ∂ z 1 \frac{\partial l}{\partial z_{1}} z1l ∂ l ∂ z 2 \frac{\partial l}{\partial z_{2}} z2l。然后 ∂ l ∂ z 1 \frac{\partial l}{\partial z_{1}} z1l ∂ l ∂ z 2 \frac{\partial l}{\partial z_{2}} z2l再分别乘上x1和x2,就是我们最终要找的 ∂ l ∂ w 1 \frac{\partial l}{\partial w_{1}} w1l ∂ l ∂ w 2 \frac{\partial l}{\partial w_{2}} w2l
    我们不难发现,这种计算方式很清楚明了地体现了“反向传播”四个字。
    好了,目标达成!!
    在这里插入图片描述

    5.总结

    通过Forward Pass我们求得 ∂ z ∂ w = a \frac{\partial z}{\partial w}=a wz=a,然后通过Backward Pass我们求得 ∂ l ∂ z \frac{\partial l}{\partial z} zl,二者相乘,就是 ∂ l ∂ w \frac{\partial l}{\partial w} wl。利用上述方法求得所有参数的值之后,我们就可以用梯度下降法来更新参数,直至找到最优解。

    展开全文
  • 深度学习(一):DNN前向传播算法和反向传播算法

    万次阅读 多人点赞 2018-11-29 17:32:13
    文章目录一、深度神经网络(DNN)模型1.1 从感知机到神经网络1.2 DNN的基本结构二、DNN前向传播算法2.1 DNN前向传播算法数学原理2.2 DNN前向传播算法2.3 DNN前向传播算法小结三、DNN反向传播算法3.1 DNN反向传播算法...

    一、深度神经网络(DNN)模型

    深度神经网络(Deep Neural Networks, 以下简称DNN)是深度学习的基础,而要理解DNN,首先我们要理解DNN模型,下面我们就对DNN的模型与前向传播算法做一个总结。

    1.1 从感知机到神经网络

    感知机的模型大家都比较熟悉,它是一个有若干输入和一个输出的模型,如下图:
    在这里插入图片描述

    输出和输入之间学习到一个线性关系,得到中间输出结果:
    z = ∑ i = 1 m w i x i + b z=\sum\limits_{i=1}^mw_ix_i + b z=i=1mwixi+b

    接着是一个神经元激活函数:
    s i g n ( z ) = { − 1 z < 0 1 z ≥ 0 sign(z)= \begin{cases} -1& {z<0}\\ 1& {z\geq 0} \end{cases} sign(z)={11z<0z0

    从而得到我们想要的输出结果1或者-1。

    这个模型只能用于二元分类,且无法学习比较复杂的非线性模型,因此在工业界无法使用。

    而神经网络则在感知机的模型上做了扩展,总结下主要有三点:

    1)加入了隐藏层,隐藏层可以有多层,增强模型的表达能力,如下图实例,当然增加了这么多隐藏层模型的复杂度也增加了好多。
    在这里插入图片描述

    2)输出层的神经元也可以不止一个输出,可以有多个输出,这样模型可以灵活的应用于分类回归,以及其他的机器学习领域比如降维和聚类等。多个神经元输出的输出层对应的一个实例如下图,输出层现在有4个神经元了。
    在这里插入图片描述

    3) 对激活函数做扩展,感知机的激活函数是 s i g n ( z ) sign(z) sign(z),虽然简单但是处理能力有限,因此神经网络中一般使用的其他的激活函数,比如我们在逻辑回归里面使用过的Sigmoid函数,即:
    f ( z ) = 1 1 + e − z f(z)=\frac{1}{1+e^{-z}} f(z)=1+ez1

    还有后来出现的tanx, softmax,和ReLU等。通过使用不同的激活函数,神经网络的表达能力进一步增强。对于各种常用的激活函数,我随后会整理一份资料。

    1.2 DNN的基本结构

    上一节我们了解了神经网络基于感知机的扩展,而DNN可以理解为有很多隐藏层的神经网络。这个很多其实也没有什么度量标准, 多层神经网络和深度神经网络DNN其实也是指的一个东西,当然,DNN有时也叫做多层感知机(Multi-Layer perceptron,MLP), 名字实在是多。后面我们讲到的神经网络都默认为DNN。

    从DNN按不同层的位置划分,DNN内部的神经网络层可以分为三类,输入层,隐藏层和输出层,如下图示例,一般来说第一层是输入层,最后一层是输出层,而中间的层数都是隐藏层。
    在这里插入图片描述

    层与层之间是全连接的,也就是说,第 i i i层的任意一个神经元一定与第 i + 1 i+1 i+1层的任意一个神经元相连。虽然DNN看起来很复杂,但是从小的局部模型来说,还是和感知机一样,即一个线性关系 z = ∑ w i x i + b z=\sum\limits w_ix_i + b z=wixi+b 加上一个激活函数 σ ( z ) \sigma(z) σ(z)

    由于DNN层数多,则我们的线性关系系数 w w w和偏倚 b b b的数量也就是很多了。具体的参数在DNN是如何定义的呢?

    首先我们来看看线性关系系数 w w w的定义。以下图一个三层的DNN为例,第二层的第4个神经元到第三层的第2个神经元的线性系数定义为 w 24 3 w_{24}^3 w243。上标3代表线性系数 w w w所在的层数,而下标对应的是输出的第三层索引2和输入的第二层索引4。你也许会问,为什么不是 w 42 3 w_{42}^3 w423, 而是 w 24 3 w_{24}^3 w243呢?这主要是为了便于模型用于矩阵表示运算,如果是 w 42 3 w_{42}^3 w423每次进行矩阵运算是 w T x + b w^Tx+b wTx+b,需要进行转置。将输出的索引放在前面的话,则线性运算不用转置,即直接为 w x + b wx+b wx+b总结下,第 l − 1 l−1 l1层的第 k k k个神经元到第 l l l层的第 j j j个神经元的线性系数定义为 w j k l w_{jk}^l wjkl。注意,输入层是没有 w w w参数的。
    在这里插入图片描述

    再来看看偏倚 b b b的定义。还是以这个三层的DNN为例,第二层的第3个神经元对应的偏倚定义为 b 3 2 b_3^{2} b32。其中,上标2代表所在的层数,下标3代表偏倚所在的神经元的索引。输入层是没有偏倚参数 b b b的。

    同样的道理,对于神经元的激活值而言,第3层的第1个神经元的激活值应该表示为 a 1 3 a_1^{3} a13
    在这里插入图片描述

    二、DNN前向传播算法

    2.1 DNN前向传播算法数学原理

    在上一节,我们已经介绍了DNN各层线性关系系数 w w w和偏倚 b b b的定义。假设我们选择的激活函数是 σ ( z ) \sigma(z) σ(z),隐藏层和输出层的输出值为 a a a,则对于下图的三层DNN,利用和感知机一样的思路,我们可以利用上一层的输出计算下一层的输出,也就是所谓的DNN前向传播算法。
    在这里插入图片描述
    对于第二层的的输出 a 1 2 , a 2 2 , a 3 2 a_1^2,a_2^2,a_3^2 a12,a22,a32,我们有:
    a 1 2 = σ ( z 1 2 ) = σ ( w 11 2 x 1 + w 12 2 x 2 + w 13 2 x 3 + b 1 2 ) a_1^2=\sigma(z_1^2) = \sigma(w_{11}^2x_1 + w_{12}^2x_2 + w_{13}^2x_3 + b_1^{2}) a12=σ(z12)=σ(w112x1+w122x2+w132x3+b12)

    a 2 2 = σ ( z 2 2 ) = σ ( w 21 2 x 1 + w 22 2 x 2 + w 23 2 x 3 + b 2 2 ) a_2^2=\sigma(z_2^2) = \sigma(w_{21}^2x_1 + w_{22}^2x_2 + w_{23}^2x_3 + b_2^{2}) a22=σ(z22)=σ(w212x1+w222x2+w232x3+b22)

    a 3 2 = σ ( z 3 2 ) = σ ( w 31 2 x 1 + w 32 2 x 2 + w 33 2 x 3 + b 3 2 ) a_3^2=\sigma(z_3^2) = \sigma(w_{31}^2x_1 + w_{32}^2x_2 + w_{33}^2x_3 + b_3^{2}) a32=σ(z32)=σ(w312x1+w322x2+w332x3+b32)

    对于第三层的的输出 a 1 3 a_1^3 a13,我们有:
    a 1 3 = σ ( z 1 3 ) = σ ( w 11 3 a 1 2 + w 12 3 a 2 2 + w 13 3 a 3 2 + b 1 3 ) a_1^3=\sigma(z_1^3) = \sigma(w_{11}^3a_1^2 + w_{12}^3a_2^2 + w_{13}^3a_3^2 + b_1^{3}) a13=σ(z13)=σ(w113a12+w123a22+w133a32+b13)

    将上面的例子一般化,假设第 l − 1 l−1 l1层共有 m m m个神经元,则对于第 l l l层的第 j j j个神经元的输出 a j l a_j^l ajl,我们有:
    a j l = σ ( z j l ) = σ ( ∑ k = 1 m w j k l a k l − 1 + b j l ) a_j^l = \sigma(z_j^l) = \sigma(\sum\limits_{k=1}^mw_{jk}^la_k^{l-1} + b_j^l) ajl=σ(zjl)=σ(k=1mwjklakl1+bjl)

    其中,如果 l = 2 l=2 l=2,则对于的 a k 1 a_k^1 ak1即为输入层的 x k x_k xk

    从上面可以看出,使用代数法一个个的表示输出比较复杂,而如果使用矩阵法则比较的简洁。假设第 l − 1 l−1 l1层共有 m m m个神经元,而第 l l l层共有 n n n个神经元,则第 l l l层的线性系数 w w w组成了一个 n × m n×m n×m的矩阵 W l W^l Wl, 第 l l l层的偏倚 b b b组成了一个 n × 1 n×1 n×1的向量 b l b^l bl , 第 l − 1 l−1 l1层的输出 a a a组成了一个 m × 1 m×1 m×1的向量 a l − 1 a^{l−1} al1,第 l l l层的未激活前线性输出 z z z组成了一个 n × 1 n×1 n×1的向量 z l z^l zl, 第 l l l层的的输出 a a a组成了一个 n × 1 n×1 n×1的向量 a l a^l al。则用矩阵法表示,第 l l l层的输出为:
    a l = σ ( z l ) = σ ( W l a l − 1 + b l ) a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l) al=σ(zl)=σ(Wlal1+bl)

    这个表示方法简洁漂亮,后面我们的讨论都会基于上面的这个矩阵法表示来。所以,应该时刻记住我们符号的含义,否则在后面推导反向传播公式时会比较懵。

    2.2 DNN前向传播算法

    有了上一节的数学推导,DNN的前向传播算法也就不难了。所谓的DNN的前向传播算法也就是利用我们的若干个权重系数矩阵 W W W和偏倚向量 b b b来和输入值向量 x x x进行一系列线性运算和激活运算,从输入层开始,一层层的向后计算,一直到运算到输出层,得到输出结果为止 。

    输入: 总层数 L L L,所有隐藏层和输出层对应的矩阵 W W W,偏倚向量 b b b,输入值向量 x x x
    输出:输出层的输出 a L a^L aL

    • 1) 初始化 a 1 = x a^1=x a1=x

    • 2) for l = 2 l=2 l=2 to L L L, 计算:

    a l = σ ( z l ) = σ ( W l a l − 1 + b l ) a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l) al=σ(zl)=σ(Wlal1+bl)

    最后的结果即为输出 a L a^L aL

    2.3 DNN前向传播算法小结

    单独看DNN前向传播算法,似乎没有什么大用处,而且这一大堆的矩阵 W W W,偏倚向量 b b b对应的参数怎么获得呢?怎么得到最优的矩阵 W W W,偏倚向量 b b b呢?这个我们在下一章讲DNN的反向传播算法时再讲。而理解反向传播算法的前提就是理解DNN的模型与前向传播算法。这也是我们先讲前向传播算法的原因。

    三、DNN反向传播算法

    3.1 DNN反向传播算法要解决的问题

    在了解DNN的反向传播算法(Back Propagation,BP)前,我们先要知道DNN反向传播算法要解决的问题,也就是说,什么时候我们需要这个反向传播算法?

    回到我们监督学习的一般问题,假设我们有 m m m个训练样本: { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } \{(x_1,y_1), (x_2,y_2), ..., (x_m,y_m)\} {(x1,y1),(x2,y2),...,(xm,ym)},其中 x x x为输入向量,特征维度为 n i n n_{in} nin,而 y y y为输出向量,特征维度为 n o u t n_{out} nout。我们需要利用这 m m m个样本训练出一个模型,当有一个新的测试样本 ( x t e s t , ? ) (x_{test},?) (xtest,?)来到时, 我们可以预测 y t e s t y_{test} ytest向量的输出。

    如果我们采用DNN的模型,即我们使输入层有 n i n n_{in} nin个神经元,而输出层有 n o u t n_{out} nout个神经元。再加上一些含有若干神经元的隐藏层。此时我们需要找到合适的所有隐藏层和输出层对应的线性系数矩阵 W W W和偏倚向量 b b b,让所有的训练样本输入计算出的输出尽可能的等于或很接近样本输出。怎么找到合适的参数呢?

    如果大家对传统的机器学习的算法优化过程熟悉的话,这里就很容易联想到我们可以用一个合适的损失函数来度量训练样本的输出损失,接着对这个损失函数进行优化求最小化的极值,对应的一系列线性系数矩阵 W W W和偏倚向量 b b b即为我们的最终结果。在DNN中,损失函数优化极值求解的过程最常见的一般是通过梯度下降法来一步步迭代完成的,当然也可以是其他的迭代方法比如牛顿法与拟牛顿法。

    对DNN的损失函数用梯度下降法进行迭代优化求极小值的过程即为我们的反向传播算法。

    3.2 DNN反向传播算法的基本思路

    在进行DNN反向传播算法前,我们需要选择一个损失函数,来度量训练样本计算出的输出和真实的训练样本输出之间的损失。你也许会问:训练样本计算出的输出是怎么得来的?这个输出是随机选择一系列 W , b W,b W,b,用前向传播算法计算出来的。即通过一系列的计算: a l = σ ( z l ) = σ ( W l a l − 1 + b l ) a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l) al=σ(zl)=σ(Wlal1+bl)。计算到输出层第 L L L层对应的 a L a^L aL即为前向传播算法计算出来的输出。

    回到损失函数,DNN可选择的损失函数有不少,为了专注算法,这里我们使用最常见的均方差来度量损失。当然,针对不同的任务,可以选择不同的损失函数。即对于每个样本,我们期望最小化下式:
    J ( W , b , x , y ) = 1 2 ∣ ∣ a L − y ∣ ∣ 2 2 J(W,b,x,y) = \frac{1}{2}||a^L-y||_2^2 J(W,b,x,y)=21aLy22

    其中, a L a^L aL y y y为特征维度为 n o u t n_{out} nout的向量,而 ∣ ∣ S ∣ ∣ 2 ||S||_2 S2 S S S的L2范数。

    损失函数有了,现在我们开始用梯度下降法迭代求解每一层的 W , b W,b W,b

    注:以下是BP算法推导的过程,是本文最核心,也是神经网络最基本的公式推导。

    思路第一步:
    首先是输出层第 L L L层。注意到输出层的 W , b W,b W,b满足下式:
    a L = σ ( z L ) = σ ( W L a L − 1 + b L ) (1) a^L = \sigma(z^L) = \sigma(W^La^{L-1} + b^L) \qquad \text{(1)} aL=σ(zL)=σ(WLaL1+bL)(1)

    这样对于输出层的参数,我们的损失函数变为:
    J ( W , b , x , y ) = 1 2 ∣ ∣ a L − y ∣ ∣ 2 2 = 1 2 ∣ ∣ σ ( W L a L − 1 + b L ) − y ∣ ∣ 2 2 (2) J(W,b,x,y) = \frac{1}{2}||a^L-y||_2^2 = \frac{1}{2}|| \sigma(W^La^{L-1} + b^L)-y||_2^2 \qquad \text{(2)} J(W,b,x,y)=21aLy22=21σ(WLaL1+bL)y22(2)

    这样求解 W , b W,b W,b的梯度就简单了:
    ∂ J ( W , b , x , y ) ∂ W L = ∂ J ( W , b , x , y ) ∂ z L ∂ z L ∂ W L = ∂ J ( W , b , x , y ) ∂ a L ∂ a L ∂ z L ∂ z L ∂ W L = ( a L − y ) ⊙ σ ′ ( z L ) ( a L − 1 ) T (3) \frac{\partial J(W,b,x,y)}{\partial W^L} = \frac{\partial J(W,b,x,y)}{\partial z^L}\frac{\partial z^L}{\partial W^L} =\frac{\partial J(W,b,x,y)}{\partial a^L}\frac{\partial a^L}{\partial z^L}\frac{\partial z^L}{\partial W^L} =(a^L-y) \odot \sigma^{'}(z^L)(a^{L-1})^T\qquad \text{(3)} WLJ(W,b,x,y)=zLJ(W,b,x,y)WLzL=aLJ(W,b,x,y)zLaLWLzL=(aLy)σ(zL)(aL1)T(3)

    ∂ J ( W , b , x , y ) ∂ b L = ∂ J ( W , b , x , y ) ∂ z L ∂ z L ∂ b L = ∂ J ( W , b , x , y ) ∂ a L ∂ a L ∂ z L ∂ z L ∂ b L = ( a L − y ) ⊙ σ ′ ( z L ) (4) \frac{\partial J(W,b,x,y)}{\partial b^L} = \frac{\partial J(W,b,x,y)}{\partial z^L}\frac{\partial z^L}{\partial b^L} =\frac{\partial J(W,b,x,y)}{\partial a^L}\frac{\partial a^L}{\partial z^L}\frac{\partial z^L}{\partial b^L}=(a^L-y)\odot \sigma^{'}(z^L)\qquad \text{(4)} bLJ(W,b,x,y)=zLJ(W,b,x,y)bLzL=aLJ(W,b,x,y)zLaLbLzL=(aLy)σ(zL)(4)

    注意上式中有一个符号 ⊙ \odot ,它代表Hadamard积,对于两个维度相同的向量 A ( a 1 , a 2 , . . . a n ) T A(a_1,a_2,...a_n)^T Aa1,a2,...anT B ( b 1 , b 2 , . . . b n ) T B(b_1,b_2,...b_n)^T Bb1,b2,...bnT,则 A ⊙ B = ( a 1 b 1 , a 2 b 2 , . . . a n b n ) T A \odot B = (a_1b_1, a_2b_2,...a_nb_n)^T AB=(a1b1,a2b2,...anbn)T


    对于公式(3)和(4),我在这里多解释一下为什么是这样:

    对于公式(3):前两项之所以是Hadamard积的形式,是因为 ∂ J ( W , b , x , y ) ∂ a L ∂ a L ∂ z L \frac{\partial J(W,b,x,y)}{\partial a^L}\frac{\partial a^L}{\partial z^L} aLJ(W,b,x,y)zLaL都是针对同一层的神经元。如果我们考虑对于 L L L层的第 j j j个神经元,即 ∂ J ( W , b , x , y ) ∂ a j L σ ′ ( z j L ) \frac{\partial J(W,b,x,y)}{\partial a_j^L}\sigma^{'}(z_j^L) ajLJ(W,b,x,y)σ(zjL),那么整合这一层的神经元,自然是 ( a L − y ) ⊙ σ ′ ( z L ) (a^L-y) \odot \sigma^{'}(z^L) (aLy)σ(zL)这样Hadamard积的形式。那么 ( a L − 1 ) T (a^{L-1})^T (aL1)T为什么在(3)中的最后呢?这涉及到矩阵求导的知识,不是我们本文的重点。在这里,用到的知识是:如果
    Y = W X + B Y=WX+B Y=WX+B

    那么
    ∂ C ∂ W = ∂ C ∂ Y X T \frac{\partial C}{\partial W}=\frac{\partial C}{\partial Y}X^T WC=YCXT

    这样,即可推出公式(3)。公式(4)与公式(3)类似。


    思路第二步:
    我们注意到在求解输出层的 W , b W,b W,b的时候,有公共的部分 ∂ J ( W , b , x , y ) ∂ z L \frac{\partial J(W,b,x,y)}{\partial z^L} zLJ(W,b,x,y),因此我们可以把公共的部分即对 z L z^L zL先算出来,记为:
    δ L = ∂ J ( W , b , x , y ) ∂ z L = ( a L − y ) ⊙ σ ′ ( z L ) (5) \delta^L = \frac{\partial J(W,b,x,y)}{\partial z^L} = (a^L-y)\odot \sigma^{'}(z^L) \qquad \text{(5)} δL=zLJ(W,b,x,y)=(aLy)σ(zL)(5)

    根据公式(3)(4),我们可以把输出层的梯度算出来,那么如何计算上一层 L − 1 L−1 L1层的梯度,上上层 L − 2 L−2 L2层的梯度呢?这里我们需要一步步的递推,注意到对于第 l l l层的未激活输出 z l z^l zl,它的梯度可以表示为:
    δ l = ∂ J ( W , b , x , y ) ∂ z l = ∂ J ( W , b , x , y ) ∂ z L ∂ z L ∂ z L − 1 ∂ z L − 1 ∂ z L − 2 . . . ∂ z l + 1 ∂ z l (6) \delta^l =\frac{\partial J(W,b,x,y)}{\partial z^l} = \frac{\partial J(W,b,x,y)}{\partial z^L}\frac{\partial z^L}{\partial z^{L-1}}\frac{\partial z^{L-1}}{\partial z^{L-2}}...\frac{\partial z^{l+1}}{\partial z^{l}}\qquad \text{(6)} δl=zlJ(W,b,x,y)=zLJ(W,b,x,y)zL1zL