Tanh-Sigmoid Gating(双曲正切-Sigmoid 门控)是深度学习中一种经典的门控机制(Gating Mechanism),通常被称为 GTU(Gated Tanh Unit,门控双曲正切单元)。

🎯核心思想:“内容”与“开关”分离

它用一个分支生成信息内容,另一个分支生成门控信号,两者相乘得到最终输出:
Output = tanh ⁡ ( X W + b ) ⏟ 信息内容 (-1,1) ⊙ σ ( X V + c ) ⏟ 门控信号 (0,1) \text{Output} = \underbrace{\tanh(\boldsymbol{XW} + \boldsymbol{b})}_{\text{信息内容 (-1,1)}} \odot \underbrace{\sigma(\boldsymbol{XV} + \boldsymbol{c})}_{\text{门控信号 (0,1)}} Output=信息内容 (-1,1) tanh(XW+b)门控信号 (0,1) σ(XV+c)
其中:

  • ⊗:逐元素乘法(Hadamard 积)
  • tanh:提供实际要传递的信息(-1 到 1,零中心化,能表示正向和反向信息)
  • σ (sigmoid):提供"阀门"(0=完全关闭,1=完全开放)

🚰 直观类比:水坝系统

想象在控制水流:

组件 作用 数学对应
水流本身 有方向(正向/反向)和大小,但被限制在安全范围内 tanh(XW+b)
水坝闸门 决定放不放水、放多少(0%~100%) σ(XV+c)
实际流出 水流 × 闸门开度 Output

为什么不用同一种激活函数?

  • 如果水流用 sigmoid:只能单向流动(0~1),而且不是零中心化,难以表示"抵消/反向"信息
  • 如果闸门用 tanh:可能出现负值(-1),这在"门控"中没有意义(不能"负向通过")

💻 代码实现

import torch
import torch.nn as nn

class TanhSigmoidGating(nn.Module):
	def __init__(self, dim):
		super().__init__()
		# 信息分支:生成内容
		self.to_content = nn.Linear(dim, dim)
		# 门控分支:生成0-1的权重
		self.to_gate = nn.Linear(dim, dim)

	def forward(self, x):
		# 内容:-1~1
		content = torch.tanh(self.to_content(x))
		# 门控:0~1
		gate = torch.sigmoid(self.to_gate(x))
		# 门控过滤
		return content * gate

🆚 与 GLU 的区别

之前还听说过 GLU(Gated Linear Unit),这是现代大模型(如 PaLM、LLaMA)的首选:

特性 GTU (Tanh-Sigmoid) GLU (Linear-Sigmoid)
信息分支 tanh(XW+b)(非线性) XW+b(线性,无激活)
门控分支 sigmoid(XV+c) sigmoid(XV+c)
梯度流 ❌ 容易梯度消失(双重饱和) ✅ 较好(有线性通道)
现代使用 早期(如 Gated CNN) 主流(SwiGLU、GeGLU 等)

GTU 的梯度问题:

因为 tanh 和 sigmoid 都有饱和区(输入很大/很小时梯度趋近0),两者相乘后梯度消失更严重。相比之下,GLU 保留了线性路径,梯度可以直接回流。

❌ GTU 的致命劣势(为什么被 GLU 取代)

根据《Language Modeling with Gated Convolutional Networks》(Facebook AI Research, 2017) 的实验

双重梯度消失(梯度截断)

当两个函数都进入饱和区(输入很大或很小时),梯度会被连续削弱两次,导致深层网络几乎训练不动。

收敛速度慢、最终精度低

在同规模实验中(WikiText-103 数据集):

  • GLU:收敛快,困惑度低
  • GTU:收敛慢,且最终困惑度比 GLU 高(性能差)

计算冗余

tanh 比线性变换(GLU)计算量更大,收益却更低。

✅ GTU 的残余优势(什么情况下还能用?)

虽然主流已被 GLU 取代,但 GTU 在以下特定场景仍有理论或实践价值:

输出范围严格受限的任务 🎯

当必须将输出限制在 [−1,1] 范围内时,GTU 是"天然"的选择:

  • 图像生成(PixelCNN):像素值通常归一化到 [−1,1] ,GTU 的输出范围正好匹配,无需额外约束
  • 强化学习中的动作控制:某些环境的动作空间要求有界输出(如电机扭矩限制)
  • 嵌入式部署:限幅输出可减少数值溢出风险

与 LSTM/GRU 的架构一致性 🧩

如果你的系统是混合架构(如 CNN+LSTM):

  • LSTM 内部就是 tanh ⊗ sigmoid 结构
  • 使用 GTU 可以保持梯度流动力学一致性,避免不同层间信号分布差异过大

这在早期序列建模(如 2016-2017 年的语音合成、机器翻译)中曾被使用,因为当时 LSTM 是主流,GTU 更容易融入现有框架。

强非线性特征提取(浅层网络) 🔧

在网络较浅(3-5 层)且需要剧烈非线性变换的任务中:

  • GTU 的双重非线性(tanh + sigmoid)可以建模更复杂的特征交互
  • GLU 的线性通道虽然利于梯度,但表达上限受限于线性变换

例如在某些信号处理或时间序列异常检测中,数据的非线性极强,GTU 的"双重压缩"反而能提取出 GLU 难以捕捉的模式。

正则化效果(作为隐式 Dropout)🛡️

tanh 的饱和区可以看作一种硬正则化:

  • 当特征过大时,tanh 将其压缩,自动抑制异常值
  • 这种"软截断"在某些噪声较大的任务中,比 GLU 的线性无界传播更鲁棒

虽然这会导致梯度消失,但在模型容量过大、数据噪声多的场景,这种"自我限制"反而可能防止过拟合(类似于 L2 正则,但作用于激活值)。

🏆 总结:什么情况下用 GTU?

场景 推荐选择 原因
深层 Transformer (>12层) GLU/SwiGLU 梯度流畅通,训练稳定
图像生成(Pixel-level) GTU 或 Tanh 输出需严格有界 [-1,1]
混合 CNN+LSTM 架构 GTU 与 LSTM 内部机制一致
浅层网络 + 强非线性 GTU 需要剧烈特征变换
数值稳定性优先 GTU 自动限幅,防爆炸
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