反向传播是训练神经网络最重要的算法,可以这么说,没有反向传播算法就没有深度学习的今天。但是反向传播算法涉及一大堆数据公式概念。所以我们了解导数计算过程以及要介绍的新的复合函数多层求导计算过程。

链式法则

简单的说链式法则就是原本y对x求偏导,但是由于过程较为复杂,我们需要将函数进行拆分,通过链式进行分别求导,这样会使整个计算更为简单。

假设f=k(a+bc)f = k(a + bc)f=k(a+bc)

接下来我们用链式法则(将这些梯度表达式链接起来相乘。)分别对变量a、b、c进行求导:
dfda=dfdvdvda=k∗1=k\frac{d f}{d a}=\frac{d f}{d v} \frac{d v}{d a} = k * 1 = k dadf​=dvdf​dadv​=k∗1=k

dfdb=dfdududb=k∗c=kc\frac{d f}{d b}=\frac{d f}{d u} \frac{d u}{d b} = k * c = kc dbdf​=dudf​dbdu​=k∗c=kc

dfdc=dfdududc=k∗b=kb\frac{d f}{d c}=\frac{d f}{d u} \frac{d u}{d c} = k * b = kb dcdf​=dudf​dcdu​=k∗b=kb

通俗都说,链式法则表明,知道z相对于y的瞬时变化率和y相对于x的瞬时变化率,就可以计算z相对于x的瞬时变化率作为这两个变化率的乘积。其实就是求复合函数都导数过程。

前向传播

前向传播(forward propagation或forward pass) 指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。

对于中间变量:
z=Wx+b\mathbf{z}=\mathbf{W}^{} \mathbf{x}+b z=Wx+b
W为参数权重,b为函数偏置,函数结果经过激活函数C(常见都激活函数Sigmoid、tanh、ReLU)
y=C(z)\mathbf{y}=C(z) y=C(z)
假设损失函数为l,真实值为h,我们可以计算单个数据样本的损失项,
L=l(h,y)L = l(h,y) L=l(h,y)
在不考虑优化函数,单个神经元从输出到输出的过程结束,后面需要对误差进行反向传播,更新权值,重新计算输出。

反向传播

反向传播(backward propagation或backpropagation)指的是计算神经网络参数梯度的方法。 简言之,该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。 该算法存储了计算某些参数梯度时所需的任何中间变量(偏导数)。

梯度下降

在说反向传播算法前,先简单了解一些梯度下降,对于损失函数(这里假设损失是MSE,即均方误差损失)
L(w,b)=1N∑i=1N(yi−f(wxi+b))2L(w, b)=\frac{1}{N} \sum_{i=1}^{N}\left(y_{i}-f\left(w x_{i}+b\right)\right)^{2} L(w,b)=N1​i=1∑N​(yi​−f(wxi​+b))2
wiw_{i}wi​权重在某点的梯度为dLdwi\frac{d L}{d w_{i}}dwi​dL​,设学习率为α\alphaα(即步长,学习率为超参数,自己定义的),有梯度更新公式:
wi+1=wi−α∗dLdwiw_{i+1}=w_{i}-\alpha * \frac{d L}{d w_{i}} wi+1​=wi​−α∗dwi​dL​
除此以为还有一些再次基础上优化都其他梯度下降方法: 小批量样本梯度下降(Mini Batch GD)、随机梯度下降(Stochastic GD)等

反向传播

反向传播计算损失函数相对于单个输入-输出示例的网络权重的梯度,为了说明这个过程,使用了具有2个输入和1个输出的2层神经网络,如下图所示:

不考虑优化算法,单个神经结构如下图所示,第一个单元将权重系数和输入信号的乘积相加。第二单元为神经元激活函数(反向传播需要在网络设计时激活函数可微的),如下图所示:

在反向传播的过程中,单个神经元将最终获得整个网络的最终输出值在自己的输出值上的梯度。链式法则指出,单个神经元应该将回传的梯度乘以它对其的输入的局部梯度,从而得到整个网络的输出对该门单元的每个输入值的梯度∂l∂wij\frac{\partial l}{\partial w_{ij}}∂wij​∂l​。

梯度公式,α\alphaα为学习率,α>0\alpha>0α>0:
w:=w−αdJ(w,b)dw,b:=b−αdJ(w,b)dbw:=w-\alpha \frac{d J(w, b)}{d w}, \quad b:=b-\alpha \frac{d J(w, b)}{d b} w:=w−αdwdJ(w,b)​,b:=b−αdbdJ(w,b)​
对该例中权重梯度进行更新:
w(x1)2′=w(x1)2−α∂l∂wx11w_{(x 1) 2}^{\prime}=w_{(x 1) 2}-\alpha\frac{\partial l}{\partial w_{x_{1}1}} w(x1)2′​=w(x1)2​−α∂wx1​1​∂l​
w21′=w21−α∂l∂w21w_{21}^{\prime}=w_{21}-\alpha\frac{\partial l}{\partial w_{21}} w21′​=w21​−α∂w21​∂l​
............ ......
根据链式法则求出所有的更新后的权重WWW梯度,偏值使用同样的方法。通过反向传播,计算损失函数与当前神经元权重的最陡下降方向。然后,可以沿最陡下降方向修改权重,并以有效的方式降低损失。

反向传播代码实现:

