ReLU激活函数杂谈

在实现多层感知机代码实现中使用了ReLU激活函数:
R e L U ( x ) = m a x ( x , 0 ) ReLU(x)=max(x,0)
形状大概是这样的
ReLU函数形状
这里根据几个问题来进行回答解释

  1. 为什么要使用激活函数呢?
    简单来说激活函数的作用就是将仿射函数进行非线性化,可以拟合出更多的情况。更详细的解答可以参考知乎激活函数的解释
  2. ReLU函数的梯度问题
    首先谈一下sigimoid函数的梯度,通常不选用它是因为sigmoid函数可能有梯度消失的情况,原因可以看它的梯度函数图
    sigmoid函数图像及其梯度图
    可以看到蓝色的线是sigmoid函数图像,橘色的线是它的梯度图。当输入值特别大或者特别小的时候,sigmoid函数梯度趋近于0,因此在反向传播时梯度一乘就没有了。还有一个原因就是指数函数的梯度计算比较复杂,不利于快速计算。
    而ReLU函数只有一半的梯度消失问题,因为当 x > 0 x>0 的时候它的梯度值恒为1,因此在反向传播的过程中,不会因为导数连乘,而使得梯度特别小,以至于参数无法更新。但是当 X < 0 X<0 的时候,负的梯度被置零,所以这个神经元有可能再也不会被任何数据激活,也就是‘杀死’了神经元。但是这个可以通过Leaky ReLU(改进算法)进行解决:
    f ( x ) = m a x ( a x , x ) f(x)=max(ax,x)
    给负数的情况传一个非常小的梯度,让他拥有斜率,因此神经元就不会被杀死
发布了36 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tyro_blog/article/details/104400676