轻量化卷积神经网络综述

MobileNetV3

激活函数

MobileNetV3 使用了 h-swish\mathrm{h\text{-}swish}

h-swish[x]=xReLU6(x+3)6\mathrm{h\text{-}swish}[x] = x\frac{\mathrm{ReLU6}(x+3)}{6}

首先来看一下 swishswish

swish[x]=xσ(x)swish[x] = x \sigma(x)

x+x\to +\infty 时,σ(x)1\sigma(x) \to 1swishswish 退化成 xx,当 xx\to -\infty 时,σ(x)0\sigma(x) \to 0swishswish 等于 00。不难看出,swishswishReLU\mathrm{ReLU}soft version

既然有了 ReLU\mathrm{ReLU} ,那为啥还要发明 swishswish

为了避免神经网络在训练时出现梯度爆炸的问题,人们设计激活函数时会约束其导数的绝对值 dydx1\vert\frac{dy}{dx}\vert \le 1,而 ReLU\mathrm{ReLU} 天生具有这一优势,但是其有一个弊端,ReLU\mathrm{ReLU} 的导数并不连续,这将降低拟合的速度以及效果,因此诞生了 swishswish,其导数连续,在 x=0x = 0 附近制造了一个平缓区。

那为什么还要发明 h-swish\mathrm{h\text{-}swish}

swishswish 中的 σ\sigma 计算量大,导致延迟较大,而 h-swish\mathrm{h\text{-}swish} 中的 ReLU6(x+3)6\frac{\mathrm{ReLU6}(x+3)}{6} 其实就是对 σ\sigma 的分段近似拟合,从而减少计算量,降低延迟。

首先 ReLU6\mathrm{ReLU6} 是对 ReLU\mathrm{ReLU} 的最大值加以限制的版本

ReLU6[x]=min(6,max(0,x))\mathrm{ReLU6}[x] = \min(6, \max(0, x))

x>3x > 3 时,ReLU6(x+3)6=1\frac{\mathrm{ReLU6}(x+3)}{6} = 1,此时 h-swish\mathrm{h\text{-}swish} 退化成 xx,当 x<3x < -3 时,ReLU6(x+3)=0\mathrm{ReLU6}(x+3) = 0,此时 h-swish\mathrm{h\text{-}swish} 恒等于 00,这很类似 ReLU\mathrm{ReLU}

3x3-3 \le x \le 3 时,h-swish\mathrm{h\text{-}swish} 等于 x(x+3)6\frac{x(x+3)}{6}

To be done.