**函数
**函数作用
没有**函数时,神经网络相当于一个一个线性感知器,虽然可以通过无数感知器来拟合曲线,但是这样做的效率并不高:
-
**函数主要将Cell输出,从简单的线性转化为非线形,这样就可以逼近任意函数,让人工神经网络可以完成更加复杂的非线形场景,增强网络表达能力
线性不可分数据集:
区分该数据集可能的方程:
对于上图二的数据集,把( x , y )的坐标用( x^2 , y^2 )表示,那么数据坐标图转化为如下,数据又一次变成了线性可分问题,这个转化可以理解成**函数的作用:
常用**函数
Sigmoid
公式:
- 优点:将实数压缩到(0,1)区间,大的负数变成0,大的正数变成1,有强大的解释力(可以拿来做二分类问题最后一个神经元输出,替代softmax,但是最后min cost function方法还是作为最终标准,不能因此作为cost function)
-
-
sigmoid过饱和、丢失了梯度(导数):在0,1处饱和,梯度趋近0。根据梯度更新的方法:
如果Net_1是Sigmoid函数,如果输入值很大,输出值接近0或者1,那么梯度接近0,在多层网络情况下BP数据经过这个梯度后就变的非常小,在之后的权重就很容易拿不到跟新值(也就是梯度消失vanishing gradient)。因此,人们很关注这个节点输入的初始权值,如果过大,经过Sigmoid,输出很容易接近0或1,那么反向传播过程中梯度更新值就慢的可以 -
Sigmoid输出数据中心不是0: 导致后层神经元输入都大于0(假设后层神经元:),如此求解对
w的局部梯度,即:
由于都大于0,则当总Error传递到时,梯度更新:
当:
当:
这样w的更新,被Err捆绑,就是更新数据一直朝着增大方向更新很多,才转向减少方向,然后持续一段时间,更新路径基本就是变成Z字形走向,效率较低 -
计算量大:
- 前向传播:指数运算,计算量大
- 反向传播:求导数,也是指数运算,计算量也很大
-
tanh
公式:
与sigmoid**函数相比,主要是改善了数据中心不是0的缺点,其他的优缺点和Sigmoid类似
Relu
公式:
-
优点:
- 线性函数,收敛速度保持始终不变,而且不会出现过饱和现象
- 正反向都不需要做指数运算,速度快
- 缺点:很容易出现网络ReLU神经元细胞坏死,只要这个节点的输入有一次<0,那么她再不可能被**(即,通过梯度更新值,因为此时的梯度值恒为0),例如:权重梯度更新公式:如果开始时很大、较小,一次更新后可能变更小,如果此时输入新的合适的,就很可能这个神经元的下一次输出<0,再流过ReLU,那么神经元之后的所有输出都会变成0,所以这个神经网络的初始学习效率建议设置小一点
总结
通常很少把所有的程序穿起来在一个网络中全部使用。
如果使用 ReLU ,那么一定要小心设置 learning rate ,而且要注意不要让你的网络出现很多 “ dead ” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU 、 PReLU 或者 Maxout
最好不要用 sigmoid ,可以试试 tanh ,不过可以预期它的效果会比不上 ReLU 和 Maxout