sigmoid函数
sigmoid函数公式:
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1
值域在[0,1]之间,图像y轴对称。
sigmoid函数求导:
σ
′
(
x
)
=
(
1
1
+
e
−
x
)
′
=
e
−
x
(
1
+
e
−
x
)
2
=
1
+
e
−
x
−
1
(
1
+
e
−
x
)
2
=
σ
(
x
)
(
1
−
σ
(
x
)
)
\begin{aligned} \sigma^{\prime}(x) &=\left(\frac{1}{1+e^{-x}}\right)^{\prime} \\\\ &=\frac{e^{-x}}{\left(1+e^{-x}\right)^{2}} \\\\ &=\frac{1+e^{-x}-1}{\left(1+e^{-x}\right)^{2}} \\\\ &=\sigma(x)(1-\sigma(x)) \end{aligned}
σ′(x)=(1+e−x1)′=(1+e−x)2e−x=(1+e−x)21+e−x−1=σ(x)(1−σ(x))
从sigmoid函数的导数形式可知,其导数最大值为0.25,因此sigmoid函数容易引起梯度消失。
tanh函数
tanh函数公式:
tanh
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
\tanh (x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
tanh(x)=ex+e−xex−e−x
值域[-1,1]。
tanh函数求导:
t
a
n
h
(
x
)
′
=
(
e
x
+
e
−
x
)
2
−
(
e
x
−
e
−
x
)
2
(
e
x
+
e
−
x
)
2
=
1
−
(
t
a
n
h
(
x
)
)
2
tanh(x)^{\prime}=\frac{(e^{x}+e^{-x})^{2}-(e^{x}-e^{-x})^{2}}{(e^{x}+e^{-x})^{2}}=1-(tanh(x))^{2}
tanh(x)′=(ex+e−x)2(ex+e−x)2−(ex−e−x)2=1−(tanh(x))2
relu函数
relu函数公式:
R
e
L
U
(
x
)
=
{
0
,
x
⩽
0
x
,
x
>
0
ReLU(x)=\begin{cases}{0,} & {x \leqslant 0} \\\\ {x,} & {x>0}\end{cases}
ReLU(x)=⎩⎪⎨⎪⎧0,x,x⩽0x>0
relu函数求导:
R
e
L
U
(
x
)
′
=
{
0
,
x
⩽
0
1
,
x
>
0
ReLU(x)^{\prime}=\begin{cases}{0,} & {x \leqslant 0} \\\\ {1,} & {x>0}\end{cases}
ReLU(x)′=⎩⎪⎨⎪⎧0,1,x⩽0x>0
在输入为正数的时候,函数导数为1,因此不存在梯度消失问题。作为激活函数时网络模型的收敛速度远快于sigmoid和tanh。
maxout函数
假如一个简单的神经网络输入层有x1和x2两个神经元,下一层有4个神经元,x1和x2分别与4个神经元做运算,得到4个输出值,如果我们使用relu函数,那么这4个输出值应当都要经过relu函数计算得到4个激活值。而使用Maxout则是将这个4个值分成两组,即一个组里2个神经元,分别取每组的最大值,最后只输出两个最大值。
Maxout学习出来的激活函数是分段的线性函数。当分组中神经元数量越多时,分段函数的分段就越多,拟合能力越强。事实上relu就可以看成是Maxout函数的一种特殊情况。
Maxout函数在每次反向传播时总是将分组中其他较小的值当做不存在,只更新最大值所在的神经元权重参数。这也与relu类似,relu每次反向传播时对神经元值为0的神经元权重参数不更新,因为该神经元梯度被计算为0。
softplus函数
softplus函数公式:
S
o
f
t
p
l
u
s
(
x
)
=
log
(
1
+
e
x
)
Softplus(x)=\log \left(1+e^{x}\right)
Softplus(x)=log(1+ex)
Softplus函数可以看成是ReLU函数的平滑版本。Softplus函数是对全部数据进行了非线性映射,是一种不饱和的非线性函数。它的收敛速度比ReLU函数要慢很多。但是计算量比relu函数要大,因此函数的导数计算起来较为复杂。
softplus函数求导:
S
o
f
t
p
l
u
s
(
x
)
=
e
x
1
+
e
x
=
1
1
+
e
−
x
=
σ
(
x
)
Softplus(x)=\frac{e^{x}}{1+e^{x}}=\frac{1}{1+e^{-x}}=\sigma(x)
Softplus(x)=1+exex=1+e−x1=σ(x)
softplus函数求导的结果正好是sigmoid函数。
softmax函数
softmax函数压缩一维向量中的每个元素在0到1之间,并且所有元素总和为1。softmax函数最好在分类器的输出层使用,用来预测输入物体属于某个类的概率。
softmax函数公式:
S
(
a
)
:
[
a
1
a
2
…
a
N
]
→
[
S
1
S
2
…
S
N
]
S(a) : \left[ \begin{array}{c}{a_{1}} \\\\ {a_{2}} \\\\ {\dots} \\\\ {a_{N}}\end{array}\right] \rightarrow \left[ \begin{array}{c}{S_{1}} \\\\ {S_{2}} \\\\ {\dots} \\\\ {S_{N}}\end{array}\right]
S(a):⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡a1a2…aN⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤→⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡S1S2…SN⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
右边的矩阵中每一个元素sj的计算公式为:
S
j
=
e
a
j
∑
k
=
1
N
e
a
k
∀
j
∈
1
…
N
S_{j}=\frac{e^{a_{j}}}{\sum_{k=1}^{N} e^{a_{k}}} \quad \forall j \in 1 \ldots N
Sj=∑k=1Neakeaj∀j∈1…N
Sj范围是(0,1),所有的Sj的和为1。
我们可以将softmax解释如下:
S
j
=
P
(
y
=
j
∣
a
)
S_{j}=P(y=j | a)
Sj=P(y=j∣a)
其中y是输出的N个类别中的某个类(取值为1…N)。a是任意一个N维向量。最常见的例子是多类别的逻辑回归,输入的向量x乘以一个权重矩阵W,且该结果输入softmax函数以产生概率。
softmax函数求导:
对于softmax函数第i个输出关于第j个输入的偏导数为:
∂
S
i
∂
a
j
\frac{\partial S_{i}}{\partial a_{j}}
∂aj∂Si
我们使用DjSi来表示这个偏导数。所有偏导数组成了一个雅可比矩阵:
D
S
=
[
D
1
S
1
⋯
D
N
S
1
⋮
⋱
⋮
D
1
S
N
⋯
D
N
S
N
]
D S=\left[ \begin{array}{ccc}{D_{1} S_{1}} & {\cdots} & {D_{N} S_{1}} \\\\ {\vdots} & {\ddots} & {\vdots} \\\\ {D_{1} S_{N}} & {\cdots} & {D_{N} S_{N}}\end{array}\right]
DS=⎣⎢⎢⎢⎢⎢⎡D1S1⋮D1SN⋯⋱⋯DNS1⋮DNSN⎦⎥⎥⎥⎥⎥⎤
计算DjSi时我们必须分别考虑两种情况:
- 如果i等于j:
∂ e a i ∑ k = 1 N e a k = e a i ∑ − e a j e a i ∑ i 2 = e a i ∑ ∑ − e a j ∑ = S i ( 1 − S j ) \begin{aligned} \partial \frac{e^{a_{i}}}{\sum_{k=1}^{N} e^{a_{k}}} &=\frac{e^{a_{i}} \sum-e^{a_{j}} e^{a_{i}}}{\sum_{i}^{2}} \\\\ &=\frac{e^{a_{i}}}{\sum} \frac{\sum-e^{a_{j}}}{\sum} \\\\ &=S_{i}\left(1-S_{j}\right) \end{aligned} ∂∑k=1Neakeai=∑i2eai∑−eajeai=∑eai∑∑−eaj=Si(1−Sj) - 如果i不等于j:
∂ e a i ∑ k = 1 N e a k ∂ a j = 0 − e a j e a i ∑ j 2 = − e a j ∑ e a i ∑ = − S j S i \begin{aligned} \frac{\partial \frac{e^{a_{i}}}{\sum_{k=1}^{N} e^{a_{k}}}}{\partial a_{j}}=& \frac{0-e^{a_{j}} e^{a_{i}}}{\sum_{j}^{2}} \\\\=&-\frac{e^{a_{j}}}{\sum} \frac{e^{a_{i}}}{\sum} \\\\ &=-S_{j} S_{i} \end{aligned} ∂aj∂∑k=1Neakeai==∑j20−eajeai−∑eaj∑eai=−SjSi
所以softmax函数的导数为:
D j S i = { S i ( 1 − S j ) i = j − S j S i i ≠ j D_{j} S_{i}=\begin{cases}{S_{i}\left(1-S_{j}\right)} & {i=j} \\\\ {-S_{j} S_{i}} & {i \neq j}\end{cases} DjSi=⎩⎪⎨⎪⎧Si(1−Sj)−SjSii=ji̸=j
在文献中我们常会见到用克罗内克函数来表示softmax函数的导数:
δ i j = { 1 i = j 0 i ≠ j \delta_{i j}=\begin{cases}{1} & {i=j} \\\\ {0} & {i \neq j}\end{cases} δij=⎩⎪⎨⎪⎧10i=ji̸=j
则有:
D j S i = S i ( δ i j − S j ) D_{j} S_{i}=S_{i}\left(\delta_{i j}-S_{j}\right) DjSi=Si(δij−Sj)