一、前言
论文地址:https://arxiv.org/abs/2003.10027
这篇博客主要是对Dynamic ReLU这篇论文进行简单记录与解析。
二、拟解决的关键问题
在轻量级网络例如MobileNet、ShuffleNet、ShiftNet中,由于网络规模的限制,导致模型的表征能力不足。因此,为了进一步提高轻量级网络的表征能力,需要在不过分增加模型规模的情况下,尽可能高效地利用其有限的参数。基于这个目的,本文对深度神经网络中常用的激活函数ReLU进行了改进,提出了一种更高效的Dynamic ReLU激活函数,在稍微增加一点参数的条件下,在多个网络架构上的分类以及关键点检测两个任务上都取得了较大幅度的性能提升。
三、Dynamic ReLU
1. 激活函数
激活函数在深度神经网络中的主要作用是引入非线性,线性模型从网络深度中获益的能力较低,因此,加深网络的深度也难以较大提升网络性能,但引入非线性后,理论上深度神经网络可以拟合任何的函数,从而极大地提升了网络的表征能力。
目前深度学习领域常见几种激活函数为:Sigmoid、tanh、ReLU、Leaky ReLU、ELU等,其中ReLU由于其形式简单、效果也很好,成为目前最常用的激活函数。
上图为ReLU激活函数的示意图,其计算公式为: R e L U ( x ) = m a x ( x , 0 ) ReLU(x)=max(x,0) ReLU(x)=max(x,0)。
ReLU函数有几个特点:
- 负半区( x ≤ 0 x \leq 0 x≤0)中的神经元是死神经元,也就是无论输入多少,都只能输出为0
- 正半区( x ≥ 0 x \geq 0 x≥0)中的函数的斜率是固定为1的,也就是无论输入是多少,其对输入的放大能力都是一样的
基于以上这两个特点,可以将这两个约束进行改善,从而提高ReLU的表征能力。
这里比较出名的两个改动是Leaky ReLU以及ELU,这两种激活函数都是“激活”了负半区,只不过形式不同,不过这里的“激活”还是一种静态的“激活”,无论输入是什么,负半区的“激活”函数的形式是一样的。那么,是否可以进一步释放ReLU的“激活”函数的形式呢?是否可以让其由输入学习得到呢?
2. Dynamic ReLU
基于以上思考,本文提出了Dynamic ReLU激活函数。
上图是Dynamic ReLU激活函数的示意图。 x x x是输入的一个tensor,基于 x x x,Dynamic ReLU会学习一个激活函数 f θ ( x ) ( x ) f_{\theta(x)}(x) fθ(x)(x)对 x x x进行激活。
这个激活函数 f θ ( x ) ( x ) f_{\theta(x)}(x) fθ(x)(x)由两个部分来确定:
- 超函数 θ ( x ) \theta(x) θ(x):用于产生激活函数中的一些参数
- 激活函数的形式:激活函数的基础形式还是遵从了ReLU函数的分段线性的函数形式,并通过取最大值的方式,将多段函数进行了融合
具体而言, f θ ( x ) ( x ) f_{\theta(x)}(x) fθ(x)(x)的形式为:
y c = f θ ( x ) ( x c ) = max 1 ≤ k ≤ K { a c k ( x ) x c + b c k ( x ) } y_c = f_{\theta(x)}(x_c)=\max_ {1\leq k \leq K} \{{a_c^k(x)x_c} + b_c^k(x) \} yc=fθ(x)(xc)=1≤k≤Kmax{ack(x)xc+bck(x)}
其中, x c x_c xc为输入 x x x的 c t h c^{th} cth个通道, ( a c k , b c k ) (a_c^k, b_c^k) (ack,bck)则是 θ ( x ) \theta(x) θ(x)的输出,其具体形式为:
[
a
1
1
,
.
.
.
,
a
C
1
,
.
.
.
,
a
1
K
,
.
.
.
,
a
C
K
,
b
1
1
,
.
.
.
,
b
C
1
,
.
.
.
,
b
1
K
,
.
.
.
,
b
C
K
]
T
=
θ
(
x
)
\left[a_1^1,...,a_C^1, ...,a_1^K,...,a_C^K,b_1^1,...,b_C^1, ...,b_1^K,...,b_C^K\right]^T=\theta(x)
[a11,...,aC1,...,a1K,...,aCK,b11,...,bC1,...,b1K,...,bCK]T=θ(x)
其中
K
K
K是分段函数的个数,
C
C
C是通道数。
3. Dynamic ReLU的实现
在论文中,主要给出了三种Dynamic ReLU:
- DY-ReLU-A(空间和通道都共享):所有空间位置和通道共享相同的分段线性激活函数。其超函数的网络结构如图3-a所示,与DY-ReLU B相似,只是输出的数目减少到2K。与DY-ReLU-B相比,DY-ReLU-A的计算量较小,但表示能力较弱。
- DY-ReLU-B(空间共享通道不共享):所有空间位置共享相同的分段线性激活函数,但各个通道间不共享,其网络结构如图3-b所示。激活函数需要由超函数计算2KC参数(每个通道2K)。
- DY-ReLU-C (空间通道都不共享):如图3-c所示,每个输入元素xchw都有一个独立的激活函数,下标chw表示第c通道上特征图(维度为CHW)的第h行w列。这会导致输出维度过大(2KCHW)而无法使用全连接层来生成。论文通过将空间位置与通道解耦来解决这个问题。具体而言,也就是引入了一个额外的分支来计算空间注意力,最后的输出是按通道参数和空间注意力来计算得到的。空间注意力分支很简单,只包括一个1*1卷积、一个单输出通道和一个归一化函数,该归一化函数是一个有上界的softmax函数,如下所示:
π
h
,
w
=
min
{
γ
exp
(
z
h
,
w
/
τ
)
∑
h
,
w
exp
(
z
h
,
w
/
τ
)
,
1
}
\pi_{h,w}=\min \{ \frac{\gamma \exp(z_{h,w}/\tau)}{\sum_{h,w}\exp(z_{h, w}/\tau)},1 \}
πh,w=min{∑h,wexp(zh,w/τ)γexp(zh,w/τ),1}
其中,z是1*1卷积的输出,
τ
\tau
τ\是temperature,
γ
\gamma
γ是标量。softmax被
γ
\gamma
γ放大以防止梯度消失。我们经验地设置
γ
=
H
W
/
3
\gamma=HW/3
γ=HW/3,使得注意力
π
h
,
w
\pi_{h,w}
πh,w的均值为1/3。一个大的temperature(
γ
=
10
\gamma=10
γ=10)用于防止训练早期出现稀疏现象。上界1将注意力限制在0和1之间。
这三种实现中,整体而言,C版本的性能最好,但参数量、计算量等也较大,综合性能则以B版本较为均衡,因此,论文中后续试验都主要以B版本展开。
四、总结
Dynamic ReLU也算是对之前的ReLU的变体进行了整合,通过神经网络的学习去确定各个参数,也极大地提高了ReLU的表达能力,据说是个涨点神器,后续我也会在自己的一些任务上进行尝试,GitHub上也已经有了开源代码,大家可以尝试尝试。
参考文献
[1] https://blog.csdn.net/JNingWei/article/details/79210904
[2] https://blog.csdn.net/xspyzm/article/details/105742461