吴恩达机器学习(第五周)神经网络——反向传播
因为对于小白来说,看的我一头雾水,因此通过搜集资料,整理一下知识,对Ng男神的反向传播加深理解(注:这里引用了其他一些大神的资料O_O)
为什么要使用反向传播
在反向传播算法提出之前人们应该想到了使用正向传播SGD(梯度下降)学习模型,也想到了一些办法求解网络模型的偏导数,但这些算法求解效率比较低,所以提出反向传播算法来更高效的计算偏导数。(那时的网络模型还比较浅只有2-3层,参数少。估计即便不适用反向传播这种高效的算法也能很好的学习。一旦有人想使用更深的网络自然会遇到这个偏导数无法高效计算的问题,提出反向传播也就势在必行了)
为什么说正向传播效率低呢,反向传播怎么样实现高效计算偏导数的? 请先回顾一下当初我们学习微积分时是如何计算偏导数的? (链式法则,具体看下面)
e = (a+b)*(b+1)用如下计算图表达:
令a=2,b=1则有:
让我们再次考虑前面的例子:
如果用前向求导模式:关于b向前求导一次
如果用反向求导模式:向后求导
因此,当我们训练神经网络时,把“损失“ 看作 ”权重参数“ 的函数,需要计算”损失“关于每一个”权重参数“的偏导数(然后用梯度下降法学习)。 神经网络的权重参数可以是百万甚至过亿级别。因此 反向求导模式(反向传播算法)可以极大的加速学习。
再熟悉一下链式法则:
神经网络就是一个层次很多的多元函数,我们可以隐约从 链式法则 中感觉到反向传播的意味
反向传播详解
Ok,弄清楚我们为什么要使用反向传播以后,开始步入正题
大家应该很清楚正向传播,这里我就不再赘述,看下图应该就能看懂
这里注明一下:下面的J(θ)和J是同一个函数,他们是一样的,很抱歉交替出现,但是不影响我们理解
我们的目的就是为了求解
这个其实只是一个中间量而已,为了求解J(θ)对θ(L)ij的偏导
为什么定义一个中间量呢?为什么要这么定义呢?
这样我们就看出定义的δ在J(θ)求导中的作用了!!
接下来的公式中,C就是J(θ),这两个是一样的,也不影响理解QAQ,只是我实在用不惯这个公式编辑,先这么看吧~
上面公式的第一步其实是这么推出来的:
这个公式也就是吴恩达(Ng)所说的:
因此我们为了求J(θ)对θ的偏导,看到如下等式右边的求和符号,只需要将所有的
δ
i
∗
a
j
(
L
)
δ_i*a_j^{(L)}
δi∗aj(L)求和就行:
注:θ和w一样,J(θ)和J和C一样,都是同一个东西,很抱歉符号不统一带来的不便
整理一下式子:
对于输出层,就是最后一层,我们的
δ
j
(
L
)
δ_j^{(L)}
δj(L)就是:
(1)
(2)
注:上面这个式子就是Ng所说的
(3)
这个D就是我们通过累加计算得出J(θ)对θ的偏导,累加就是将所有的
δ
i
∗
a
j
(
L
)
δ_i*a_j^{(L)}
δi∗aj(L)求和,相当于梯度算法的θ=θ-α*D的D项
这就是梯度算法,而且是反向的哦,哈哈