激活函数
如果不用激活函数,每一层的输出都是上一层的线性组合,从而导致整个神经网络的输出为神经网络输入的线性组合,无法逼近任意函数。
1 sigmoid
数据压缩到[0,1]之间
promblems:
1 饱和的神经元导致梯度消失, 输入非常大(10)或非常小(-10)时,其梯度接近于0
2 输出不是以0为均值
3 指数运算计算量大(问题不大)
2 tanh
数据压缩到[-1,1]之间
与Sigmoid相比,tanh是0均值的。
promblems:
与Sigmoid一样, 饱和的神经元导致梯度消失
3 ReLU
1)优点:
相比于 sigmoid/tanh,有如下优点:
-
计算高效 ,没有饱和及梯度消失问题 ,缓解了过拟合问题的发生。
-
收敛速度比sigmoid/tanh快6倍
2)缺点:
训练的时候很”脆弱”,很容易就”die”了,小于0就会dead, 实际操作中,如果你的Learning Rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。
如果你设置了一个合适的较小的Learning Rate,这个问题发生的情况其实也不会太频繁。
实际情况下,将偏置项 置为0
当z<0时,梯度也消失了
4 Leaky-ReLU、P-ReLU
会解决ReLU挂掉的问题
5 ELU
优点: 所有ReLU的优点 ,不会死, 输出接近0均值
缺点:计算量大,需要指数运算
6 Maxout
maxout拥有ReLu的所有优点同时避免了神经元“死亡”的现象;但是,由于需要多训练了几组参数,网络的效率也大大降低了。
实际选择:
数据预处理
减去均值,除std 标准差
设置权重
tanh:
relu:
批量归一化
每一个输入都这小批量都做这样的操作,后计算方差,通过均值和方差进行归一化,后还有额外的缩放因子和平移因子(使用常量gamma进行缩放,因子beta进行平移,你在做的是允许你恢复恒等函数),而改进了整个网络的梯度流
BN的本质原理:在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理(归一化至:均值0、方差为1),然后再进入网络的下一层。不过文献归一化层,可不像我们想象的那么简单,它是一个可学习、有参数(γ、β)的网络层。
跟踪训练过程
Learning Rate
-
Learning Rate太小(如1e-6),cost下降很慢
-
Learning Rate太大(如1e-6),cost增长爆炸 (cur cost > 3* originalcost)
-
在[1e-3,1e-5]范围内比较合适