1️⃣ 激活函数的作用
激活函数为神经网络引入非线性
,如果没有激活函数,即使网络层数再多,也只能处理线性可分
问题。
在机器学习中,线性可分问题指的是可以通过一条直线(或高维空间的一个超平面)将数据完全分开的问题。现实世界的问题大多数是非线性的,例如自然语言处理中的词汇间的上下文关系,图像识别中复杂的边缘等
2️⃣ sigmoid函数
sigmoid函数将输入变换为(0,1)
上的输出。它将范围(-inf,inf)中的任意输入压缩到区间(0,1)中,函数表示为:
s i g m o i d ( x ) = 1 1 + e − x sigmoid(x)=\frac1{1+e^{-x}} sigmoid(x)=1+e−x1
其梯度可以表示为:
d d x s i g m o i d ( x ) = e − x ( 1 + e − x ) 2 = s i g m o i d ( x ) [ 1 − s i g m o i d ( x ) ] \frac d{dx}sigmoid(x)=\frac{e^{-x}}{(1+e^{-x})^2}=sigmoid(x)[1-sigmoid(x)] dxdsigmoid(x)=(1+e−x)2e−x=sigmoid(x)[1−sigmoid(x)]
可以发现,sigmoid函数的梯度在输入很大或很小时会趋于0,当网络变得越来越深时,会出现梯度消失问题。
3️⃣ tanh函数
tanh函数将其输入压缩转换到区间(-1,1)
上,公式如下:
t a n h ( x ) = 1 − e − 2 x 1 + e − 2 x tanh(x)=\frac{1-e^{-2x}}{1+e^{-2x}} tanh(x)=1+e−2x1−e−2x
tanh函数的梯度是:
d d x t a n h ( x ) = 1 − t a n h 2 ( x ) \frac d{dx}tanh(x)=1-tanh^2(x) dxdtanh(x)=1−tanh2(x)
可以发现当输入接近0时,tanh函数的梯度接近最大值1。与sigmoid函数的梯度类似,输入在任一方向上远离0点,梯度越接近0,因此也存在梯度消失问题。
4️⃣ ReLu
线性整流单元(ReLU)提供了一种非常简单的非线性变换,被定义为:
R e L u ( x ) = m a x ( x , 0 ) ReLu(x)=max(x,0) ReLu(x)=max(x,0)
其梯度可以表示为:
f ′ ( x ) = { 1 , x > 0 0 , x < 0 f^{^{\prime}}(x)=\begin{cases}1,\quad\text{x}>0\\0,\quad\text{x}<0&\end{cases} f′(x)={1,x>00,x<0
当输入为正时,ReLU函数的梯度为1;当输入值等于0时,梯度可以当成1也可以当成0,实际应用中并不影响;输入小于0时,梯度直接为0,但在神经网络训练过程中,输入小于0的神经元占比很少。因此ReLu函数可以有效缓解梯度消失问题。
参考
激活函数(sigmoid、tanh、ReLU、softmax)