def optimize(w, b, X, Y, num_iterations, learning_rate):costs = []for i in range(num_iterations):# 梯度更新计算函数grads, cost = propagate(w, b, X, Y)# 取出两个部分参数的梯度dw = grads['dw']db = grads['db']# 按照梯度下降公式去计算w = w - learning_rate * dwb = b - learning_rate * dbif i % 100 == 0:costs.append(cost)if i % 100 == 0:print("损失结果 %i: %f" % (i, cost))print(b)params = {"w": w,"b": b}grads = {"dw": dw,"db": db}return params, grads, costsdef propagate(w, b, X, Y):m = X.shape[1]# 前向传播A = basic_sigmoid(np.dot(w.T, X) + b)cost = -1 / m * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))# 反向传播dz = A - Ydw = 1 / m * np.dot(X, dz.T)db = 1 / m * np.sum(dz)grads = {"dw": dw,"db": db}return grads, cost

代码中的参数参数:
w:权重,b:偏置,X特征,Y目标值,num_iterations总迭代次数,learning_rate学习率
basic_sigmoid: sigmoid激活函数
params: 更新后的参数字典
grads: 梯度
costs: 损失结果

参考文献 :

反向传播
前向传播、反向传播和计算图
Backpropagation

浅谈神经网络之链式法则与反向传播算法相关推荐

  1. 机器学习:神经网络的代价函数及反向传播算法

    在<机器学习:神经网络的模型构建>中,我记录了神经网络的一些基础知识,包括神经网络的逻辑单元.模型表示.前向传播等等.这篇笔记中,我会整理神经网络的代价函数以及反向传播算法- 那么如何在给 ...

  2. Educoder 机器学习 神经网络 第三关:反向传播算法

    任务描述 相关知识 数据集介绍 神经网络是如何训练 前向传播 交叉熵 反向传播 sklearn中的神经网络 编程要求 测试说明 任务描述 本关任务:用sklearn构建神经网络模型,并通过鸢尾花数据集 ...

  3. 深度神经网络(DNN)反向传播算法(BP)

    在深度神经网络(DNN)模型与前向传播算法中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Back Propagation,BP)做一个总结. 1. DNN反向 ...

  4. 神经网络之BP(反向传播算法)的原理介绍

    反向传播是人工神经网络中的一个重要算法,这个方法可以对网络中所有权重计算损失函数的梯度,然后这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数. 反向传播算法的原理 我们先直观的看一下反向传播的 ...

  5. 神经网络与机器学习 笔记—反向传播算法(BP)

    先看下面信号流图,L=2和M0=M1=M2=M3=3的情况,上面是前向通过,下面部分是反向通过. 1.初始化.假设没有先验知识可用,可以以一个一致分布来随机的挑选突触权值和阈值,这个分布选择为均值等于 ...

  6. 人工神经网络——【BP】反向传播算法证明

    第一步:前向传播 [注]此BP算法的证明仅限sigmoid激活函数情况.本博文讲道理是没错的,毕竟最后还利用代码还核对了一次理论证明结果. 关于更为严谨的BP证明,即严格通过上下标证明BP的博客请戳这 ...

  7. TensorFlow基础10-(误差反向传播算法以及实现多层神经网络)

    记录TensorFlow听课笔记 文章目录 记录TensorFlow听课笔记 一,误差反向传播算法 二,链式求导法则 三,隐含层有多个神经元的误差反向传播 四,激活函数 五,实现多层神经网络 一,误差 ...

  8. BP神经网络(反向传播算法原理、推导过程、计算步骤)

    BP神经网络 1.反向传播算法的原理 2.反向传播算法参数学习的推导 3.反向传播算法参数更新案例 3.1 反向传播的具体计算步骤 3.1.1 计算输出层的误差 3.1.2 计算隐藏层误差 3.1.3 ...

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

    作者丨南柯一梦宁沉沦@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/61898234 编辑丨极市平台 导读 在本篇文章中我们将从直观感受和数学公式两方面来介绍CNN反 ...

最新文章

  1. 洛谷 P4475 巧克力王国 解题报告
  2. '_NamespacePath' object has no attribute 'sort'
  3. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!
  4. centos 无法连接网络
  5. 王道考研 计算机网络17 IP数据报 最大传送单元MTU IP地址 IPv4 子网划分 ARP协议 ICMP协议 移动IP
  6. python购物车结算不了_Python——购物车问题
  7. bzoj4513 [Sdoi2016]储能表 dp
  8. mysql mm keeplive_mysql +keeplive
  9. LR11中将IE9降级为IE8
  10. html 默认ie设置,如何设置ie为默认浏览器,教您如何设置ie为默认浏览器
  11. Android的当前应用启动第三方应用(跨软件启动页面)
  12. java url 中文转码_URL请求中文、符号“乱码”(解码、转码)解决方式
  13. 基于matlab的文字识别算法-课程设计
  14. 一键去“码”的AI,还能认出带上口罩的脸
  15. 人人都在推销(销售永不为“奴”)
  16. 压缩包修改所属目录Linux,LINUX 压缩、解压、打包文件 修改文件所属组
  17. Fibonacci数列练习题
  18. 如何在visio中画出矩阵
  19. MAC电脑迁移本机Notes
  20. containerd环境下build镜像

热门文章

  1. 8086CPU结构与功能
  2. 谷歌翻译用不了,失效的最新解决方法之一
  3. 家用电信光猫更换教程+设置路由模式
  4. 从AOP到Spring AOP
  5. JS基础-一个完美的递归函数
  6. dumpsys alarm 格式解读
  7. 用django实现一个资产管理的系统
  8. SpringSecurity(安全)
  9. JMeter BeanShell 应用
  10. 初识selenium--发送QQ邮件