**函数

**函数作用

  1. 没有**函数时,神经网络相当于一个一个线性感知器,虽然可以通过无数感知器来拟合曲线,但是这样做的效率并不高:
    神经网络**函数

  2. **函数主要将Cell输出,从简单的线性转化为非线形,这样就可以逼近任意函数,让人工神经网络可以完成更加复杂的非线形场景,增强网络表达能力

    1. 线性不可分数据集:
      神经网络**函数

    2. 区分该数据集可能的方程:
      神经网络**函数

    3. 对于上图二的数据集,把( x , y )的坐标用( x^2 , y^2 )表示,那么数据坐标图转化为如下,数据又一次变成了线性可分问题,这个转化可以理解成**函数的作用:
      神经网络**函数

常用**函数

Sigmoid

公式:y=11+ex

神经网络**函数

  1. 优点:将实数压缩到(0,1)区间,大的负数变成0,大的正数变成1,有强大的解释力(可以拿来做二分类问题最后一个神经元输出,替代softmax,但是最后min cost function方法还是作为最终标准,不能因此作为cost function)
  2. 缺点:

    1. sigmoid过饱和、丢失了梯度(导数):在0,1处饱和,梯度趋近0。根据梯度更新的方法:

      w+=wηΔw=wηJw(x0)=wηJOut1Out1Net1...Netiw(x0)
      如果Net_1是Sigmoid函数,如果输入值很大,输出值接近0或者1,那么梯度接近0,在多层网络情况下BP数据经过这个梯度后就变的非常小,在之后的权重就很容易拿不到跟新值(也就是梯度消失vanishing gradient)。因此,人们很关注这个节点输入的初始权值,如果过大,经过Sigmoid,输出很容易接近0或1,那么反向传播过程中梯度更新值就慢的可以

    2. Sigmoid输出数据中心不是0: 导致后层神经元输入x0都大于0(假设后层神经元:f0=wTx0+b),如此求解对w的局部梯度,即:

      Jw=JOutOutffw=JOutOutfx0

      由于x0都大于0,则当总Error传递到f0时,梯度更新:
      w+=wηf0=wηErrx0

      当:
      Err>0w

      当:
      Err<0w

      这样w的更新,被Err捆绑,就是更新数据一直朝着增大方向更新很多,才转向减少方向,然后持续一段时间,更新路径基本就是变成Z字形走向,效率较低

    3. 计算量大:

      1. 前向传播:指数运算,计算量大
      2. 反向传播:求导数,也是指数运算,计算量也很大

tanh

公式:y=2Sigmoid(2x)1
神经网络**函数

与sigmoid**函数相比,主要是改善了数据中心不是0的缺点,其他的优缺点和Sigmoid类似

Relu

公式:y=max(0,x)

神经网络**函数

  1. 优点:
    1. 线性函数,收敛速度保持始终不变,而且不会出现过饱和现象
    2. 正反向都不需要做指数运算,速度快
  2. 缺点:很容易出现网络ReLU神经元细胞坏死,只要这个节点的输入有一次<0,那么她再不可能被**(即,通过梯度更新值,因为此时的梯度值恒为0),例如:权重梯度更新公式:
    w+=wηΔw
    如果开始时η很大、w较小,一次更新后w可能变更小,如果此时输入新的合适的x,就很可能这个神经元的下一次输出<0,再流过ReLU,那么神经元之后的所有输出都会变成0,所以这个神经网络的初始学习效率η建议设置小一点

总结

通常很少把所有的程序穿起来在一个网络中全部使用。

如果使用 ReLU ,那么一定要小心设置 learning rate ,而且要注意不要让你的网络出现很多 “ dead ” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU 、 PReLU 或者 Maxout

最好不要用 sigmoid ,可以试试 tanh ,不过可以预期它的效果会比不上 ReLU 和 Maxout

相关文章: