一步一步教你反向传播的样例

blfbuaa blfbuaa     2022-09-09     236

关键词:

背景

反向传播(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的输入:
技术分享

然后我们利用logistic函数把neth1挤压到h1的输出:
技术分享

h2进行同样的操作:
outh2=0.596884378

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

这是o1的输出:
技术分享

o2进行同样操作:
outo2=0.772928465

计算总体误差

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

比如,目标输出o1是0.01,可是神经网络输出是0.75136507,因此误差是:
技术分享

o2反复这个过程:
Eo2=0.023560026

神经网络总体误差:
技术分享

反向传播

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

输出层

考虑w5。我们想要知道w5如何影响总体误差,即αEtotalαw5

应用链式规则:
技术分享

可视化我们正在做的:
技术分享

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

首先,output如何改变总体误差?
技术分享

下一步。net input如何改变o1输出?
logistic函数的偏导数是输出乘以1减输出:
技术分享

最后,w5如何改变o1的net input?
技术分享

把它们结合起来:
技术分享

你经常能看到delta rule的结合形式:
技术分享
我们利用αEtotalαouto1αouto1αneto1来重写αEtotalαneto1,我们使用这个又一次上面的表达式:
技术分享

因此:
技术分享

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

我们能反复这个过程得到新的权重w6w7w8
技术分享

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

隐含层

下一步,我们将继续向后计算w1w2w3w4新值,这是我们须要理解的:
技术分享

可视化:
技术分享

我们将要对隐含层神经元使用类似的过程。可是略微不同的是。每一个隐含层神经元的输出贡献到多个输出层神经元中。我们知道outh1影响outo1outo2,因此αEtotalαouth1须要考虑两个输出层神经元的影响:

αEtotalαouth1=αEo1αouth1+αEo2αouth1

先计算αEo1αouth1:

αEo1αouth1=αEo1αneto1?αneto1αouth1

使用稍早前计算的值来计算αEo1αneto1

αEo1αneto1=αEo1αouto1?αouto1αneto1=0.74136507?0.186815602

αneto1αouth1等于w5:

neto1=w5?outh1+w6?outh2+b2?1

αneto1αouth1=w5=0.40

合在一起:
αEo1αouth1=αEo1αneto1?αneto1αouth1=0.138498562?0.40=0.055399425

αEo2αouto1做同样的处理:

αEo2αouth1=?0.019049119

因此:

技术分享

如今我们有αEtotalαouth1,我们还须要计算αouth1αneth1,然后对每一个权重计算αneth1αw

技术分享

我们计算h1w1的偏导数:

技术分享

把它们结合起来:
技术分享

你也能够例如以下写:

技术分享

如今我们能更新w1

技术分享

w2w3w4反复上面过程:

技术分享

最后,我们更新所有权重。当我们把输入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






























一步一步教你认识闭包

...什么用?为什么要用闭包?今天我们就带着这3个问题来一步一步认识闭包。闭包和函数紧密联系在一起,介绍闭包前有必要先介绍一些背景知识,诸如嵌套函数、变量的作用域等概念作用域作用域是程序运行时变量可被访问的... 查看详情

一步一步教你接入tinker热修复

官方文档:https://github.com/Tencent/tinker 下面我们按照官方文档和这个里面的tinker-sample-android来进行集成Tinker。注意说明,官方demo的使用https://github.com/Tencent/tinker/wiki/Tinker-接入指南里面的使用步骤详解,注意:官方demo导... 查看详情

一步一步教你ssm整合swagger(代码片段)

一:什么是swagger??swagger是一款非常好用的写API文档的框架。其他自行百度二:ssm整合swagger?1:在maven的pom文件中引入依赖:(注意版本,否则会导致tomcat不能正常启动)<!--引入swagger--><!--springfox的核心jar包--><depende... 查看详情

一步一步教你如何制件zkeacms的扩展组件/插件

前言如果你还不知道ZKEACMS,不妨先了解一下。ASP.NETMVC开源建站系统ZKEACMS推荐,从此网站“拼”起来官方地址:http://www.zkea.net/zkeacms下载地址:https://github.com/SeriaWei/ASP.NET-MVC-CMS/releasesGitHub:https://github.com/SeriaWei/ASP. 查看详情

02~一步一步教你使用svn之svn的介绍

SVN的介绍一.学习SVN的主要内容的介绍1.基本操作:学习SVN有哪些基本操作2.服务器端的安装配置:SVN中必不可少的2个环境之一,会在下面的课程中介绍服务器如何去安装和配置3.客户端软件的使用:在实际开发中,使用客户端软件来操... 查看详情

一步一步教你将开源项目上传到jcenter

...来,希望能帮助到小伙伴们,现在觉得还是挺简单的。第一步:首先是注册,这就是我踩的最大的一个坑,导致我一天都没有上传成功。网上说的都是去jcenter的网站上注册就 查看详情

一步一步教你在docker容器下使用mmdetection训练自己的数据集

这里不再介绍mmdetection的安装和配置,使用mmdetection较简单的方法是使用已安装mmdetection的docker容器。这样直接省去了安装mmdetection的过程,让重心放在模型训练上!如果你对docker和mmdetection还不是很熟悉,请自行搜索一下,本文... 查看详情

一步一步教你制作的第一个wordpress插件(代码片段)

💂个人网站:【海拥】【摸鱼小游戏】【神级源码资源网站】🤟风趣幽默的前端学习课程:👉28个案例趣学前端💅想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬免费且实用... 查看详情

一步一步教你制作的第一个wordpress插件(代码片段)

💂个人网站:【海拥】【摸鱼小游戏】【神级源码资源网站】🤟风趣幽默的前端学习课程:👉28个案例趣学前端💅想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬免费且实用... 查看详情

2.一步一步教你使用pycharm运行起第一个django项目(代码片段)

下面步骤展示的是如何经过VirtualBox管理器,使得pycharm和ubuntu中的项目环境连接对应起来!如果你有属于自己的服务器,核心步骤都是大差不差的,甚至使用服务器步骤更简单许多哦!(但是要注意:... 查看详情

一步一步教你yaml快速入门

Java学习之路迢迢,无论是开局helloword,还是从头文件说起,总之,都是有顺序可言。我们学习Java,都是先介绍properties文件,使用properties文件配合Properties对象能够很方便的适用于应用配置上。然后在引入XML的时候,我们介绍prop... 查看详情

一步一步教你apache深入优化

Aache深入优化一、在Centos01上安装apache服务,在Centos02配置DNS服务器使用域名www.stz.com1、在Centos01上安装apache服务配置网站1)切换光盘2)挂载光盘解压源代码程序[root@centos01~]#mount/dev/cdrom/mnt/mount:/dev/sr0写保护,将以只读方式挂载[r... 查看详情

