Backpropagation 算法的推导与直观图解

2024-06-03 15:18

本文主要是介绍Backpropagation 算法的推导与直观图解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要

本文是对 Andrew Ng 在 Coursera 上的机器学习课程中 Backpropagation Algorithm 一小节的延伸。文章分三个部分:第一部分给出一个简单的神经网络模型和 Backpropagation(以下简称 BP)算法的具体流程。第二部分以分别计算第一层和第二层中的第一个参数(parameters,在神经网络中也称之为 weights)的梯度为例来解释 BP 算法流程,并给出了具体的推导过程。第三个部分采用了更加直观的图例来解释 BP 算法的工作流程。

注:1. 文中有大量公式,在 PC 或大屏移动设备下阅读排版更佳

  2. 为了方便讨论,省去了 Bias unit,并在第二部分的讨论中省去了 cost function 的正则化项

  3. 如果熟悉 Ng 课程中使用的字符标记,则推荐的阅读顺序为:第一、第三、第二部分

 

第一部分 BP 算法的具体过程


图 1.1 给出了一个简单的神经网络模型(省去了 Bias unit):

图 1.1 一个简单的神经网络模型

图 1.1 一个简单的神经网络模型

 

其中字符标记含义与 Ng 课程中的一致:

x1,x2,x3 x1,x2,x3 为输入值,也即  x(i) x(i) 的三个特征;

  z(l)(j) z(j)(l) 为第 l 层的第 j 个单元的输入值。

  a(l)(j) a(j)(l) 为第 层的第 个单元的输出值。其中 a = g(z)g 为 sigmoid 函数。

  Θ(l)ij Θij(l) 第 l 层到 l+1 层的参数(权重)矩阵。

 

表 1.1 BP 算法的具体流程(Matlab 伪代码)

1    for i = m,

2         a(1)=x(i); a(1)=x(i);

3        使用前馈传播算法计算  a(2),a(3); a(2),a(3);

4         δ(3)=a(3)y(i); δ(3)=a(3)−y(i);                                                                

5         δ(2)=(Θ(2))Tδ(3).g(z(2)); δ(2)=(Θ(2))T∗δ(3).∗g′(z(2));  % 第 2 个运算符 ' .* ' 为点乘,即按元素操作

6         Δ(2)=Δ(2)+a(2)δ(3); Δ(2)=Δ(2)+a(2)∗δ(3);

7         Δ(1)=Δ(1)+a(1)δ(2); Δ(1)=Δ(1)+a(1)∗δ(2);

8    end;

 

第二部分 BP 算法步骤的详解与推导过程

 

BP 算法的目的在于为优化函数(比如梯度下降、其它的高级优化方法)提供梯度值,即使用 BP 算法计算代价函数(cost function)对每个参数的偏导值,其数学形式为: Θ(l)ijJ(Θ) ∂∂Θij(l)J(Θ),并最终得到的值存放在矩阵  Δ(l) Δ(l)中。

若神经网络有 K 个输出(K classes),那么其 J(Θ) 为:

J(Θ)=1mi=1mk=1K[y(i)klog(hΘ(x(i))k)+(1y(i)k)log(1hΘ(x(i))k)] J(Θ)=−1m∑i=1m∑k=1K[yk(i)log(hΘ(x(i))k)+(1−yk(i))log(1−hΘ(x(i))k)]

接下来,以计算  Θ(1)11,Θ(2)11 Θ11(1),Θ11(2) 为例来给出 BP 算法的详细步骤。对于单个训练用例,其代价函数为:

J(Θ)=[y(i)klog(hΘ(x(i))k)+(1y(i)k)log(1hΘ(x(i))k)]1 J(Θ)=−[yk(i)log(hΘ(x(i))k)+(1−yk(i))log(1−hΘ(x(i))k)](式1)

其中  hΘ(x)=a(l)=g(z(l)) hΘ(x)=a(l)=g(z(l)), g 为 sigmoid 函数。

 

计算  Θ(2)11 Θ11(2):

J(Θ)Θ(2)11=J(Θ)a31a(3)1z(3)1z(3)1Θ(2)112 ∂J(Θ)∂Θ11(2)=∂J(Θ)∂a13∗∂a1(3)∂z1(3)∗∂z1(3)∂Θ11(2)(式2)

先取出式 2 中等号右边前两项,并将其记为  δ(3)1 δ1(3)

