Softmax变体

Softmax变体2026:从标准到线性

Softmax:将分数变为概率 Softmax函数将任意实数向量转换为概率分布——所有元素为正且和为1。它是分类、注意力、语言模型等核心组件的数学基础。 Softmax(x_i) = exp(x_i) / Σ_j exp(x_j) 看似简单的公式背后,隐藏着数值稳定性、计算效率和梯度行为的深刻问题。 数值稳定性 溢出问题 当输入值很大时,exp(x)会溢出。例如exp(1000)远超FP32的范围(~3.4e38)。解决方案是减去最大值: def softmax_stable(x, dim=-1): """数值稳定的Softmax""" x_max = x.max(dim=dim, keepdim=True).values exp_x = torch.exp(x - x_max) return exp_x / exp_x.sum(dim=dim, keepdim=True) 减去最大值不改变结果(因为分子分母同时除以exp(max)),但将指数运算的输入控制在合理范围内。 Log-Softmax 在许多场景中(如交叉熵损失),我们需要的是log概率而非概率本身。直接对softmax取log可能损失精度: def log_softmax_stable(x, dim=-1): """数值稳定的Log-Softmax""" x_max = x.max(dim=dim, keepdim=True).values shifted = x - x_max log_sum_exp = torch.log(torch.exp(shifted).sum(dim=dim, keepdim=True)) return shifted - log_sum_exp PyTorch的F.log_softmax和F.cross_entropy内部都使用了这种稳定的实现。 Softmax的梯度特性 饱和问题 当某个输入远大于其他输入时,Softmax的输出接近one-hot——一个接近1,其余接近0。此时梯度几乎为零,导致学习停滞。 # 梯度公式 # ∂softmax(x_i)/∂x_j = softmax(x_i) * (δ_ij - softmax(x_j)) 当softmax(x_i) ≈ 1时,梯度 ≈ 1 × (δ_ij - softmax(x_j)) ≈ 0(对所有j)。 温度调节 温度参数T控制softmax的"尖锐度": Softmax_T(x_i) = exp(x_i / T) / Σ_j exp(x_j / T) T→0:趋向one-hot(尖锐) T→∞:趋向均匀分布(平滑) T=1:标准softmax 在知识蒸馏中,高温(T=4-10)使Teacher模型的输出更"软",传递更多暗知识。 LLM中的Softmax变体 Scaled Dot-Product Softmax 注意力中的softmax需要除以√d_k来防止内积值过大导致饱和: ...

2026-07-02 · 4 min · 818 words · 硅基 AGI 探索者
激活函数综述

激活函数综述2026

激活函数的角色 激活函数是神经网络中引入非线性的关键组件。没有激活函数,多层线性变换的堆叠等价于单层线性变换——网络的表达能力将被严重限制。激活函数的选择直接影响模型的训练动态、收敛速度和最终性能。 在LLM时代,激活函数的演进从ReLU到GELU再到SwiGLU,每一步都带来了可测量的性能提升。 ReLU时代 ReLU的革命性 ReLU(Rectified Linear Unit)的定义极其简单: ReLU(x) = max(0, x) 在ReLU之前,sigmoid和tanh是主流选择,但它们存在梯度消失问题——深层网络中梯度指数衰减。ReLU的梯度在正区间恒为1,有效解决了梯度消失问题,使得深层网络的训练成为可能。 ReLU的缺陷 Dead ReLU问题:当输入持续为负时,ReLU的梯度为零,神经元将永久"死亡"无法恢复。这在学习率设置不当时尤为严重。 非零中心化:ReLU的输出始终非负,导致后续层的输入分布偏向正方向,影响梯度下降效率。 Leaky ReLU与变体 为解决Dead ReLU问题,多种变体被提出: def leaky_relu(x, negative_slope=0.01): """Leaky ReLU: 负区间保留小梯度""" return torch.where(x > 0, x, negative_slope * x) def prelu(x, alpha): """Parametric ReLU: 负区间斜率可学习""" return torch.where(x > 0, x, alpha * x) def elu(x, alpha=1.0): """ELU: 负区间平滑过渡到指数""" return torch.where(x > 0, x, alpha * (torch.exp(x) - 1)) 这些变体在CV领域有一定应用,但在LLM中几乎未被采用——LLM的激活函数走上了另一条路。 GELU:Transformer的原始选择 定义 GELU(Gaussian Error Linear Unit)将输入的高斯分布概率与输入本身相乘: GELU(x) = x · Φ(x) 其中 Φ(x) 是标准正态分布的累积分布函数。实践中常使用近似: def gelu(x): """精确GELU""" return 0.5 * x * (1 + torch.erf(x / math.sqrt(2))) def gelu_tanh_approx(x): """tanh近似(更快)""" return 0.5 * x * (1 + torch.tanh(math.sqrt(2/math.pi) * (x + 0.044715 * x**3))) GELU vs ReLU GELU相比ReLU有两个关键优势: 平滑过渡:在零点附近,GELU是平滑的而非硬截断。这使得梯度更连续,训练更稳定 随机正则化:GELU隐含了一种随机dropout机制——输入越大,被保留的概率越高。这在一定程度上起到了自正则化的作用 原始Transformer(Attention is All You Need)选择了GELU,此后BERT、GPT系列也沿用至今。 ...

2026-07-02 · 2 min · 369 words · 硅基 AGI 探索者
activation function evolution

激活函数演进:从 ReLU 到 SwiGLU

1. 为什么需要激活函数? 没有激活函数,多层线性变换 $\mathbf{W}_2(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1) + \mathbf{b}_2$ 等价于单层线性变换。激活函数引入非线性,使网络可以拟合复杂函数。 Transformer 的 FFN 层结构: $$ \text{FFN}(x) = W_2 \cdot \sigma(W_1 x + b_1) + b_2 $$ 其中 $\sigma$ 就是激活函数。激活函数的选择直接影响模型的表达能力和训练效率。 2. ReLU 家族 2.1 ReLU $$ \text{ReLU}(x) = \max(0, x) = \begin{cases} x & x > 0 \ 0 & x \leq 0 \end{cases} $$ 优点: 计算极简、梯度不饱和(正区间梯度恒为 1)、被验证有效。 缺点: 神经元死亡(Dead Neuron)——如果输入持续为负,梯度永远为 0,该神经元永久停止学习。 2.2 Leaky ReLU / PReLU $$ \text{LeakyReLU}(x) = \begin{cases} x & x > 0 \ \alpha x & x \leq 0 \end{cases} $$ ...

2026-06-25 · 4 min · 685 words · 硅基 AGI 探索者
鲁ICP备2026018361号