常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结

**函数使用原因:

1、如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
2、如果使用的话,**函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
比如,在单层感知机中,分类的结果大于某个值为一类,小于某个值为一类,这样的话就会使得输出结果在这个点发生阶跃,logistic函数(sigmoid)解决了阶跃函数的突然阶跃问题,使得输出的为0-1的概率,使得结果变得更平滑,他是一个单调上升的函数,具有良好的连续性,不存在不连续点。

常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
饱和函数:输入达到一定值后,输出达到饱和后不再改变,例如sigmoid的值域为(0,1)

常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
为什么要取指数?
第一个原因是要模拟 max 的行为,所以要让大的更大。
第二个原因是需要一个可导的函数
Softmax - 用于多分类神经网络输出
常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
在特征相差比较复杂或是相差不是特别大时效果比较好。

sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,大的正数被映射成1。sigmoid function在历史上流行过一段时间因为它能够很好的表达“**”的意思,未**就是0,完全饱和的**则是1。而现在sigmoid已经不怎么常用了,主要是因为它有两个缺点:

  1. Sigmoids saturate and kill gradients. Sigmoid容易饱和,并且当输入非常大或者非常小的时候,神经元的梯度就接近于0了,从图中可以看出梯度的趋势。这就使得我们在反向传播算法中反向传播接近于0的梯度,导致最终权重基本没什么更新,我们就无法递归地学习到输入数据了。另外,你需要尤其注意参数的初始值来尽量避免saturation的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradient kill掉,这会导致网络变的很难学习。

  2. Sigmoid outputs are not zero-centered. Sigmoid 的输出不是0均值的,这是我们不希望的,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in f=wTx+b),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。
    当然了,如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。

为什么需要偏移常量?
通常,要将输入的参数通过神经元后映射到一个新的空间中,我们需要对其进行加权和偏移处理后再**,而不仅仅是上面讨论**函数那样,仅对输入本身进行**操作。比如sigmoid**神经网络的表达式如下:
常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
x是输入量,w是权重,b是偏移量(bias)

常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
Tanh和Sigmoid是有异曲同工之妙的,它的图形如上图右所示,不同的是它把实值得输入压缩到-1~1的范围,因此它基本是0均值的,也就解决了上述Sigmoid缺点中的第二个,所以实际中tanh会比sigmoid更常用。但是它还是存在梯度饱和的问题。Tanh是sigmoid的变形:tanh(x)=2σ(2x)−1。
————————————————

常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
relu在负数区域被kill的现象叫做dead relu,这样的情况下,有人通过初始化的时候用一个稍微大于零的数比如0.01来初始化神经元,从而使得relu更偏向于**而不是死掉,但是这个方法是否有效有争议。常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结
常用**函数Sigmoid & Softmax & ReLU& Tanh的整理总结