δ(3)1=J(Θ)a31a(3)1z(3)13 δ1(3)=∂J(Θ)∂a13∗∂a1(3)∂z1(3)(式3)

这里给出  δ(l) δ(l) 的定义,即:

 

δ(l)=z(l)J(Θ)(i)4 δ(l)=∂∂z(l)J(Θ)(i)(式4)

对式 3 进行详细计算,即将  J(Θ) J(Θ) 对  z(3)1 z1(3) 求偏导(计算过程中简记为 z):

 

δ(3)1=J(Θ)a(3)1a(3)1z(3)1 δ1(3)=∂J(Θ)∂a1(3)∗∂a1(3)∂z1(3)

=[y1g(z)g(z)+(1y)11g(z)(g(z))] =−[y∗1g(z)∗g′(z)+(1−y)∗11−g(z)∗(−g′(z))]

=[y(1g(z))+(y1)g(z)] =−[y∗(1−g(z))+(y−1)∗g(z)]

=g(z)y=a(3)y =g(z)−y=a(3)−y

其中用到了 sigmoid 函数的一个很好的性质:

g(z)=g(z)(1g(z)) g′(z)=g(z)∗(1−g(z))(易证)

这样便得到了表 1.1 中 BP 算法的第四行过程。

接下来观察式 2 中等号右边最后一项   z(3)1Θ(2)11 ∂z1(3)∂Θ11(2)

其中  z(3)1=Θ(2)11a(2)1+Θ(2)12a(2)2+Θ(2)13a(2)3 z1(3)=Θ11(2)∗a1(2)+Θ12(2)∗a2(2)+Θ13(2)∗a3(2),则易得:

 

z(3)1Θ(2)11=a(2)15 ∂z1(3)∂Θ11(2)=a1(2)(式5)

再回头观察最初的式 2,代入式 3 和式 5,即可得到:

 

J(Θ)Θ(2)11=δ(3)1a(2)1 ∂J(Θ)∂Θ11(2)=δ1(3)∗a1(2)

这样便推导出了表 1.1 中 BP 算法的第六行过程。

至此,就完成了对  Θ(2)11 Θ11(2) 的计算。

 

计算  Θ(1)11 Θ11(1)

 

J(Θ)Θ(1)11=J(Θ)a31a(3)1z(3)1z(3)1a(2)1a(2)1z(2)1z(2)1Θ(1)116 ∂J(Θ)∂Θ11(1)=∂J(Θ)∂a13∗∂a1(3)∂z1(3)∗∂z1(3)∂a1(2)∗∂a1(2)∂z1(2)∗∂z1(2)∂Θ11(1)(式6)

类似地,根据式 4 中对  δ(l) δ(l) 的定义,可以把上式(即式 6)等号右边前四项记为   δ(2)1 δ1(2) 。即:

 

δ(2)1=J(Θ)a31a(3)1z(3)1z(3)1a(2)1a(2)1z(2)17 δ1(2)=∂J(Θ)∂a13∗∂a1(3)∂z1(3)∗∂z1(3)∂a1(2)∗∂a1(2)∂z1(2)(式7)

可以发现式 3 中的   δ(3)1 δ1(3)  是这个等式右边的前两项。

 

于是   δ(l) δ(l)  的意义就体现出来了:它是用来保存上一次计算的部分结果。在计算   δ(l1) δ(l−1)  时,可以使用这个部分结果继续向下逐层求偏导。这样在神经网络特别复杂、有大量计算时就可以节省大量重复的运算,从而有效地提高神经网络的学习速度。

 

继续观察式 7,其等号右边第三项易算得(已知   z(3)1=Θ(2)11a(2)1+Θ(2)12a(2)2+Θ(2)13a(2)3 z1(3)=Θ11(2)∗a1(2)+Θ12(2)∗a2(2)+Θ13(2)∗a3(2)):

 

z(3)1a(2)1=Θ(2)118 ∂z1(3)∂a1(2)=Θ11(2)(式8)

式 7 等号右边最后一项为:

 

a(2)1z(2)1=g(z(2)1)9 ∂a1(2)∂z1(2)=g′(z1(2))(式9)

将  δ(3)1 δ1(3)、式 8、式 9 代入式 7,即可得到:

 

δ(2)1=δ(3)1Θ(2)11g(z(2)1)10 δ1(2)=δ1(3)∗Θ11(2)∗g′(z1(2))(式10)

