激活函数
在每一个神经网络中,总会遇到各种必须要定义的函数,像激活函数啊,损失函数啊……,这里就记录一下常用的激活函数吧,毕竟她在神经网络中的作用挺大的。废话不多说了,下面一起看看什么时激活函数,又有哪些激活函数。
首先得讲讲激活函数他是干嘛的。他是对神经网络中某一部分神经元的非线性运算,使神经网络可以任意逼近任何非线性函数。他的作用是:加入非线性因素,解决线性模型缺陷。
sigmoid函数
f
(
x
)
=
1
1
+
e
−
x
f(x)=\frac{1}{1+e^{-x}}
f(x)=1+e−x1
输入值在【-3,3】之间较佳,如果接近-6或6就会体现饱和问题。
- 优点:输出映射在(0,1)单调连续,适合做输出层,求导容易。
- 缺点:软包和性:进入饱和区(趋向平缓的区域),一阶导数趋于0,可能出现梯度消失情况。
他长这个模样:
tensorflow语法:
tf.nn.sigmoid(x,name=None)
Tanh函数
通过sigmoid拓展可以得到
T a n h ( x ) = 2 s i g m o i d ( 2 x ) − 1 Tanh(x)=2sigmoid(2x)-1 Tanh(x)=2sigmoid(2x)−1
同样具有软饱和性,输出以0为中心,值域为(-1,1),收敛速度比sigmoid函数要快。需要注意的是输入值的绝对值不饿能过大,否则模型无法训练。
我们看看他的图像:
tensorflow语法:
tf.nn.tanh(x,name=None)
ReLU函数
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0,x)
f(x)=max(0,x)
等价于
f
(
x
)
=
{
0
x
⩽
0
x
x
>
0
f(x)=\left\{\begin{matrix}0& x\leqslant 0 & \\ x & x > 0\end{matrix}\right.
f(x)={0xx⩽0x>0 落入
(
−
∞
,
0
)
(-\infty,0)
(−∞,0)会出现硬饱和性,导数为0。落入
[
0
+
∞
)
[0+\infty)
[0+∞)保持梯度不衰减,缓解梯度消失问题,更快收敛。
ReLU函数是一种对正向信号的重视、忽略了负向信号的特性的函数。他的运算较为简单,大大地提升了机器的运行效率。
这个很容易就猜到了他长什么模样:
tensorflow语法:
tf.nn.relu(x,name=None)
与ReLU相似的softplus函数
与relu函数相似的还有sofplus函数。二者的泣别在于:sofplus函数会更加平滑,但是他的计算量较大,且对于小于0的值保留较多。sfoplus公式如下:
f
(
x
)
=
l
n
(
1
+
e
x
)
f(x)=ln(1+e^{x})
f(x)=ln(1+ex)
ReLU函数变种
Relu函数在信号影响上优势较大,但是如果模型中的值菌落在了小于0部分就会导致输出为全零,这样模型是无法训练的,所以他还有一些变种函数:
- Naisy relu:为max中的x加了一个高斯分布的噪声。
公式: f ( x ) = m a x ( 0 , x + Y ) , Y ∈ N ( 0 , σ ( x ) ) f(x) = max(0,x+Y),Y\in N(0,\sigma (x)) f(x)=max(0,x+Y),Y∈N(0,σ(x)) - Leaky relu:在Relu基础上保留一部分负值,让x为负时乘0.01,
公式: f ( x ) = { 0.01 x x ⩽ 0 x x > 0 f(x)=\left\{\begin{matrix}0.01x& x\leqslant 0 & \\ x & x > 0\end{matrix}\right. f(x)={0.01xxx⩽0x>0 - Leaky relu的基础上再变一下,让函数乘a,这里a要求小于等于1,而不是仅限于0.01,公式: f ( x ) = { a x x ⩽ 0 , a ⩽ 1 x x > 0 f(x)=\left\{\begin{matrix}ax& x\leqslant 0 ,a\leqslant 1 \\ x & x > 0\end{matrix}\right. f(x)={axxx⩽0,a⩽1x>0
- Elus:当x小于0时,做了更加复杂的变换,他的收敛熟读比ReLU要快,
公式: f ( x ) = { a ( e x − 1 ) x ⩽ 0 x x > 0 f(x)=\left\{\begin{matrix}a(e^{x}-1)& x\leqslant 0 \\ x & x > 0\end{matrix}\right. f(x)={a(ex−1)xx⩽0x>0
tensorflow代码:
tf.nn.relu(features,name=None)
tf.nn.relu6(features,name=None)
tf.nn.softplus(features,name=None)
tf.nn.elu(features,name=None)
tf.nn.maximum(x,leak*x,name=None)#构建leaky relu函数
Swish函数
据说谷歌找到了一各更加厉害的激活函数,他的效果要优于relu函数。公式:
f
(
x
)
=
x
∗
s
i
g
m
o
i
d
(
β
x
)
,
β
默
认
为
1
f(x)=x*sigmoid(\beta x) , \beta 默认为1
f(x)=x∗sigmoid(βx),β默认为1
可以自己尝试修改一下
β
\beta
β值来看看图像时怎么变化的,留点儿悬念在这儿。
写在最后
你有没有遇到过这样的情况,需要用这些函数的时候,发现自己脑子里有这么个函数,但是又想不起他的图像长什么样或是把他们的图像记混了?有好几次跟朋友讨论这些问题的时候,突然就忘了或是记混了,所以记录一下这些常用的函数吧。如果偶尔也有这样的i情况的话也可以动手写写博客,虽然会花点儿时间,但是写一次总能让自己收获些新的知识。
欢迎各位点赞、收藏、当然还有纠错。