机器学习领域常用**函数汇总
前言
这篇博客简介了一些常见的**函数,并简要总结了每个**函数的缺点。
部分常见**函数一览图:
-
sigmoid
表达式:
导数:
sigmoid**函数图像如下:
下面我们来看看sigmoid**函数有哪些缺点:
- 在饱和区域存在梯度缺失的问题。
- sigmoid是一个非零中心的函数。
- 表达式较为复杂,计算复杂度高。
这里详细介绍第二个缺点,我们知道在NN的训练过程中,正向传播得到损失值会和反向传播得到偏导数做积,以此获得下一次更新的梯度,而非零中心带来的最大问题是,梯度更新的方向要么都为正向,要么都为反向,从而造成梯度更新的效率非常低。
-
tanh
tanh的提出同样避免了sigmoid的一些缺点,首先它是零中心的函数的函数,这点很棒;但tanh同样不可避免的存在饱和区域存在梯度缺失的问题,而计算复杂度较高。
-
ReLU
ReLU的提出在一定缓解了sigmoid**函数一部分缺点,首先它含有一半饱和区域,相比sigmoid来说大部分的饱和区域;同时它的计算成本也不高,相比sigmoid和其他的一些**函数,计算速度非常快;在实际中,我们使用ReLU**函数要比sigmoid和tanh收敛得快的多,大约快6倍左右。但同时我们发现它并没有改进非零中心的问题,在ReLU中依旧存在非零中心的问题。ReLU还会出现在0处,导数不存在的情况(根据图像可以清楚发现这一点),在实际的做法中我们人为设定在0处的偏导值为0。最后,ReLU会出现dead Relu的现象,准确来说就是存在输入小于0的情况,从而导致一部分神经元永远不会被**。
-
Leaky ReLU
表达式:
个人感觉这个**函数比较nice,它不会存在在饱和区域,同时缓解了sigmoid作为非零中心的函数带来的梯度更新效率很低的问题,最后它的计算速度也比较快,和ReLU相当。在0点会出现导数不存在的问题,但这个不是大问题,只要人为设定即可。
-
PReLU
表达式:
相比Leaky ReLU来说,最大的亮点在于比较灵活,能让NN自己学习参数。
-
elu
表达式:
elu(指数线性单元)它含有ReLU函数所有的优点,并且均值接近于0,但是仍然存在负饱和区,有论文指出,它对噪音具有更强的鲁棒性。
-
Maxout
表达式如下:
Maxout的做法比较有意思,但这样做带来最大问题是参数数量的问题,从表达式可以清晰的的得知参数的数量是其他**函数的两倍;但它不会存在饱和区域存在梯度缺失的问题,也不会存在非零中心化的问题。
-
softplus
表达式:
softplus可以看成平滑版的ReLU函数,表达式中加0为了防止中为0的情况出现,直观上感觉他比ReLU有更高的计算复杂度,从图像上可以发现,它不会存在ReLU中0点导数不存在的问题。当然它也会存在饱和区域。
-
softmax
表达式:
softmax**函数主要用于多分类问题中,它将多个神经元的输出,映射到(0,1)区间内,可以看成是当前输出是属于各个分类的概率,从而来进行多分类。