「浅层神经网络」学习笔记

课程来源:《神经网络和深度学习》——第三周:浅层神经网络 by 吴恩达

本章主要讲述了如何实现单隐藏层神经网络,笔记记录了实现细节中的激活函数,梯度下降,反向传播与随机初始化。

3.6 Activation Functions 激活函数

$\sigma$ Function : $ a=\sigma(z)=\frac{1}{1+e^{-z}} $ 输出介于0~1之间 ,一般用于二元分类
image-20181016103212378
$\tanh$ Function : $a=\tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}$ 输出介于-1~1之间,数学上是$\sigma$ 函数的平移,平均值为0 ,优于 $\sigma$函数 ,可以代替$\sigma$函数
image-20181016103240686

两者都有一个缺点,当z很大或很小的时候,其导数的梯度很小,会拖慢梯度下降法。

ReLu Fuction: $a=max(0,z)$ The Recitfied Linear Unit,激活函数的默认选择 ,缺点是z小于0的时候导数为0

image-20181016103258208

Leaky ReLU​ Fuction: 在ReLU基础上,当z<0时有一个缓慢的上升函数,优于ReLU但是使用频率不高

image-20181016103439958

3.7 Why does your neural network need a nonlinear activation function为什么要用非线性激活函数

若使用线性激活函数,那么你的模型输出的y或$\hat y$不过时你输入特征x的线性组合。则无论多少网络层都是在做线性组合。一般情况下,只有输出层会用线性激活函数,除此之外,隐藏层里除了一些压缩有关的特殊情况,使用线性函数的情况很少见。

3.9 🌟 Gradient descent for neural networks 神经网络的梯度下降法

对于单隐藏层神经网络,二元分类

Forward propagation:

1
2
3
4
Z[1]=W[1]x+b[1]
A[1]=g[1](Z[1])
Z[2]=W[2]A[2]+B[2]
A[2]=g[2](Z[2])

这里的激活函数g实际上就是$\sigma$函数

Back propagation:

1
2
3
4
5
6
dZ[2]=A[2]-Y
dW[2]=1/m * dZ[2] * A[1].T
db[2]=1/m * np.sum(dZ[2],axis=1,keepdims=true)
dZ[1]=(W[2].T * dZ[2]) 【逐个乘积】 (g[1](Z[1]))
dW[1]=1/m * dZ[1] * X.T
db[1]=1/m* np.sum(dZ[1],axis=1,keepdims=true)

用keepdims来保证输出矩阵为(n,1)而不是奇怪的(n,)

image-20181016110934688

3.10 Backpropagation intuition 直观理解反向传播

image-20181016111608504

image-20181016112059813

3.11 Random Initialization 随机初始化

如果将神经网络各层参数W全初始化为0,通过数学归纳法可以证明,任意两个隐藏单元对于输出单元都在做同样的计算,对于输出单元的影响也相同,无论多少次迭代,其对称性依然存在,两者都在计算完全一样的函数。即所有的隐藏单元都是一样的,无论跑多久的梯度下降,都在计算相同函数,所以没有意义。

解决方案:随机初始化参数

1
W[1]=np.random.randn(2,2)*0.01

通常将权重矩阵初始化成非常小的随机值,因为若权重初始化太大,则计算激活函数时可能会落在梯度平缓的区域内,这样使用梯度下降法学习会很慢。

image-20181016113525936