神经网络是由一个个神经元相互连接并按层次排列构成的,深度神经网络是有任意层的神经网络,这里的深度是指层次的多,而不是神经元数量的多。有任意层,那么就要有一个循环来负责遍历每一层进行计算。所以深度神经网络的计算形式,就必须要适应这个循环结构。
我们先来说说神经元吧
这个神经元通过对x,w,b进行运算,得出z,然后再由z得出a。
对于多神经元神经网络,其实也是一样的。简单来说就是重复单神经元的流程,把上一层神经元的输出作为下一层神经元的输入。
下面是一个多神经元神经网络。
我们可以把它拆分成一个一个单独的神经元来看,就可以清楚地看出复杂的神经网络其实就是由我们学习过的最简单的单神经元网络组成的。例如我们先只看第一个神经元。
最前面的负责输入特征的层叫做输入层,当我们在统计层数的时候通常不会把这一层计算在内,所以这是一个两层的神经网络(虽然上面看起来有3层);最后一层我们叫做输出层;在中间的所有层统称为隐藏层。
下面我们来看一下深度神经网络前向传播的计算形式,和单神经元是一样的,只是多了层次的标识符。利用下面两个经典的计算公式。
z
l
=
w
l
a
l
−
1
+
b
l
z^{l} = w^la^{l-1} + b^l
zl=wlal−1+bl
a
l
=
g
l
(
z
l
)
a^l = g^l(z^l)
al=gl(zl)
比如说在计算第一层时,
a
l
−
1
a^{l-1}
al−1就是输入特征x,
g
l
g^l
gl是第一层的激活函数(每一层的激活函数都可以是不同的),得到第一层的a后,将其传入到第二层,依然套用上面的公式计算第二层的z,然后计算第二层的a,这样一层一层地传下去,最后得出最后一层的a(
y
^
\hat{y}
y^预测结果)
然后说一下反向传播的计算。
反向传播利用的是下面四个计算公式。
d
z
l
=
d
a
l
∗
g
′
l
(
z
l
)
dz^l = da^l * g'^l(z^l)
dzl=dal∗g′l(zl)
d
w
l
=
d
z
l
∗
a
l
−
1
dw^l = dz^l * a^{l-1}
dwl=dzl∗al−1
d
b
l
=
d
z
l
db^l= dz^l
dbl=dzl
d
a
l
−
1
=
w
l
.
T
∗
d
z
l
da^{l-1} = w^l.T * dz^l
dal−1=wl.T∗dzl
需要强调的一点是,最后一层的da的计算公式有所不同,因为最后一个a直接传入到了损失函数,所以可以直接计算它的偏导数,在逻辑回归中最后一层的
d
a
=
−
y
a
+
1
−
y
1
−
a
da=-\frac{y}{a}+\frac{1-y}{1-a}
da=−ay+1−a1−y。
最后总结一下整个神经网络的训练过程,a[0]也就是特征输入x,它与w[1],b[1]一起经过前向传播的第一步后,得出了z[1]以及a[1],a[1]又传递到下一步,得出z[2]和a[2],然后又继续往下传播,最后得出预测结果a[l]就也是 y ^ \hat{y} y^。预测结果a[l]与真实标签y可以构成损失函数,得出预测精准度。有了损失函数,那么我们就可以计算出损失函数关于a[l]的偏导数da[l]。有了da[l],我们就可以通过偏导数的链式法则进行反向传播,反向传播的第一步使用da[l]以及前向传播中得到的z[l],w[l]等等数据得出了dz[l],dw[l],db[l]以及da[l-1],da[l-1]继续向前传播,一步步得出每一层的w和b的偏导数。然后使用这些偏导数进行梯度下降,来更新每一层的w和b,然后使用新的w和b进行第二轮前向传播反向传播,这样不停地更新w和b,不停地优化w和b。