吴恩达神经网络(2)

写在最开始:最终花了N多时间都没能搞明白吴恩达老师求偏导数的思路,但求参数的总体思路就是通过反向传播求代价函数关于参数θ的偏导数,得到偏导数后就可以利用梯度下降或其他高级算法来进一步优化参数(当参数取何值时,代价函数能达到最小/极小)。本文六.5中提到的文献6,个人认为是更简单更易懂的求偏导方式。

一.各种符号杂谈

在这里插入图片描述
各种符号的意思:

  • {x(i),y(i)}代表训练集,我们一共有m个训练集
  • L代表神经网络结构的总层数,本例中L=4
  • 用SL代表第L层的单元的数量(即神经元数量),但是不包括偏置单元,本例中S1=3,S2=5,S3=5,S4=4

在这里插入图片描述
我们会讨论两种分类问题,一种是二元分类,这种情况下输出单元只有一个,也就是说SL=1,为了记录方便,也可记作K=1;
第二种情况是多元分类,此时有K个输出单元,所以SL=K,K≥3.

二.代价函数

在这里插入图片描述
上方是逻辑回归的代价函数,回忆一下,末尾的第二项是正则化项,用于通过惩罚参数来解决过拟合问题;
下方就是神经网络的代价函数,在形式上基本和logistic回归的代价函数一致,区别在于前一项多了个K项求和。假如说最后一层,也就是输出层,有4个输出单元的话,那么就要进行一个1~4的求和。依照输出的顺序,依次将代价函数加起来。
第二项,也就是正则化项的思路也大致如此,要进行多次的求和,具体原理视频中讲了一些但我不是很懂,感觉差不多理解就行了也不是很重要

三.反向传播

过去,我们学习到从输入层→隐藏层→输出层进行的是一种叫做前向传播的算法,将输入的自变量通过多次计算,最终输出的一种算法:
在这里插入图片描述
现在,我们来介绍反向传播(back propagation):

反向传播的提出其实是为了解决偏导数计算量大的问题,利用反向传播算法可以快速计算任意一个偏导数。反向传播算法的思想和前向传播是一样的,只是一个反向的过程,推导过程中注意链式法则,一层扣一环即可求得结果。(在五.2提到的文章中找到的解释)

在这里插入图片描述
在前向传播中,我们是先计算第一层的激励a(1),之后再计算第二层的a(2),第三层的a(3)等等,而在反向传播中,我们是先计算第四层的δj(4)
其中,(4)代表第四层,j代表第j个单元。δj(4) = aj(4) - yj 的意思是,δj(4)等于第四层第j个单元的激励值,减去训练样本里的真实值yj。也可以用类似残差来理解,即拟合值与实际观察值之间的差异。

假如说我们把j去掉,将δ、a、y都看作向量,那通过a(4) - y得到的δ(4)也是一个向量,其维数等于输出单元的数量,通过这种方式也实现了向量化

在这里插入图片描述
δ3和δ2的计算公式如图,其中.*的意思是点乘,g‘(z(3))= a(3)点乘(1-a(3)),其中g‘(z(3))是一个向量,1代表着以1为元素的向量,具体想要深究的话看原视频。没有δ1,因为第一层是输入层,我们没有对其进行处理和运算,因此不存在着偏差
说实话我尝试着推导了,但还是不太明白这样的公式是怎么来的。尝试着从理论上去理解,我的猜想是这样的:
δ代表着误差,那么δ4是可以用预测值-观测值来直接得到的;而3与2这两层,我们称之为隐藏层,缺乏相应的观测值,只有预测值(拟合值)a(3)和a(2),不能用上述的方法,即预测-观测,那么要如何得知这两层中的误差δ3和δ2呢?答案就是把δ4代回去算。通过这个我不太能理解原理的公式,把上一层的残差代入,计算出本层的残差。我对原理的猜想是这样的。
在这里插入图片描述
基于老师这样的说明,我感觉我的理解应该没有问题。

四.如何利用反向传播来计算代价函数的偏导数

这段内容会暂时看不太懂,但是先告诉你是如何操作的,下一课才是讲解原理

在上面的例子中,我们只给出了一个训练集,接下来就是将其一般化,给出m个训练集:
在这里插入图片描述
然后把刚刚的δ写成大写的形式Δ,含义与δ有些许不同(之后再解释),Δ是用来计算J(θ)的偏导数的。
在这里插入图片描述
接下来的步骤是执行一个for循环,对于1到m中的每一个i,都对应一个训练集(x(i),y(i)),将x(i)代入,通过前向传播计算出每一层的激励值a(2)、a(3)…a(L),之后再用反向传播计算出δ(L-1)、δ(L-2)…到δ(2)为止,理由同上面一样,没有δ1
然后用a(l)j 乘以 δ(L+1)i,再将其累计起来,每算出一次就加一次,最终得到Δ
最后一个式子是用:=的,含义和python中的a=a+1类似,用来表达累加。

