反向传播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)}$. 所以我们对他们三个求偏导,也就是梯度下降求最优解来优化这三个参数。

原文地址:https://www.cnblogs.com/wevolf/p/10807786.html

时间: 2024-10-12 16:14:00

反向传播BP算法的相关文章

手写BP(反向传播)算法

BP算法为深度学习中参数更新的重要角色,一般基于loss对参数的偏导进行更新. 一些根据均方误差,每层默认激活函数sigmoid(不同激活函数,则更新公式不一样) 假设网络如图所示: 则更新公式为: 以上列举了最后2层的参数更新方式,第一层的更新公式类似,即上一层的误差来自于下一层所有的神经元,e的更新就是不断建立在旧的e上(这里g可以当做初始的e) 下面上代码: 1,BP算法 # 手写BP算法 import numpy as np # 先更新参数,再继续传播 # layers:包括从输入层到输

反向传播BP为什么高效

之前有一篇文章讲了反向传播的原理: 下面这篇文章讲了反向传播为什么高效: https://blog.csdn.net/lujiandong1/article/details/52716726 主要通过对比得到的结论,也就是对比反向传播和之前的算神经网络权重的方法. 原文地址:https://www.cnblogs.com/charlesblc/p/8832905.html

BP(back propagation)反向传播

转自:http://www.zhihu.com/question/27239198/answer/89853077 机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定一些样本点,用合适的曲线揭示这些样本点随着自变量的变化关系. 深度学习同样也是为了这个目的,只不过此时,样本点不再限定为(x, y)点对,而可以是由向量.矩阵等等组成的广义点对(X,Y).而此时,(X,Y)之间的关系也变得十分复杂,不太可能用一个简单函数表示.然而,人们发现可以用多层神经网络来表示这

前项传播和反向传播

前向传播 如图所示,这里讲得已经很清楚了,前向传播的思想比较简单.  举个例子,假设上一层结点i,j,k,-等一些结点与本层的结点w有连接,那么结点w的值怎么算呢?就是通过上一层的i,j,k等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项(图中为了简单省略了),最后在通过一个非线性函数(即激活函数),如ReLu,sigmoid等函数,最后得到的结果就是本层结点w的输出. 最终不断的通过这种方法一层层的运算,得到输出层结果. 对于前向传播来说,不管维度多高,其过程都可以用如下公式表

[NN] 对于BackPropagation(BP, 误差反向传播)的一些理解

本文大量参照 David E. Rumelhart, Geoffrey E. Hinton and Ronald J. Williams, Learning representation by back-propagating errors, Nature, 323(9): p533-536, 1986. 在现代神经网络中, 使用最多的算法当是反向传播(BP). 虽然BP有着收敛慢, 容易陷入局部最小等缺陷, 但其易用性, 准确度却是其他算法无可比拟的. 在本文中, $w_{ji}$为连接前一层

反向传播(Backpropagation)算法的数学原理

准备 本文不是一篇引导读者入门的科普文.读者至少需要对人工神经网络有概念性的理解,并且熟悉偏导数. 这是一个简单的人工神经网络,分为输入层,隐藏层和输出层.输入层以原始数据 x 作为本层向下一层的输出,即 a(1):隐藏层将 a(1) 中的元素进行线性组合作为自己的输入,即 z(2),然后将 z(2) 进行一个数学变换(函数 g(z))作为对下一层的输出,即 a(2).以此类推,得到最后一层的输出,即 a(3) 或 hΘ(x),就是人工神经网络的运算结果. 其中 Θ(1), Θ(2) 分别是第1

反向传播算法推导

? 神经网络中权重 \(w^{(l)}_{ij}\) 的改变将影响到接下来的网络层,直到输出层,最终影响损失函数 ? \(\color{red}{公式推导符号说明}\) 符号 说明 \(n_l\) 网络层数 \(y_j\) 输出层第 \(j\) 类 标签 \(S_l\) 第 \(l\) 层神经元个数(不包括偏置) \(g(x)\) 激活函数 \(w^{(l)}_{ij}\) 第 \(l\) 层第 \(j\) 个单元与第 \(l+1\) 层第 \(i\) 个单元之间的连接参数 \(b^{(l)}_

实现一个反向传播人工神经网络

为何实现一个BP神经网络? “What I cannot create, I do not understand” — Richard Feynman, February 1988 实现一个BP神经网络的7个步骤 选择神经网络 结构 随机 初始化权重 实现 前向传播 实现 成本函数 $J(\Theta)$ 实现反向传播算法并计算 偏微分 $\frac{\partial}{\partial\Theta_{jk}^{(i)}}J(\Theta)$ 使用 梯度检查 并在检查后关闭 使用梯度下降或其它优

什么是反向传播

作者:韩小雨 类别:①反向传播算法  ②反向传播模型 反向传播算法(英:Backpropagation algorithm,简称:BP算法) 算法简介:是一种监督学习算法,常被用来训练多层感知机. 于1974年,Paul Werbos[1]首次给出了如何训练一般网络的学习算法,而人工神经网络只是其中的特例.不巧的,在当时整个人工神经网络社群中却无人知晓Paul所提出的学习算法.直到80年代中期,BP算法才重新被David Rumelhart.Geoffrey Hinton及Ronald Will