深度学习之 BP 算法

神经网络的一种求解W的算法,分为信号“正向传播(FP)”求损失,“反向传播(BP)”回传误差;根据误差值修改每层的权重,继续迭代。

BP算法也叫做δ算法。以三层的感知器为例(假定现在隐层和输出层均存在相同类型的激活函数)

  • 隐层 y = f(x * v)
  • 输出层 o = f(f(y) * w)
  • 输入层误差:E=\frac{1}{2}(d-O)^{2}=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-O_k)^2
  • 隐层误差:   E=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f(net_k))^2=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f(\sum_{j=1}^{m}w_{jk}y_j)))^2
  • 输入层误差:E=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f\left [ \sum_{j=1}^{m}w_{jk}f(net_j)\right ])^2=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f\left [ \sum_{j=1}^{m}w_{jk}f\left ( \sum_{i=1}^{n}v_{ij}x_i \right )\right ])^2

误差E有了,那么为了使误差越来越小,可以采用随机梯度下降的方式进行ω和υ的求解,即求得ω和υ使得误差E最小

BP算法的例子

å¨è¿éæå¥å¾çæè¿°

  • 初始值:w(0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65),   b(0.35,0.65)
  • 输出值:O=(0.01,0.99)
  • 学习率:η=0.5 
  • 假设隐层和输出层都使用 sigmoid 激活函数

1、FP过程

先求out

net_{h_1} = w_1 * l_1 + w_2 * l_2 + b_1 * 1 = 0.1 * 5 + 0.15*10+0.35*1=2.35
out_{h_1} = \frac{1}{1+e^{-h_1}} = \frac{1}{1+e^{-2.35}} = 0.912934

同理可以得到:

out_{h_2} =0.979164
out_{h_3} =0.995275

o_1 = w_7 * out_{h_1}+w_9 * out_{h_2}+w_{10} * out_{h_3}+b_2*1

out_{o1} = \frac{1}{1+e^{-o_1}} = \frac{1}{1+e^{-2.1019206}}=0.891090

同理可以得到:

out_{0_2} =0.904330

输出层误差表示如下:

E = \frac{1}{2}(d - O)^2 = \frac{1}{2}\sum_{k=1}^l(d_k - O_k)^2
E_{o_1} = \frac{1}{2}(target_{o_1} - out_{o_1})^2

E_{total} = E_{o_1}+E_{o_2}= \frac{1}{2}(0.01 - 0.891090)^2 + \frac{1}{2}(0.99 -0.904330 )^2 = 0.391829

2、BP 过程

输出层到第二层隐层,以求 w_7  为例:

\frac{\partial E_{total}}{\partial w_7} =\frac{\partial E_{total}}{\partial out_{o_1}}*\frac{\partial out_{o_1}}{\partial o_1}*\frac{\partial o_1}{\partial w_7}

下面我们分别求上式的三个部分,其中第一部分:

E_{o_1} = \frac{1}{2}(target_{o_1} - out_{o_1})^2

E_{total} = E_{o_1}+E_{o_2}=\frac{1}{2}(target_{o_1} - out_{o_1})^2+\frac{1}{2}(target_{o_2} - out_{o_2})^2

\frac{\partial E_{total}}{\partial out_{o_1}} = 2 * \frac{1}{2}(target_{o_1}-out_{o_1}) * (-1) + 0 = -(0.01 - 0.891090) = 0.88109

第二分部因为:

out_{o1} = \frac{1}{1+e^{-o_1}}

\begin{align*} {out_{o_1}}'=\frac{e^{-o_1}}{(1+e^{-o_1})^2}=\frac{1+e^{-o_1}-1}{(1+e^{-o_1})^2}=\frac{1}{1+e^{-o_1}}-\frac{1}{(1+e^{-o_1})^2}=out_{o_1}(1- out_{o_1}) \end{align*}

\frac{\partial out_{o_1}}{\partial o_1} = out_{o_1}(1 - out_{o_1}) = 0.891090(1 - 0.891090) = 0.097049

第三部分,因为:

o_1 = w_7 * out_{h_1}+w_9 * out_{h_2}+w_{10} * out_{h_3}+b_2*1

\frac{\partial o_1}{\partial w_7} = out_{h_1} + 0 + 0+0=0.912934

最终得到:

\frac{\partial E_{total}}{\partial w_7} =0.88109*0.097049*0.912934=0.078064

更新 w_7 的值:

\hat{w_7} = w_7 + \Delta w_7 = w_7 - \eta \frac{\partial E_{total}}{\partial w_7} =0.4 - 0.5 * 0.078064=0.360968

