背景

反向传播(Backpropagation)是训练神经网络最通用的方法之一,网上有许多文章尝试解释反向传播是如何工作的,但是很少有包括真实数字的例子,这篇博文尝试通过离散的数据解释它是怎样工作的。

Python实现的反向传播

你能使用Python来实现反向传播,我曾经在this Github repo上实现了反向传播算法。

反向传播的可视化

显示神经网络学习时相互作用的可视化,检查我的Neural Network visualization

另外的资源

如果你发现这个教程对你有用并且想继续学习神经网络以及它的应用,我强烈建议你看Adrian Rosebrock优秀的教程Getting Started with Deep Learning and Python

概述

对于这个教程,我们将使用2个输入神经元、2个隐含层神经元以及2个输出层神经元组成一个神经网络,另外,隐含层和输出层神经元各包含一个偏差。

这是基本结构:

目的让神经网络工作,我们对权重偏差和训练的输入/输出设置一个初始值:

反向传播的目的是优化权重,以便于让神经网络学习怎样正确的把任意的输入映射到输出中。

这篇教程的剩余部分我们将要和单一的训练集工作:输入0.05和0.10,我们想要神经网络输出0.01和0.99。

前向反馈

为了开始,当前给定权重和偏差以及输入值0.05和0.10,神经网络预测结果是什么,我们需要把输入值向前传给网络。

我们知道全部的输入值传到每个隐含层神经元中,使用激活函数挤压全部的输入值(在这里,我们使用logistic函数),对输出层神经元重复这一过程。

计算h1" role="presentation" style="position: relative;">h1h1的输入:

然后我们利用logistic函数把neth1" role="presentation" style="position: relative;">neth1neth1挤压到h1" role="presentation" style="position: relative;">h1h1的输出:

对h2" role="presentation" style="position: relative;">h2h2进行相同的操作:

outh2=0.596884378" role="presentation" style="position: relative;">outh2=0.596884378outh2=0.596884378

对输出层神经元重复操作,使用隐含层神经元的输出作为输出层神经元的输入。

这是o1" role="presentation" style="position: relative;">o1o1的输出:

对o2" role="presentation" style="position: relative;">o2o2进行相同操作:

outo2=0.772928465" role="presentation" style="position: relative;">outo2=0.772928465outo2=0.772928465

计算整体误差

利用平方和误差,我们能计算每个输出层神经元的误差:

例如,目标输出o1" role="presentation" style="position: relative;">o1o1是0.01,但是神经网络输出是0.75136507,因此误差是:

对o2" role="presentation" style="position: relative;">o2o2重复这个过程:

Eo2=0.023560026" role="presentation" style="position: relative;">Eo2=0.023560026Eo2=0.023560026

神经网络整体误差:

反向传播

反向传播的目的是更新网络中每个权重,以便他们真实的输出值是接近目标输出,从而最小化输出层神经元的误差。

输出层

考虑w5" role="presentation" style="position: relative;">w5w5,我们想要知道w5" role="presentation" style="position: relative;">w5w5怎样影响整体误差,即αEtotalαw5" role="presentation" style="position: relative;">αEtotalαw5αEtotalαw5

应用链式规则:

可视化我们正在做的:

我们需要理解这个公式的每一步。

首先,output怎样改变整体误差?

下一步,net input怎样改变o1" role="presentation" style="position: relative;">o1o1输出?

logistic函数的偏导数是输出乘以1减输出:

最后,w5" role="presentation" style="position: relative;">w5w5怎样改变o1" role="presentation" style="position: relative;">o1o1的net input?

把它们结合起来:

你常常能看到delta rule的结合形式:



我们利用αEtotalαouto1" role="presentation" style="position: relative;">αEtotalαouto1αEtotalαouto1和αouto1αneto1" role="presentation" style="position: relative;">αouto1αneto1αouto1αneto1来重写αEtotalαneto1" role="presentation" style="position: relative;">αEtotalαneto1αEtotalαneto1,我们使用这个重新上面的表达式:

因此:

为了减少误差,我们从当前权重减去这个值(乘以一个学习率,设置成0.5):

我们能重复这个过程得到新的权重w6" role="presentation" style="position: relative;">w6w6,w7" role="presentation" style="position: relative;">w7w7和w8" role="presentation" style="position: relative;">w8w8:

当我们继续下面的反向传输算法时,我们使用初始权重,而不是更新过的权重。

隐含层

下一步,我们将继续向后计算w1" role="presentation" style="position: relative;">w1w1,w2" role="presentation" style="position: relative;">w2w2,w3" role="presentation" style="position: relative;">w3w3和w4" role="presentation" style="position: relative;">w4w4新值,这是我们需要理解的:

