文章目录
如果神经网络中没有激活函数,无论网络结构再如何复杂,学习的模型都只能得到线性函数,只能解决线性可分问题。激活函数的引入,使得神经网络能够拟合任何一个非线性函数,可用于解决线性不可分问题。不同的激活函数具有不同的特征,适合的场景也因数据的差异而各不相同,需要根据具体的情况选择合适的激活函数,否则无法得到一个令人满意的模型。这篇博客以
tf.keras.activations
中提供的激活函数为基础,对常用的激活函数进行总结
elu函数
tf.keras.activations.elu
函数定义如下:
tf.keras.activations.elu(
x,
alpha=1.0
)
elu函数和其导函数的数学定义如下:
f ( x ) = { x i f x > 0 α ( e x − 1 ) i f x ≤ 0 , f ′ ( x ) = { 1 i f x > 0 f ( x ) + α i f x ≤ 0 f(x)=\left\{\begin{matrix} x \qquad &if \; x > 0 \\ \alpha(e^{x}-1) \qquad &if \; x\leq 0 \end{matrix}\right.\quad,\quad f'(x)=\left\{\begin{matrix} 1 \qquad &if \; x > 0 \\ f(x)+ \alpha \qquad &if \; x\leq 0 \end{matrix}\right. f(x)={xα(ex−1)ifx>0ifx≤0,f′(x)={1f(x)+αifx>0ifx≤0
对应的函数和导数的图像如下:
exponential函数
tf.keras.activations.exponential
函数定义如下:
tf.keras.activations.exponential(x)
函数及其导数的数学表达式如下:
f ( x ) = e x , f ′ ( x ) = e x f(x)=e^{x} \quad, \quad f'(x)=e^{x} f(x)=ex,f′(x)=ex
导数和对应的导数的图像如下:
hard_sigmoid函数
tf.keras.activations.hard_sigmoid
函数定义如下:
tf.keras.activations.hard_sigmoid(x)
函数和其导数的数学定义和对应的图像如下。其中,分界点的值是可变化的 且关于原点对称,小于当前分界则值为0,大于当前分界则值为1,在分界之间则为一个线性函数,线性函数也是可变的,但必须注意可变的前提是要保证分段函数在整个取值区间上是连续的。以下为一个分界区间为 [ − 1 , 1 ] [-1, 1] [−1,1]的例子:
relu函数(Rectified Linear Unit,修正线性神经元)
tf.keras.activations.relu
函数定义如下:
tf.keras.activations.relu(
x,
alpha=0.0,
max_value=None,
threshold=0
)
ReLU的常规定义和对应的图像如下:
f ( x ) = { x i f x > 0 0 i f x ≤ 0 , f ′ ( x ) = { 1 i f x > 0 0 i f x ≤ 0 f(x)=\left\{\begin{matrix} x \qquad &if \; x > 0 \\ 0 \qquad &if \; x\leq 0 \end{matrix}\right.\quad,\quad f'(x)=\left\{\begin{matrix} 1 \qquad &if \; x > 0 \\ 0 \qquad &if \; x\leq 0 \end{matrix}\right. f(x)={x0ifx>0ifx≤0,f′(x)={10ifx>0ifx≤0
而tf.keras.activations.relu
中定义的ReLU函数比以上常规定义更复杂一点。以上的常规定义可以认为是tf.keras.activations.relu
只指定了输入时的默认情况。如果指定了其他参数,则tf.keras.activations.relu
的形式变为:
f
(
x
)
=
{
m
a
x
_
v
a
l
u
e
i
f
x
≥
m
a
x
_
v
a
l
u
e
x
i
f
t
h
r
e
s
h
o
l
d
≤
x
<
m
a
x
_
v
a
l
u
e
a
l
p
h
a
∗
(
x
−
t
h
r
e
s
h
o
l
d
)
i
f
x
<
t
h
r
e
s
h
o
l
d
,
f(x)=\left\{\begin{matrix} max\_value \qquad &if \; x \geq max\_value \\ x \qquad &if \; threshold \leq x < max\_value \\ alpha*(x-threshold) & if \; x < threshold \end{matrix}\right.\quad,\quad
f(x)=⎩⎨⎧max_valuexalpha∗(x−threshold)ifx≥max_valueifthreshold≤x<max_valueifx<threshold,
f
′
(
x
)
=
{
0
i
f
x
≥
m
a
x
_
v
a
l
u
e
1
i
f
t
h
r
e
s
h
o
l
d
≤
x
<
m
a
x
_
v
a
l
u
e
a
l
p
h
a
i
f
x
<
t
h
r
e
s
h
o
l
d
f'(x)=\left\{\begin{matrix} 0 \qquad &if \; x \geq max\_value \\ 1 \qquad &if \; threshold \leq x < max\_value \\ alpha & if \; x < threshold \end{matrix}\right.
f′(x)=⎩⎨⎧01alphaifx≥max_valueifthreshold≤x<max_valueifx<threshold
这里设 m a x _ v a l u e = 3 , a l p h a = 0.5 , t h r e s h o l d = 0 max\_value=3,alpha=0.5, threshold=0 max_value=3,alpha=0.5,threshold=0,则对应的函数和导数图像为:
LeakyReLu函数
ReLU是将所有的负值都设为零,相反,Leaky ReLU是给所有负值赋予一个非零斜率。Leaky ReLU激活函数是在声学模型(2013)中首次提出的。Leaky ReLU函数及其导函数对应的数学定义和对应图像如下:
f ( x ) = { x i f x ≥ 0 x a i f x < 0 , f ′ ( x ) = { 1 i f x ≥ 0 1 a i f x < 0 f(x)=\left\{\begin{matrix} x \qquad &if \; x \geq 0 \\ \frac{x}{a} \qquad &if \; x< 0 \end{matrix}\right.\quad,\quad f'(x)=\left\{\begin{matrix} 1 \qquad &if \; x \geq 0 \\ \frac{1}{a} \qquad &if \; x< 0 \end{matrix}\right. f(x)={xaxifx≥0ifx<0,f′(x)={1a1ifx≥0ifx<0
其中 a ∈ ( 1 , + ∞ ) a \in (1,+\infty ) a∈(1,+∞), a a a的值是事先给定的。下面给出 a = 2 a=2 a=2时LeakyReLU函数及其导函数的图像。
PReLU(参数化修正线性单元)函数
PReLU可以看作是Leaky ReLU的一个变体。在PReLU中,负值部分的斜率是根据数据来定的,而非预先定义的。作者称,在ImageNet分类(2015,Russakovsky等)上,PReLU是超越人类分类水平的关键所在。
RReLU(随机纠正线性单元)函数
“随机纠正线性单元”RReLU也是Leaky ReLU的一个变体。在RReLU中,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。RReLU的亮点在于,在训练环节中, a a a是从一个均匀的分布 U ( l , u ) U(l,u) U(l,u)中随机抽取的数值。形式上来说,我们能得到以下结果:
selu函数
tf.keras.activations.selu
函数的定义为:
tf.keras.activations.selu(x)
SeLU函数和其对应导数的定义为:
f ( x ) = λ { x i f x > 0 α ( e x − 1 ) i f x ≤ 0 , f ′ ( x ) = { λ i f x > 0 f ( x ) + λ α i f x ≤ 0 f(x)= \lambda\left\{\begin{matrix}x \qquad &if \; x > 0 \\ \alpha(e^{x}-1) \qquad &if \; x\leq 0 \end{matrix}\right.\quad,\quad f'(x)=\left\{\begin{matrix} \lambda \qquad &if \; x > 0 \\ f(x)+ \lambda\alpha \qquad &if \; x\leq 0 \end{matrix}\right. f(x)=λ{xα(ex−1)ifx>0ifx≤0,f′(x)={λf(x)+λαifx>0ifx≤0
其中 λ , α \lambda,\alpha λ,α是定值, λ = 1.0507009873554804934193349852946 , α = 1.6732632423543772848170429916717 \lambda=1.0507009873554804934193349852946, \quad\alpha=1.6732632423543772848170429916717 λ=1.0507009873554804934193349852946,α=1.6732632423543772848170429916717
SeLU函数及其导函数对应的图像为:
sigmoid函数
tf.keras.activations.sigmoid
函数的定义为:
tf.keras.activations.sigmoid(x)
Sigmoid函数及其导数对应的数学定义为:
f ( x ) = 1 1 + e − x , f ′ ( x ) = e − x ( 1 + e − x ) 2 f(x)=\frac{1}{1+e^{-x}} \quad,\quad f'(x)= \frac{e^{-x}}{(1+e^{-x})^{2}} f(x)=1+e−x1,f′(x)=(1+e−x)2e−x
Sigmoid函数及其导数对应的图像为:
softmax函数
tf.keras.activations.softmax
函数的定义如下:
tf.keras.activations.softmax(
x,
axis=-1
)
其中,x
为输入,axis
为指定的轴,softmax操作将在指定的轴上进行。softmax
激活函数一般用在解决多分类问题的网络的最后一层,用于生成对应每个类别的概率分布,这些类别的概率分布之和为1。设当前的任务为一个n分类任务,对应于第i个类别的softmax
值为:
S i = e i ∑ j = 1 n e j S_{i} = \frac{e^{i}}{\sum_{j=1}^{n}e^{j} } Si=∑j=1nejei
softplus函数
tf.keras.activations.softplus
函数的定义如下:
tf.keras.activations.softplus(x)
softplus函数及其导函数的定义和图像为:
f ( x ) = l o g ( 1 + e x ) , f ′ ( x ) = e x ( 1 + e x ) I n 2 f(x)=log(1+e^{x}) \quad , \quad f'(x)= \frac{e^{x}}{(1+e^{x})In2} f(x)=log(1+ex),f′(x)=(1+ex)In2ex
softsign函数
tf.keras.activations.softsign
函数的定义如下:
tf.keras.activations.softsign(x)
函数及其导函数的定义和图像如下:
f ( x ) = x 1 + ∣ x ∣ , f ′ ( x ) = 1 ( 1 + ∣ x ∣ ) 2 f(x)= \frac{x}{1+\left | x \right |} \quad , \quad f'(x)= \frac{1}{(1+\left | x \right |)^{2}} f(x)=1+∣x∣x,f′(x)=(1+∣x∣)21
tanh函数
tf.keras.activations.tanh
函数的定义如下:
tf.keras.activations.tanh(x)
函数及其导函数的数学定义和图像如下:
f ( x ) = e x − e − x e x + e − x , , f ′ ( x ) = 1 − t a n h 2 x = 1 − ( e x − e − x e x + e − x ) 2 f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}, \quad , \quad f'(x)=1-tanh^{2}x=1-(\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}})^{2} f(x)=ex+e−xex−e−x,,f′(x)=1−tanh2x=1−(ex+e−xex−e−x)2