手写误差反向传播算法Error BackPropagation

本文介绍如何手写神经网络训练代码

已知数据:

输入数据 X ∈ R n × d X\in\mathbb{R}^{n\times d} XRn×d n n n为样本个数, d d d为样本维数,也就是神经网络输入节点数。
标注数据 Y ∈ R n × t Y\in\mathbb{R}^{n\times t} YRn×t, t t t为输出维数,也就是神经网络输出节点数。
注意,为了便于书写,不考虑偏置Bias。

神经网络模型:

两层权重,三层节点。
Y ^ = f 2 ( f 1 ( X W 1 ) W 2 ) \widehat{Y}=f_2(f_1(XW_1)W_2) Y =f2(f1(XW1)W2) W 1 ∈ R d × h W_1\in\mathbb{R}^{d\times h} W1Rd×h W 2 ∈ R h × t W_2\in\mathbb{R}^{h\times t} W2Rh×t为带求参数。 Y ^ \widehat{Y} Y 为预测输出。 f 1 , f 2 f_1,f_2 f1,f2为激励函数。

损失函数:

L = 1 2 ∣ ∣ Y ^ − Y ∣ ∣ 2 L=\frac{1}{2}||\widehat{Y}-Y||^2 L=21Y Y2

训练伪代码:
  1. 初始化 W 1 W_1 W1, W 2 W_2 W2.

  2. 前向过程:
    H = f 1 ( X W 1 ) H=f_1(XW_1) H=f1(XW1)
    Y ^ = f 2 ( H W 2 ) \widehat{Y}=f_2(HW_2) Y =f2(HW2)

  3. 反向过程:
    e = Y ^ − Y e=\widehat{Y}-Y e=Y Y
    ∂ L ∂ W 2 = f 1 T [ e . ∗ f 2 ′ ] \frac{\partial L}{\partial W_2}=f_1^T[e.*f_2'] W2L=f1T[e.f2]

    ∂ L ∂ W 1 = X T [ e W 2 T . ∗ f 1 ′ ] \frac{\partial L}{\partial W_1}=X^T[eW_2^T.*f_1'] W1L=XT[eW2T.f1]
    此处注意误差 e e e传递过程,当层数更多时只需计算 e W T eW^T eWT即可。
    (直观上说,任何一条权重的梯度等于 a i e a o ′ a_iea_o' aieao a i a_i ai为输入权重的激励值,e为传到输出节点 a o a_o ao的误差, a o ′ a_o' ao为激励函数导数输出。)
    注意:反向传播是一种自动微分技术,是一种特殊的反向模式自动微分技术,其通过构建计算图来计算所有权重的梯度。
    如下是一个两层权重神经网络的计算图示意图:

    ∂ L ∂ Y ^ = ( Y ^ − Y ) . ∗ f 2 ′ \frac{\partial L}{\partial \widehat{Y}}=(\widehat{Y}-Y).*f'_2 Y L=(Y Y).f2
    ∂ Y ^ ∂ W 2 = H . ∗ f 2 ′ \frac{\partial\widehat{Y}}{\partial W_2} = H.*f_2' W2Y =H.f2
    ∂ L ∂ W 2 = ∂ Y ^ ∂ W 2 T ∂ L ∂ Y ^ \frac{\partial L}{\partial W_2}=\frac{\partial\widehat{Y}}{\partial W_2}^T\frac{\partial L}{\partial \widehat{Y}} W2L=W2Y TY L
    ∂ Y ^ ∂ H = W 2 . ∗ f 2 ′ \frac{\partial \widehat{Y}}{\partial H} = W_2.*f_2' HY =W2.f2
    ∂ L ∂ H = ∂ Y ^ ∂ H ∂ L ∂ Y ^ \frac{\partial L}{\partial H}=\frac{\partial \widehat{Y}}{\partial H}\frac{\partial L}{\partial\widehat{Y}} HL=HY Y L
    ∂ H ∂ W 1 = X . ∗ f 1 ′ \frac{\partial H}{\partial W_1} = X.*f_1' W1H=X.f1
    ∂ L ∂ W 1 = ∂ H ∂ W 1 T ∂ L ∂ H \frac{\partial L}{\partial W_1}=\frac{\partial H}{\partial W_1}^T \frac{\partial L}{\partial H} W1L=W1HTHL
    实际梯度batch平均梯度为:
    ∂ L ∂ W 2 = ∂ L ∂ W 2 / n \frac{\partial L}{\partial W_2}=\frac{\partial L}{\partial W_2}/n W2L=W2L/n
    ∂ L ∂ W 1 = ∂ L ∂ W 1 / n \frac{\partial L}{\partial W_1}=\frac{\partial L}{\partial W_1}/n W1L=W1L/n

  4. 应用梯度更新权重:
    W 1 = W 1 − α ∂ L ∂ W 1 W_1=W_1-\alpha\frac{\partial L}{\partial W_1} W1=W1αW1L
    W 2 = W 2 − α ∂ L ∂ W 2 W_2=W_2-\alpha\frac{\partial L}{\partial W_2} W2=W2αW2L
    α \alpha α为学习率。

  5. 计算损失函数,不收敛则继续2-4步骤。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值