可视化:

我们将要对隐含层神经元使用相似的过程,但是稍微不同的是,每个隐含层神经元的输出贡献到多个输出层神经元中。我们知道outh1" role="presentation" style="position: relative;">outh1outh1影响outo1" role="presentation" style="position: relative;">outo1outo1和outo2" role="presentation" style="position: relative;">outo2outo2,因此αEtotalαouth1" role="presentation" style="position: relative;">αEtotalαouth1αEtotalαouth1需要考虑两个输出层神经元的影响:

αEtotalαouth1=αEo1αouth1+αEo2αouth1" role="presentation" style="position: relative;">αEtotalαouth1=αEo1αouth1+αEo2αouth1αEtotalαouth1=αEo1αouth1+αEo2αouth1

先计算αEo1αouth1" role="presentation" style="position: relative;">αEo1αouth1αEo1αouth1:

αEo1αouth1=αEo1αneto1∗αneto1αouth1" role="presentation" style="position: relative;">αEo1αouth1=αEo1αneto1∗αneto1αouth1αEo1αouth1=αEo1αneto1∗αneto1αouth1

使用稍早前计算的值来计算αEo1αneto1" role="presentation" style="position: relative;">αEo1αneto1αEo1αneto1:

αEo1αneto1=αEo1αouto1∗αouto1αneto1=0.74136507∗0.186815602" role="presentation" style="position: relative;">αEo1αneto1=αEo1αouto1∗αouto1αneto1=0.74136507∗0.186815602αEo1αneto1=αEo1αouto1∗αouto1αneto1=0.74136507∗0.186815602

αneto1αouth1" role="presentation" style="position: relative;">αneto1αouth1αneto1αouth1等于w5" role="presentation" style="position: relative;">w5w5:

neto1=w5∗outh1+w6∗outh2+b2∗1" role="presentation" style="position: relative;">neto1=w5∗outh1+w6∗outh2+b2∗1neto1=w5∗outh1+w6∗outh2+b2∗1

αneto1αouth1=w5=0.40" role="presentation" style="position: relative;">αneto1αouth1=w5=0.40αneto1αouth1=w5=0.40

合在一起:

αEo1αouth1=αEo1αneto1∗αneto1αouth1=0.138498562∗0.40=0.055399425" role="presentation" style="position: relative;">αEo1αouth1=αEo1αneto1∗αneto1αouth1=0.138498562∗0.40=0.055399425αEo1αouth1=αEo1αneto1∗αneto1αouth1=0.138498562∗0.40=0.055399425

对αEo2αouto1" role="presentation" style="position: relative;">αEo2αouto1αEo2αouto1做相同的处理:

αEo2αouth1=−0.019049119" role="presentation" style="position: relative;">αEo2αouth1=−0.019049119αEo2αouth1=−0.019049119

因此:

现在我们有αEtotalαouth1" role="presentation" style="position: relative;">αEtotalαouth1αEtotalαouth1,我们还需要计算αouth1αneth1" role="presentation" style="position: relative;">αouth1αneth1αouth1αneth1,然后对每个权重计算αneth1αw" role="presentation" style="position: relative;">αneth1αwαneth1αw:

我们计算h1" role="presentation" style="position: relative;">h1h1对w1" role="presentation" style="position: relative;">w1w1的偏导数:

把它们结合起来:

你也可以如下写:

现在我们能更新w1" role="presentation" style="position: relative;">w1w1:

对w2" role="presentation" style="position: relative;">w2w2,w3" role="presentation" style="position: relative;">w3w3和w4" role="presentation" style="position: relative;">w4w4重复上面过程:

最后,我们更新所有权重,当我们把输入0.05和0.1向前反馈,神经网络的误差为0.298371109,在一次反向传播后,整体误差降到0.291027924,它看似不多,但是重复10000次之后,误差大幅下降到0.000035085,在这之后,我们把输入0.05和0.1向前反馈,那么输出的2个神经元生成0.015912196(vs 目标0.01)和0.984065734(vs 目标0.99)。

原文链接:A Step by Step Backpropagation Example

转https://blog.csdn.net/shaomingliang499/article/details/50587300