同理可以求出:

\hat{w_8} = 0.453383

\hat{w_9} = 0.458137

\hat{w_{10}} = 0.553629 

\hat{w_{11}} = 0.557448

\hat{w_{12}} = 0.653688

第二层隐层到第一层隐层,以求 w_1 为例:

\frac{\partial E_{total}}{\partial w_1} = \frac{\partial E_{total}}{\partial out_{h_1}}* \frac{\partial out_{h_1}}{\partial h_1}* \frac{\partial h_1}{\partial w_1}

\frac{\partial E_{total}}{\partial w_1}=\Big(\frac{\partial E_{o_1}}{\partial out_{h_1}} + \frac{\partial E_{o_2}}{\partial out_{h_1}}\Big)* \frac{\partial out_{h_1}}{\partial h_1}* \frac{\partial h_1}{\partial w_1}

\frac{\partial E_{o_1}}{\partial out_{h_1}}=\frac{\partial E_{o_1}}{\partial out_{o_1}} * \frac{\partial out_{o_1}}{\partial o_1}*\frac{\partial o_1}{\partial out_{h_1}}

下面我们分别计算,第一部分:

\frac{\partial E_{o_1}}{\partial out_{h_1}}=\frac{\partial E_{o_1}}{\partial out_{o_1}} * \frac{\partial out_{o_1}}{\partial o_1}*\frac{\partial o_1}{\partial out_{h_1}}

其中:

E_{o_1} = \frac{1}{2}(target_{o_1} - out_{o_1})^2

out_{o1} = \frac{1}{1+e^{-o_1}}

o_1 = w_7 * out_{h_1}+w_9 * out_{h_2}+w_{10} * out_{h_3}+b_2*1

\frac{\partial E_{o_1}}{\partial out_{h_1}}=-(target_{o_1} - out_{o_1})*out_{o_1}*(1- out_{o_1})*\hat{w_7}

注意:这里由于是反向传播,此时要用到之前更新后的 w_7​ 的值

\begin{align*}\frac{\partial E_{o_1}}{\partial out_{h_1}}=-(0.01 - 0.891090)*0.891090*(1-0.891090)*0.360968=0.030866 \end{align*}

同理计算:

\frac{\partial E_{o_2}}{\partial out_{h_1}} = \frac{\partial E_{o_2}}{\partial out_{o_2}} * \frac{\partial out_{o_2}}{\partial o_2}*\frac{\partial o_2}{\partial out_{h_1}}

\begin{align*} \frac{\partial E_{o_2}}{\partial out_{h_1}} &= -(target_{o_2} -out_{o_2})*out_{o_2}(1-out_{o_2})*w_8 \\ & =-(0.99-0.904330)*0.904330*(1-0.904330)*0.453383\\ &=-0.003360 \end{align*}

接着计算第二部分:

\frac{\partial out_{h_1}}{\partial h_1}=out_{h_1}*(1-out_{h_1}) =0.912934*(1-0.912934)=0.079486

接着计算第三部分:

\frac{\partial h_1}{\partial w_1} = l_1 = 5

最终整合起来:

\frac{\partial E_{total}}{\partial w_1} = (0.030866 + (-0.003360))*0.079486 *5=0.010932

于是更新 w_1

\hat{w_1} = w_1 + \Delta w_1 = w_1 - \eta \frac{\partial E_{total}}{\partial w_1} = 0.1 - 0.5 *0.010932 =0.094534

同理求出:w_2, w_3,w_4,w_5,w_6

以上是第一次迭代,经过多次迭代,最终的误差会越来越小

上图可以看出,当迭代1000次时,输出为 O=(0.022971,0.977675) 和原本的 O=(0.01,0.99) 比较接近了。

python代码

https://github.com/flepeng/code/blob/master/DL/bp_demo.py

