反向传播BP算法
前向传播模型
一般我们使用的公式是:
\[
a=\frac{1}{1+\exp \left(-\left(w^{T} x+b\right)\right)} = \frac{1}{1+\exp \left(-\left[w^{T} \quad b\right] \cdot[x \quad 1]\right)}
\]
对于隐层有多个神经元的情况就是:
\[
\begin{array}{l}{a_{1}=\frac{1}{1+\exp \left(w^{(1) T} x+b_{1}\right)}} \\ {\vdots} \\ {a_{m}=\frac{1}{1+\exp \left(w^{(m) T} x+b_{m}\right)}}\end{array}
\]
记为:\(z=W x+b\)
\[
\left[ \begin{array}{c}{a^{(1)}} \\ {\vdots} \\ {a^{(m)}}\end{array}\right]=\sigma(z)=\sigma(W x+b)
\]
反向传播中的微积分计算
现在假设我们有一个三层神经网络,我们简单的表示成:
\[
C\left(w_{1}, b_{1}, w_{2}, b_{2}, w_{3}, b_{3}\right)
\]
我们需要调整的就是这些变量,我们的目的就是希望这些变量作为参数,损失函数梯度下降的最快,
现在假设我们每层只有一个神经元,我们将神经网络最后一层得神经元用 \(a^{(L)}\)来表示,这一个损失函数我们可以表示成:\(\operatorname{cost} \longrightarrow C_{0}(\ldots)=\left(a^{(L)}-y\right)^{2}\)
我们从倒数第二层 \(a^{(L-1)}\) 到 \(a^{(L)}\) 层的时候,由下面的公示的得到:
\[
\begin{aligned} z^{(L)} &=w^{(L)} a^{(L-1)}+b^{(L)} \\ a^{(L)} &=\sigma\left(z^{(L)}\right) \end{aligned}
\]
这个是前向传播的公式:现在我们想要损失函数下降的越快,那么 \(C\) 对 \(w\) 越敏感,下降得越快。这里我们将上面的求导用链式法则,只是简单的列出来,
\[
\frac{\partial C_{0}}{\partial w^{(L)}}=\frac{\partial z^{(L)}}{\partial w^{(L)}} \frac{\partial a^{(L)}}{\partial z^{(L)}} \frac{\partial C 0}{\partial a^{(L)}}
\]
现在我们分别对上面公式后面的三个求导:
\[
\begin{aligned} \frac{\partial C_0}{\partial a^{(L)}} &=2\left(a^{(L)}-y\right) \\ \frac{\partial a^{(L)}}{\partial z^{(L)}} &=\sigma^{\prime}\left(z^{(L)}\right) \\ \frac{\partial z^{(L)}}{\partial w^{(L)}} &=a^{(L-1)} \end{aligned}
\]
然后我们得到下面的公式:
\[
\frac{\partial C_{0}}{\partial w^{(L)}}=\frac{\partial z^{(L)}}{\partial w^{(L)}} \frac{\partial a^{(L)}}{\partial z^{(L)}} \frac{\partial C _{0}}{\partial a^{(L)}}=a^{(L-1)} \sigma^{\prime}\left(z^{(L)}\right) 2\left(a^{(L)}-y\right)
\]
对于这个式子,说明了梯度与哪些因素相关:由于上面的式子,我们只考虑了最终输出的一个元素,由于最后的网络输出的是一层,所以最后一层的神经元求得偏置应该是:
\[
\frac{\partial C}{\partial w^{(L)}}=\frac{1}{n} \sum_{k=0}^{n-1} \frac{\partial C_{k}}{\partial w^{(L)}}
\]
上述只是对一个偏置 \(w(L)\) 求梯度,而我们要对所有的偏置求梯度,那就是:
\[
\nabla C=\left[ \begin{array}{c}{\frac{\partial C}{\partial w^{(1)}}} \\ {\frac{\partial C}{\partial b^{(1)}}} \\ {\vdots} \\ {\frac{\partial C}{\partial w^{(L)}}} \\ {\frac{\partial C}{\partial b^{(L)}}}\end{array}\right]
\]
每层有多个神经元时
前面我们假设的是每层只有一个神经元,现在我们假设每层有多个神经元,我们表示神经网络如下:
我们下一层的计算方法本质上是一样的:
\[
z_{j}^{(L)}=w_{j 0}^{(L)} a_{0}^{(L-1)}+w_{j 1}^{(L)} a_{1}^{(L-1)}+w_{j 2}^{(L)} a_{2}^{(L-1)}+b_{j}^{(L)}
\]
\[
a_{j}^{(L)}=\sigma\left(z_{j}^{(L)}\right)
\]
上面的公式如果写成向量的形式,本质上与每层只有一个神经元是一样的。
此时我们的损失函数就是:
\[
C_{0}=\sum_{j=0}^{n_{L}-1}\left(a_{j}^{(L)}-y_{j}\right)^{2}
\]
损失函数对偏置求导:
\[
\frac{\partial C_{0}}{\partial w_{j k}^{(L)}}=\frac{\partial z_{j}^{(L)}}{\partial w_{j k}^{(L)}} \frac{\partial a_{j}^{(L)}}{\partial z_{j}^{(L)}} \frac{\partial C_{0}}{\partial a_{j}^{(L)}}
\]
这个公式和每层只有一个神经元本质是一样的。
这里我们求的是最后一层,而反向传播的本质是要不断的向后,也就是从最后一层到倒数第二层,一直反向。上面我们求的是倒数第二层到最后一层的 \(w_{j k}^{(L)}\) 对最后一层损失函数的影响,那么再往后该怎么计算呢?所以我们要知道倒数第二层的期望值,所以我们用最后一层对倒数第二层求偏导:
\[
\frac{\partial C_{0}}{\partial a_{k}^{(L-1)}}=\sum_{j=0}^{n_{L}-1} \frac{\partial z_{j}^{(L)}}{\partial a_{k}^{(L-1)}} \frac{\partial a_{j}^{(L)}}{\partial z_{j}^{(L)}} \frac{\partial C_{0}}{\partial a_{j}^{(L)}}
\]
这样我们可以得到期望的 \(a ^{(L-1)}\), 也就算到了倒数第二层,然后我们再用这一层继续往后修正神经网络中的参数就可以了。
本质上就是,每一层的损失函数有三个参数:
\[
\begin{aligned} z^{(L)} &=w^{(L)} a^{(L-1)}+b^{(L)} \\ a^{(L)} &=\sigma\left(z^{(L)}\right) \end{aligned}
\]
分别是 \(w^{(L)}\) 和 \(a^{(L-1)}\) 以及$ b^{(L)}$. 所以我们对他们三个求偏导,也就是梯度下降求最优解来优化这三个参数。
反向传播BP算法的更多相关文章
- 神经网络——反向传播BP算法公式推导
在神经网络中,当我们的网络层数越来越多时,网络的参数也越来越多,如何对网络进行训练呢?我们需要一种强大的算法,无论网络多复杂,都能够有效的进行训练.在众多的训练算法中,其中最杰出的代表就是BP算法,它 ...
- 神经网络,前向传播FP和反向传播BP
1 神经网络 神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入.例如,下图就是一个简单的神经网络: 我们使用圆圈来表示神经网络的输入,标上“”的圆 ...
- 手写BP(反向传播)算法
BP算法为深度学习中参数更新的重要角色,一般基于loss对参数的偏导进行更新. 一些根据均方误差,每层默认激活函数sigmoid(不同激活函数,则更新公式不一样) 假设网络如图所示: 则更新公式为: ...
- 反向传播BP为什么高效
之前有一篇文章讲了反向传播的原理: 下面这篇文章讲了反向传播为什么高效: https://blog.csdn.net/lujiandong1/article/details/52716726 主要通过 ...
- Backpropagation反向传播算法(BP算法)
1.Summary: Apply the chain rule to compute the gradient of the loss function with respect to the inp ...
- BP(back propagation)反向传播
转自:http://www.zhihu.com/question/27239198/answer/89853077 机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定 ...
- 前向传播算法(Forward propagation)与反向传播算法(Back propagation)
虽然学深度学习有一段时间了,但是对于一些算法的具体实现还是模糊不清,用了很久也不是很了解.因此特意先对深度学习中的相关基础概念做一下总结.先看看前向传播算法(Forward propagation)与 ...
- ML(5)——神经网络2(BP反向传播)
上一章的神经网络实际上是前馈神经网络(feedforward neural network),也叫多层感知机(multilayer perceptron,MLP).具体来说,每层神经元与下一层神经元全 ...
- [NN] 对于BackPropagation(BP, 误差反向传播)的一些理解
本文大量参照 David E. Rumelhart, Geoffrey E. Hinton and Ronald J. Williams, Learning representation by bac ...
随机推荐
- 使用ABAP绘制可伸缩矢量图
Jerry去年的文章 动手使用ABAP Channel开发一些小工具,提升日常工作效率 里曾经介绍过一些用ABAP实现的可供娱乐的小程序,比如用古老的HPGL接口在SAPGUI里绘图: 关于如何用SA ...
- linux技能五 文件权限
文件权限:-rw-r--r--. 1 fileInUser fileInGroup 1623 5月 4 19:33 fileName -:第一个-是文件类型 rw-:文件的所有者权限 r--:文件的 ...
- Alpha_7
一. 站立式会议照片 二. 工作进展 (1) 昨天已完成的工作 a. 体验,测试,并反馈意见 b. 实现其余的琐碎页面,包括蜕变记录,签到卡 c. 已实现“习惯简记”页面.“习惯简记详情”页面.“已养 ...
- C#数字千分位
C#中把数字转换成带两位小数的千分位字符 如1234567.891变成1,234,567.89 方法:String.Format("{0:N}",1234567.891); / ...
- 应用在App Store上被拒重新提交审核流程指南
1. 打开地址: https://itunesconnect.apple.com 2. 输入APPID和密码后,再输入绑定手机后的验证码. 3. 查看“”我的APP“”,如果显示拒绝,可能需打开Mac ...
- 小程序中的数据请求sessionid,保持登陆状态。
版权声明:本文为CSDN博主「weixin_43964779」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net ...
- Java Excel报表导出Demo
/** * 一级权限数据导出 * @return */ @RequestMapping(value = "/getExportData", method = RequestMeth ...
- PostgreSQL分区表实现——pg_pathman安装、配置
近日由于系统运行时间太长,数据库库表中的数据也是越来越多,为了缩短库表的操作时间,所以对数据库中的部分库表进行分区的操作. 通过研究,决定采用pg_pathman插件对库表进行分区操作.pg_path ...
- VMware15.5版本安装Windows_Server_2008_R2
VMware15.5版本安装Windows_Server_2008_R2一.从VMware15.5中新建虚拟机1.打开VMware,在首页面选择创建新的虚拟机. 2.新建虚拟机向导,选择典型配置. 3 ...
- Pthon魔术方法(Magic Methods)-上下文管理
Pthon魔术方法(Magic Methods)-上下文管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上下文管理方法 __enter__: 进入与此对象相关的上下文.如果 ...