3.1 神经网络概述(Neural Network Overview)
3.2 神经网络的表示(Neural Network Representation )
单隐藏层神经网络就是典型的浅层(shallow)神经网络
单隐藏层神经网络也被称为两层神经网络(2 layer NN)
第l层的权重W[l]维度的行等于l层神经元的个数,列等于l−1层神经元的个数;第i层常数项b[l]维度的行等于l层神经元的个数,列始终为1
3.3 计算一个神经网络的输出(Computing a Neural Network's output )
两层神经网络可以看成是逻辑回归再重复计算一次
逻辑回归的正向计算可以分解成计算z和a的两部分:
两层神经网络,从输入层到隐藏层对应一次逻辑回归运算;从隐藏层到输出层对应一次逻辑回归运算
z[1]=W[1]x+b[1] a[1]=σ(z[1]) z[2]=W[2]a[1]+b[2] a[2]=σ(z[2]) 3.4 多样本向量化(Vectorizing across multiple examples )
for循环来求解其正向输出:
for i = 1 to m:
z[1](i)=W[1]x(i)+b[1]a[1](i)=σ(z[1](i))z[2](i)=W[2]a[1](i)+b[2]a[2](i)=σ(z[2](i))
矩阵运算的形式:
Z[1]=W[1]X+b[1] A[1]=σ(Z[1]) Z[2]=W[2]A[1]+b[2] A[2]=σ(Z[2]) 行表示神经元个数,列表示样本数目m
3.5 激活函数(Activation functions)
对于隐藏层的激活函数,tanh函数要比sigmoid函数表现更好一些。因为tanh函数的取值范围在[−1,+1]之间,隐藏层的输出被限定在[−1,+1]之间,可以看成是在0值附近分布,均值为0。这样从隐藏层到输出层,数据起到了归一化(均值为0)的效果
对于输出层的激活函数,因为二分类问题的输出取值为{0,+1},所以一般会选择sigmoid作为激活函数
选择ReLU作为激活函数能够保证z大于零时梯度始终为1,从而提高神经网络梯度下降算法运算速度。但当z小于零时,存在梯度为0的缺点
Leaky ReLU激活函数,能够保证z小于零时梯度不为0
3.6 为什么需要( 非线性激活函数?(why need a nonlinear activation function?)
假设所有的激活函数都是线性的,直接令激活函数g(z)=z,即a=z
z[1]=W[1]x+b[1] a[1]=z[1] z[2]=W[2]a[1]+b[2] a[2]=z[2] a[2]=z[2]=W[2]a[1]+b[2]=W[2](W[1]x+b[1])+b[2]=(W[2]W[1])x+(W[2]b[1]+b[2])=W′x+b′ 多层隐藏层的神经网络,如果使用线性函数作为激活函数,最终的输出仍然是输入x的线性模型。这样的话神经网络就没有任何作用了。因此,隐藏层的激活函数必须要是非线性的
如果是预测问题而不是分类问题,输出y是连续的情况下,输出层的激活函数可以使用线性函数。如果输出y恒为正值,则也可以使用ReLU激活函数
3.7 激活函数的导数(Derivatives of activation functions )
sigmoid函数的导数:
g(z)=1+e(−z)1 g′(z)=dzdg(z)=g(z)(1−g(z))=a(1−a) tanh函数的导数:
g(z)=e(z)+e(−z)e(z)−e(−z) g′(z)=dzdg(z)=1−(g(z))2=1−a2 ReLU函数的导数:
g(z)=max(0,z) x={01if z<0if z≥0 LeakyReLU函数:
g(z)=max(0.01z,z) g′(z)={0.011if z<0if z≥0 3.8 神经网络的梯度下降(Gradient descent for neural networks)
dZ[2]=A[2]−Y dW[2]=m1dZ[2]A[1]T db[2]=m1np.sum(dZ[2],axis=1,keepdim=True) dZ[1]=W[2]TdZ[2]∗g′(Z[1]) dW[1]=m1dZ[1]XT db[1]=m1np.sum(dZ[1],axis=1,keepdim=True) 3.9 (选修)直观理解反向传播(Backpropagation intuition )
单个训练样本反向过程可以根据梯度计算方法逐一推导:
dz[2]=a[2]−y dW[2]=dz[2]⋅∂W[2]∂z[2]=dz[2]a[1]T db[2]=dz[2]⋅∂b[2]∂z[2]=dz[2]⋅1=dz[2] dz[1]=dz[2]⋅∂a[1]∂z[2]⋅∂z[1]∂a[1]=W[2]Tdz[2]∗g[1]′(z[1]) dW[1]=dz[1]⋅∂W[1]∂z[1]=dz[1]xT db[1]=dz[1]⋅∂b[1]∂z[1]=dz[1]⋅1=dz[1] 浅层神经网络(包含一个隐藏层),m个训练样本的正向传播过程和反向传播过程分别包含了6个表达式,其向量化矩阵形式如下图所示:
3.10 随机初始化(Random Initialization)
神经网络模型中的参数权重W不能全部初始化为零
如果权重W[1]和W[2]都初始化为零,即:
W[1]=[0000] W[2]=[00] 这样使得隐藏层第一个神经元的输出等于第二个神经元的输出,即a1[1]=a2[1]。经过推导得到dz1[1]=dz2[1],dW1[1]=dW2[1],这样的结果是隐藏层两个神经元对应的权重行向量W1[1]和W2[1]每次迭代更新都会得到完全相同的结果,W1[1]始终等于W2[1],完全对称。这样隐藏层设置多个神经元就没有任何意义
权重W全部初始化为零带来的问题称为symmetry breaking problem
随机初始化:
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比较小,是因为如果使用sigmoid函数或者tanh函数作为激活函数的话,W比较小,得到的∣z∣也比较小(靠近零点),而零点区域的梯度比较大,这样能大大提高梯度下降算法的更新速度,尽快找到全局最优解
如果W较大,得到的∣z∣也比较大,附近曲线平缓,梯度较小,训练过程会慢很多
如果激活函数是ReLU或者Leaky ReLU函数,则不需要考虑这个问题
如果输出层是sigmoid函数,则对应的权重W最好初始化到比较小的值