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

    1986年Rumelhart和McCelland在《并行分布式处理》中提出了BP算法,即非线性连续变换函数的多层感知器网络误差反向传播算法。

    该算法的思想是:学习过程分为信号的正向传播与误差的反向传播两个过程。

          正向传播时,输入样本从输入层传入,经各隐含层逐层处理后传向输出层,若输出层的实际输出与期望输出不符,则转入误差反向传播阶段。

         误差反传是将输出误差以某种形式通过隐含层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层的误差信号,此信号即作为修正各单元权值的依据。

         上述两个过程周而复始地进行,直到网络输出的误差减少到可接受的程度或达到预先设置的学习次数为止。

    下面以三层感知器网络(单隐含层)为例:

    输入向量X=(x1,x2,...,xi,...,xn)T,图中x0=-1是为隐含层神经元引入阈值而设置的;隐含层输出向量Y=(y1,y2,...,yj,...,ym)T,图中y0=-1是为输出层神经元引入阈值而设置的;输出层输出向量O=(o1,o2,...,ok...,ol)T;期望输出向量d=(d1,d2,...,dk,...,dl)T。输入层到隐含层之间的权值矩阵V=(v1,v2,...,vj,...,vm)T,其中vj为神经元j的权向量;隐含层到输出层之间的权值矩阵W=(W1,W2,...,Wk,...,Wl)T,其中Wk为神经元k的权向量。则:

    对于输出层:

    ok=f(netk)=f(∑wjkyj ) 其中k=1,2,...,l;j=0,1,2,...,m

    对于隐含层:

    yj=f(netj)=f(∑vijxi ) 其中j=1,2,...,m;i=0,1,2,...,n

    设上述式子中的变换函数f(x)=sigmoid(x)=1/(1+e-x),可知f(x)连续可导,且f‘(x)=f(x)[1-f(x)],

    BP算法的学习规则如下:

    网络的输出误差E=(d-o)2/2=∑(dk-ok)2 *1/2,其中k=1,2,...,l,

    则将误差展开至隐含层:

    E=∑[dk-f(netk)]2 *1/2=∑[dk-f(∑wjkyj)]2 *1/2,其中k=1,2,...,l;j=0,1,2,...,m

    将误差展开至输入层:

    E=∑[dk-f(∑wjkf(netj))]2 *1/2=∑[dk-f(∑wjkf(∑vijxi))]2 *1/2,其中k=1,2,...,l;j=0,1,2,...,m;i=0,1,2,....,n

    由此可见网络误差是各层权值wjk,vij的函数,调整权值即可调整误差,显然权值调整原则是使误差不断减小,可见应使权值的调整量与误差的负梯度成正比,故有:

    ΔWjk=-η*∂E/∂Wjk ,j=0,1,2,...,m;k=1,2,...,l

    Δvjk=-η*∂E/∂vij ,i=0,1,2,...,n;j=1,2,...,m

    负号表示负梯度,η为[0,1]常数,反映了网络的学习速率,可见BP采用的是连续型感知器学习规则δ类。

    综上,各层间权值调整公式如下:

    输出层与隐含层间权值调整公式:

    w(t+1)=w(t)+ΔW=w(t)+η*(d-O)*O*(1-O)*Y

            V(t+1)=V(t)+ΔV=V(t)+η*([(d-O)*O*(1-O)]W)*Y*(1-Y)*X

  • 相关阅读:
    [LeetCode] 1103. Distribute Candies to People 分糖果
    [LeetCode] 994. Rotting Oranges 腐烂的橘子
    [LeetCode] 面试题 10.01.合并排序的数组
    [LeetCode] 207. Course Schedule 课程表
    Windows下利用virtualenvwrapper指定python版本创建虚拟环境
    Vagrant Ansible Playbook 安装一群虚拟机
    selenium grid的使用与配置
    selenium之 玩转鼠标键盘操作(ActionChains)
    Python3.7 dataclass 介绍
    简单的验证码识别
  • 原文地址:https://www.cnblogs.com/cloudml/p/4170443.html
Copyright © 2011-2022 走看看