1、激活函数将线性变换转变成非线性。
Y
=
σ
(
X
W
+
b
)
Y=\sigma(XW+b)
Y=σ(XW+b)
X
W
+
b
XW+b
XW+b是在X基础上做的线性变换(仿射变换),总体来说做的平移、旋转和缩放,加入激活函数后,原来的变换是非线性的。
上式也可以理解为,在
X
X
X基础上先过MLP,再加激活函数。在实际训练中,发现一个问题,假设
W
W
W初始化权重集中在0附近(正交初始化或者其他方法),不加激活函数时,
W
W
W的经多次训练后的权重数据集中在0附近,与初始化差异不大;加任意激活函数后,
W
W
W的经多次训练后的权重数据被拉长,呈纺锤形。
原因分析:MLP层的作用类似做一次仿射变换。在经过MLP后,若不加激活函数,仿射变换不起作用,表现在
W
W
W权重更新与原始差异不大;若加激活函数,激活函数起到挤压MLP输出的作用。反过来想,
W
W
W被拉长的部分,正是MLP输出被激活函数挤压或裁剪的部分,因为$W $的变化大对应着其导数大,更新的幅度就大。
所以,应用MLP层后,最好加激活函数。
2、以ReLU函数为例
R
e
L
U
(
x
)
=
{
0
,
x
<
0
x
,
x
≥
0
ReLU(x)=\left\{ \begin{aligned} 0&, x < 0 \\ x&, x\ge 0 \end{aligned} \right.
ReLU(x)={0x,x<0,x≥0
激活函数干的事,总结起来就两件:裁剪和挤压
若没有激活函数,只用线性变换,对于如下二分类问题,分类结果如下
![](https://i-blog.csdnimg.cn/blog_migrate/a472e3d8a28fb6414d97712683a185fc.png)
若采用ReLU激活函数,在大于0的地方不变,小于0的地方归到0,单侧抑制(梯度为0)。下图中,直线左侧归为正类,右侧归为负类,但是由于单侧抑制,右侧负类的梯度不反向传播,相当于ReLU激活函数在这里砍一刀,只关注左侧部分。假设x([batch, seq, hidden_dim]),产生ReLU(x)时会经过hidden_dim次激活,也就是砍hidden_dim次刀。
![](https://i-blog.csdnimg.cn/blog_migrate/9e728809eaf4edbbfc2e3c930600dc3f.png)
经过ReLU激活函数后的二分类图像如下,可以很明显的看出,分类边界是个多边形,像砍过一样。ReLU激活函数起裁剪作用。
![](https://i-blog.csdnimg.cn/blog_migrate/0b83fb9d17793700ae09a8b8506c48ff.png)
3、tanh激活函数
![](https://i-blog.csdnimg.cn/blog_migrate/df06b59173176c3cd41031ca0d898c64.png)
可以看出tanh激活函数,在(-1,1)内变化比较迅速,而且并不像ReLU函数单侧抑制,所以经过tanh激活后的输出应该比较平滑,如下
![](https://i-blog.csdnimg.cn/blog_migrate/3dcd41a4eaa110ce34e79dd92d1f42ca.png)
另一方面,tanh函数在(- ∞ \infty ∞,-1)和(1,+ ∞ \infty ∞)变化较小(梯度接近于0),相当于将输出都挤压到单位球上,关注点都放在零点附近。所以tanh激活函数主要起挤压作用。