2021.09.25
LeeML-Notes:P14
【主要参考】
https://www.jianshu.com/p/765d603c76a0
https://blog.csdn.net/weixin_38347387/article/details/82936585
https://www.bilibili.com/video/BV1Zg411T71b
https://zhuanlan.zhihu.com/p/28821475
文章目录
7.1 反向传播是做啥的?
- 前向传递输入信号直至输出产生误差,反向传播误差信息更新权重矩阵。
- 反向传播一般包括两部分:前向传播和反向传播;
- 前向传播,是指数据从X从输入层传入到神经网络,经过各个隐藏层得到最终损失的过程:
- 反向传播,主要是针对神经网络优化的过程中进行,在最终系统损失端计算总的损失函数,然后根据梯度递减公式,逐层的向前反馈,找到每层每个参数对损失的影响权重,进行调整,形成反向传播机制。
-
反向传播是个什么想法呢?
【杨鸽理解】
- 就是我们通过正向传播找到了总的交叉熵(误差量多大),我们想减少误差,那么我们需要知道这些误差是哪里产生的(调哪个参数)?应该调整参数的权重是多少(调多少)?
- 反向传播就是从总误差入手(输出端),开始逆向分配误差的量,来进行参数修改。
7.2 为什么会提出反向传播?
*回答不一定对,我还无法判断正误
- 提问:
通常在神经网络中用反向传播进行参数优化,我不太明白的地方是,是因为隐藏层存在,正向传播没办法直接用梯度下降达到优化效果,才不得不通过反向优化? 还是正向传播也是可以通过一遍遍学习进行梯度下降优化参数,只是效率没有反向传播高效,被弃用?如果第二种情况 反向传播高效,高效在哪里?
- 回答1:为什么会提出反向传播算法,我直接应用梯度下降(Gradient Descent)不行吗?
答案肯定是不行的,纵然梯度下降神通广大,但却不是万能的。梯度下降可以应对带有明确求导函数的情况,或者说可以应对那些可以求出误差的情况,比如逻辑回归(Logistic Regression),我们可以把它看做没有隐层的网络;但对于多隐层的神经网络,输出层可以直接求出误差来更新参数,但其中隐层的误差是不存在的,因此不能对它直接应用梯度下降, 而是先将误差反向传播至隐层,然后再应用梯度下降,其中将误差从末层往前传递的过程需要链式法则(Chain Rule)的帮助.
.
转自:https://zhuanlan.zhihu.com/p/28821475
- 回答2:反向传播高效,高效在哪里?
用反向传播算法求梯度这个过程,类似动态规划求解多阶段决策优化问题。BP算法自底向上逐步得到误差函数相对所有变量的偏导数,消除了节点重复计算的问题,因而其求解效率非常高。
.
转自:https://www.zhihu.com/question/373841162/answer/1088443414
7.3 反向传播计算过程
7.3.1 预备知识
- 链式法则(Chain Rule)
- 损失函数(Loss function)
定义在单个训练样本上的,也就是就算一个样本的误差,比如我们想要分类,就是预测的类别和实际类别的区别,是一个样本的,用L表示。
- 代价函数(Cost function)
定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均,有没有这个平均其实不会影响最后的参数的求解结果。
- 总体损失函数(Total loss function)
总体损失函数(Total loss function)是定义在整个训练集上面的,也就是所有样本的误差的总和。也就是平时我们反向传播需要最小化的值。
7.3.2 第一步:Forward pass部分 算总体损失函数
详见第六章:《6.深度学习简介》
7.3.3 符号体系
符号系统每本教材用的都不太一样,我们用王老师的符号系统大致了解一下神经网络符号书写基本习惯
如何理解“梯度下降法”?什么是“反向传播”?通过一个视频,一步一步全部搞明白
王老师这段视频讲的很好,从29分钟开始看
- l层的输入是l-1层输出的 a [ l − 1 ] a^{[l-1]} a[l−1]一共有n个感知机;还有l层的 w [ l ] , b [ l ] w^{[l]},b^{[l]} w[l],b[l],他们都是向量。
- 其中l层有i个感知机, w i w_i wi说的就是第i个感知机的w,每个感知机w有n维,如图i=2 他的激活函数可能是 Z 2 [ l ] = w 2 , 1 [ l ] x + w 2 , 2 [ l ] x + . . . w 2 , n [ l ] x + b Z_2^{[l]}=w_{2,1}^{[l]}x+w_{2,2}^{[l]}x+...w_{2,n}^{[l]}x+b Z2[l]=w2,1[l]x+w2,2[l]x+...w2,n[l]x+b;
- 【注意】注意w的形式是谁乘谁 要结合着图看,容易没有转置搞错。
- 只有头标的表示这一层,如 a [ l − 1 ] a^{[l-1]} a[l−1],表示l-1层感知机输出的结果
- 圆括号代表训练集的个数,方括号代表第几层. 比如我们现在有1w笔数据,那么这里面m=1w
- 我们把l层作为输出层,那么如图这就是个多分类问题
- 单看一笔数据k, x ( k ) x^{(k)} x(k)就是我们第k笔数据,其中x是个向量,有j维。如 Z [ 1 ] = w 1 [ 1 ] x + w 2 [ 1 ] x + b Z^{[1]}=w_{1}^{[1]}x+w_{2}^{[1]}x+b Z[1]=w1[1]x+w2[1]x+b;那么这是j=2,x就是个二维数据
- 图中用J来代表总损失,也就是损失函数
7.3.4 第二步:Backward pass部分
【输出层】
- 这里面把输出成看成了l+1层
- 也就是l+1层的梯度方向是对参数 w i , b i w_i,b_i wi,bi下降最快的方向,也是l-1层的输出 a [ l − 1 ] a^{[l-1]} a[l−1]下降最快方向
- 这里需要用到莲师求导法则
- J ( a i [ l ] ) J(a_i^{[l]}) J(ai[l])是第l层第i个感知机的总误差
【中间层】
把l-1层看成新的l层 方法一样,重复操作
【输入层】
- 直到到 a [ 0 ] a^{[0]} a[0],这个是输入值,是常数,这个分量就不存在了,
到这,所有的系数全部修改完成,整个神经网络第一轮学习,所有系数的更新迭代完成一遍。
7.4 实例展示过程
实例来源:https://blog.csdn.net/weixin_38347387/article/details/82936585,
*计算值有些有点出入,但数据是都以原博客为主,重在会意
-
输入数据 i1=0.05,i2=0.10;
-
输出数据 o1=0.01,o2=0.99;
-
初始权重 w1=0.15,w2=0.20,w3=0.25,w4=0.30; w5=0.40,w6=0.45,w7=0.50,w8=0.55
-
目标:给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。
7.4.1 Step 1: Forward pass
- z = w 1 x + w 2 x + b z=w_1x+w_2x+b z=w1x+w2x+b
- a = σ ( z ) = 1 1 + e − z a=\sigma(z)=\cfrac{1}{1+e^{-z}} a=σ(z)=1+e−z1
【1层】
- z h 1 = 0.15 ∗ 0.05 + 0.2 ∗ 0.1 + 0.35 = 0.3775 z_{h1}=0.15*0.05+0.2*0.1+0.35=0.3775 zh1=0.15∗0.05+0.2∗0.1+0.35=0.3775
- a h 1 = 1 1 + e − 0.3775 = 0.593269992 a_{h1}=\cfrac{1}{1+e^-0.3775}=0.593269992 ah1=1+e−0.37751=0.593269992
- z h 2 = 0.25 ∗ 0.05 + 0.3 ∗ 0.1 + 0.35 = 0.3925 z_{h2}=0.25*0.05+0.3*0.1+0.35=0.3925 zh2=0.25∗0.05+0.3∗0.1+0.35=0.3925
- a h 2 = 1 1 + e − 0.3925 = 0.596884378 a_{h2}=\cfrac{1}{1+e^-0.3925}=0.596884378 ah2=1+e−0.39251=0.596884378