1 神经网络与深度学习
1.4 浅层神经网络
上接:https://blog.csdn.net/qq_41556318/article/details/88014549
1.4.9 Gradient descent for neural networks
接下来看一下在神经网络中如何进行梯度计算。
仍然是浅层神经网络,包含的参数为
W
[
1
]
,
b
[
1
]
,
W
[
2
]
,
b
[
2
]
{W^{[1]}},{b^{[1]}},{W^{[2]}},{b^{[2]}}
W[1],b[1],W[2],b[2]。令输入层的特征向量个数
n
x
=
n
[
0
]
{n_x} = {n^{[0]}}
nx=n[0] ,隐藏层神经元个数为
n
[
1
]
{n^{[1]}}
n[1] ,输出层神经元个数为
n
[
2
]
=
1
{n^{[2]}}{\rm{ = }}1
n[2]=1 。则
W
[
1
]
{W^{[1]}}
W[1]的维度为(
n
[
1
]
{n^{[1]}}
n[1] ,
n
[
0
]
{n^{[0]}}
n[0] ),
b
[
1
]
{b^{[1]}}
b[1]的维度为(
n
[
1
]
{n^{[1]}}
n[1],1),
W
[
2
]
{W^{[2]}}
W[2]的维度为(
n
[
2
]
{n^{[2]}}
n[2] ,
n
[
1
]
{n^{[1]}}
n[1]),
b
[
2
]
{b^{[2]}}
b[2] 的维度为(
n
[
2
]
{n^{[2]}}
n[2],1)。
该神经网络正向传播过程为:
其中,g(⋅)表示激活函数。
反向传播是计算导数(梯度)的过程,这里先列出来Cost function对各个参数的梯度:
反向传播的具体推导过程我们下一部分再进行详细说明。
1.4.10 Backpropagation intuition(optional)
我们仍然使用计算图的方式来推导神经网络反向传播过程。记得之前介绍逻辑回归时,我们就引入了计算图来推导正向传播和反向传播,其过程如下图所示:
由于多了一个隐藏层,神经网络的计算图要比逻辑回归的复杂一些,如下图所示。对于单个训练样本,正向过程很容易,反向过程可以根据梯度计算方法逐一推导。
总结一下,浅层神经网络(包含一个隐藏层),m个训练样本的正向传播过程和反向传播过程分别包含了6个表达式,其向量化矩阵形式如下图所示:
1.4.11 Random Initialization
神经网络模型中的参数权重W是不能全部初始化为零的,接下来我们分析一下原因。
举个简单的例子,一个浅层神经网络包含两个输入,隐藏层包含两个神经元。如果权重
W
[
1
]
{W^{[1]}}
W[1]和
W
[
2
]
{W^{[2]}}
W[2]都初始化为零,即:
这样使得隐藏层第一个神经元的输出等于第二个神经元的输出,即
a
1
[
1
]
=
a
2
[
1
]
a_1^{[1]} = a_2^{[1]}
a1[1]=a2[1]。经过推导得到
d
z
1
[
1
]
=
d
z
2
[
1
]
dz_1^{[1]} = dz_2^{[1]}
dz1[1]=dz2[1],以及
d
W
1
[
1
]
=
d
W
2
[
1
]
dW_1^{[1]} = dW_2^{[1]}
dW1[1]=dW2[1] 。因此,这样的结果是隐藏层两个神经元对应的权重行向量
W
1
[
1
]
W_1^{[1]}
W1[1]和
W
2
[
1
]
W_2^{[1]}
W2[1]每次迭代更新都会得到完全相同的结果,
W
1
[
1
]
W_1^{[1]}
W1[1]始终等于
W
2
[
1
]
W_2^{[1]}
W2[1] ,完全对称。这样隐藏层设置多个神经元就没有任何意义了。值得一提的是,参数b可以全部初始化为零,并不会影响神经网络训练效果。
我们把这种权重W全部初始化为零带来的问题称为symmetry breaking problem。解决方法也很简单,就是将W进行随机初始化(b可初始化为零)。python里可以使用如下语句进行W和b的初始化:
w_1 = np.random.randn((2, 2)) * 0.01
b_1 = np.zero((2, 1))
w_2 = np.random.randn((1, 2)) * 0.01
b_2 = 0
这里我们将
W
1
[
1
]
W_1^{[1]}
W1[1]和
W
2
[
1
]
W_2^{[1]}
W2[1]乘以0.01的目的是尽量使得权重W初始化比较小的值。之所以让W比较小,是因为如果使用sigmoid函数或者tanh函数作为激活函数的话,W比较小,得到的|z|也比较小(靠近零点),而零点区域的梯度比较大,这样能大大提高梯度下降算法的更新速度,尽快找到全局最优解。如果W较大,得到的|z|也比较大,附近曲线平缓,梯度较小,训练过程会慢很多。
当然,如果激活函数是ReLU或者Leaky ReLU函数,则不需要考虑这个问题。但是,如果输出层是sigmoid函数,则对应的权重W最好初始化到比较小的值。
1.4.12 Summary
本节课主要介绍了浅层神经网络。首先,我们简单概述了神经网络的结构:包括输入层,隐藏层和输出层。然后,我们以计算图的方式推导了神经网络的正向输出,并以向量化的形式归纳出来。接着,介绍了不同的激活函数并做了比较,实际应用中根据不同需要选择合适的激活函数。激活函数必须是非线性的,不然神经网络模型起不了任何作用。然后,我们重点介绍了神经网络的反向传播过程以及各个参数的导数推导,并以矩阵形式表示出来。最后,介绍了权重随机初始化的重要性,必须对权重W进行随机初始化操作。