SELU(scaled exponential linear units)源自论文. 作者提出这个激活函数是为了在FNN中实现自己定义的self-normalization
, 以解决FNN表现差的问题.
函数表示为:
selu(x)=λ{xαex−α if x>0 if x⩽0 推理得到的λ=1.0507, α=1.67326.
对应图像为:
其实就是在ELU
激活函数上乘了个λ, 要求λ是大于1的.
论文中作者认为好的激活函数应当具有以下特点:
能够输出正值和负值, 可以做到输出的期望均值在0左右
具有饱和区域, 对应的导数约为0. 这样在较浅的层中, 对于输出方差过大的情况, 能够缓和这种情况
斜率应当大于1, 这样在浅层中, 如果输出的方差过小, 能够增大方差
最终使得FNN达到self-normalization
的状态, 即每层的输出能够满足均值为0, 方差为1, 得到类似于batch normalization的效果. 达到避免梯度消失和梯度爆炸的效果.
考虑某一层, 该层的参数为W, 该层的输入/上一层的输出为x, 输入到激活函数的值为z=Wx, 激活函数的输出为y=f(z). 每一层的输入输出都是随机变量, 则输入向量x中每个元素分布的定义为μ:=E(xi), 方差定义为ν:=Var(xi), 输出的均值和方差定义为μ~:=E(y)和ν~:=Var(y).
对于单个输出值y=f(z), 其中z=wTx. 该神经元对应的参数向量w长度与输入向量x相同, 假设长度为n, 定义两个变量ω:=∑i=1nwi和τ:=∑i=1nwi2, 分别为参数向量中每个值的均值乘以n, 以及方差乘以n.
定义映射关系g, 映射输入的均值和方差到输出的均值和方差, 这个关系由该层的参数决定, 表示为:
(μν)↦(μ~ν~):(μ~ν~)=g(μν) 使用常见的正则化方法(batch, layer, weight normalization)对应于g, 这里的g使得输入输出的方差和均值能够保持不变, 一般为(0,1).
以上为必要的定义, 然后就可以定义作者所说的Self-normalizing
概念了.
首先定义均值和方差的值域Ω={(μ,ν)∣μ∈[μmin,μmax],ν∈[νmin,νmax]}, 如果一个网络是满足Self-normalizing
的, 应当满足:
对于单个神经元, 其输出值与输入向量的均值和方差是没有变化的, 即g:Ω↦Ω. 这个关系是依赖于该神经元的参数向量, 等同于依赖(ω,τ)
对于任何输入样本, 输出的均值和方差都能够保持在Ω范围内, g(Ω)⊆Ω. 随着层数的推进, 输出的均值和方差最终收敛到Ω范围内的一个固定点上
SELU激活函数使得网络达到self-normalization的状态, 使每层的输出都能够维持在均值为0, 方差为1的状态.
SELU使用注意
SELU激活函数需要配和lecun normalization初始化方法使用, lecun normalization初始化即从均值为0, 标准差为stddev = sqrt(1 / fan_in)
的正态分布中抽取样本, fan_in
表示权重张量对应的输入向量
SELU激活函数需要配和AlphaDropout使用, AphaDropout可以保持输入的均值和标准差.
训练过程中, AlphaDropout会以从伯努利分布中采样到的概率p使一些元素置零. 每次前向传递过程中, 保留的元素都是随机且会进行缩放和移位以保持0均值和单位标准差
SELU优缺点
优点:
神经网络能够实现自归一化(self-normalizing), 无需使用其他的归一化技术
缺点:
需要使用特定的初始化方法(lecun normalization)和Dropout方法(Alpha Dropout)