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