**函数整理
1. 前言
这里主要首先要说下为什么在深度学习网络中需要加入**函数?因为**函数是网络中非线性的来源,去除了该部分之后网络就只剩下线性运算部分了,而且线性运算的组合叠加也是线性的,最后得到的结果模型也当然可以等价于单层的线性模型了,也为了能够适用于复杂的情况,所以需要在网络中引入非线性单元。
那么说到了**函数那么就先从常见的sigmoid开始谈起吧。
2. sigmoid函数
首先,来看看sigmoid函数是怎么定义的
其表示的实际函数曲线是这样的
从上图中可以看出:sigmoid函数的输出被限制在(0,1)之间,单调连续,并且根据其定义其求导容易;但是该损失函数由于其软饱和性,容易产生梯度消失,导致训练出现问题,并且其输出并不是以0为中心的。
3. tanh函数
tanh函数和sigmoid函数比较类似,其函数定义为
其函数曲线为:
从上面的曲线中可以看出函数的取值范围为[-1,1]。tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好。Tanh的梯度相比较Sigmoid更加陡峭。我们选择Sigmoid还是Tanh是根据问题中对梯度的要求而定的。
4. Softmax函数
Softmax是另一种Sigmoid函数,但是它是在分类中比较容易控制的一种**函数。Sigmoid只能处理两类的问题。Softmax将输出结果压缩在0-1之间,并依据输出的总和来分类。它给输入的概率一个概率。Softmax形式如下:
假设我们的一个输出结果是[1.2,0.9,0.75],当我们使用了softmax之后,这个值变成了[0.42, 0.31, 0.27],我们可以使用这些概率当做每一类的概率。
Softmax在输出层中使用是比较完美的,这里我们通常是需要获得输入数据对应的类别的各种概率。
笼统解释:二分类情况一般使用sigmoid**,多分类情形一般使用softmax进行**。
5. relu函数
说到relu函数一般是说的其一般表达式:
其函数图像也很简单了,大于0的分布就是一条直线,小于0的分布那就是的水平直线。
relu函数在最近的几年中是最广泛使用的**函数原因首先是它是非线性的,也就意味着反向传播算法可用。而ReLu一个非常好的特性是它不会同时**所有的神经元。这是什么意思呢?从上面的图中我们可以看到ReLU的图形,在输入是负值的情况下,它会输出0,那么神经元就不会被**。这意味着同一时间只有部分神经元会被**,从而使得网络很稀疏,进而对计算来说是非常有效率的。
在进行反向传播的时候,输入值小于0对应的神经元是不会被更新的,相当于是死的,不会被**。
通过上面的图像可以看到relu函数在输入小于0的时候,对应的神经元是不能被**的。为了解决该问题,提出了relu这一族的函数,其大体思想可以使用下面的函数进行概括:
6. swish函数
该函数是Google大脑团队提出了一个新的**函数。其函数定义式为:
其函数图像为:
团队的测试结果表明该函数在很多模型都优于ReLu。
从图像上来看,Swish函数跟ReLu差不多,唯一区别较大的是接近于0的负半轴区域。其实这个**函数跟facebook提出的GLU**函数是类似的。
7. **函数选择的一些指导
讲了如上的**函数,在实际的运用过程中如何使用?并没有特定的规则。但是根据这些函数的特征,可以总结一个比较好的使用规律或者使用经验,使得网络可以更加容易且更快的收敛。
1. Sigmoid函数以及它们的联合通常在分类器的中有更好的效果
2. 由于梯度崩塌的问题,在某些时候需要避免使用Sigmoid和Tanh**函数
3. ReLU函数是一种常见的**函数,在目前使用是最多的
4. 如果遇到了一些死的神经元,我们可以使用Leaky ReLU函数
5. 记住,ReLU永远只在隐藏层中使用
6. 根据经验,我们一般可以从ReLU**函数开始,但是如果ReLU不能很好的解决问题,再去尝试其他的**函数
7. 如果使用 ReLU,要小心设置 learning rate,注意不要让网络出现很多 “dead” 神经元,如果不好解决,可以试试 Leaky ReLU、PReLU 或者 Maxout.