CNN反向传播更新权值的更多相关文章

  1. 卷积神经网络(CNN)反向传播算法

    在卷积神经网络(CNN)前向传播算法中,我们对CNN的前向传播算法做了总结,基于CNN前向传播算法的基础,我们下面就对CNN的反向传播算法做一个总结.在阅读本文前,建议先研究DNN的反向传播算法:深度 ...

  2. CNN反向传播算法过程

    主模块 规格数据输入(加载,调格式,归一化) 定义网络结构 设置训练参数 调用初始化模块 调用训练模块 调用测试模块 画图 初始化模块 设置初始化参数(输入通道,输入尺寸) 遍历层(计算尺寸,输入输出 ...

  3. 深度学习梯度反向传播出现Nan值的原因归类

    症状:前向计算一切正常.梯度反向传播的时候就出现异常,梯度从某一层开始出现Nan值(Nan: Not a number缩写,在numpy中,np.nan != np.nan,是唯一个不等于自身的数). ...

  4. CNN反向传播算法公式

    网络结构(6c-2s-12c-2s): 初始化: \begin{align}\notag W \sim U(- \frac{\sqrt{6}}{\sqrt{n_j+n_{j+1}}} , \frac{ ...

  5. CNN的反向传播

    在一般的全联接神经网络中,我们通过反向传播算法计算参数的导数.BP 算法本质上可以认为是链式法则在矩阵求导上的运用.但 CNN 中的卷积操作则不再是全联接的形式,因此 CNN 的 BP 算法需要在原始 ...

  6. CNN中卷积层 池化层反向传播

    参考:https://blog.csdn.net/kyang624823/article/details/78633897 卷积层 池化层反向传播: 1,CNN的前向传播 a)对于卷积层,卷积核与输入 ...

  7. [转] 一文弄懂神经网络中的反向传播法——BackPropagation

    在看CNN和RNN的相关算法TF实现,总感觉有些细枝末节理解不到位,浮在表面.那么就一点点扣细节吧. 这个作者讲方向传播也是没谁了,666- 原文地址:https://www.cnblogs.com/ ...

  8. NLP教程(3) | 神经网络与反向传播

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...

  9. 一文弄懂神经网络中的反向传播法——BackPropagation

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

随机推荐

  1. R期望

    斐波那契数列--九九乘法表 # 1. 打印斐波那契数列 kl<-c(1,1) for (i in 1:8){ kl[i+2]<-kl[i]+kl[i+1] } kl # 10. 打印九九乘 ...

  2. java超市购物管理系统

    一.概述 1.鹏哥前面有写过java项目超市管理系统项目,传送门 2.收到很多朋友私信给我,也很感谢老铁们的反馈和交流,前面这个项目只是对java基础知识和面向对象的思想练习,但是没有涉及到java如 ...

  3. linux命令-压缩与打包

    在 Linux 中可以识别的常见压缩格式有十几种,比如".zip"" .gz"" .bz2" ".tar" " ...

  4. 腾讯短信+SpringBoot+Redis实现注册逻辑

    使用redis做缓存实现用户的注册功能: 异步请求发送短信,给 发送短信的按钮 绑定异步事件 调用发送短信逻辑发送短信 缓存 key1:验证码 缓存 key2:短信发送时刻的时间 用户提交表单 包含用 ...

  5. Netty实战:设计一个IM框架

    来源:逅弈逐码 bitchat 是一个基于 Netty 的 IM 即时通讯框架 项目地址:https://github.com/all4you/bitchat 快速开始 bitchat-example ...

  6. 【nodejs原理&源码赏析(5)】net模块与通讯的实现

    目录 一. net模块简介 二. Client-Server的通讯 2.1 server的建立 2.2 Socket的建立 三. IPC通讯 四. 撸一个简易的cluster通讯模型 示例代码托管在: ...

  7. Web前端基础(18):jQuery基础(五)

    1. 事件 前面我们介绍完js的事件流的概念之后,相信大家对事件流也有所了解了.那么接下来我们看一下jquery的事件操作. 在说jquery的每个事件之前,我们先来看一下事件对象 . 1.1 事件对 ...

  8. 使用Navicat Premium 比较PostgreSql数据库 dev环境与test环境差异

    Navicat Premium 功能很强大,支持不同数据库客户端的连接,并且使用工具可以生成两个库差异的sql脚本,方便dev与test环境表结构同步,具体操作方法如下 单击运行,实现两个库中模式表结 ...

  9. [browser location和history] 简单实现了个路由[转载]

    今天看了1下前面写的,好像缺乏交流性,周末再来弄吧 -0- 今天看了browser 的 location 和 history location属性 // //location.hash 性是一个可读可 ...

  10. 地图SDK全面升级 – 数十项新功能及优化等你来体验

    腾讯位置服务地图SDK是一套提供多种地理位置服务的应用程序接口.通过调用该接口,开发者可以在自己的应用中加入地图相关的功能(如地图展示.标注.绘制图形等),轻松访问腾讯地图服务和数据,构建功能丰富.交 ...