这样便推导出了表 1.1 中 BP 算法第五行过程。

接下来继续计算式 6 中等号右边最后一项,已知   z(2)1=Θ(1)11a(1)1+Θ(1)12a(1)2+Θ(1)13a(1)3 z1(2)=Θ11(1)∗a1(1)+Θ12(1)∗a2(1)+Θ13(1)∗a3(1),易得:

 

z(2)1Θ(1)11=a(1)111 ∂z1(2)∂Θ11(1)=a1(1)(式11)

将式 10、式 11 代入最开始的式 6 即可得:

 

J(Θ)Θ(1)11=δ(2)1a(1)1 ∂J(Θ)∂Θ11(1)=δ1(2)∗a1(1)

如此,即可得到表 1.1 中 BP 算法的第七行过程。

至此,就完成了对  Θ(1)11 Θ11(1) 的计算。

 

第三部分 BP 算法的直观图解

 

神经网络学习算法图概览

给定一个函数 f(x),它的首要求导对象是什么?就是它的输入值,是自变量 x。那 f(g(x)) 呢?即把g(x) 当作一个整体作为它的输入值,它的自变量。那么 g(x) 这个整体就是它的首要求导对象。因此,一个函数的求导对象是它的输入值,是它的自变量。弄清楚这一点,才能在求多元函数偏导的链式法则中游刃有余。

图 3.1 自下而上,每一个框是上面一个框的输入值,也即上面一个框中函数的自变量。这张图明确了神经网络中各数据之间的关系——谁是谁的输入值,图中表现得非常清楚。上段提到一个函数的求导对象是它的输入值,那么通过图 3.1 就能非常方便地使用链式法则,也能清楚地观察到 BP 算法的流程(后面一个小节会给出一个更具体的 BP 流程图)。

对照文首给出的图 1.1 神经网络的模型图,应该很容易理解图 3.1 的含义,它大致地展现了神经网络的学习(训练)流程。前馈传播算法自下而上地向上计算,最终可以得到  a(3) a(3),进一步可以计算得到  J(Θ) J(Θ)。而 BP 算法自顶向下,层层求偏导,最终得到了每个参数的梯度值。下面一个小节将仔细介绍本文的主题,即 BP 算法的流程图解。

图 3.1 神经网络学习算法概览

图 3.1 神经网络学习算法概览

 

BP 算法的直观图解

图 3.2 给出了 BP 算法的计算流程,并附上了具体的计算步骤。BP 算法的流程在这张图中清晰可见:自顶向下(对应神经网络模型为自输出层向输入层)层层求偏导。因为神经网络的复杂性,人们总是深陷于求多元函数偏导的泥潭中无法自拔:到底该对哪个变量求导?图 3.2 理顺了神经网络中各数据点之间的关系,谁是谁的输入值,谁是谁的函数一清二楚,然后就可以畅快地使用链式法则了。

图3.2 BP 算法流程

图3.2 BP 算法流程

 

所以 BP 算法即反向传播算法,就是自顶向下求代价函数  J(Θ) J(Θ) 对各个参数  Θ(l)ij Θij(l) 偏导的过程,对应到神经网络模型中即自输出层向输入层层层求偏导。在图 3.2 中,当反向传播到  a(2)1 a1(2) 结点时,遇到分叉路口:选择对  Θ(2)11 Θ11(2) 求偏导,即可得到第二层的参数梯度。而若选择对  a(2)1 a1(2) 这条路径继续向下求偏导,就可以继续向下(即输出层)传播,继续向下求偏导,最终可得到第一层的参数梯度,于是就实现了 BP 算法的目的。在选择分叉路口之前,使用  δ(l) δ(l) 来保存到达分岔路口时的部分结果(本文的第二部分对  δ(l) δ(l) 做出了精确定义)。那么如果选择继续向下求偏导,则还可以使用这个部分结果继续向下逐层求偏导。从而避免了大量的重复计算,有效地提升了神经网络算法的学习速度。

 

因此可以观察到 BP 算法两个突出特点:

1) 自输出层向输入层(即反向传播),逐层求偏导,在这个过程中逐渐得到各个层的参数梯度。

2) 在反向传播过程中,使用  δ(l) δ(l) 保存了部分结果,避免了大量的重复运算,因而该算法性能优异。


这篇关于Backpropagation 算法的推导与直观图解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027352

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯: