目前有四种常见的非线性激励函数:
sigmoid函数:
tanh函数:
softplus函数:
Relu函数:
其对应得函数图像如下:
| 函数种类 | 优点 | 缺点 |
| sigmoid函数 | 在整个定义域内可导 |
gradient在饱和区域非常平缓,接近于0,很容易造成vanishing gradient的问题,减缓收敛速度。 算**函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大 |
| tanh函数 | 在整个定义域内可导 |
gradient在饱和区域非常平缓,接近于0,很容易造成vanishing gradient的问题,减缓收敛速度。 算**函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大 |
| softplus函数 | 在整个定义域内可导 | 算**函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大 |
| ReLu函数 |
Relu的gradient大多数情况下是常数,有助于解决深层网络的收敛问题。 ReLU更容易学习优化。因为其分段线性性质,导致其前传,后传,求导都是分段线性 Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生,也更接近真实的神经元**模型。 |
如果后层的某一个梯度特别大,导致W更新以后变得特别大,导致该层的输入<0,输出为0,这时该层就会‘die’,没有更新。当学习率比较大时可能会有40%的神经元都会在训练开始就‘die’,因此需要对学习率进行一个好的设置。 |
需要注意的是:tanh特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果显示出来,但有是,在特征相差比较复杂或是相差不是特别大时,需要更细微的分类判断的时候,sigmoid效果就好了。
还有一个东西要注意,sigmoid 和 tanh作为**函数的话,一定要注意一定要对 input 进行归一话,否则**后的值都会进入平坦区,使隐层的输出全部趋同,但是 ReLU 并不需要输入归一化来防止它们达到饱和。
还有一个东西要注意,sigmoid 和 tanh作为**函数的话,一定要注意一定要对 input 进行归一话,否则**后的值都会进入平坦区,使隐层的输出全部趋同,但是 ReLU 并不需要输入归一化来防止它们达到饱和。
还有两种改进的激励函数:
Leaky ReLu函数:
Maxout函数:
但是这两种并不常用