zoukankan      html  css  js  c++  java
  • 5.3 BP算法


    一句话: BP算法是基于梯度下降算法的迭代算法,用来优化模型参数, 作用相当于梯度下降算法


    感知器:
    感知器使用特征向量来表示前馈神经网络,它是一种二元分类器,把矩阵上的x{f{x}}(实数值向量) 映射到输出 f(x)f(x)上(一个二元的值)
    f(x)={1 if wx+b>00 else f(x)=left{egin{array}{ll}{1} & { ext { if } w cdot x+b>0} \ {0} & { ext { else }}end{array} ight.
                             在这里插入图片描述

    感知器

    误差逆传播算法 (error BackPropagation,简称 BP)

    符号表示

    给定训练集 D ,上图神经网络含有
    dd 个输入神经元
    ll 个输出神经元
    qq 个隐层神经元
    θjθ_j 表示输出层第 jj 个神经元的阈值
    γhgamma_h 表示隐层第 hh 个神经元的阈值
    whjw_{hj} 表示隐层第 hh 个神经元与输出层第 jj 个神经元的连接权
    vihv_{ih} 表示输入层第 ii 个神经元与隐层第 hh 个神经元的连接权

    隐层第 hh 个神经元接收输入为 α=i=1dvihxialpha =sum_{i=1}^dv_{ih}x_i
    输出层第 jj 个神经元接收输入为 βj=h=1qwhjbheta_j=sum_{h=1}^qw_{hj}b_h, 其中bhb_h为第 hh 个神经元的输出
    ff 为 sigmoid 函数

    神经网络的输出 y^=(y^1k,y^2k,...,y^lk){f{hat{y}}}=(hat{y}^k_1, hat{y}^k_2, ..., hat{y}^k_l),即
    y^jk=f(βjθj)(5.3) hat{y}^k_j=f(eta_j- heta_j) ag{5.3}
    其中 θj为阈值。

    网络在(xk,yk)上的均方误差为
    Ek=12j=1l(y^jkyjk)2(5.4) E_k=frac12sum_{j=1}^l(hat{y}_j^k-y_j^k)^2 ag{5.4}
    BP是一个迭代学习算法,它基于梯度下降策略,以目标的负梯度方向对参数进行调整.对式 (5.4) 的误差 Ek ,给定学习率 η ,有
    Δwhj=ηEkwhj=ηEky^jky^jkβjβjwhj(5.5) egin{aligned} Delta w_{hj} &= -ηfrac{partial E_k}{partial w_{hj}}\ &= -η frac{partial E_k}{partial hat{y}^k_j }cdot frac{partial hat{y}^k_j}{partial eta _j }cdotfrac{partial eta _j}{partial w_{hj}} ag{5.5} end{aligned}
    sigmoid函数有一个很好的性质:
    f(x)=f(x)(1f(x))(5.6) f'(x)=f(x)cdot (1-f(x)) ag{5.6}
    于是根据式(5.4)和(5.3),令
    gj=Eky^jky^jkβj=(yjk^yjk)f(βjθj)=y^jk(1y^jk)(yjky^jk)(5.7) egin{aligned} g_j&=- frac{partial E_k}{partial hat{y}^k_j }cdot frac{partial hat{y}^k_j}{partial eta _j } \&= -(hat{y_j^k}-y_j^k)f'(eta _j- heta_j)\&=hat{y}_j^k(1-hat{y}_j^k)(y_j^k-hat{y}_j^k) ag{5.7} end{aligned}
    根据 βj 的定义,显然有
    βjwhj=bh(5.8) frac{partial eta_j}{partial w_{hj}}=b_h ag{5.8}
    将式(5.7),(5.8)带入式(5.5),得到:
    Δwhj=ngjbh(5.9) Delta w_{hj}=ng_jb_h ag{5.9}
    类似可得
    Δθj=ηgj(5.10) Delta heta_j=-ηg_j ag{5.10}
    Δvih=ηehxi(5.11) \ Delta v_{ih}=ηe_hx_i ag{5.11}
    Δγh=ηeh(5.12) Delta gamma_h =-ηe_h ag{5.12}
    下图给出了 BP 算法的工作流程。对每个训练样例, BP 算法执行以下操作:先将输入实例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差(第4-5行),再将误差逆向传播至隐层神经元(第6行),最后根据隐层神经元的误差来对连接权和阈值进行调整(第7行)。该迭代过程循环进行,直到达到某些停止条件为止。


    输入:训练集 D={(xk,yk)}k=1m_{k=1}^m
       学习率 η
    过程:
    1:在 (0,1) 范围内随机初始化网络中所有连接权和阈值
    2:repeat
    3: for all (xk,yk) in D do
    4:  根据当前参数和式(5.3)计算当前样本的输出 y^khat{y}_k
    5:  计算输出层神经元的梯度项 gjg_j
    6:  计算隐层神经元的梯度项 ehe_h
    7:  跟新连接权 whj,vihw_{hj},v_{ih} 与阈值 θj,γh heta_j,gamma_h
    8: end for
    9:until 达到停止条件
    输出:连接权与阈值确定的多层前馈神经网络



    以下为吴恩达课程中的表述:

    训练神经网络:
    1. 参数的随机初始化
    2. 利用正向传播方法计算所有的 h(x)
    3. 编写计算代价函数 J 的代码
    4. 利用反向传播方法计算所有偏导数
    5. 利用数值检验方法检验这些偏导数
    6. 使用优化算法来最小化代价函数

    参考:周志华《机器学习》
       吴恩达《机器学习》

  • 相关阅读:
    别人的代码
    ZOJ 1914 Arctic Network
    今日所得 2.22
    poj 2031 Building a Space Station
    POJ 1251 Jungle Roads
    优秀的开发者 vs. 糟糕的开发者
    有关读书求知的一些想法
    开发者拒绝写技术博客的常见理由
    写代码如坐禅:你是哪一类程序员?
    [C++] c++ new() 与new[]的区别
  • 原文地址:https://www.cnblogs.com/larkiisready/p/11681630.html
Copyright © 2011-2022 走看看