当前位置:   article > 正文

机器学习:神经网络中的激活函数_sigmoid函数

sigmoid函数

随着深度学习的兴起,神经网络也似乎成了所有计算机视觉任务的标配,大家除了研究各种各样的网络结构之外,还有研究优化方法的,以及激活函数的,这篇博客就对当前各种各样的激活函数做一个总结,分析其背后的性质。

到目前为止,激活函数的形式有很多种了,早期的激活函数主要是 sigmoid 以及 tanh 函数,这两种函数都能将输入限制在很小的范围内,算是一种非线性函数,后来又出现了 RELU 以及各种基于 RELU 的变体。

Tanh 函数

tanh 是一种双曲函数,称为双曲正切,其表达式如下:

t a n h ( x ) = e x − e − x e x + e − x tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} tanh(x)=ex+exexex

从上式可以看出,tanh 函数的取值范围是 [-1, 1],其导数为:

t a n h ′ ( x ) = ( ( e x − e − x ) ( e x + e − x ) − 1 ) ′ = ( e x + e − x ) ( e x + e − x ) − 1 − ( e x − e − x ) ( e x + e − x ) − 2 ( e x − e − x ) = 1 − ( e x − e − x e x + e − x ) 2 = 1 − t a n h 2 ( x ) tanh(x)=((exex)(ex+ex)1)=(ex+ex)(ex+ex)1(exex)(ex+ex)2(exex)=1(exexex+ex)2=1tanh2(x) tanh(x)=((exex)(ex+ex)1)=(ex+ex)(ex+ex)1(exex)(ex+ex)2(exex)=1(ex+exexex)2=1tanh2(x)

其函数曲线及导数曲线如下所示:

  • tanh 函数曲线在这里插入图片描述
Sigmoid 函数

sigmoid 函数也是非常常见的一种函数,其表达式如下:

s i g m o i d ( x ) = σ ( x ) = 1 1 + e − x sigmoid(x) = \sigma(x) = \frac{1}{1 + e^{-x}} sigmoid(x)=σ(x)=1+ex1

sigmoid 函数的取值范围是 [0, 1],其导数为:

σ ′ ( x ) = 1 ( 1 + e − x ) 2 e − x = 1 + e − x − 1 ( 1 + e − x ) 2 = σ ( x ) − σ 2 x = σ ( x ) ( 1 − σ ( x ) ) σ(x)=1(1+ex)2ex=1+ex1(1+ex)2=σ(x)σ2x=σ(x)(1σ(x)) σ(x)=(1+ex)21ex=(1+ex)21+ex1=σ(x)σ2x=σ(x)(1σ(x))

其函数曲线及导数曲线如下:

  • sigmoid 函数曲线
    在这里插入图片描述
RELU 函数

relu 函数在如今的深度神经网络里面,应该是非常主流的一种函数了,上面介绍的两种激活函数,我们可以看到其导数的取值范围很小,在深度神经网络里,这种导数在链式传导的时候,有可能出现梯度消失的问题,所以为了解决这个问题,relu 这种函数获得了推广和关注,relu 函数的形式非常简单:

r e l u ( x ) = max ⁡ ( 0 , x ) relu(x) = \max(0, x) relu(x)=max(0,x)