import numpy as np# 初始值
w = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65]
# 偏置项b不进行更新
b = [0.35, 0.65]l = [5, 10]# sigmoid函数
def sigmoid(z):return 1.0 / (1 + np.exp(-z))def f1(w, b, l):# 前向传播,计算结果值h1 = sigmoid(w[0] * l[0] + w[1] * l[1] + b[0])h2 = sigmoid(w[2] * l[0] + w[3] * l[1] + b[0])h3 = sigmoid(w[4] * l[0] + w[5] * l[1] + b[0])o1 = sigmoid(w[6] * h1 + w[8] * h2 + w[10] * h3 + b[1])o2 = sigmoid(w[7] * h1 + w[9] * h2 + w[11] * h3 + b[1])# 后向传播,更新w# 输出层到第二层隐层,前两项# 公式中的第一部分-(0.01 - o1),第二部分o1 * (l - o1)t1 = -(0.01 - o1) * o1 * (l - o1)# 第二层隐层到第一层隐层,前两项t2 = -(0.99 - o2) * o2 * (l - o2)# t1*第三部分,即输出层到第二层隐层的参数梯度w[6] = w[6] - 0.5 * (t1 * h1)w[8] = w[8] - 0.5 * (t1 * h2)w[10] = w[10] - 0.5 * (t1 * h3)w[7] = w[7] - 0.5 * (t2 * h1)w[9] = w[9] - 0.5 * (t2 * h2)w[11] = w[11] - 0.5 * (t2 * h3)# (t1 * w[6] + t2 * w[7])对于公式()中的两项,h1 * (1 - h1)对于第二项,l[0]对应第三项w[0] = w[0] - 0.5 * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[0]w[1] = w[1] - 0.5 * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[1]w[2] = w[2] - 0.5 * (t1 * w[8] + t2 * w[9]) * h2 * (1 - h2) * l[0]w[3] = w[3] - 0.5 * (t1 * w[6] + t2 * w[9]) * h2 * (1 - h2) * l[1]w[4] = w[4] - 0.5 * (t1 * w[10] + t2 * w[11]) * h3 * (1 - h3) * l[0]w[5] = w[5] - 0.5 * (t1 * w[10] + t2 * w[11]) * h3 * (1 - h3) * l[1]return o1, o2, wfor i in range(1000):r1, r2, w = f1(w, b, l)print("第{}次迭代后,结果值为:({},{}),权重更新为:{}".format(i+1, r1, r2, w))

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自带的解释器叫做_python学习

一、PYTHON中的元素1.基本元素运算符: - * / %等等除法:" / " 表示浮点数除法,返回浮点结果;" // " 表示整数除法,返回不大于结果的一个最大的整数运算顺序:先乘除 再加减 括号最优先变量:就是一…

IE打印空白

今天碰到HR经理碰到一个问题,就是windows 7 64位操作系统,但是打印空白,打印出来像白纸一样!经过查看和总结,确认是:由于保护模式下 %Temp%\Low 文件夹工作不正常引起的!故障打印白纸下面会出现…

Python Matplotlib.plot Update image Questions

1. 最近在测试一款设备,采集了一些设备后需要一帧一帧显示图像,经常使用Python,所以选用了Matplotlib进行图像操作 数据结构: timesatamp polar_distance horizontal_angle refelectivity_intensity,所有数据类型都是 float,储存在…

深度学习之 RBF神经网络

RBF神经网络通常只有三层,即输入层、中间层和输出层。其中中间层主要计算输入x和样本矢量c(记忆样本)之间的欧式距离的Radial Basis Function (RBF)的值,输出层对其做一个线性的组合。 径向基函数: RBF神经网络的训练…

redis 队列_Redis与Rabbitmq消息队列的区别

将redis发布订阅模式用做消息队列和rabbitmq的区别:可靠性 redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中;rabbit…

EasyUI中那些不容易被发现的坑——EasyUI重复请求2次的问题

问题控件:datagrid、combobox、所有能设置url属性的控件 问题版本:1.4.4、1.4.5(之前的版本没测) 问题如图: 重复请求2次,错误代码如图: 错误问题分析:html加载的时候回请求url加载数…

GCC编译的背后( 预处理和编译 汇编和链接 )

发表于 2010年05月18日 22:01 分类: 编程coding统计: 1评/465阅 2人收藏此文章&#xff0c; 收藏此文章(?)by falcon<zhangjinwgmail.com> 2008-02-22 平时在Linux下写代码&#xff0c;直接用"gcc -o out in.c"就把代码编译好了&#xff0c;但是这后面到底做了…

ElasticSearch Java API

ElasticSearch-Java Client类型 ElasticSearch-TransportClient环境准备 ElasticSearch-TransportClient连接 ElasticSearch-Document APIs ElasticSearch-搜索-原理 ElasticSearch-搜索-问题 ElasticSearch-搜索-问题解决思路 ElasticSearch-搜索-SearchType-类型一 E…

深度学习之卷积神经网络(Convolutional Neural Networks, CNN)

前面, 介绍了DNN及其参数求解的方法(深度学习之 BP 算法),我们知道DNN仍然存在很多的问题&#xff0c;其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸.那么,人们又是怎么解决这个问题的呢?本节的卷积神经网络(Convolutional Neural Networks, CNN)就是一种解决方法. 我们…