我们还可以像之前一样,把下标去掉,表示向量化:
在这里插入图片描述

分割行——————————————————————————————————————

在这里插入图片描述
之后计算出D这个东西,要分成j=0与j≠0两种情况来讨论,因为j=0时对应偏差项(偏差单元:bias unit),所以无需像j≠0时一样写出额外的正则化项。
ps:由于Δ大概可以看作是总误差的累计,那么D=1/m Δ大概可以看作是平均误差?不对,为什么axδ会是总误差的累计,没道理
至此,偏导数就计算出来了,即:
在这里插入图片描述

五、反向传播原理说明

1.老师的说明(这部分随便看看,重点看五.2)

对应于该课:
在这里插入图片描述
说实话基本上都没听懂,但总之还是记录一下。

在这里插入图片描述
假设说我们考虑只有一个训练值xi,yi,那么反向传播的代价函数就可以省略掉求和的部分;同时,我们再忽视掉正则化项,就得到了一个很简单的式子,即上图中的:
在这里插入图片描述
这个东西之前我们也有讨论过,和logistic的代价函数一样,而它的实际意义等价于
在这里插入图片描述
之所以要变成那个样子,好像是会导致非凸函数还是什么的原因,具体的可以翻回去复习,此处不再讨论一遍。但总之,cost(i)相当于一个平方误差函数,衡量了计算结果与真实值之间的差距。

(到目前为止都看的懂,但接下来直接跳到新的一张幻灯片中了,我不太明白这两张幻灯片之间有什么联系)

在这里插入图片描述
在新一张幻灯片中,突然告诉我一个结论:δ(l)j是cost(i)对于Z(l)j的偏导数
我实在不理解为什么δ等于这个偏导数,其次也不明白这个偏导数他的实际意义是什么。一般来说,他的意义是“cost(i)在Z(l)j方向上的变化速率”,而Z是那一堆东西的线性组合,所以这个偏导的意义是什么呢?
自己尝试着理解一下,假如说对于第二层,即l=2时,如果不看偏置单元,那么还有两个神经元a(2)1和a(2)2,二者在被sigmoid函数作用前分别为Z(2)1和Z(2)2,所以是否也能看成是两种不同的方向?对应的方向上的变化速率也可以解释了?

在这里插入图片描述
接下来,课程尝试解释δ(2)2是怎么来的。在正向传播里面,a(2)2对应的神经元能通过粉线和红线出发到第三层的两个神经元,其中粉线代表的权重为Θ(2)12,红线代表的权重为Θ(2)22,而δ(2)2就等于第三层的两个δ乘以对应的权重?在这里插入图片描述

同理来看第三层的话,δ(3)2就等于第四层的δ(4)1乘以对应权重在这里插入图片描述
不太能理解这样的等式是怎么得出来的,在上一课里面告诉我们的是:

在这里插入图片描述

上图中都是经过向量化的,所以没有下标,且需要转置来实现矩阵乘法,前半部分是没有问题的,但是后半部分,即点乘g’(z)这部分,在式子中完全没有体现啊?

文献3告诉我们:

这里是引用

也就是说前一层的δ等于后一层δ*权重,因为是反向传播,所以这听起来很合理?

2.在文献4中找到的解释

文献4:一文读懂反向传播算法原理
建议结合原文进行理解。

反向传播的提出其实是为了解决偏导数计算量大的问题,利用反向传播算法可以快速计算任意一个偏导数。反向传播算法的思想和前向传播是一样的,只是一个反向的过程,推导过程中注意链式法则,一层扣一环即可求得结果。

为何反向传播可以解决偏导数计算量过大的问题?详见六.1

首先是一个极其牛逼的理解:
在这里插入图片描述

即,将偏导数理解为自变量对因变量产生了多大的影响

而上图也对应于老师给出的
在这里插入图片描述
之前不太明白为什么δ(l)j是cost(i)对于Z(l)j的偏导数,而解释正对应图中文字说明,即Z(l)j对输出层总误差J(θ)的贡献大小

接下来我们对该式进行拆解:
在这里插入图片描述
由于g(z)=a,也就是说a是z的函数,图中算式是一个复合函数求偏导,因此可以根据链式法则将其拆解成两项,而后一项在这里插入图片描述正好可以写作g’(z)

接下来是:
在这里插入图片描述
这里仍是重复上面的步骤,但“进行推广”,这是什么意思呢?我认为是从特定的第L层推广到泛指的l层,后面还要进行K项求和应该就是指l+1层中的K个神经元。
下面这三步的推导且听我细细道来:
在这里插入图片描述
由于前面说了:
在这里插入图片描述
因此在这里插入图片描述的意思是第L+1层的Z这个数对最终输出层的计算误差J(θ)产生多大的影响,既然对第L层的Z求偏导叫做在这里插入图片描述,那么现在对第L+1层的Z求偏导自然叫在这里插入图片描述
至于该项在这里插入图片描述,我们来思考一下第L层的a对第L+1层的Z有什么贡献?很显然,下一层的Z就是本层的a乘以θ,例如:在这里插入图片描述

