神经网络与深度学习笔记(三)激活函数与参数初始化
激活函数
为什么使用激活函数?
线性激活函数一般用于输出。如果使用线性方程,而不使用激活函数,那么神经网络不管多少层,它的输出就仅仅是输入函数的线性变化
ReLu

又称为整流线性单元函数,表达式可以表示为:
%0A#card=math&code=a%20%3D%20max%280%2Cz%29%0A)
ReLU函数一般可以默认使用,不知道用啥可以使用ReLU试试先。
ReLU函数在 时,导数为1
时,导数为0
leaky ReLU

表达式可以表示为:
%0A#card=math&code=a%20%3D%20max%280.01z%2Cz%29%0A)
使用较少,与ReLU不同之处在于,当 时,leaky ReLU,导数不为0
sigmoid

主要用于二元分类,表达式为:
除非是二元分类或输出层。其他的情景不建议用。或许使用tanh更好
tanh

双曲正切函数,表达式为:
一般情况下,tanh优于sigmoid,且具有居中数据的功能。
tanh 与 sigmoid 在 x 很大或者很小时,斜率接近0,会减缓梯度下降的速度
如果不知道哪种激活函数的效果好,不妨都试一遍!
参数初始化

对于参数 我们不能初始化为
0,因为那会出现对称失效的现象。当训练时, ,即
与
一致,这就使得隐藏层的功能一样,而不同隐藏层应该有不同的功能。同时,参数
初始化为
0在反向传播时,求得的导数也会是一样的。
因此, 应该使用随机初始化。
w1 = np.random.randn((2,2)) * 0.01 #当把0.01变成100时,在w增加,z增加的情况下,Z的梯度下降会变慢。
对于参数b 初始化为0时可以的。
检查矩阵维数

在检查神经网络是否会出现错误时,使用检查矩阵维数的方法是很有效的
我们设 为第
层的单元数
则它们的维数
%5C%5C%0A#card=math&code=w%5E%7B%5Bl%5D%7D%2C%20dw%20%EF%BC%9A%28n%5E%7B%5Bl%5D%7D%2Cn%5E%7B%5Bl-1%5D%7D%29%5C%5C%0A)
%5C%5C%0A#card=math&code=b%5E%7B%5Bl%5D%7D%2C%20db%20%EF%BC%9A%28n%5E%7B%5Bl%5D%7D%2C1%29%5C%5C%0A)
%5C%5C%0A#card=math&code=z%5E%7B%5Bl%5D%7D%2Ca%5E%7Bl%7D%3A%28n%5E%7B%5Bl%5D%7D%2C1%29%5C%5C%0A)
%0A#card=math&code=Z%5E%7Bl%7D%2CA%5E%7Bl%7D%2CdZ%2CdA%3A%28n%5E%7B%5Bl%5D%7D%2Cm%29%0A)
同时,在编程时候,记得将 缓存起来,以便反向传播调用数据
例如:输入
输出 ,#card=math&code=Cache%28z%5E%7B%5Bl%5D%7D%2Cw%5E%7B%5Bl%5D%7D%2Cb%5E%7B%5Bl%5D%7D%29)输入 输出 
%5C%5C%0A#card=math&code=dz%5E%7B%5Bl%5D%7D%20%3D%20da%5E%7B%5Bl%5D%7D%20%2A%20g%5E%7B%5Bl%5D%27%7D%28z%5E%7B%5Bl%5D%7D%29%5C%5C%0A)
