为什么引入非线性**函数
如果不使用非线性的**函数,无论叠加多少层,最终的输出依然只是输入的线性组合。
引入非线性的**函数,使得神经网络可以逼近任意函数。
常用**函数
sigmoid函数
sigmoid函数是最常见的**函数,常用于输出层。其值域为0到1。
tanh双曲正切函数
可以看作是sigmoid函数向下平移和伸缩的结果。
经验表明,在隐藏层中使用
sigmoid函数和tanh函数共同的缺点是,在z特别大或者特别小的情况下,函数的梯度会变得特别小,接近0,这会使得梯度下降的速度变慢。
一般在二分类问题的输出层使用,不在隐藏层使用。
ReLU修正线性单元
当z为正的时候,导数恒为1,当z为负的时候,导数恒为0。
在零点的导数不存在,在实际使用中,z不会恰好为0,一般为一个很小的浮点数,这时导数取0或1都可以。
ReLU易于优化。只要出与**状态,导数都能保持较大。梯度不仅大而且一致。二阶导数几乎处处为0,并且在ReLU处于**状态时,一阶导数处处为1。
通常将偏置b设置成一个小的正值,如0.1。使得其对训练集中大多数输入呈现**状态,并且允许导数通过。
ReLU是最常用的**函数。
Leaky ReLU
relu和leakyrelu的优点
- 相比于sigmoid等,计算量小,
- 相比于sigmoid,不容易出现梯度消失情况,能加速网络训练速度
- 使得一些神经元输出为0,增加稀疏性,防止过拟合。
PReLU
将
maxout 单元
maxout单元进一步扩展了relu。maxout将z划分为每组具有k各值的组,而不是使用作用于每个元素的函数
这提供了一种方法来学习对输入x空间中多个方向响应的分段线性函数。
maxout单元可以学习具有多达k段的分段线性的凸函数。
maxout单元因此可以视为学习**函数本身而不仅仅是单元之间的关系。使用足够大的k,maxout可以以任意的精确度来近似任何凸函数。特别地,具有两块的maxout层可以学习实现和传统层相同的输入x的函数,这些传统层可以使用relu,prelu等。
每个maxout单元现在由k个权重向量来参数化,而不仅仅是一个,所以maxout单元通常比relu需要更多的正则化。
参考资料
DeepLearning deeplearning.ai
《深度学习》第6章
Introduction to Deep Learning HEC