又称修正线性单元,是一种分段线性函数,弥补了sigmoid函数以及tanh函数的梯度消失问题。relu函数的公式及图形,导数公式如下图 特点: 1、在输入为正数的时候(对于大多数输入 zz 空间来说),不存在梯度消失问题。 2、计算速度要快很多。relu函数只有线性关系,不管是前向传播还是反向传播,都比sigmoid和tanh要快很多。(sigmoid和tanh要计算指数,计算速度会比较慢) 3、当输入为负时,梯度为0,会产生梯度消失问题 relu目前仍是最常用的激活函数,在搭建人工神经网络的时候推荐优先尝试!
单极性,sigmoid 是常用的非线性的激活函数,该函数是将取值为 (−∞,+∞)(−∞,+∞) 的数映射到 (0,1)之间,它的数学形式和图像如下: sigmod激励函数符合实际,当输入很小时,输出接近于0;当输入很大时,输出值接近1,但是sigmoid函数作为非线性激活函数,但是其并不被经常使用,它具有以下几个缺点: 1、当 zz 值非常大或者非常小时,通过右上图我们可以看到,sigmoid函数的导数 g′(z)g′(z) 将接近 0 。这会导致权重 WW 的梯度将接近 0 ,使得梯度更新十分缓慢,即梯度消失。 2、非零中心化,也就是当输入为0时,输出不为0,,因为每一层的输出都要作为下一层的输入,而未0中心化会直接影响梯度下降 。 3、计算量比较大。 sigmoid函数可用在网络最后一层,作为输出层进行二分类,尽量不要使用在隐藏层。
双极性,该函数是将取值为 (−∞,+∞)(−∞,+∞) 的数映射到 (−1,1)(−1,1) 之间,其数学形式与图形为: 特点: 1、tanh函数在 0 附近很短一段区域内可看做线性的。由于tanh函数均值为 0 ,因此弥补了sigmoid函数均值为 0.5 的缺点。 2、当z为非常大或者非常小的时候,由导数推断公式可知,此时导数接近与0,会导致梯度很小,权重更新非常缓慢,即梯度消失问题。 3、幂运算问题仍然存在,计算量比较大。
和relu一样为近似生物神经激活函数,函数数学形式和图像如下:(log里面加1是为了避免非0出现) 特点: 1、softplus可以看作是ReLu的平滑。
1、在少量层结构中, 我们可以尝试很多种不同的激励函数. 在卷积神经网络 的卷积层中, 推荐的激励函数是 relu. 在循环神经网络中, 推荐的是 tanh 或者是 relu 。 2、如果使用 relu,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky relu、Prelu 或者 Maxout. 3、relu->Lecky relu/Elu>tanh>sigmoid
执行结果图: 参考文献: 1、https://www.cnblogs.com/carrollCN/p/11370960.html 2、https://morvanzhou.github.io/tutorials/machine-learning/torch/2-03-activation/