神经网络反向传播(BP)公式推导_bp神经网络传播公式-程序员宅基地

技术标签: 机器学习  数学推导  深度学习  深度学习基础  人工智能  神经网络  

前言(简要)

阅读文本之前,默认您对神经网络的结构有了基本的了解,并且在阅读其他文章后觉得似懂非懂,想弄懂反向传播是如何真正地传导

符号定义

A multi-layer neural network with one hidden layer

上图中展示了一张最基本的多层神经网络(具有一个隐藏层,多层的思想和这个完全相同,文末点睛):
输入层是
x k = x 1 , . . . , x K {x_k}={x_1,...,x_K} xk=x1,...,xK
隐藏层是
h i = h 1 , . . . , h N {h_i}={h_1,...,h_N} hi=h1,...,hN
输出层是
y j = y 1 , . . . , y M {y_j}={y_1,...,y_M} yj=y1,...,yM
为了清楚起见,我们使用k、I、j分别作为输入、隐藏和输出层单元的下标。我们用 u i u_i ui u j ′ u_j^{'} uj分别表示隐藏层单元和输出层单元的净输入。
我们想导出更新方程,用于学习输入层和隐藏层之间的权重 w k i w_{ki} wki和隐藏层和输出层之间的权重 w i j ′ w_{ij}^{'} wij。我们假设所有的计算单元(图中的隐藏层和输出层)都使用 σ ( u ) σ(u) σ(u)作为激活函数。因此,对于隐藏层中的一个单元 h i h_i hi,它的输出定义为
h i = σ ( u i ) = σ ( ∑ k = 1 K w k i x k ) h_i=σ(u_i)=σ(\sum_{k=1}^{K} w_{ki}x_k) hi=σ(ui)=σ(k=1Kwkixk)
类似地,对于输出层中的一个单元 y j y_j yj,它的输出定位为:
y j = σ ( u j ′ ) = σ ( ∑ i = 1 N w i j ′ h i ) y_j=σ(u_j^{'})=σ(\sum_{i=1}^{N} w_{ij}^{'}h_i) yj=σ(uj)=σ(i=1Nwijhi)
损失函数我们使用平方和损失函数
E ( x , t , W , W ′ ) = 1 2 ∑ j = 1 M ( y j − t j ) 2 E(x,t,W,W^{'})=\frac{1}{2}\sum_{j=1}^{M} (y_j-t_j)^2 E(x,t,W,W)=21j=1M(yjtj)2
其中 W = w k i , 是 一 个 K ∗ N 的 权 重 矩 阵 ( 输 入 层 − 隐 藏 层 ) , W ′ = w i j ′ , 一 个 N ∗ M 的 权 重 矩 阵 ( 隐 藏 层 − 输 出 层 ) , t = t 1 , . . . , t M , 是 一 个 M 维 的 向 量 , 即 标 签 W={w_{ki}},是一个K*N的权重矩阵(输入层-隐藏层),W^{'}={w_{ij}^{'}},一个N*M的权重矩阵(隐藏层-输出层),t={t_1,...,t_M},是一个M维的向量,即标签 W=wki,KNW=wij,NMt=t1,...,tM,M

重点强调

我们反向传播的目的是获取 w k i w_{ki} wki w i j ′ {w_{ij}^{'}} wij的更新方程。我们只需要分别求出误差函数E对权重的导数。为了使推导变得简单,我们需要开始计算最右侧层(即输出层)的导数,对于每一层我们将计算分为三个步骤,分别计算输出、净输入和权重的误差导数。该过程如下所示:

推导过程

我们从输出层开始。第一步是计算输出误差的导数:
∂ E ∂ y j = y j − t j \frac{\partial{E}}{\partial{y_j}}=y_j-t_j yjE=yjtj
第二步是计算误差相对于输出层净输入的导数。请注意,当对某个事物进行导数时,我们需要保持其他一切不变。还要注意,这个值非常重要,因为它将在后续计算中多次重复使用。我们使用 E I j ′ EI_j^{'} EIj来表示它,出于简单.
∂ E ∂ u j ′ = ∂ E ∂ y j ∗ ∂ y j ∂ u j ′ = ( y j − t j ) ∗ y j ( 1 − y j ) : = E I j ′ ( 1 ) \frac{\partial{E}}{\partial{u_j^{'}}}=\frac{\partial{E}}{\partial{y_j}}*\frac{\partial{y_j}}{\partial{u_j^{'}}}=(y_j-t_j)*y_j(1-y_j):=EI_j^{'} (1) ujE=yjEujyj=(yjtj)yj(1yj):=EIj(1)
:=是定义的意思
第三步是计算关于输出层和隐藏层之间的权重的误差的导数。
∂ E ∂ w i j ′ = ∂ E ∂ u j ′ ∗ ∂ u j ′ ∂ w i j ′ = E I j ′ ∗ h i \frac{\partial{E}}{\partial{w_{ij}^{'}}}=\frac{\partial{E}}{\partial{u_j^{'}}}*\frac{\partial{u_j^{'}}}{\partial{w_{ij}^{'}}}=EI_j^{'}*h_i wijE=ujEwijuj=EIjhi
到目前为止,我们已经获得了隐藏层和输出层之间的权重更新方程.
w i j n e w = w i j o l d − η ∗ ∂ E ∂ w i j ′ = w i j o l d − η ∗ E I j ′ ∗ h i w_{ij}^{new}=w_{ij}^{old}-η*\frac{\partial{E}}{\partial{w_{ij}^{'}}}=w_{ij}^{old}-η*EI_j^{'}*h_i wijnew=wijoldηwijE=wijoldηEIjhi
其中η > 0是学习率。
我们可以重复同样的三个步骤来获得左边一层(前一层)权重的更新方程,这本质上是反向传播的思想。我们重复第一步,计算关于隐藏层输出的误差导数。请注意,隐藏层的输出与输出层中的所有单元相关。
∂ E ∂ h i = ∑ j = 1 M ∂ E ∂ u j ′ ∂ u j ′ ∂ h i = ∑ j = 1 M E I j ′ ∗ w i j ′ \frac{\partial{E}}{\partial{h_i}}=\sum_{j=1}^{M}\frac{\partial{E}}{\partial{u_{j}^{'}}}\frac{\partial{u_j^{'}}}{\partial{h_i}}=\sum_{j=1}^{M}EI_j^{'}*w_{ij}^{'} hiE=j=1MujEhiuj=j=1MEIjwij
然后我们重复上面的第二步,计算关于隐藏层净输入的误差导数。这个值也很重要,我们称之为 E I i EI_i EIi
∂ E ∂ u i = ∂ E ∂ h i ∗ ∂ h i ∂ u i = ∑ j = 1 M E I j ′ ∗ u i j ′ ∗ h i ∗ ( 1 − h i ) : = E I i ( 2 ) \frac{\partial{E}}{\partial{u_i}}=\frac{\partial{E}}{\partial{h_i}}*\frac{\partial{h_i}}{\partial{u_i}}=\sum_{j=1}^{M}EI_j^{'}*u_{ij}^{'}*h_i*(1-h_i):=EI_i(2) uiE=hiEuihi=j=1MEIjuijhi(1hi):=EIi(2)
接下来,我们重复上面的第三步,计算关于输入层和隐藏层之间的权重的误差导数。
∂ E ∂ w k i = ∂ E ∂ u i ∗ ∂ u i ∂ w k i = E I i ∗ x k \frac{\partial{E}}{\partial{w_{ki}}}=\frac{\partial{E}}{\partial{u_i}}*\frac{\partial{u_i}}{\partial{w_{ki}}}=EI_i*x_k wkiE=uiEwkiui=EIixk
最后,我们可以获得隐藏层和输入层之间的权重更新方程
. w k i n e w = w i j o l d − η ∗ E I i ∗ x k w_{ki}^{new}=w_{ij}^{old}-η*EI_i*x_k wkinew=wijoldηEIixk

点睛

从上面的例子中,我们可以看到,计算一层导数时的中间结果( E I j ′ EI_j^{'} EIj)可以被前一层重用。假设在输入层之前还有另一层,那么还可以重用 E I i EI_i EIi来继续高效地计算导数链。比较等式(1)和(2),我们可以发现在(2)中,因子 ∑ j = 1 M E I j ′ w i j ′ \sum_{j=1}^{M}EI_j^{'}w_{ij}^{'} j=1MEIjwij隐藏层单元 h i h_i hi的“误差”。我们可以将这个术语解释为从右边一层“反向传播”的误差,如果网络有更多的隐藏层,这种传播可能会进一步反向。

参考文献

【1】Xin Rong.word2vec Parameter Learning Explained[J].

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45771770/article/details/115003577

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签