本文总结了深度学习的损失函数及其优缺点。
激活函数是深度学习模型的重要成分,其目的是将线性输入转换为非线性。 常见的激活函数有sigmoid、tanh、ReLU等
1.sigmoidSigmoid非线性函数将输入映射在【0,1】之间。 其公式如下。
历史上,sigmoid函数曾非常常用,但现在很不受欢迎,实际上很少使用。 主要是因为有两个缺点。
函数饱和使梯度消失sigmoid神经元在值为0或1时接近饱和,在这些区域,梯度为几乎为 0。 因此,在反向传播时,该局部斜率与整个成本函数的该单元输出相关的斜率相乘,结果也接近0。
这样,通过神经元传递到权重并到达数据的信号几乎没有,所以梯度对模型的更新没有任何贡献。
除此之外,为了防止饱和,需要特别注意权重矩阵的初始化。 例如,如果初始化的权重太大,许多神经元就会饱和,网络就几乎不学习了。
sigmoid函数关于原点中心不对称的这一特性使得后续网络层的输入也不是零中心,从而影响了梯度下降的行为。
如果输入都是正数的话,如(x0中),关于w的斜率在反向传播的过程中,要么都是正数,要么都是负数(具体来说是由公式f ) x )整体决定的),因为斜率下降权重更新时会发生锯齿型的下降
当然,如果针对每个batch进行训练,则每个batch可以获得不同的信号,这可以通过匹配整体的批量梯度来缓解该问题。 因此,这个问题对上面的神经元饱和问题只是个小麻烦,不是很严重。
2.tanhtanh函数也存在饱和问题,但由于其输出是零中心,实际上tanh比sigmoid更受欢迎。
tanh函数实际上是放大的sigmoid函数,数学关系如下。
在具体应用中,tanh函数往往比Sigmoid函数更具优势。 这主要是因为Sigmoid函数在输入介于[-1,1 ]之间时,对函数值的变化很敏感,当接近或超过区间时失去敏感性,处于饱和状态。
3.Relu近年来非常流行。 其公式如下。
ReLU的效果如上图所示。
ReLU的优点:
与sigmoid和tanh函数相比,ReLU对SGD的收敛有很大的加速作用(Alex Krizhevsky指出有6倍以上)。 也有人认为这是由其线性、非饱和公式造成的。
与sigmoid/tanh相比,ReLU可以通过一个阈值获得激活值,不需要计算大量复杂的(指数)运算,
ReLU的缺点是训练时很脆弱,**可能会“死”**。
例如,当非常大的梯度通过ReLU神经元并更新参数后,该神经元不再对任何数据激活。 如果发生这种情况,从那以后,流经这个神经元的梯度都为0。
也就是说,该ReLU单元在训练中不可逆地死亡,导致了数据多样化的丢失。 实际上,如果将学习率设定得较高,网络内的神经元有40%会死亡(在整个训练集中这些神经元不会被激活)。
合理设定学习率会降低这种情况的发生概率。
ReLU与sigmoid和tanh相比,存在没有设置上限的缺点。 在实际使用中,可设定ReLU6经验函数:f(x )=min ) 6,max ) 0,x ) ) f ) x )=min ) 6,max ) 0,x )的上限
4.Leaky ReLULeaky ReLU是解决“ReLU死亡”问题的尝试。
如果ReLU为x0,则函数值为0。 另一方面,Leaky ReLU给出了0.01这样的小的负梯度值。
一些研究者的论文指出,这个激活函数运作良好,但其效果不稳定。
5. 随机纠正线性单元(RReLU)
“随机修改线性单元”RReLU也是Leaky ReLU的变体。 在RReLU中,负值的斜率在训练中是随机的,在之后的测试中是固定的。 RReLU的亮点是,在训练的一环中,aji是从均匀分布u(I,u )中随机提取的数值。 在形式上,可以获得以下结果。
6.ELU
7.preluprelu (parametricrectifiedlinearunit ),顾名思义,带参数的relu。 两者的定义和区别如下图所示。
当ai=0时,PReLU退化为ReLU; 对于较小的固定值,例如ai=0.01,PReLU退化为leakyRelu(LRELu )。 实验证明,与ReLU相比,LReLU对最终结果几乎没有影响。
3358 www.Sina.com/http://www.Sina.com/prelu只是增加了极少量的参数,意味着网络的计算量和过拟合的危险性只增加了一点。 特别是如果不同的channels使用相同的ai,则参数会更少。
(2) BP更新ai时,采用的是带动量的更新方式,如下:
8.SELU
经过该激活函数后使得样本分布自动归一化到0均值和单位方差(自归一化,保证训练过程中梯度不会爆炸或消失,效果比Batch Normalization 要好)
其实就是ELU乘了个lambda,关键在于这个lambda是大于1的。以前relu,prelu,elu这些激活函数,都是在负半轴坡度平缓,这样在activation的方差过大的时候可以让它减小,防止了梯度爆炸,但是正半轴坡度简单的设成了1。而selu的正半轴大于1,在方差过小的的时候可以让它增大,同时防止了梯度消失。这样激活函数就有一个不动点,网络深了以后每一层的输出都是均值为0方差为1。
tensorflow中:tf.nn.selu(features, name=None)
9.Swish
Swish是Google在10月16号提出的一种新型激活函数,其原始公式为:f(x)=x * sigmod(x),变形Swish-B激活函数的公式则为f(x)=x * sigmod(b * x),其拥有不饱和,光滑,非单调性的特征,而Google在论文中的多项测试表明Swish以及Swish-B激活函数的性能即佳,在不同的数据集上都表现出了要优于当前最佳激活函数的性能.
参考地址:
https://www.cnblogs.com/ymjyqsx/p/6294021.html
https://blog.csdn.net/qq_23304241/article/details/80300149
https://www.colabug.com/3289623.html