【NLP复习】常用**函数的比较
一、啥是**函数?为啥用**函数?常用的有哪些?
- 啥是**函数?**函数是上层节点的输出和下层节点的输入之间的一个非线性函数关系。
- 为啥用**函数?要是不用**函数,不管多少层的神经网络说白了都是些线性变换的叠加,网络的逼近能力有限,所以引入非线性函数。
- 常用的有哪些?早期:sigmoid、tanh;近期:Relu及其改进(Leaky-ReLU、P-ReLU、R-ReLU...)、Maxout
二、Sigmoid函数
- Sigmoid公式、求导、图像:
- Sigmoid的导数的图像:
- 缺点:x较大时,导数接近0,导致参数长时间得不到更新。因此除了输出层是一个二分类问题,其他基本不用它。
- pytorch:torch.sigmoid()
三、Tanh函数(双曲正切)
- tanh公式、求导、图像:
- tanh导数图像:
- 优缺点:解决了Sigmoid函数的不是zero-centered输出问题(y轴方向均值为0),然而仍有梯度消失(gradient vanishing)的问题和幂运算耗时的问题。
- pytorch:torch.tanh()
四、relu函数
- relu公式、求导、图像
- relu导数图像
- relu优点:
- 正区间解决了梯度弥散(梯度消失)
- 计算速度非常快,只需要判断输入是否大于0
- 收敛速度远快于sigmoid和tanh
- relu缺点:
- ReLU的输出不是zero-centered
- Dead ReLU Problem,指的是某些神经元可能永远不会被**,导致相应的参数永远不能被更新,原因:
- 非常不幸的参数初始化,这种情况比较少见
- learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
五、其他**函数
-
Leaky ReLU函数(PReLU):
-
优缺点:不会有Dead ReLU问题,但性能还没证明比relu好
-
ELU (Exponential Linear Units) 函数:
-
优缺点:没有Dead ReLU问题;输出的均值接近0;zero-centered。但性能也不一定比relu好
-
MaxOut函数
-
maxout相当于一层神经网络,对于输入特征 X=(x1,x2,……xd),其函数如下:
-
权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,这时网络就类似于普通的MLP网络。
-
参考经验:
-
最好不用sigmoid,不如tanh,更不如ReLU 和 Maxout
-
尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的**函数以加快模型的收敛速度。
-
如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
-
-
【参考资料】