基本概念
单层求导
f为激活函数
y
=
f
(
w
x
+
b
)
w
=
[
w
11
w
12
.
.
.
w
1
n
w
21
w
22
.
.
.
w
2
n
.
.
.
.
.
.
.
.
.
.
.
.
w
m
1
w
m
2
.
.
.
w
m
n
]
x
=
[
x
1
x
2
.
.
.
x
n
]
b
=
[
b
1
b
2
.
.
.
b
m
]
y
=
[
f
(
∑
j
=
1
n
w
1
j
x
j
+
b
1
)
f
(
∑
j
=
1
n
w
2
j
x
j
+
b
2
)
.
.
.
f
(
∑
j
=
1
n
w
m
j
x
j
+
b
m
)
]
?
y
?
w
=
[
f
′
(
∑
j
=
1
n
w
1
j
x
j
+
b
1
)
x
1
f
′
(
∑
j
=
1
n
w
1
j
x
j
+
b
1
)
x
2
.
.
.
f
′
(
∑
j
=
1
n
w
1
j
x
j
+
b
1
)
x
n
f
′
(
∑
j
=
1
n
w
2
j
x
j
+
b
2
)
x
1
f
′
(
∑
j
=
1
n
w
2
j
x
j
+
b
2
)
x
2
.
.
.
f
′
(
∑
j
=
1
n
w
2
j
x
j
+
b
2
)
x
n
.
.
.
.
.
.
.
.
.
.
.
.
f
′
(
∑
j
=
1
n
w
m
j
x
j
+
b
m
)
x
1
f
′
(
∑
j
=
1
n
w
m
j
x
j
+
b
m
)
x
2
.
.
.
f
′
(
∑
j
=
1
n
w
m
j
x
j
+
b
m
)
x
n
]
?
y
?
b
=
[
f
′
(
∑
j
=
1
n
w
1
j
x
j
+
b
1
)
f
′
(
∑
j
=
1
n
w
2
j
x
j
+
b
2
)
.
.
.
f
′
(
∑
j
=
1
n
w
m
j
x
j
+
b
m
)
]
y=f(wx+b)\\ w=\begin{bmatrix} w_{11}&w_{12}&...&w_{1n}\\ w_{21}&w_{22}&...&w_{2n}\\ ...&...&...&...\\ w_{m1}&w_{m2}&...&w_{mn} \end{bmatrix}\\ x=\begin{bmatrix} x_1\\x_2\\...\\x_n \end{bmatrix}\\ b=\begin{bmatrix} b_1\\b_2\\...\\b_m \end{bmatrix}\\ y=\begin{bmatrix} f(\sum_{j = 1}^{n}w_{1j}x_j+b_1)\\f(\sum_{j = 1}^{n}w_{2j}x_j+b_2)\\...\\f(\sum_{j = 1}^{n}w_{mj}x_j+b_m) \end{bmatrix}\\ \frac{\partial y}{\partial w} = \begin{bmatrix} f'(\sum_{j = 1}^{n}w_{1j}x_j+b_1)x_1&f'(\sum_{j = 1}^{n}w_{1j}x_j+b_1)x_2&...&f'(\sum_{j = 1}^{n}w_{1j}x_j+b_1)x_n\\ f'(\sum_{j = 1}^{n}w_{2j}x_j+b_2)x_1&f'(\sum_{j = 1}^{n}w_{2j}x_j+b_2)x_2&...&f'(\sum_{j = 1}^{n}w_{2j}x_j+b_2)x_n\\ ...&...&...&...\\ f'(\sum_{j = 1}^{n}w_{mj}x_j+b_m)x_1&f'(\sum_{j = 1}^{n}w_{mj}x_j+b_m)x_2&...&f'(\sum_{j = 1}^{n}w_{mj}x_j+b_m)x_n\\ \end{bmatrix}\\ \frac{\partial y}{\partial b}=\begin{bmatrix} f'(\sum_{j = 1}^{n}w_{1j}x_j+b_1)\\f'(\sum_{j = 1}^{n}w_{2j}x_j+b_2)\\...\\f'(\sum_{j = 1}^{n}w_{mj}x_j+b_m) \end{bmatrix}\\
y=f(wx+b)w=?????w11?w21?...wm1??w12?w22?...wm2??............?w1n?w2n?...wmn???????x=?????x1?x2?...xn???????b=?????b1?b2?...bm???????y=?????f(∑j=1n?w1j?xj?+b1?)f(∑j=1n?w2j?xj?+b2?)...f(∑j=1n?wmj?xj?+bm?)???????w?y?=?????f′(∑j=1n?w1j?xj?+b1?)x1?f′(∑j=1n?w2j?xj?+b2?)x1?...f′(∑j=1n?wmj?xj?+bm?)x1??f′(∑j=1n?w1j?xj?+b1?)x2?f′(∑j=1n?w2j?xj?+b2?)x2?...f′(∑j=1n?wmj?xj?+bm?)x2??............?f′(∑j=1n?w1j?xj?+b1?)xn?f′(∑j=1n?w2j?xj?+b2?)xn?...f′(∑j=1n?wmj?xj?+bm?)xn????????b?y?=?????f′(∑j=1n?w1j?xj?+b1?)f′(∑j=1n?w2j?xj?+b2?)...f′(∑j=1n?wmj?xj?+bm?)??????
作用
激活函数对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用,它们将非线性特性引入到我们的网络中。
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
Me:增加非线性运算,增强拟合能力
梯度饱和
梯度饱和常常是和激活函数相关的,比如sigmod和tanh就属于典型容易进入梯度饱和区的函数,即自变量进入某个区间后,梯度变化会非常小,表现在图上就是函数曲线进入某些区域后,越来越趋近一条直线,梯度变化很小,梯度饱和会导致训练过程中梯度变化缓慢,从而造成模型训练缓慢。
以0为中心
因为输出不以0为中心的激活函数,比如sigmoid函数,其输出都为正,意味着在梯度下降时对某权重1到权重n的导数要么全为正,要么全为负。这会导致梯度下降呈z字型,增加了迭代次数,降低了收敛速度
Sigmoid
σ
(
x
)
=
1
1
+
e
?
x
σ
′
=
σ
(
1
?
σ
)
\sigma(x)=\frac{1}{1+e^{-x}}\\ \sigma'=\sigma(1-\sigma)
σ(x)=1+e?x1?σ′=σ(1?σ) 优点: Sigmoid 函数的输出范围是 0 到 1。由于输出值限定在 0 到 1,因此它对每个神经元的输出进行了归一化; 用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适;梯度平滑,避免「跳跃」的输出值; 函数是可微的,便于求导。 明确的预测,即非常接近 1 或 0。
缺点: 容易梯度饱和后梯度消失; 函数输出不是以 0 为中心的,这会降低权重更新的效率; Sigmoid 函数执行指数运算,计算机运行得较慢。
Tanh/双曲正切
t
a
n
h
(
x
)
=
2
σ
(
x
)
?
1
=
2
1
+
e
?
2
x
?
1
t
a
n
h
′
=
1
?
t
a
n
h
2
tanh(x)=2\sigma(x)-1=\frac{2}{1+e^{-2x}}-1\\ tanh'=1-tanh^2
tanh(x)=2σ(x)?1=1+e?2x2??1tanh′=1?tanh2 整体优越点与sigmoid类似,但Tanh函数是 0 均值的,因此实际应用中 Tanh 会比 sigmoid 更好。
在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层,但这并不是固定的,需要根据特定问题进行调整。
ReLU/整流线性单元
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x)=max(0,x)
f(x)=max(0,x) 优点: 当输入为正时,不存在梯度饱和问题。 计算速度快得多。ReLU 函数中只存在线性关系,因此它的计算速度比 sigmoid 和 tanh 更快。
缺点: Dead ReLU 问题。当输入为负时,ReLU 完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度将完全为零,sigmoid 函数和 tanh 函数也具有相同的问题; ReLU 函数不是以 0 为中心的函数。
Leaky ReLU/LReLU/渗透整流线性单元
f
(
x
)
=
m
a
x
(
α
x
,
x
)
f(x)=max(\alpha x, x)
f(x)=max(αx,x) 一种专门设计用于解决 Dead ReLU 问题的激活函数。a通常取0.01。 从理论上讲,Leaky ReLU 具有 ReLU 的所有优点,而且 Dead ReLU 不会有任何问题,但在实际操作中,尚未完全证明 Leaky ReLU 总是比 ReLU 更好。
ELU
f
(
x
)
=
{
x
,
x
≥
0
α
(
e
x
?
1
)
,
x
<
0
f(x)=\left\{ \begin{aligned} x,x\geq0 \\ \alpha(e^x-1),x<0 \end{aligned} \right.
f(x)={x,x≥0α(ex?1),x<0? 优点: 没有 Dead ReLU 问题,输出的平均值接近 0,以 0 为中心; ELU 通过减少偏置偏移的影响,使正常梯度更接近于单位自然梯度,从而使均值向零加速学习;ELU 在较小的输入下会饱和至负值,从而减少前向传播的变异和信息。
与 Leaky ReLU 类似,尽管理论上比 ReLU 要好,但目前在实践中没有充分的证据表明 ELU 总是比 ReLU 好。
Parametric ReLU/PReLU/参数化整流线性单元
f
(
x
)
=
{
x
,
x
≥
0
α
x
,
x
<
0
f(x)=\left\{ \begin{aligned} x,x\geq0 \\ \alpha x,x<0 \end{aligned} \right.
f(x)={x,x≥0αx,x<0? α是可学习的参数
优点: 在负值域,PReLU 的斜率较小,这也可以避免 Dead ReLU 问题。 与 ELU 相比,PReLU 在负值域是线性运算。尽管斜率很小,但不会趋于 0。
Softmax
大的相对更大,小的相对更小,但不改变相对的大小关系,一般对分类任务的输出进行处理
缺点: 在零点不可微; 负输入的梯度为零,这意味着对于该区域的激活,权重不会在反向传播期间更新,因此会产生永不激活的死亡神经元。
Swish
y
=
x
?
s
i
g
m
o
i
d
(
x
)
y=x*sigmoid(x)
y=x?sigmoid(x) 优点: 「无界性」有助于防止慢速训练期间,梯度逐渐接近 0 并导致饱和;(同时,有界性也是有优势的,因为有界激活函数可以具有很强的正则化,并且较大的负输入问题也能解决); 导数恒 > 0;平滑度在优化和泛化中起了重要作用。
Maxout
https://www.bilibili.com/video/BV1bD4y1d7Zz?spm_id_from=333.337.search-card.all.click
maxout单元进一步扩展了整流线性(ReLU)单元。maxout单元将z划分为每组具有k个值的组,而不是使用作用于每个元素的函数g (z)。每个maxout单元则输出每组中的最大元素。
g
(
z
)
i
=
max
?
j
∈
G
(
i
)
z
j
g(z)_i=\max_{j\in G^{(i)}}z_j
g(z)i?=j∈G(i)max?zj? i是组号索引,j是组内号索引。
例如,我们要得到一个3输入2输出的结构: 即将线性变换后的z分为2组,每组4个元素,组内求最大值
maxout单元可以学习具有多达k段的分段线性的凸函数。maxout单元因此可以视为学习激活函数本身,而不仅仅是单元之间的关系。使用足够大的k,maxout单元可以以任意的精确度来近似任何凸函数。
特别地,具有两块的maxout层可以学习实现和传统层相同的输入x的函数,这些传统层可以使用整流线性激活函数、绝对值整流、渗漏整流线性单元或参数化整流线性单元,或者可以学习实现与这些都不同的函数。Me:ReLU,绝对值整流,LReLU,PReLU是2分段函数,所有k=2就可以拟合到
maxout层的参数化当然也将与这些层不同,所以即使是maxout学习去实现和其他种类的层相同的x的函数这种情况下,学习的机理也是不一样的。
代码
import torch
from torch import nn
from torch.nn import functional as F
inputs = torch.randn(2, 4)
print(F.sigmoid(inputs))
print(F.tanh(inputs))
print(F.relu(inputs))
print(F.leaky_relu(inputs, negative_slope=0.01))
print(F.elu(inputs, alpha=1.0))
m = nn.PReLU(num_parameters=1)
print(m(inputs))
print(F.softmax(inputs, dim=1))
print(inputs * F.sigmoid(inputs))
a=1.0))
m = nn.PReLU(num_parameters=1)
print(m(inputs))
print(F.softmax(inputs, dim=1))
print(inputs * F.sigmoid(inputs))
|