2. Sigmoid与Tanh:经典门控激活函数的数学表达式与梯度特性分析
说起门控机制,咱们得先聊聊两位“老前辈”——Sigmoid和Tanh。别看现在各种新激活函数层出不穷,但这两个函数在门控单元里的地位,至今没人能完全替代。我个人习惯把Sigmoid叫做“软开关”,把Tanh叫做“中心对称器”。为什么这么叫?往下看你就明白了。
2.1 Sigmoid:那个经典的“S”形曲线
Sigmoid的数学表达式很简单:
σ(x) = 1 / (1 + e^(-x))
它的输出范围是(0, 1)。这个特性太关键了——你想想看,门控不就是“开多少”的问题吗?0代表完全关闭,1代表完全打开,中间值就是半开半闭。我在做早期的LSTM项目时,就是用Sigmoid来控制遗忘门和输入门的开度。
它的导数长这样:
σ'(x) = σ(x) * (1 - σ(x))
嗯,这里要注意。这个导数形式虽然优雅,但隐藏着一个大坑。
核心特性总结:
- 输出范围:(0, 1),天然适合做概率或门控系数
- 单调递增,连续可导
- 导数最大值只有0.25,在x=0处取得
2.2 Tanh:零中心的“升级版”
Tanh的表达式是:
tanh(x) = (e^x - e^(-x)) / (e^x + e^(-x))
说白了,它就是Sigmoid的“平移拉伸版”。有个很实用的关系:
tanh(x) = 2 * σ(2x) - 1
Tanh的输出范围是(-1, 1),零中心。这个特性在深层网络中特别重要。为什么?因为零中心意味着下一层的输入均值接近0,能缓解梯度更新的“偏移”问题。
它的导数:
tanh'(x) = 1 - tanh²(x)
我的经验之谈:在RNN和LSTM中,Tanh通常用作状态更新函数,而Sigmoid用作门控函数。这个分工是有道理的——Tanh的零中心特性让状态值更稳定,Sigmoid的(0,1)范围让门控更直观。
2.3 梯度消失:经典函数的“阿喀琉斯之踵”
这两个函数有个共同的致命伤——梯度消失。我曾经在一个5层以上的全连接网络里用Sigmoid做激活,训练了整整两天,loss纹丝不动。排查了半天,发现就是梯度消失搞的鬼。
为什么会这样?来看数据:
| 输入x | Sigmoid输出 | Sigmoid梯度 | Tanh输出 | Tanh梯度 |
|---|---|---|---|---|
| 0 | 0.5 | 0.25 | 0 | 1.0 |
| ±2 | 0.12 / 0.88 | ≈0.10 | ±0.96 | ≈0.07 |
| ±4 | 0.02 / 0.98 | ≈0.02 | ±0.999 | ≈0.002 |
| ±6 | ≈0 / ≈1 | ≈0.002 | ≈±1 | ≈0.0001 |
看到没?当输入绝对值大于4时,梯度已经小到几乎为0了。这意味着什么?意味着网络在反向传播时,梯度信号传不了几层就“消失”了。深层网络的前几层根本学不到东西。
避坑指南:我曾经在做一个文本分类任务时,用了6层Sigmoid激活的全连接层。结果训练了100个epoch,测试准确率还不如一个2层的网络。后来换成ReLU,同样的结构,准确率直接提升了15%。所以,除非你明确需要门控特性,否则别在深层网络里用Sigmoid/Tanh做激活。
2.4 门控场景下的“幸存者”
虽然梯度消失问题严重,但Sigmoid和Tanh在门控机制里依然活得很好。为什么?因为门控场景下,我们通常只对每个门控单元做一次非线性变换,不会堆叠很多层。比如LSTM里,遗忘门、输入门、输出门各用一次Sigmoid,状态更新用一次Tanh。梯度只经过这几个门控点,不会反复乘很多次。
说白了,门控函数不是用来“传递梯度”的,而是用来“控制信息流”的。这个定位上的差异,让Sigmoid和Tanh在门控领域找到了自己的生态位。
2.5 知识结构图
下面这张图帮你理清Sigmoid和Tanh在门控机制中的角色定位:
一句话总结:Sigmoid做门控(控制开度),Tanh做变换(信息映射)。两者配合使用,是经典门控结构的标配。虽然都有梯度消失的问题,但在门控场景下,这个缺点被“单次使用”的特性给规避了。