本文主要是介绍激活函数介绍Sigmoid,tanh,Relu,softmax。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 什么是激活函数?
在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function。
2.为什么引入非线性激励函数?
若不使用激励函数,每一层的输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(perceptron)。
非线性函数作为激励函数,这样深层神经网络就有意义了,不再是输入的线性组合,可以逼近任意函数,最早的想法是用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。
Output = w7(input1w1 +input2w2)+w8(input1w3+input2w4)+w9(input1w5+input2w6)
公式转换一下:
Output = input1(w1w7+w3w8+w9w5)+input2(w2w7+w4w8+w6w9)
我们假设Output = 0
那么input1 = input2( w2w7+w4w8+w6w9)/(-w2w7+w4w8+w6w9)
最后又回到了y= X*W的线性模式
也就是说,现在的神经网络学习能力非常有限
无法去解决非线性问题
叠加简单神经网络解决不了非线性分类问题
3.激活函数特性
可微性: 当优化方法是基于梯度的时候,这个性质是必须的。
单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate。从目前来看,常见的激活函数多是分段线性和具有指数形状的非线性函数
4.常用激活函数
①sigmoid
sigmoid 是使用范围最广的一类激活函数,具有指数函数形状,它在物理意义上最为接近生物神经元。此外,(0, 1) 的输出还可以被表示作概率,或用于输入的归一化,代表性的如Sigmoid交叉熵损失函数。
然而,sigmoid也有其自身的缺陷,最明显的就是饱和性。从上图可以看到,其两侧导数逐渐趋近于0
具有这种性质的称为软饱和激活函数。具体的,饱和又可分为左饱和与右饱和。与软饱和对应的是硬饱和, 即
f′(x)=0,当|x|>c,其中c为常数。
sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个 f′(x)f′(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f′(x)f′(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象
此外,sigmoid函数的输出均大于0,使得输出不是0均值,这称为偏移现象,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。
sigmoid缺点:
(1)sigmod函数要进行指数运算,这个对于计算机来说是比较慢的
(2)当输入稍微远离了坐标原点,函数的梯度就变得很小了,几乎为零。反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练
(3)函数输出不是以0为中心的,这样会使权重更新效率降低。
②tanh
tanh变形:
tanh也是一种非常常见的激活函数。
tanh优缺点:
优点:与sigmoid相比,它的输出均值是0,使得其收敛速度要比sigmoid快,减少迭代次数。缺点:tanh一样具有软饱和性,从而造成梯度消失,在两边一样有趋近于0的情况
为什么引入Relu?
第一,采用sigmoid等函数,算激活函数时候(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相当大,而采用Relu激活函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,很容易就出现梯度消失的情况(在sigmoid函数接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。
第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
③ ReLU,P-ReLU, Leaky-ReLU
当然,现在也有一些对relu的改进,比如,prelu,random relu等,在不同的数据集上会有一些训练速度上或者准确率上的改进
多加一句,现在主流的做法,会多做一步batch normalization,尽可能保证每一层网络的输入具有相同的分布
一言以蔽之,其实,relu函数的作用就是增加了神经网络各层之间的非线性关系,否则,如果没有激活函数,层与层之间是简单的线性关系,每层都相当于矩阵相乘,这样怎么能够完成我们需要神经网络完成的复杂任务,
我们利用神经网络去解决图像分割,边界探测,超分辨等问题时候,我们的输入(假设为x),与期望的输出(假设为y)之间的关系究竟是什么?也就是y=f(x)中,f是什么,我们也不清楚,但是我们对一点很确信,那就是f不是一个简单的线性函数,应该是一个抽象的复杂的关系,那么利用神经网络就是去学习这个关系,存放在model中,利用得到的model去推测训练集之外的数据,得到期望的结果
这篇关于激活函数介绍Sigmoid,tanh,Relu,softmax。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!