前言
本文所列举的简单的例子可能用神经网络解释显得有点大材小用(overkill),不过,这样讲解是很简单的,也是更加易于消化理解的。所以既然只是为了体会思想,请尽量跟着思路就好。
简单的神经网络的图解作为引入(Introduction)
比如这个简单的式子
J
=
3
×
(
a
+
b
c
)
J=3×(a+bc)
J=3×(a+bc)
通过拆解成三层结构
u
=
b
c
,
v
=
a
+
u
,
J
=
3
v
u=bc,v=a+u,J=3v
u=bc,v=a+u,J=3v,我们可以认为这是一个简单的的神经网络。
前向传播(forward propagation)
那么当我们指定
a
,
b
,
c
a,b,c
a,b,c的数值的之后如图所示,比如我们把
a
,
b
,
c
a,b,c
a,b,c分别赋值为5,3,2,我们怎么得到
J
J
J呢,用前向传播的观点就是,我们一步步的向前计算并且传播。第一步实现
u
=
b
c
u=bc
u=bc,计算出u的数值是6,然后
v
=
a
+
u
v=a+u
v=a+u计算出v为11,之后再
J
=
3
v
J=3v
J=3v算得J为33。
也就是说,前向传播的过程,实际上是在做一个数值的计算过程。传播完成后,我们会得到每一个节点位置的运算数据。我们来看看这会如何被我们利用到。
反向传播(back propagation)
之后我们再来看在这个简单的模型上做一下暂时看来没有什么意义的事情,解释一下反向传播。
比如我们现在需要知道
J
J
J关于
a
,
b
,
c
a,b,c
a,b,c的导数,那么我们一种想法是,我们可以通过一层层求导,从
J
J
J传递回来。
从
J
J
J到v,就是一个
J
=
3
v
J=3v
J=3v对于
v
v
v求导的过程,得到
d
J
d
u
\frac{dJ}{du}
dudJ为3;然后对于
v
=
a
+
u
v=a+u
v=a+u再求导,得到
d
v
d
a
\frac{dv}{da}
dadv、
d
v
d
u
\frac{dv}{du}
dudv值为1,进而
d
v
d
a
\frac{dv}{da}
dadv=
d
J
d
v
\frac{dJ}{dv}
dvdJ×
d
v
d
a
\frac{dv}{da}
dadv等于3(其实反向传播的同时体现的就是求导的链式法则),以此类推…有些小伙伴可能会问,
那么我为什么还要前向传播一点点算出中间每一个节点的值呢?
其实我们继续往下反向传播就会发现,当我们传递到
u
=
b
c
u=bc
u=bc的时候,再次求导就会发现,当我们对于b求导的时候,得到的数值和a有关,当我们对于a求导时,这个数值便与b有关。也就是说,当我们进行反向传播求得导函数的时候,这个函数的变量是可能与上一层,(更靠近输入层的紧挨着的那一段有关的)。我们可以想到,如果在更加复杂的神经网络中,既然这个情况可能会发生在居中的位置,那么如果我们不进行提前的正向传播,让每一个位置都有数值,那么在求导的反向传播时就会遇到困难,使得效率降低。这也就是我理解要进行正向传播的原因之一。
我们为什么要了解这些,我们要干什么
我们想要使用梯度下降法,将每个参数做迭代的变化,我们需要得到代价函数 J J J对于每一个参数的导数表达式。而提前了解清楚概念,对于我们理解后面的知识是大有帮助的。
一些更加实际的例子
我们再次回到logistic回归当中来。
我们现在要做的是:
使用神经网络模型,使用梯度下降法,搞定参数。当然这里面做了简化,
x
x
x是二维的只有两个属性,进而
w
w
w也是二维的。
既然确定了梯度下降法,那么我们要做的事情,其实更简要地说就是再搞清楚
J
J
J对于
w
w
w1、
w
w
w2、
b
b
b的导数
d
w
dw
dw1、
d
w
dw
dw2、
d
b
db
db,然后我们便可以使用梯度下降法对于
w
w
w1、
w
w
w2、
b
b
b做
w
w
w=
w
w
w-
a
×
d
w
a×dw
a×dw的迭代,得到最优的解。
那如图所示,我们将其表达为上图的神经网络模型,试图去得到两个
w
w
w的导数。
我们先正向传播,再反向传播,反向传播的过程中,我们看到了一些很好的事情发生了。
我们可以看到,
d
L
d
a
\frac{dL}{da}
dadL算出来的结果是 -
y
a
+
1
−
y
1
−
a
\frac{y}{a}+\frac{1-y}{1-a}
ay+1−a1−y
然后我们再计算
d
a
d
z
\frac{da}{dz}
dzda得到结果是
a
(
1
−
a
)
a(1-a)
a(1−a)这是sigmod函数非常好的一个性质。然后和传播的上一次的导数值链乘,得到
d
z
=
a
−
y
dz=a-y
dz=a−y
在之后计算
d
z
d
w
1
\frac{dz}{dw1}
dw1dz、
d
z
d
w
2
\frac{dz}{dw2}
dw2dz和
d
z
d
b
\frac{dz}{db}
dbdz,再与传播的上一次的导数值链乘,得到
d
w
dw
dw1、
d
w
dw
dw2和
d
b
db
db。至此任务完成,接下来梯度下降循环迭代即可。
小结
1)神经网络本质是一种函数的复合+组合。我们要一层层看待
2)前向传播和反向传播的存在是为了更高效的计算出导数。因为有时候某一层的导数值和函数值存在依赖。
3)sigmod函数的求导之后的结果可以用其自身来表示。可香了(
a
′
=
a
(
1
−
a
)
a'=a(1-a)
a′=a(1−a))