Oracle DBA课程系列笔记(16)

第十六章&#xff1a; 用户管理 1、schema &#xff1a; user.object &#xff0c;用户认证方式&#xff1a;os 认证&#xff0c;database 认证 2、建立 database认证的用户&#xff1a; 10:00:48 SQL> create user rose …

python序列是几维_从一个1维的位数组获得一个特定的2维的1序列数组[Python] - python...

我正在使用Python&#xff0c;我需要找到执行以下任务的最有效方法。任务&#xff1a;给定零和一的任何一维数组v&#xff0c;用k> 0表示v的所有一维的子序列数。我需要从v获得一个二维数组w&#xff0c;使得&#xff1a;1)shape(w)(k&#xff0c;len(v))&#xff0c;2)对于…

深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)

前面我们说了CNN的一般层次结构, 每个层的作用及其参数的优缺点等内容.深度学习之卷积神经网络(Convolutional Neural Networks, CNN)_fenglepeng的博客-CSDN博客 一 CNN参数初始化及参数学习方法 和机器学习很多算法一样, CNN在进行训练之前也要进行参数的初始化操作. 我们…

GCC Inline ASM GCC内联汇编

GCC 支持在C/C代码中嵌入汇编代码&#xff0c;这些汇编代码被称作GCC Inline ASM——GCC内联汇编。这是一个非常有用的功能&#xff0c;有利于我们将一些C/C语法无法表达的指令直接潜入C/C代码中&#xff0c;另外也允许我们直接写 C/C代码中使用汇编编写简洁高效的代码。1.基本…

Hadoop1.x版本升级Hadoop2.x

引言 随着企业数据化和Hadoop的应用越加广泛&#xff0c;hadoop1.x的框架设计越来越无法满足人们对需求&#xff0c;Apache一直在对Hadoop1.x进行修改&#xff0c;最后推出了新一代的Hadoop2.x。从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看&#xff0c;MapRed…

本页由试用版打印控件lodop6.2.6输出_Visual Basic 6.0 Sirk 迷你版

Visual Basic 6.0 Sirk 迷你版 VB6 Sirk Mini 2019更新1、支持主流操作系统&#xff0c;避免原版安装失败的问题&#xff1a;支持Windows XP、Vista、Win7、Win8、Win10(32位、64位)。2、保留大部分常用功能&#xff0c;避免精简版过度精简&#xff1a;包含原版完整控件&#x…

深度学习之卷积神经网络 LeNet

卷积神经网络典型CNN LeNet&#xff1a;最早用于数字识别的CNNLeNet5&#xff1a;现在常说的一般就是LeNet5AlexNet&#xff1a;2012ILSVRC冠军&#xff0c;远超第二名的CNN&#xff0c;比LeNet更深&#xff0c;用多层小卷积叠加来替换单个的大卷积ZF Net&#xff1a;2013ILSV…

python爬虫常见反爬措施_爬虫常见的反爬措施有哪些

爬虫常见的反爬措施有三种&#xff1a;1、header头部信息解决方法&#xff1a;加User-Agent值&#xff1a;如果不加header头&#xff0c;部分网站服务器判断不到用户的访问来源&#xff0c;所以会返回一个404错误来告知你是一个爬虫&#xff0c;拒绝访问&#xff0c;解决办法如…

dom4j的读写xml文件,读写xml字符串

百度了一些博客&#xff0c;大同小异&#xff0c;在选取jar包工具的时候大概看了下&#xff0c;大抵是jdom原始&#xff0c;dom4j优秀。于是做了些练习。 参考&#xff1a;http://www.cnblogs.com/mengdd/archive/2013/06/05/3119927.html 1 package com.test.xml;2 3 import j…

深度学习之数据增强方案和TensorFlow操作

一、数据增强的方法介绍 增加训练数据&#xff0c; 则能够提升算法的准确率&#xff0c; 因为这样可以避免过拟合&#xff0c; 而避免了过拟合你就可以增大你的网络结构了。 当训练数据有限的时候&#xff0c; 可以通过一些变换来从已有的训练数据集中生成一些新的数据&#x…

移动前端头部标签(HTML5 head meta)

<!DOCTYPE html> <!-- 使用 HTML5 doctype&#xff0c;不区分大小写 --> <html lang"zh-cmn-Hans"> <!-- 更加标准的 lang 属性写法 http://zhi.hu/XyIa --> <head><!-- 声明文档使用的字符编码 --><meta charsetutf-8>&l…