一步一步教你nginx地址重写

Nginx地址重写一、在Centos01上安装安装Nginx,设置网站根目录/www使用域名www.stz.com访问,Cent02上安装DNS服务解析www.stz.com和www.stz.com.cn以及www.stz.com.en域名1、在Centos01上安装nginx依赖1)挂载系统光盘配置本地yum仓库[root@centos01~]#mount/d... 查看详情

一步一步教你tomcat优化和发布动态网站

Tomcat性能优化一、安装Centos01上安装tomcat发布动态网站jpress使用www.Benet.com访问,配置虚拟机主机通过www.benet.com和www.accp.com访问不同的虚拟主机1)上传tomcat文件包[root@centos01~]#rz[root@centos01~]#lsanaconda-ks.cfg公共图片音乐apache-tomcat-8.5... 查看详情

一步一步教你nginx优化和防盗链

     Nginx优化和防盗链一、在Centos01上安装Nginx,设置根目录/www/使用域名www.stz.con访问1、在Centos01上安装Nginx依赖程序1)挂载系统光盘配置本地yum仓库[root@centos01~]#mount/dev/cdrom/mnt/mount:/dev/sr0写保护,将以只读方... 查看详情

一步一步教你nginx平滑升级和动静分离

一、在Centos01安装Nginx服务,配置网站主页,使用www.szt.com访问Nginx1、在Centos01上安装Nginx依赖1)挂载光盘配置本地yum仓库[root@centos01~]#mount/dev/cdrom/mnt/mount:/dev/sr0写保护,将以只读方式挂载[root@centos01~]#rm-rf/etc/yum.repos.d/CentOS-*2)安... 查看详情

一步一步教你nginx优化和防盗链

     Nginx优化和防盗链一、在Centos01上安装Nginx,设置根目录/www/使用域名www.stz.con访问1、在Centos01上安装Nginx依赖程序1)挂载系统光盘配置本地yum仓库[root@centos01~]#mount/dev/cdrom/mnt/mount:/dev/sr0写保护,将以只读方... 查看详情

一步一步教你nginx平滑升级和动静分离

一、在Centos01安装Nginx服务,配置网站主页,使用www.szt.com访问Nginx1、在Centos01上安装Nginx依赖1)挂载光盘配置本地yum仓库[root@centos01~]#mount/dev/cdrom/mnt/mount:/dev/sr0写保护,将以只读方式挂载[root@centos01~]#rm-rf/etc/yum.repos.d/CentOS-*2)安... 查看详情