激活函数(activation function)又称非线性映射函数或是隐藏单元,是神经网络中中最主要的组成部分之一。
数据的分布绝大多数是非线性的,而一般神经网络的计算是线性的,引入激活函数,是在神经网络中引入非线性,强化网络的学习能力。所以激活函数的最大特点就是非线性。
现阶段的激活函数多种多样,对应着不同的特性。实际建模过程中,当我们需要实现不同功能时,所需要的激活函数往往也不尽相同。所以掌握各种激活函数的特性,才能在工作中按需选择、信手拈来。
sigmoid 激活函数是深度学习中最早使用也是最常见的激活函数。多用来作为二分类的分类头。
(图片来自pytorch官方文档)
优势:
缺点:
(实际上,不以0为中心的问题,只要用上norm层,就可以解决了。)
tanh的图像曲线和sigmoid类似,但它的值域是(-1, 1)。它的优势是:
但它依然存在缺陷:
rectified linear unit(整流线性单位函数),目前深度学习非常常用的激活函数,可以进行深层训练。
ReLU(x)=max(0,x)
优势:
缺点:
通常来说relu的通用性比较好,训模型闭眼relu先。
negative_slope 可自行设置,默认是0.01.
优势:
缺陷(理论上比relu好,实际上不一定):
用leakyrelu的模型比如Yolo系列v1~v3,都用leakyrelu作为激活层。
就是把LeakyReLU的负斜率值negative_slope改为了可训练的参数。
拥有LeakyReLU的所有优势和缺陷。
以及:通常来说,leakyrelu比relu多一个参数,所以模型拟合能力不够时,可以用PReLU。
PReLU(x)=max(0,x)+a∗min(0,x)
在pytorch中调用nn.PReLU(num_parameters,init):
注意:当a学得性能很好时,不应使用权重衰减;
ReLU6(x)=min(max(0,x),6)
优势:
使用模型:Mobilev1。
其中a是一个随机数,服从均匀分布U(lower,upper)(具体细节可看https://arxiv.org/pdf/1505.00853.pdf,这篇论文对比了ReLU、LeakyReLU、PReLU和RReLU,发现RReLU在训练集上错误率最大,但在测试集上错误率最小。).
在pytorch中,nn.RReLU默认参数是(lower=1/8, upper=1/3)。
a在训练时随机,测试时固定((lower + upper) / 2)。
目前没听说哪个模型用的RReLU。
用分段函数近似sigmoid,优点是计算速度快,因为没有指数计算。
用分段函数近似tanh。
两端用线性函数近似。
使用场景:MobileNetv3.
在pytorch中,nn.Hardshrink
(lambd=0.5)。
很明显,优势:
缺点:
pytorch中nn.ELU
(alpha=1.0,inplace=False)
SELU(x)=λ∗(max(0,x)+min(0,α∗(exp(x)−1)))
其中,α=1.6732632423543772848170429916717
λ = 1.0507009873554804934193349852946
α 和 λ 的值是证明得到的,不是训出来的(详见Self-Normalizing Neural Networks,目的就是希望输入值的均值和方差分别为0和1,输出值的均值和方差也分别为0和1)。
Gaussian Error Linear Units,高斯误差线性单元。
GELU(x)=x∗Φ(x)
其中 Φ(x) 是高斯分布的累计分布函数。
CELU(x)=max(0,x)+min(0,α∗(ex/α−1))
就是把ELU中的 ex 变为 ex/α 。好处是可以调整左半边的斜率了(细节详见Continuously Differentiable Exponential Linear Units)。
pytorch中α 可设置,默认是1.
是
输入n维tensor,对它们进行重新缩放(rescale)使得张量的n维输出的每个元素都在[0, 1]区间内,且和为1。此过程会保持数值原本的大小顺序,即最大值经过激活函数后依旧最大。
跟softmax类似,输入n维tensor,对它们进行重新缩放(rescale)使得张量的n维输出的每个元素都在[0, 1]区间内,且和为1。不同的是,softmax是单调递增而softmin是单调递减,意味着softmax操作会使得最大的值在激活操作后依然保持最大,而softmin会使得最小的数在经过了softmin后变成最大值。
这是一种有效的softmax逼近(如Efficient softmax approximation for GPUs by Edouard Grave, Armand Joulin, Moustapha Cissé, David Grangier, and Hervé Jégou所述)。
adaptive softmax 是一种用于训练具有大输出空间的模型的近似策略。当标签分布高度不平衡时它最有效,例如在自然语言模型中,当词频分布近似于齐夫定律(zipf's law)时。
adaptive softmax 根据标签频率把它们分成几个族群,每个族群可能包含的目标数量不同。此外,包含较少标签的族群会为这些标签分配较低维的嵌入,从而加快计算速度。对于每个minibatch,仅评估至少存在一个目标的族群。
这个想法是频繁访问的集群(如第一个,包含最频繁的标签)也应该计算成本低——即包含少量分配的标签。
如果想要了解更多,强烈建议阅读原始论文。
:y = x * sigmoid (x)