zoukankan      html  css  js  c++  java
  • BP神经网络算法推导

    前置知识

    梯度下降法

    [设损失函数为F(vec{w}) \ 则F(vec{w}+Delta{vec{w}})-F(vec{w}) = abla{F(vec{w})} cdot Delta{vec{w}}\ 其中 abla{F(vec{w})} 是 F(vec{w})的梯度\ 所以当Delta{vec{w}} = -eta abla F(vec{w}),(eta>0)时,下降速率最快\ 即Delta{w_i} = -eta frac{partial{F}}{partial{w_i}} ]

    激活函数

    [设当前激活函数为f(x) = 1/(1+exp(-x))\ 有f'(x) = exp(-x)/(1+exp(-x))^2=f(x)*(1-f(x)) ]

    多元复合函数求偏导的相关知识

    正向计算

    符号定义

    1. 节点 (i)的输入为(net_i),输出为(O_i)
    2. (v_{ij},w_{jk}是节点i到节点j,节点j到节点k的权值)
    3. 误差为(E),是个多元函数

    输入层

    输入层不使用激活函数,(O_i = x_i)

    隐含层

    隐含层输入为 (net_j = Sigma_{i=0}^{I-1} v_{ij}*O_i)
    输出为 (O_j = f(net_j))

    输出层

    输入为(net_k = Sigma_{j=0}^{J-1}w_{jk}*O_j)
    输出为 (O_k = f(net_k))

    误差函数

    (E=frac{1}{2}Sigma_{k=0}^{K-1}(d_k-O_k)^2, d_k为期望输出)

    反向传播

    使用梯度下降法调整节点间连接的权值,使得E获得极小值

    输出层与隐含层之间的权值调整

    [把E视为是关于vec{w}, vec{v}的函数\ 由前置知识得,Delta{w_{jk}} = -etafrac{partial E }{partial w_{jk} }=-etafrac{partial E}{partial net_k}cdot frac{partial net_k}{partial w_{jk}}\ 即 Delta{w_{jk}} = eta(-frac{partial{E}}{partial{net_k}})O_j\ 设delta_k = -frac{partial{E}}{partial{net_k}} = -frac{partial{E}}{partial{O_k}} cdot frac{dO_k}{dnet_k}\ 即 delta_k = (d_k-O_k)f'(net_k), Delta{w_{jk}} = etadelta_kO_j ]

    隐含层与输入层之间权值的调整

    [同理Delta{v_{ij}} = -etafrac{partial E }{partial v_{ij} }=eta(-frac{partial E}{partial net_j}) frac{partial net_j}{partial w_{ij}}\ 即 Delta{v_{ij}} = eta(-frac{partial{E}}{partial{net_j}})O_i\ 设delta_j = -frac{partial{E}}{partial{net_j}} = -frac{partial{E}}{partial{O_j}} cdot frac{dO_j}{dnet_j}=-frac{partial E}{partial net_j}f'(net_j)\ -frac{partial E }{partial O_j} = -Sigma_{k=0}^{K-1}frac{partial E}{partial net_k}frac{partial net_k}{partial O_j}=Sigma_{k=0}^{K-1}delta_kw_{jk}\ 所以Delta v_{ij} = eta O_if'(net_j)Sigma_{k=0}^{K-1}delta_kw_{jk} ]

    计算步骤

    1. 假设经过正向计算得到(O_i, O_j,O_k),且已知(v_{ij},w_{jk},d_k)

    2. 计算(f'(net_k), f'(net_j)),对于我选用的激活函数来说,

      [f'(net_k)=O_k(1-O_k)\ f'(net_j)=O_j(1-O_j) ]

      有可能选择其他激活函数,所以把此步骤单独分开

    3. 计算(delta_k=(d_k-O_k)f'(net_k))

    4. 计算(Delta w_{jk}=etadelta_kO_j)

    5. 计算(Delta v_{ij}=eta O_i f'(net_j)Sigma_{i=0}^{K-1}delta_k w_{jk})

    6. (v_{ij}+=Delta v_{ij}, w_{jk} += Delta w_{jk})

  • 相关阅读:
    [笔记] 辛普森积分
    Luogu P4175 [CTSC2008]网络管理
    Luogu P4331 [BOI2004]Sequence 数字序列
    Luogu P1456 Monkey King
    Luogu P3261 [JLOI2015]城池攻占
    Luogu P4309 [TJOI2013]最长上升子序列
    Luogu P4246 [SHOI2008]堵塞的交通
    Luogu P3638 [APIO2013]机器人
    Luogu P4294 [WC2008]游览计划
    CF613D Kingdom and its Cities
  • 原文地址:https://www.cnblogs.com/Merodach/p/9093197.html
Copyright © 2011-2022 走看看