精华内容
下载资源
问答
  • 反向传播

    千次阅读 多人点赞 2019-05-18 22:58:54
    误差反向传播算法简称反向传播算法(Back Propagation)。使用反向传播算法的多层感知器又称为BP神经网络。 BP算法是一个迭代算法,它的基本思想如下: 将训练集数据输入到神经网络的输入层,经过隐藏层,最后达到...

    简介

    误差反向传播算法简称反向传播算法(Back Propagation)。使用反向传播算法的多层感知器又称为BP神经网络。

    BP算法是一个迭代算法,它的基本思想如下:

    1. 将训练集数据输入到神经网络的输入层,经过隐藏层,最后达到输出层并输出结果,这就是前向传播过程。
    2. 由于神经网络的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
    3. 在反向传播的过程中,根据误差调整各种参数的值(相连神经元的权重),使得总损失函数减小。
    4. 迭代上述三个步骤(即对数据进行反复训练),直到满足停止准则。

    示例

    有如下一个神经网络:

    1.png

    第一层是输入层,包含两个神经元 i 1 i_1 i1 i 2 i_2 i2 和偏置项 b 1 b_1 b1;第二层是隐藏层,包含两个神经元 h 1 h_1 h1 h 2 h_2 h2 和偏置项 b 2 b_2 b2;第三层是输出 o 1 o_1 o1 o 2 o_2 o2。每条线上标的 w i w_i wi 是层与层之间连接的权重。激活函数是 s i g m o d sigmod sigmod 函数。我们用 z z z 表示某神经元的加权输入和;用 a a a 表示某神经元的输出。

    上述各参数赋值如下:

    参数
    i 1 i_1 i10.05
    i 2 i_2 i20.10
    w 1 w_1 w10.15
    w 2 w_2 w20.20
    w 3 w_3 w30.25
    w 4 w_4 w40.30
    w 5 w_5 w50.40
    w 6 w_6 w60.45
    w 7 w_7 w70.50
    w 8 w_8 w80.55
    b 1 b_1 b10.35
    b 2 b_2 b20.60
    o 1 o_1 o10.01
    o 2 o_2 o20.99

    Step 1 前向传播

    输入层 —> 隐藏层

    神经元 h 1 h_1 h1 的输入加权和:
    输入加权和
    神经元 h 1 h_1 h1 的输出 a h 1 a_{h1} ah1
    a h 1 = 1 1 + e − z h 1 = 1 1 + e − 0.3775 = 0.593269992 a_{h1} = \frac{1}{1+e^{-z_{h1}}} = \frac{1}{1+e^{-0.3775}} = 0.593269992 ah1=1+ezh11=1+e0.37751=0.593269992
    同理可得,神经元 h 2 h_2 h2 的输出 a h 2 a_{h2} ah2
    a h 2 = 0.596884378 a_{h2} = 0.596884378 ah2=0.596884378

    隐藏层 —> 输出层

    计算输出层神经元 o 1 o1 o1 o 2 o2 o2 的值:
    隐藏层->输出层
    前向传播的过程就结束了,我们得到的输出值是 [ 0.751365069 , 0.772928465 ] [0.751365069, 0.772928465] [0.751365069,0.772928465] ,与实际值 [ 0.01 , 0.99 ] [0.01, 0.99] [0.01,0.99] 相差还很远。接下来我们对误差进行反向传播,更新权值,重新计算输出。

    Step 2 反向传播

    1. 计算损失函数:

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

    但是有两个输出,所以分别计算 o 1 o_1 o1 o 2 o_2 o2 的损失值,总误差为两者之和:
    E o 1 = 1 2 ( 0.01 − 0.751365069 ) 2 = 0.274811083 E o 2 = 1 2 ( 0.99 − 0.772928465 ) 2 = 0.023560026 E t o t a l = E o 1 + E o 2 = 0.274811083 + 0.023560026 = 0.298371109 E_{o_1} = \frac {1}{2}(0.01 - 0.751365069)^2 = 0.274811083 \\ E_{o_2} = \frac {1}{2}(0.99 - 0.772928465)^2 = 0.023560026 \\ E_{total} = E_{o_1} + E_{o_2} = 0.274811083 + 0.023560026 = 0.298371109 Eo1=21(0.010.751365069)2=0.274811083Eo2=21(0.990.772928465)2=0.023560026Etotal=Eo1+Eo2=0.274811083+0.023560026=0.298371109

    1. 隐藏层 —> 输出层的权值更新

    以权重参数 w 5 w_5 w5 为例,如果我们想知道 w 5 w_5 w5 对整体损失产生了多少影响,可以用整体损失对 w 5 w_5 w5 求偏导:
    ∂ E t o t a l ∂ w 5 = ∂ E t o t a l ∂ a o 1 ∗ ∂ a o 1 ∂ z o 1 ∗ ∂ z o 1 ∂ w 5 \frac{\partial E_{total}}{\partial w_5} = {\frac {\partial E_{total}}{\partial a_{o_1}}}*{\frac {\partial a_{o_1}}{\partial z_{o_1}} }*{ \frac {\partial z_{o_1}} {\partial w_5} } w5Etotal=ao1Etotalzo1ao1w5zo1
    下面的图可以更直观了解误差是如何反向传播的:

    2.png

    我们现在分别来计算每个式子的值:

    计算 ∂ E t o t a l ∂ a o 1 \frac {\partial E_{total}} {\partial a_{o_1}} ao1Etotal
    E t o t a l = 1 2 ( t a r g e t o 1 − a o 1 ) 2 + 1 2 ( t a r g e t o 2 − a o 1 ) 2 ∂ E t o t a l ∂ a o 1 = 2 ∗ 1 2 ( t a r g e t o 1 − a o 1 ) ∗ − 1 ∂ E t o t a l ∂ a o 1 = − ( t a r g e t o 1 − a o 1 ) = 0.751365069 − 0.01 = 0.741365069 E_{total} = \frac {1}{2}(target_{o_1} - a_{o_1})^2 + \frac {1}{2}(target_{o_2} - a_{o_1})^2 \\ \frac {\partial E_{total}} {\partial a_{o_1}} = 2 * \frac {1}{2} (target_{o_1} - a_{o_1})*-1 \\ \frac {\partial E_{total}} {\partial a_{o_1}} = -(target_{o_1} - a_{o_1}) = 0.751365069-0.01=0.741365069 \\ Etotal=21(targeto1ao1)2+21(targeto2ao1)2ao1Etotal=221(targeto1ao1)1ao1Etotal=(targeto1ao1)=0.7513650690.01=0.741365069
    计算 ∂ E t o t a l ∂ a o 1 \frac {\partial E_{total}} {\partial a_{o_1}} ao1Etotal
    a o 1 = 1 1 + e − z o 1 ∂ a o 1 ∂ z o 1 = a o 1 ∗ ( 1 − a o 1 ) = 0.751365069 ∗ ( 1 − 0.751365069 ) = 0.186815602 a_{o_1} = \frac {1}{1+e^{-z_{o_1}}} \\ \frac {\partial a_{o_1}} {\partial z_{o_1}} = a_{o_1}*(1-a_{o_1}) = 0.751365069*(1-0.751365069) = 0.186815602 ao1=1+ezo11zo1ao1=ao1(1ao1)=0.751365069(10.751365069)=0.186815602
    计算 ∂ z o 1 ∂ w 5 \frac {\partial z_{o_1}} {\partial w_5} w5zo1
    z o 1 = w 5 ∗ a h 1 + w 6 ∗ a h 2 + b 2 ∗ 1 ∂ z o 1 ∂ w 5 = a h 1 = 0.593269992 z_{o_1} = w_5*a_{h1} + w_6*a_{h2} + b_2*1 \\ \frac {\partial z_{o_1}} {\partial w_5} = a_{h_1} = 0.593269992 zo1=w5ah1+w6ah2+b21w5zo1=ah1=0.593269992
    最后三者相乘:
    ∂ E t o t a l ∂ w 5 = 0.741365069 ∗ 0.186815602 ∗ 0.593269992 = 0.082167041 \frac {\partial E_{total}} {\partial w_5} = 0.741365069*0.186815602*0.593269992 = 0.082167041 w5Etotal=0.7413650690.1868156020.593269992=0.082167041
    这样我们就算出整体损失 E t o t a l E_{total} Etotal w 5 w_5 w5 的偏导值。
    ∂ E t o t a l ∂ w 5 = − ( t a r g e t o 1 − a o 1 ) ∗ a o 1 ∗ ( 1 − a o 1 ) ∗ a h 1 \frac {\partial E_{total}} {\partial w_5} = -(target_{o_1} - a_{o_1}) * a_{o_1}*(1-a_{o_1}) * a_{h_1} w5Etotal=(targeto1ao1)ao1(1ao1)ah1
    针对上述公式,为了表达方便,使用 δ o 1 \delta_{o_1} δo1 来表示输出层的误差:
    δ o 1 = ∂ E t o t a l ∂ a o 1 ∗ ∂ a o 1 ∂ z o 1 = ∂ E t o t a l ∂ z o 1 δ o 1 = − ( t a r g e t o 1 − a o 1 ) ∗ a o 1 ∗ ( 1 − a o 1 ) \delta_{o_1} = {\frac {\partial E_{total}}{\partial a_{o_1}}}*{\frac {\partial a_{o_1}}{\partial z_{o_1}} } = \frac {\partial E_{total}} {\partial z_{o_1}} \\ \delta_{o_1} = -(target_{o_1} - a_{o_1}) * a_{o_1}*(1-a_{o_1}) δo1=ao1Etotalzo1ao1=zo1Etotalδo1=(targeto1ao1)ao1(1ao1)
    因此整体损失 E t o t a l E_{total} Etotal w 5 w_5 w5 的偏导值可以表示为:
    ∂ E t o t a l ∂ w 5 = δ o 1 ∗ a h 1 \frac {\partial E_{total}}{\partial w_5} = \delta_{o_1}*a_{h_1} w5Etotal=δo1ah1
    最后我们来更新 w 5 w_5 w5 的值:
    w 5 + = w 5 − η ∗ ∂ E t o t a l ∂ w 5 = 0.4 − 0.5 ∗ 0.082167041 = 0.35891648 η : 学 习 率 w_5^+ = w_5 - \eta * \frac {\partial E_{total}} {\partial w_5} = 0.4 - 0.5*0.082167041 = 0.35891648 \qquad \eta: 学习率 w5+=w5ηw5Etotal=0.40.50.082167041=0.35891648η:
    同理可更新 w 6 , w 7 , w 8 w_6, w_7, w_8 w6,w7,w8
    w 6 + = 0.408666186 w 7 + = 0.511301270 w 8 + = 0.561370121 w_6^+ = 0.408666186 \\ w_7^+ = 0.511301270 \\ w_8^+ = 0.561370121 w6+=0.408666186w7+=0.511301270w8+=0.561370121

    1. 隐藏层 —> 隐藏层的权值更新:

    计算 ∂ E t o t a l ∂ w 1 \frac {\partial E_{total}} {\partial w_1} w1Etotal 与上述方法类似,但需要注意下图:

    3.png

    计算 ∂ E t o t a l ∂ a h 1 \frac {\partial E_{total}} {\partial a_{h_1}} ah1Etotal
    ∂ E t o t a l ∂ a h 1 = ∂ E o 1 ∂ a h 1 + ∂ E o 2 ∂ a h 1 \frac {\partial E_{total}} {\partial a_{h_1}} = \frac {\partial E_{o_1}} {\partial a_{h_1}} + \frac {\partial E_{o_2}} {\partial a_{h_1}} ah1Etotal=ah1Eo1+ah1Eo2

    先计算 ∂ E o 1 ∂ a h 1 \frac {\partial E_{o_1}} {\partial a_{h_1}} ah1Eo1

    o1h1

    同理可得:
    ∂ E o 2 ∂ a h 1 = − 0.019049119 \frac {\partial E_{o_2}} {\partial a_{h_1}} = -0.019049119 ah1Eo2=0.019049119
    两者相加得:
    ∂ E t o t a l ∂ a h 1 = 0.055399425 − 0.019049119 = 0.036350306 \frac {\partial E_{total}} {\partial a_{h_1}} = 0.055399425 - 0.019049119 = 0.036350306 ah1Etotal=0.0553994250.019049119=0.036350306
    计算 a h 1 z h 1 \frac {a_{h_1}} {z_{h_1}} zh1ah1
    a h 1 z h 1 = a h 1 ∗ ( 1 − a h 1 ) = 0.593269992 ∗ ( 1 − 0.593269992 ) = 0.2413007086 \frac {a_{h_1}} {z_{h_1}} = a_{h_1} * (1-a_{h_1}) = 0.593269992*(1-0.593269992) = 0.2413007086 zh1ah1=ah1(1ah1)=0.593269992(10.593269992)=0.2413007086
    计算 ∂ z h 1 ∂ w 1 \frac {\partial z_{h_1}} {\partial w_1} w1zh1
    ∂ z h 1 ∂ w 1 = i 1 = 0.05 \frac {\partial z_{h_1}} {\partial w_1} = i_1 = 0.05 w1zh1=i1=0.05
    最后三者相互乘:
    ∂ E t o t a l ∂ w 1 = 0.036350306 ∗ 0.2413007086 ∗ 0.05 = 0.000438568 \frac {\partial E_{total}} {\partial w_1} = 0.036350306 * 0.2413007086 * 0.05 = 0.000438568 w1Etotal=0.0363503060.24130070860.05=0.000438568

    为了简化公式,用 δ h 1 \delta_{h_1} δh1 表示隐藏层单元 h 1 h_1 h1 的误差:

    simplify

    最后更新 w 1 w_1 w1 的权值:
    w 1 + = w 1 − η ∗ ∂ E t o t a l ∂ w 1 = 0.15 − 0.5 ∗ 0.000438568 = 0.149780716 w_1^+ = w_1 - \eta * \frac {\partial E_{total}} {\partial w_1} = 0.15 - 0.5*0.000438568 = 0.149780716 w1+=w1ηw1Etotal=0.150.50.000438568=0.149780716
    同理,更新 w 2 , w 3 , w 4 w_2, w_3, w_4 w2,w3,w4 权值:
    w 2 + = 0.19956143 w 3 + = 0.24975114 w 4 + = 0.29950229 w_2^+ = 0.19956143 \\ w_3^+ = 0.24975114 \\ w_4^+ = 0.29950229 w2+=0.19956143w3+=0.24975114w4+=0.29950229
    这样,反向传播算法就完成了,最后我们再把更新的权值重新计算,不停地迭代。在这个例子中第一次迭代之后,总误差 E t o t a l E_{total} Etotal 由0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085,输出为 [ 0.015912196 , 0.984065734 ] ( 原 输 入 为 [ 0.01 , 0.99 ] [0.015912196,0.984065734](原输入为[0.01,0.99] [0.015912196,0.984065734]([0.01,0.99] ,证明效果还是不错的。

    公式推导

    4.png

    符号说明

    符号说明
    n l n_l nl网络层数
    y j y_j yj输出层第 j j j 类标签
    S l S_l Sl l l l 层神经元个数(不包括偏置项)
    g ( x ) g(x) g(x)激活函数
    w i j l w_{ij}^{l} wijl l − 1 l-1 l1 层的第 j j j 个神经元连接到第 l l l 层第 i i i 个神经元的权重
    b i l b_i^{l} bil l l l 层的第 i i i 个神经元的偏置
    z i l z_i^{l} zil l l l 层的第 i i i 个神经元的输入加权和
    a i l a_i^{l} ail l l l 层的第 i i i 个神经元的输出(激活值)
    δ i l \delta_i^{l} δil l l l 层的第 i i i 个神经元产生的错误

    推导过程

    基本公式

    basic expresssion

    梯度方向传播公式推导

    初始条件

    6

    递推公式

    7

    反向传播伪代码

    1. 输入训练集。
    2. 对于训练集的每个样本 x ⃗ \vec x x ,设输入层对应的激活值为 a l a^l al
      • 前向传播: z l = w l ∗ a l − 1 + b l , a l = g ( z l ) z^l = w^l*a^{l-1}+b^l, a^l = g(z^l) zl=wlal1+bl,al=g(zl)
      • 计算输出层产生的误差: δ L = ∂ J ( θ ) ∂ a L ⊙ g ′ ( z L ) \delta^L = \frac {\partial J(\theta)} {\partial a^L} \odot g'(z^L) δL=aLJ(θ)g(zL)
      • 反向传播错误: δ l = ( ( w l + 1 ) T ∗ δ l + 1 ) ⊙ g ′ ( z l ) \delta^l = ((w^{l+1})^T*\delta^{l+1}) \odot g'(z^l) δl=((wl+1)Tδl+1)g(zl)
    3. 使用梯度下降训练参数:
      • w l ⇢ w l − α m ∑ x δ x , l ∗ ( a x , l − 1 ) T w^l \dashrightarrow w^l - \frac {\alpha} {m} \sum_x\delta^{x, l}*(a^{x, l-1})^T wlwlmαxδx,l(ax,l1)T
      • b l ⇢ b l − η m ∑ x δ x , l b^l \dashrightarrow b^l - \frac {\eta} {m} \sum_x\delta^{x, l} blblmηxδx,l

    交叉熵损失函数推导

    对于多分类问题, s o f t m a x softmax softmax 函数可以将神经网络的输出变成一个概率分布。它只是一个额外的处理层,下图展示了加上了 s o f t m a x softmax softmax 回归的神经网络结构图:

    softmax

    递推公式仍然和上述递推公式保持一致。初始条件如下:

    8

    s o f t m a x softmax softmax 偏导数计算:
    ∂ y j p ∂ a i n l = { − y i p ∗ y j p i ≠ j y i p ∗ ( 1 − y i p ) i = j \frac {\partial y_j^p} {\partial a_i^{nl}} = \left\{ \begin{aligned} -y_i^p*y_j^p \qquad i \neq j \\ y_i^p*(1-y_i^p) i = j \end{aligned} \right. ainlyjp={yipyjpi̸=jyip(1yip)i=j

    推导过程

    9


    参考自:

    展开全文
  • 反向传播——通俗易懂

    万次阅读 多人点赞 2018-10-04 12:05:05
    最近在看深度学习的东西,一开始看的吴恩达...反向传播法其实是神经网络的基础了,但是很多人在学的时候总是会遇到一些问题,或者看到大篇的公式觉得好像很难就退缩了,其实不难,就是一个链式求导法则反复用。如果...

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进行补充,但是补充的又是错的,难怪觉得有问题。反向传播法其实是神经网络的基础了,但是很多人在学的时候总是会遇到一些问题,或者看到大篇的公式觉得好像很难就退缩了,其实不难,就是一个链式求导法则反复用。如果不想看公式,可以直接把数值带进去,实际的计算一下,体会一下这个过程之后再来推导公式,这样就会觉得很容易了。

      说到神经网络,大家看到这个图应该不陌生:

     

      这是典型的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层,Layer L3是隐含层,我们现在手里有一堆数据{x1,x2,x3,...,xn},输出也是一堆数据{y1,y2,y3,...,yn},现在要他们在隐含层做某种变换,让你把数据灌进去后得到你期望的输出。如果你希望你的输出和原始输入一样,那么就是最常见的自编码模型(Auto-Encoder)。可能有人会问,为什么要输入输出都一样呢?有什么用啊?其实应用挺广的,在图像识别,文本分类等等都会用到,我会专门再写一篇Auto-Encoder的文章来说明,包括一些变种之类的。如果你的输出和原始输入不一样,那么就是很常见的人工神经网络了,相当于让原始数据通过一个映射来得到我们想要的输出数据,也就是我们今天要讲的话题。

      本文直接举一个例子,带入数值演示反向传播法的过程,公式的推导等到下次写Auto-Encoder的时候再写,其实也很简单,感兴趣的同学可以自己推导下试试:)

      假设,你有这样一个网络层:

      第一层是输入层,包含两个神经元i1,i2,和截距项b1;第二层是隐含层,包含两个神经元h1,h2和截距项b2,第三层是输出o1,o2,每条线上标的wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。

      现在对他们赋上初值,如下图:

      其中,输入数据  i1=0.05,i2=0.10;

         输出数据 o1=0.01,o2=0.99;

         初始权重  w1=0.15,w2=0.20,w3=0.25,w4=0.30;

               w5=0.40,w6=0.45,w7=0.50,w8=0.55

     

      目标:给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。

     

      Step 1 前向传播

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

      计算神经元h1的输入加权和:

    神经元h1的输出o1:(此处用到激活函数为sigmoid函数):

     

     

      同理,可计算出神经元h2的输出o2:

      

     

      2.隐含层---->输出层:

      计算输出层神经元o1和o2的值:

      

     

    这样前向传播的过程就结束了,我们得到输出值为[0.75136079 , 0.772928465],与实际值[0.01 , 0.99]相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。

     

    Step 2 反向传播

    1.计算总误差

    总误差:(square error)

    但是有两个输出,所以分别计算o1和o2的误差,总误差为两者之和:

     

    2.隐含层---->输出层的权值更新:

    以权重参数w5为例,如果我们想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导求出:(链式法则)

    下面的图可以更直观的看清楚误差是怎样反向传播的:

    现在我们来分别计算每个式子的值:

    计算

    计算

    (这一步实际上就是对sigmoid函数求导,比较简单,可以自己推导一下)

     

    计算

    最后三者相乘:

    这样我们就计算出整体误差E(total)对w5的偏导值。

    回过头来再看看上面的公式,我们发现:

    为了表达方便,用来表示输出层的误差:

    因此,整体误差E(total)对w5的偏导公式可以写成:

    如果输出层误差计为负的话,也可以写成:

    最后我们来更新w5的值:

    (其中,是学习速率,这里我们取0.5)

    同理,可更新w6,w7,w8:

     

    3.隐含层---->隐含层的权值更新:

     方法其实与上面说的差不多,但是有个地方需要变一下,在上文计算总误差对w5的偏导时,是从out(o1)---->net(o1)---->w5,但是在隐含层之间的权值更新时,是out(h1)---->net(h1)---->w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方两个都要计算。

     

     

    计算

    先计算

    同理,计算出:

              

    两者相加得到总值:

    再计算

    再计算

    最后,三者相乘:

     为了简化公式,用sigma(h1)表示隐含层单元h1的误差:

    最后,更新w1的权值:

    同理,额可更新w2,w3,w4的权值:

     

      这样误差反向传播法就完成了,最后我们再把更新的权值重新计算,不停地迭代,在这个例子中第一次迭代之后,总误差E(total)由0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085,输出为[0.015912196,0.984065734](原输入为[0.01,0.99]),证明效果还是不错的。

    展开全文
  • 神经网络BP反向传播算法原理和详细推导流程

    万次阅读 多人点赞 2018-05-09 22:25:53
    1 反向传播算法和BP网络简介 误差反向传播算法简称反向传播算法(即BP算法)。使用反向传播算法的多层感知器又称为BP神经网络。BP算法是一个迭代算法,它的基本思想为:(1)先计算每一层的状态和激活值,直到最后一...

    1  反向传播算法和BP网络简介

     

        误差反向传播算法简称反向传播算法(即BP算法)。使用反向传播算法的多层感知器又称为BP神经网络。BP算法是一个迭代算法,它的基本思想为:(1)先计算每一层的状态和激活值,直到最后一层(即信号是前向传播的);(2)计算每一层的误差,误差的计算过程是从最后一层向前推进的(这就是反向传播算法名字的由来);(3)更新参数(目标是误差变小)。迭代前面两个步骤,直到满足停止准则(比如相邻两次迭代的误差的差别很小)。

        本文的记号说明:

     

     

     

    下面以三层感知器(即只含有一个隐藏层的多层感知器)为例介绍“反向传播算法(BP 算法)”。

    2 信息前向传播

     

     

    3 误差反向传播

    3.1 输出层的权重参数更新

    3.2  隐藏层的权重参数更新

    3.3输出层和隐藏层的偏置参数更新

    3.4 BP算法四个核心公式

     

    3.5 BP 算法计算某个训练数据的代价函数对参数的偏导数

    3.6 BP 算法总结:用“批量梯度下降”算法更新参数

    4 梯度消失问题及其解决办法

    5 加快 BP 网络训练速度:Rprop 算法

     

     

     

     

    展开全文
  • 先看看前向传播算法(Forward propagation)与反向传播算法(Back propagation)。1.前向传播如图所示,这里讲得已经很清楚了,前向传播的思想比较简单。 举个例子,假设上一层结点i,j,k,…等一些结点与本层的结点w有...

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
    欢迎大家star,留言,一起学习进步

    虽然学深度学习有一段时间了,但是对于一些算法的具体实现还是模糊不清,用了很久也不是很了解。因此特意先对深度学习中的相关基础概念做一下总结。先看看前向传播算法(Forward propagation)与反向传播算法(Back propagation)。

    1.前向传播

    这里写图片描述

    如图所示,这里讲得已经很清楚了,前向传播的思想比较简单。
    举个例子,假设上一层结点i,j,k,…等一些结点与本层的结点w有连接,那么结点w的值怎么算呢?就是通过上一层的i,j,k等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项(图中为了简单省略了),最后在通过一个非线性函数(即激活函数),如ReLu,sigmoid等函数,最后得到的结果就是本层结点w的输出。
    最终不断的通过这种方法一层层的运算,得到输出层结果。

    对于前向传播来说,不管维度多高,其过程都可以用如下公式表示:
    a 2 = σ ( z 2 ) = σ ( a 1 ∗ W 2 + b 2 ) a^2 = \sigma(z^2) = \sigma(a^1 * W^2 + b^2) a2=σ(z2)=σ(a1W2+b2)

    其中,上标代表层数,星号表示卷积,b表示偏置项bias, σ \sigma σ表示激活函数。

    2.反向传播算法(Back propagation)

    BackPropagation算法是多层神经网络的训练中举足轻重的算法。简单的理解,它的确就是复合函数的链式法则,但其在实际运算中的意义比链式法则要大的多。要回答题主这个问题“如何直观的解释back propagation算法?” 需要先直观理解多层神经网络的训练。

    机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定一些样本点,用合适的曲线揭示这些样本点随着自变量的变化关系.

    深度学习同样也是为了这个目的,只不过此时,样本点不再限定为(x, y)点对,而可以是由向量、矩阵等等组成的广义点对(X,Y)。而此时,(X,Y)之间的关系也变得十分复杂,不太可能用一个简单函数表示。然而,人们发现可以用多层神经网络来表示这样的关系,而多层神经网络的本质就是一个多层复合的函数。借用网上找到的一幅图[1],来直观描绘一下这种复合关系。

    这里写图片描述

    其对应的表达式如下:
    这里写图片描述

    上面式中的Wij就是相邻两层神经元之间的权值,它们就是深度学习需要学习的参数,也就相当于直线拟合y=k*x+b中的待求参数k和b。

    和直线拟合一样,深度学习的训练也有一个目标函数,这个目标函数定义了什么样的参数才算一组“好参数”,不过在机器学习中,一般是采用成本函数(cost function),然后,训练目标就是通过调整每一个权值Wij来使得cost达到最小。cost函数也可以看成是由所有待求权值Wij为自变量的复合函数,而且基本上是非凸的,即含有许多局部最小值。但实际中发现,采用我们常用的梯度下降法就可以有效的求解最小化cost函数的问题。

    梯度下降法需要给定一个初始点,并求出该点的梯度向量,然后以负梯度方向为搜索方向,以一定的步长进行搜索,从而确定下一个迭代点,再计算该新的梯度方向,如此重复直到cost收敛。那么如何计算梯度呢?

    假设我们把cost函数表示为 H ( W 11 , W 12 , ⋯   , W i j , ⋯   , W m n ) H(W_{11}, W_{12}, \cdots , W_{ij}, \cdots, W_{mn}) H(W11,W12,,Wij,,Wmn),那么它的梯度向量[2]就等于 ∇ H = ∂ H ∂ W 11 e 11 + ⋯ + ∂ H ∂ W m n e m n \nabla H = \frac{\partial H}{\partial W_{11} }\mathbf{e}_{11} + \cdots + \frac{\partial H}{\partial W_{mn} }\mathbf{e}_{mn} H=W11He11++WmnHemn, 其中 e i j \mathbf{e}_{ij} eij表示正交单位向量。为此,我们需求出cost函数H对每一个权值Wij的偏导数。而BP算法正是用来求解这种多层复合函数的所有变量的偏导数的利器。

    我们以求e=(a+b)*(b+1)的偏导[3]为例。
    它的复合关系画出图可以表示如下:
    这里写图片描述

    在图中,引入了中间变量c,d。
    为了求出a=2, b=1时,e的梯度,我们可以先利用偏导数的定义求出不同层之间相邻节点的偏导关系,如下图所示。
    这里写图片描述

    利用链式法则我们知道:
    ∂ e ∂ a = ∂ e ∂ c ⋅ ∂ c ∂ a 以 及 ∂ e ∂ b = ∂ e ∂ c ⋅ ∂ c ∂ b + ∂ e ∂ d ⋅ ∂ d ∂ b \frac{\partial e}{\partial a}=\frac{\partial e}{\partial c}\cdot \frac{\partial c}{\partial a}以及\frac{\partial e}{\partial b}=\frac{\partial e}{\partial c}\cdot \frac{\partial c}{\partial b}+\frac{\partial e}{\partial d}\cdot \frac{\partial d}{\partial b} ae=ceacbe=cebc+debd

    链式法则在上图中的意义是什么呢?其实不难发现, ∂ e ∂ a \frac{\partial e}{\partial a} ae的值等于从a到e的路径上的偏导值的乘积,而 ∂ e ∂ b \frac{\partial e}{\partial b} be的值等于从b到e的路径1(b-c-e)上的偏导值的乘积加上路径2(b-d-e)上的偏导值的乘积。也就是说,对于上层节点p和下层节点q,要求得 ∂ p ∂ q \frac{\partial p}{\partial q} qp,需要找到从q节点到p节点的所有路径,并且对每条路径,求得该路径上的所有偏导数之乘积,然后将所有路径的 “乘积” 累加起来才能得到 ∂ p ∂ q \frac{\partial p}{\partial q} qp的值。

    大家也许已经注意到,这样做是十分冗余的,因为很多路径被重复访问了。比如上图中,a-c-e和b-c-e就都走了路径c-e。对于权值动则数万的深度模型中的神经网络,这样的冗余所导致的计算量是相当大的。

    同样是利用链式法则,BP算法则机智地避开了这种冗余,它对于每一个路径只访问一次就能求顶点对所有下层节点的偏导值。
    正如反向传播(BP)算法的名字说的那样,BP算法是反向(自上往下)来寻找路径的。

    从最上层的节点e开始,初始值为1,以层为单位进行处理。对于e的下一层的所有子节点,将1乘以e到某个节点路径上的偏导值,并将结果“堆放”在该子节点中。等e所在的层按照这样传播完毕后,第二层的每一个节点都“堆放"些值,然后我们针对每个节点,把它里面所有“堆放”的值求和,就得到了顶点e对该节点的偏导。然后将这些第二层的节点各自作为起始顶点,初始值设为顶点e对它们的偏导值,以"层"为单位重复上述传播过程,即可求出顶点e对每一层节点的偏导数。

    以上图为例,节点c接受e发送的12并堆放起来,节点d接受e发送的13并堆放起来,至此第二层完毕,求出各节点总堆放量并继续向下一层发送。节点c向a发送21并对堆放起来,节点c向b发送21并堆放起来,节点d向b发送31并堆放起来,至此第三层完毕,节点a堆放起来的量为2,节点b堆放起来的量为21+3*1=5, 即顶点e对b的偏导数为5.

    举个不太恰当的例子,如果把上图中的箭头表示欠钱的关系,即c→e表示e欠c的钱。以a, b为例,直接计算e对它们俩的偏导相当于a, b各自去讨薪。a向c讨薪,c说e欠我钱,你向他要。于是a又跨过c去找e。b先向c讨薪,同样又转向e,b又向d讨薪,再次转向e。可以看到,追款之路,充满艰辛,而且还有重复,即a, b 都从c转向e。

    而BP算法就是主动还款。e把所欠之钱还给c,d。c,d收到钱,乐呵地把钱转发给了a,b,皆大欢喜。

    3.反向传播具体计算过程推导

    为了方便起见,这里我定义了三层网络,输入层(第0层),隐藏层(第1层),输出层(第二层)。并且每个结点没有偏置(有偏置原理完全一样),激活函数为sigmod函数(不同的激活函数,求导不同),符号说明如下:
    这里写图片描述

    对应网络如下:

    这里写图片描述

    其中对应的矩阵表示如下

    这里写图片描述

    首先我们先走一遍正向传播,公式与相应的数据对应如下:

    这里写图片描述

    那么:

    这里写图片描述

    同理可以得到:

    这里写图片描述

    那么最终的损失为

    这里写图片描述

    ,我们当然是希望这个值越小越好。这也是我们为什么要进行训练,调节参数,使得最终的损失最小。这就用到了我们的反向传播算法,实际上反向传播就是梯度下降法中链式法则的使用。

    下面我们看如何反向传播

    根据公式,我们有:

    这里写图片描述

    这个时候我们需要求出C对w的偏导,则根据链式法则有:

    这里写图片描述

    同理有:

    这里写图片描述

    到此我们已经算出了最后一层的参数偏导了.我们继续往前面链式推导:

    我们现在还需要求

    这里写图片描述

    ,下面给出一个推导其它全都类似

    这里写图片描述

    同理可得其它几个式子:

    则最终的结果为:

    这里写图片描述

    再按照这个权重参数进行一遍正向传播得出来的Error为0.165

    而这个值比原来的0.19要小,则继续迭代,不断修正权值,使得代价函数越来越小,预测值不断逼近0.5.我迭代了100次的结果,Error为5.92944818e-07(已经很小了,说明预测值与真实值非常接近了),最后的权值为:

    这里写图片描述

    bp过程可能差不多就是这样了,可能此文需要你以前接触过bp算法,只是还有疑惑,一步步推导后,会有较深的理解。

    上面的python代码实现如下:

    #!/usr/bin/env python
    #coding:utf-8
    
    
    import numpy as np
    
    def nonlin(x, deriv = False):
        if(deriv == True):
            return x * (1 - x)
        return 1 / (1 + np.exp(-x))
    
    
    X = np.array([[0.35], [0.9]])
    y = np.array([[0.5]])
    
    np.random.seed(1)
    
    W0 = np.array([[0.1, 0.8], [0.4, 0.6]])
    W1 = np.array([[0.3, 0.9]])
    
    print 'original ', W0, '\n', W1
    
    for j in xrange(100):
        l0 = X
        l1 = nonlin(np.dot(W0, l0))
        l2 = nonlin(np.dot(W1, l1))
        l2_error = y - l2
        Error = 1 / 2.0 * (y-l2)**2
        print 'Error:', Error
    
        l2_delta = l2_error * nonlin(l2, deriv=True)
    
        l1_error = l2_delta * W1 #back propagation
        l1_delta = l1_error * nonlin(l1, deriv=True)
    
        W1 += l2_delta * l1.T
        W0 += l0.T.dot(l1_delta)
        print W0, '\n', W1
    

    参考文档:

    1.http://blog.csdn.net/lhanchao/article/details/51419150
    2.https://www.zhihu.com/question/39022858

    展开全文
  • 反向传播-源码

    2021-03-04 11:28:15
    反向传播
  • 反向传播
  • 反向传播BP

    2018-02-02 15:19:25
    深度学习入门,反向传播代码,matlab编程,简单易学!
  • 反向传播作为一种基本负反馈机制,极大地推动了深度学习神经网络的发展。那么,反向传播也存在于人脑的运行方式中吗?反向传播的发明者Geoffery Hinton发Nature子刊告诉我们:人脑中存在类似于反向传播的神经机制,...
  • 反向传播详解

    2019-09-25 20:06:11
    文章目录一、为什么引入反向传播二、反向传播的重要性三、反向传播的推导过程四、反向传播与梯度下降的关系 一、为什么引入反向传播 神经网络的过程就是正向传播得到Loss值,再把Loss值反向传播,并对神经网络的参数...
  • 了解反向传播神经网络:有关反向传播神经网络的测试数据和MATLAB代码
  • 上图其实就是运用了反向传播的思想, 对于上图中 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l​最后的表达式,我们可以换一种结构,如下所示: l对两个z的偏导我们假设是已知的,并且在这里是作为输入,三角形...
  • 反向传播推导

    2018-08-30 11:04:11
    DNN反向传播算法 CNN反向传播算法 DNN和CNN反向传播总结
  • 神经网络反向传播

    2017-11-09 11:38:57
    该课件以一个简单的网络结构,首先回顾了前馈神经网络,基于前馈神经网络进行反向传播的讲解,便于刚入门的爱好者打开反向传播的黑匣子。
  • 详解神经网络的前向传播和反向传播(从头推导)

    万次阅读 多人点赞 2018-08-06 17:12:35
    详解神经网络的前向传播和反向传播 本篇博客是对Michael Nielsen所著的《Neural Network and Deep Learning》第2章内容的解读,有兴趣的朋友可以直接阅读原文Neural Network and Deep Learning。  对神经网络有些...
  • 反向传播视频教程.wmv

    2020-02-06 17:29:57
    反向传播视频教程,希望能够学习者提供帮助,实现对反向传播知识的掌握与理解,为后续学习做好铺垫,实现反向传播的灵活运用
  • 该代码实现了用于教程目的的多层反向传播神经网络,并允许在输入、输出和隐藏层中训练和测试任意数量的神经元。 隐藏层的数量也可以变化。 共有三个文件,其中 MLBPN_Train.m 用于在所需输入模式上构建和训练多层...
  • 吴恩达机器学习课程反向传播算法的数学推导 Proof of Back Propagation Algorithm.pdf 【本文旨在给出吴恩达机器学习课程反向传播算法的数学推导】
  • 神经网络反向传播算法,神经网络反向传播算法原理和推导
  • DNN正向传播和反向传播的解释
  • mnist反向传播文件

    2018-10-09 09:47:14
    mnist手写字符识别反向传播文件,来源于“中国大学mooc——曹健老师的Tensorflow笔记”
  • 反向传播算法-源码

    2021-02-11 15:05:02
    反向传播算法
  • 反向传播算法python实现.
  • 反向传播算法PPT

    2018-11-30 20:16:59
    这是我在机器学习课程上做汇报用的反向传播算法的PPT,主要是通过学习吴恩达老师的课程总结得来
  • 1. 误差反向传播整体流程 2. 误差反向传播代码实现 3. 误差反向传播梯度确认 4. 误差反向传播使用示例
  • 详解 误差反向传播算法推导

    万次阅读 多人点赞 2018-09-14 03:58:31
    误差反向传播算法误差 反向传播算法(back propagation,简称BP模型)是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络...
  • 主要为大家详细介绍了TensorFlow如何实现反向传播,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 正向传播和反向传播

    千次阅读 2020-05-11 13:59:55
    1.什么是正向传播和反向传播,有何关系? 一、正向传播:沿着从输入层到输出层的顺序,依次计算并存储神经网络的中间变量。 二、反向传播:沿着从输出层到输入层的顺序,依次计算并存储神经网络的中间变量和参数的...
  • 反向传播算法(过程及公式推导)

    万次阅读 多人点赞 2016-04-01 21:19:56
    反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。
  • 反向传播的目的是计算成本函数C对网络中任意w或b的偏导数。一旦我们有了这些偏导数,我们将通过一些常数 α的乘积和该数量相对于成本函数的偏导数来更新网络中的权重和偏差。这是流行的梯度下降算法。而偏导数给出了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,942
精华内容 38,776
关键字:

反向传播