因此该偏导数当然代表着在这里插入图片描述
在这里插入图片描述
而该式就是我们之前提到过的:
在这里插入图片描述
至于为何是点乘倒是没有解释,可能是因为在课中也有说的,g’(z)是一个向量,而点乘代表着两个向量元素的一一相乘?不是特别明白,但一点点的小细节也没必要深究。以及g’(z)可以进一步展开的推导,在那篇参考文献的末尾也有说明,原理很简单,这里就不再复述了。

六.其他

所谓的其他主要讲的是这一大课:
在这里插入图片描述
Unrolling parameters这课不重要,直接跳过;

1.梯度下降的检查

Gradient Checking讲的是有时候你会担心自己的代码有bug,比如表面上你的代价函数在减小,但实际上最后得到的参数θ与正确的θ有很大的差距,而现在就有一种方法可以帮助检查。
这种方法简单来说就是编一个程序,严格地按照求偏导的定义来求偏导(定义法):
在这里插入图片描述

octave中的代码如下,大概也能看的懂,求出偏导后确认该偏导数等于DVec,即通过后向传播求出来的偏导数
然后吴恩达老师这么说:
在这里插入图片描述
也就是说我们正常求导的话是用定义法,而后向传播的办法会比定义法更简单,运算量更小,因此才会采用后向传播,但我还是不明白为啥后向传播能求出偏导?

2.随机初始化

Random Initialization这课讲的东西很简单,在神经网络中使用各种算法时,例如梯度下降算法,我们在开始训练的时候需要给参数一个初始值。这里回忆一下,参数指的是权重,即连接各个神经元的突触的值,假如说初始值全部都设置为0的话(或者说我认为设置为一样的值达到的效果也是同样的):
在这里插入图片描述
各条线都设置为0的话,会导致下一层的激励值是一样的,即a(2)1 = a(2)2,同样地,代表误差的各个导数的值也是一样的,即δ(2)1 = δ(2)2。由于最终的偏导数是通过δ来求的,这也会导致不同的偏导数都是相同的,从而导致这样的神经网络是没有意义的——等同于逻辑回归。因为逻辑回归就是没有那么多个神经元,而现在这样的神经网络,每层中的各个神经元既然是一样的,那就没有存在的必要了。因此解决方法就是通过计算机生成随机数,进行Random Initialization.

3.神经网络结构的选择

在这里插入图片描述
神经网络有那么多种形式,比如隐藏层的数量不同,每层中单元数不同,那我们应该如何选择呢?
首先,输入单元数量是很好确定的,取决于你有几个输入的特征;
输出单元数量取决于是二分类还是多分类的,前面有讲过;
然后有一个默认规则是隐藏层最好只有一层,没说明原因;假如隐藏层不止一层的话,每个隐藏层的单元数量要相当;且隐藏层中单元数量要是输入单元的整数倍,例如1倍、2倍等等。

4.两个难理解的问题

两个较难理解的:神经网络与反向传播
将神经网络理解为一个多元复合函数?反向传播就是为了简化求偏导的一种方式。

后续的思考问题:对于在这里插入图片描述的原理我已经明白了,但是对于下图中:
在这里插入图片描述
大写的△为什么等于这些东西的累加,以及偏导数最终为什么是这么求的,我还是不明白

我悟了:
在这里插入图片描述

在五.2的文章中提到,δj(l)可以理解为“zj(l)这个数对最终输出层的计算的误差J(θ)产生了多大的影响,也就是这个数对于这个误差做出了多大贡献”。其实那篇文章的说法有一点点容易误解,因为是偏导数,所以这个多大的贡献指的应该是贡献率、变化率、斜率,而不是贡献值;而aj(l)是激励,也就是通过前向传播算出来的一个数值,把数值a乘以变化率δ,就得到了对误差的贡献值,因此将误差贡献值累计起来,就得到了总误差△。←该说法存疑,在下方被质疑了。
还有一点小疑惑是为什么是L+1层的δ乘以L层的a?而不是L层的δ乘以L层的a?是否跟输入层没有δ有关?应该是这样吧,毕竟输入层肯定是没有误差的,误差应当从第二层开始,那就是输入层的a到了第二层后,乘以第二层误差贡献率δ,得到一个相应的误差大小。
但我仍未明白,为何在这里插入图片描述