r e l u ( x ) = { x  if  x > 0 0  if  x < 0 relu(x) = {x if x>00 if x<0 relu(x)={x0 if x>0 if x<0

可以看出,就是把小于 0 的输出都给截断了,而大于 0 的输出都保留,其导数也很简单,不过 relu 函数的导数不连续,在 0 这个地方出现断裂:

r e l u ′ ( x ) = { 1  if  x > 0 0  if  x < 0 relu'(x) = {1 if x>00 if x<0 relu(x)={10 if x>0 if x<0

  • relu 函数曲线

在这里插入图片描述

RELU6 函数

Relu6 属于 Relu 函数的一种变体,将大于 0 的输出在某个地方做了一个截断,从函数名上可以看出,这个截断就是在 6 这个地方,其函数表达式为:

R e l u 6 ( x ) = { 0  if  x < 0 6  if  x > 6 x otherwise Relu6(x) = {0 if x<06 if x>6xotherwise Relu6(x)=06x if x<0 if x>6otherwise

从函数表达式可以看出,只有在 [0, 6] 之间的输入保持了线性关系,小于 0 和 大于 6 的输入都直接截断了,其导数形式为:

R e l u 6 ′ ( x ) = { 0  if  x < 0 0  if  x > 6 1 otherwise Relu6'(x) = {0 if x<00 if x>61otherwise Relu6(x)=001 if x<0 if x>6otherwise

ELU 函数

ELU 函数属于 RELU 函数的变体,因为原始的 RELU 函数对小于 0 的输入都直接截断了,所以为了克服这个问题,提出了很多的变体,ELU 是其中的一种,其函数表达式如下:

e l u ( x ) = { x  if  x > 0 α ∗ ( e x − 1 )  if  x < 0 elu(x) = {x if x>0α(ex1) if x<0 elu(x)={xα(ex1) if x>0 if x<0

ELU 对小于 0 的输入没有直接截断,而是用一个指数函数来表示,一定程度保留了小于 0 的部分,相应地,其导数也分成两部分:

e l u ′ ( x ) = { 1  if  x > 0 α ∗ e x  if  x < 0 elu'(x) = {1 if x>0αex if x<0 elu(x)={1αex if x>0 if x<0

  • elu 函数曲线
    在这里插入图片描述
SELU 函数

SELU 函数的表达式如下:

S e l u ( x ) = λ { x  if  x > 0 α ∗ e x − α  if  x < 0 Selu(x) = \lambda {x if x>0αexα if x<0 Selu(x)=λ{xαexα if x>0 if x<0

上面的 α = 1.6732632423543772848170429916717 \alpha = 1.6732632423543772848170429916717 α=1.6732632423543772848170429916717
λ = 1.0507009873554804934193349852946 \lambda = 1.0507009873554804934193349852946 λ=1.0507009873554804934193349852946

Selu 的导数为:

S e l u ′ ( x ) = λ { 1  if  x > 0 α ∗ e x  if  x ≤ 0 Selu'(x) = \lambda {1 if x>0αex if x0 Selu(x)=λ{1αex if x>0 if x0

LeakyReLU 函数

LeakyReLU 函数也是 RELU 函数的变体,类似 ELU,其小于 0 的部分并没有截断,不过不同于 ELU 的是,LeakyReLU 没有用指数函数,而是简单的一个线性函数来表示:

L e a k y R e L U ( x ) = { x  if  x > 0 α ∗ x  if  x < 0 LeakyReLU(x) = {x if x>0αx if x<0 LeakyReLU(x)={xαx if x>0 if x<0

其导数形式也很简单:

L e a k y R e L U ′ ( x ) = { 1  if  x > 0 α  if  x < 0 LeakyReLU'(x) = {1 if x>0α if x<0 LeakyReLU(x)={1α if x>0 if x<0

HardShrink 函数

HardShrink 类似一个对称函数,在大于一定阈值与小于一定阈值的输入保持不变,而在某个范围之间的为 0,其函数表达式如下:

H a r d S h r i n k ( x ) = { x  if  x > λ − x  if  x < − λ 0 otherwise HardShrink(x) = {x if x>λx if x<λ0otherwise HardShrink(x)=xx0 if x>λ if x<λotherwise

λ \lambda λ 一般取 0.5,其导数形式也很直接:

H a r d S h r i n k ( x ) = { 1  if  x > λ − 1  if  x < − λ 0 otherwise HardShrink(x) = {1 if x>λ1 if x<λ0otherwise HardShrink(x)=110 if x>λ if x<λotherwise

HardSigmoid 函数

HardSigmoid 函数类似 sigmoid 函数,取值范围也是 [0, 1] 之间,不过不是利用指数函数做非线性变换,而是一个线性函数来实现的,其函数形式如下所示:

H a r d S i g m o i d ( x ) = { 0  if  x ≤ − 3 1  if  x ≥ 3 x / 6 + 1 / 2 otherwise HardSigmoid(x) = {0 if x31 if x3x/6+1/2otherwise HardSigmoid(x)=01x/6+1/2 if x3 if x3otherwise

其导数形式也比较简单:

H a r d S i g m o i d ′ ( x ) = { 0  if  x ≤ − 3 0  if  x ≥ 3 1 / 6 otherwise HardSigmoid'(x) = {0 if x30 if x31/6otherwise HardSigmoid(x)=001/6 if x3 if x3otherwise

Hardtanh

应该是基于 tanh 函数变化而来,tanh 的取值范围是 [-1, 1],hardtanh 的取值范围也是 [-1, 1],只不过在这个区间是一个线性函数的映射:

H a r d t a n h ( x ) = { − 1  if  x ≤ − 1 1  if  x ≥ 1 x otherwise Hardtanh(x) = {1 if x11 if x1xotherwise Hardtanh(x)=11x if x1 if x1otherwise

其导数形式为:

H a r d t a n h ′ ( x ) = { 0  if  x ≤ − 1 0  if  x ≥ 1 1 otherwise Hardtanh'(x) = {0 if x10 if x11otherwise Hardtanh(x)=001 if x1 if x1otherwise

Hardswish

这个函数的形式如下:

H a r d s w i s h ( x ) = { 0  if  x ≤ − 3 x  if  x ≥ 3 x ⋅ ( x + 3 ) / 6 otherwise Hardswish(x) = {0 if x3x if x3x(x+3)/6otherwise Hardswish(x)=0xx(x+3)/6 if x3 if x3otherwise

其导数形式如下:

H a r d s w i s h ′ ( x ) = { 0  if  x ≤ − 3 1  if  x ≥ 3 x / 6 + 1 / 2 otherwise Hardswish'(x) = {0 if x31 if x3x/6+1/2otherwise Hardswish(x)=01x/6+1/2 if x3 if x3otherwise

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号