同样用之前的思维,这个偏导数的意义应该是L层ij个参数对总误差的贡献率(不对,应该是贡献值才说得通),而D(L)ij就代表了第L层第ij个参数的误差,因此等式左边等于右边。但是这样思考的话,就推翻了之前“偏导数等于贡献率”的说法?

突然意识到一个事情:在这里插入图片描述
该等式的右边是由乘以激励a组成的,这是对线性组合Z的偏导;而等式的左边是对参数Θ的偏导,是否是偏导对象的差异造成的?

文献7
文献7中有一部分的推导或许可以解答我的疑问:
在这里插入图片描述
首先这个推导不是从在这里插入图片描述出发,而是从在这里插入图片描述出发——由于D=1/m*Δ,而D又等于在这里插入图片描述,因此不妨将其导数展开,过程不再深究,最终展开得到Δ(3) = δ(4)*a(3),这不就恰好对应在这里插入图片描述

5.文献5与文献6

再摘抄一段话:文献5

BP算法的基本思想是,学习过程由信号的正向传播与误差反向传播两个过程组成。正向传播时,输入样本从输入层传入,经过各隐层逐层处理后,传向输出层。若输出层的实际输出与期望输出不符,则转入误差的反向传播阶段。误差反向传播是将输出误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层的误差信号,此误差信号即作为修正单元权值的依据。这种信号正向传播与误差反向传播的各层权值调整过程周而复始的进行,权值不断调整的过程,也就是网络学习训练的过程,此过程一直进行到网络输出的误差减少到可接受的程度,或进行到预先设定的学习次数为止。

文献6借用了文献5的原理说明,并给出了实例举例。其中在对参数修正的过程中提到的字母η:
在这里插入图片描述

是在文献6中说明过的
在这里插入图片描述
学习系数,应该和之前在梯度下降中学到的学习速率是差不多的东西。建议文献5和文献6结合起来观看。最终有一点不太理解的地方在于在这里插入图片描述
更新后的权重W5+的等式为何是这样的?由原先的W5减去学习速率 * 偏导数?
等等,这有啥不好理解的,这不就是梯度下降里面的参数更新的方式吗!!!!
在这里插入图片描述
所以这么一看一切都解决了?但是文献5、文献6里说的这种思路似乎和吴恩达老师给出的有点不一样啊?

6.“两种”算法(吴恩达老师给的,以及文献5、6中的)区别何在

综上二者:最大的区别在于反向传播中,求得偏导数的方法存在一定的差别,文献5、6的我能理解,吴恩达老师的我不是特别能理解

在文献5、6中输出层误差的计算是MSE(均方误差)
在这里插入图片描述
然后直接通过链式法则求出总误差对参数的偏导数,然后就能用梯度下降来修正参数了(见六.6)
在这里插入图片描述

——————————————分割线———————————————

而吴恩达老师给的是
在这里插入图片描述
其中输出层误差是直接相减,隐藏层误差则为:在这里插入图片描述
也是求偏导数(不过这儿似乎没有把链式法则写出来)。
注意!!!这个偏导数和算法①中的偏导数不一样,这是代价函数对线性组合Z的偏导数,而不是对参数(权重w)的偏导数!!!此处开始思路就发生了巨大的变化!

而文献4所解释的是如何将这个链式法则的式子拆开,变成可以直接代值计算的公式,是对吴恩达老师在这里插入图片描述该部分的解释,其实并不是很重要,只是知道推导过程心里会舒坦点。

吴恩达老师也有提到,在求出偏导数后,就可利用各种算法(例如反向传播等)来最小化代价函数:
在这里插入图片描述

7.梯度下降算法与反向传播的结合

我们先尝试着搞清楚在文献5、6中,梯度下降算法是如何与反向传播结合的。
以下是对于一元函数梯度下降的回顾:

我们举一个一元函数的例子(即只有θ1,较为简单)来理解该公式。当我们的初始点靠右边时,相应的导数(斜率)为该红色的直线。
在这里插入图片描述

此处导数显然大于0,而α作为速率也是大于0的,因此θ1-α*导数会小于原先的θ1。也就是说,θ1会缩小,这个点会往左边走,接近J的最低点。
同理,当初始点靠左时:
在这里插入图片描述

导数值小于0,θ1-α*导数会大于原先的θ1。也就是说,θ1会增大,这个点会往右边走,接近J的最低点。
综上二者,不管点在何处,该公式都能使得代价函数J逐步最小化。

梯度下降算法通过这种神奇的方式,帮助我们找到当参数θ为何值时,代价函数能取得最小值。
回到反向传播中,由于我们已经通过链式法则求得代价函数(Etotal)对参数w5的偏导数,因此就具备了计算梯度下降的条件,很自然地就利用梯度下降算法求得了更新后的参数。
在这里插入图片描述
同理可以求出其他参数。(理论上是不是要像之前学的梯度下降那样,对参数进行同步更新,然后重复这一过程,直到取得局部最优解?)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值