激活函数是插在神经网络每个神经元输出端的非线性变换。它的使命只有一个:让网络能够刻画非线性的输入—输出关系——没有它,一百层的网络在数学上仍然等价于一层线性回归。直观地说,激活函数决定了网络能不能”弯”:只能切直线的模型永远分不开 XOR,也永远画不出图像里的猫耳朵轮廓。

演进时间线:问题驱动的三十年

激活函数三十年的演进史,就是一部「发现问题 → 修补问题」的历史。每一代函数都是为了解决上一代的结构性缺陷而生,理解了这条因果链,选型时就不会犯”新的一定好”或”旧的一定差”的错误。

年份 事件 意义
1986 Rumelhart、Hinton、Williams 在《Nature》发表反向传播算法 Sigmoid 凭”处处可导、输出像概率”成为默认选择
1991 Hochreiter 在毕业论文中系统分析梯度消失问题 指出饱和激活是深层网络训练困难的元凶之一
2010 Nair 与 Hinton 将 ReLU 引入受限玻尔兹曼机;Glorot 与 Bengio 分析饱和与初始化难题 非饱和激活进入视野
2012 AlexNet 使用 ReLU 夺得 ImageNet 冠军(top-5 错误率 15.3%,第二名 26.2%) ReLU 成为深度网络标配,深度学习就此爆发
2013–2016 Leaky ReLU(2013)、PReLU(2015)、ELU(2015)相继提出 针对”死亡神经元”与零中心问题修补 ReLU
2016–2018 GELU 提出,随 BERT、GPT-2 成为 Transformer 标配 平滑、概率式门控激活进入 NLP 主流
2020–至今 Shazeer 提出 GLU 变体(SwiGLU);LLaMA、PaLM 等大模型采纳 门控激活成为大语言模型 FFN 的事实标准

一个真实细节可以说明 ReLU 当年带来的冲击:AlexNet 论文里专门报告,在 CIFAR-10 上带 ReLU 的网络达到 25% 训练误差的速度,是等价 tanh 网络的 6 倍。当年”仅仅换一个激活函数”就能带来数倍收敛加速,这在今天仍然是最有说服力的工程证据之一。

为什么需要激活函数

没有激活函数,再深的网络也会塌缩成一层线性回归;用错饱和激活,梯度会在反向传播中逐层衰减到无法训练。这两个论断分别对应激活函数的两个角色:正向引入非线性、反向传递梯度。下面分别论证。

论断一:非线性塌缩

假设每层只是线性变换 $z = Wx + b$ 且不加激活函数,那么两层堆叠的结果是:

$$a = W_2(W_1 x + b_1) + b_2 = (W_2 W_1)x + (W_2 b_1 + b_2) = W’x + b’$$

无论叠多少层,乘出来的仍然是一个仿射变换 $W’x + b’$——深度的”表达力”完全消失了。最直观的反例是 XOR:两类点在平面上交叉分布,任何一条直线都至少切错一个点;而单隐藏层网络只要配上一个非线性激活,就能用两个神经元把空间折成两半。理论上,Cybenko(1989)与 Hornik 等人证明的万能逼近定理保证了:单个隐藏层 + 非线性激活 + 足够多的神经元,可以以任意精度逼近任意连续函数。换句话说,非线性的来源正是激活函数,而不是”层多”。

论断二:梯度消失

训练靠反向传播,而反向传播靠链式法则。对 10 层网络,第 1 层预激活 $z_1$ 收到的梯度是:

$$\frac{\partial L}{\partial z_1} = \frac{\partial L}{\partial z_{10}} \cdot \prod_{i=2}^{10} f'(z_i)$$

注意那个连乘:每一层的贡献是激活函数的导数 $f’$。Sigmoid 的导数在 $x=0$ 处取到全局最大值 $\sigma'(0) = 0.25$,也就是说每一层最好也要把梯度砍到四分之一,10 层下来最坏衰减 $0.25^9 \approx 3.8 \times 10^{-6}$——首层参数基本收不到学习信号。Tanh 稍好(导数峰值 1.0),但同样在 $|x| > 2$ 后迅速趋零,这叫”饱和”。下图把四个函数的导数画在一起,问题一目了然:

这张图解释了时间线里 1991 年到 2012 年之间发生的一切:不是深度学习 idea 不对,是 Sigmoid 的导数形状配不上”深”。ReLU 的导数在正区间恒等于 1,连乘里它就是”透明”的,这才是深度网络能训得动的先决条件之一(另一个是初始化,后面场景示例会看到)。

主流激活函数逐个拆解

先看全家福曲线,再逐个按「定义 / 特点 / 注意」拆解。看图时留意三件事:负区间的形状(决定死亡神经元问题)、饱和与否(决定梯度消失问题)、是否平滑(决定优化景观)。

Sigmoid:概率输出专用户

Sigmoid 是一种经典的激活函数,其数学表达式为$\sigma(x) = \frac{1}{1 + e^{-x}}$,输出值被压缩到 0 到 1 之间。它的图形呈平滑的 S 型曲线,并且处处可导,适合用于神经网络的非线性变换。

主要特点

  • 输出可解释为概率:由于值域在 (0,1),常被用在二分类模型的输出层,将线性结果映射成概率。
  • 单调递增且光滑:导数容易计算($f'(x)=f(x)(1-f(x))$),便于反向传播。

局限性

  • 梯度饱和:当输入很大或很小时,导数趋近于 0,导致深层网络中的梯度消失,训练缓慢。
  • 非零中心输出:输出恒为正,使得后续层的权重更新只能朝单一方向变化,降低收敛效率。
  • 计算开销较大:涉及指数运算,相比 ReLU 等函数更耗时。

应用场景

在现代深度学习中,隐藏层已很少使用 Sigmoid,转而采用 ReLU 及其变体;但它仍然是二分类输出层的标准选择(配合交叉熵损失)。此外,在门控循环单元(如 LSTM)中也用到了 Sigmoid 作为门控信号。

Tanh:零中心的过渡方案

Tanh(双曲正切)是另一种常用的激活函数,数学表达式为 $\tanh(x) = \frac{e^x – e^{-x}}{e^x + e^{-x}} = 2\sigma(2x) – 1$,输出范围在 (-1, 1)​ 之间,形状也是 S 型曲线。

主要特点

  • 零中心输出:输出均值为 0,解决了 Sigmoid 非零中心的问题,有助于缓解权重更新单向性,加速收敛。
  • 梯度更强:在原点附近梯度比 Sigmoid 更大(最大为 1),一定程度上减轻了梯度消失,但极端输入仍会饱和。

局限性

  • 依然存在梯度饱和:当输入绝对值很大时,导数趋近于 0,深层网络中梯度消失问题仍然明显。
  • 计算量稍高:同样涉及指数运算。

应用场景

  • 在 RNN 和某些传统神经网络中曾广泛用于隐藏层(尤其是早期)。
  • 现代深度学习中,隐藏层多被 ReLU 系列取代,但在一些对输出范围有对称性要求的任务(如生成模型、归一化层前)仍有使用。

简单对比:Sigmoid 适合输出概率(0~1),Tanh 更适合作为隐藏层激活(-1~1),两者都因饱和问题而逐渐让位于 ReLU。

ReLU:深度学习的功臣

ReLU(Rectified Linear Unit,修正线性单元)是目前最常用的激活函数之一,公式为 $\mathrm{ReLU}(x) = \max(0, x)$,即输入为正则原样输出,否则输出 0。

主要优点

  • 计算极快:只涉及比较操作,没有指数运算,训练速度远快于 Sigmoid/Tanh。
  • 缓解梯度消失:正区间导数为常数 1,梯度不会随深度衰减,有助于深层网络训练。
  • 稀疏激活性:负输入被置零,使神经元具有稀疏响应,减少过拟合风险。

局限性

  • 神经元死亡(Dying ReLU):若某神经元所有输入都为负,梯度为零,参数永远无法更新,导致永久失效。
  • 非零中心输出:输出全为非负,可能影响收敛效率(但通常不如 Tanh 严重)。

改进变体

  • Leaky ReLU / PReLU:给负区间一个很小的斜率(如01),避免神经元死亡。
  • ELU / SELU:引入指数形式的负值,兼顾零中心与抗饱和。

应用场景

ReLU 及其变体是卷积神经网络(CNN)、多层感知机(MLP)等主流架构中隐藏层的默认激活函数,几乎取代了 Sigmoid/Tanh 在隐藏层的位置。

Leaky ReLU 与 PReLU:给负区间留一条缝

Leaky ReLU 和 PReLU 都是针对 ReLU “神经元死亡”问题的改进版本。

Leaky ReLU(带泄露的 ReLU)

  • 公式:f(x)=max(αx,x),其中 α 是一个很小的固定常数(通常取01)。
  • 特点:负区间不再直接归零,而是保留一个微小的斜率,使得负输入的梯度可以传递,从而避免神经元永久失活。
  • 优势:保留了 ReLU 的计算高效性,同时缓解了死亡问题;超参数 α 无需学习,人工设定即可。

PReLU(Parametric ReLU,参数化 ReLU)

  • 公式:与 Leaky ReLU 相同 f(x)=max(αx,x),但 α 是可学习的参数,随网络一起通过反向传播优化。
  • 特点:每个通道或每个神经元可以拥有独立的 α,自适应调整负区间的斜率。
  • 优势:灵活性更高,理论上能获得更好的拟合效果,但增加了参数量和过拟合风险(需适当正则化)。

总结:两者核心区别在于负斜率 α 是否可学习。Leaky ReLU 简单固定,PReLU 更灵活但需额外训练。实际应用中,Leaky ReLU 更常用作默认改进方案,PReLU 则在特定任务(如人脸识别、细粒度分类)中有提升表现。

ELU:平滑地压向零均值

ELU(Exponential Linear Unit,指数线性单元)是一种试图结合 ReLU 优点并改善其缺点的激活函数。

公式:

$$f(x) = \begin{cases} x, & x > 0 \\ \alpha(e^x – 1), & x \leq 0 \end{cases}$$

其中$\alpha $是一个正常数(通常取 1)。

主要特点

  • 正区间同 ReLU:输入为正时无饱和、梯度恒为 1,计算高效。
  • 负区间软饱和:负值趋向于 −α,输出均值接近零,有助于缓解偏移效应,加快收敛。
  • 抗神经元死亡:负值仍有非零梯度(虽然很小),避免像 ReLU 那样完全失活。

局限性

  • 计算量稍增:负区间涉及指数运算,比 ReLU/Leaky ReLU 慢。
  • 非零中心但不完美:输出均值虽接近零,但仍依赖于数据分布和 α 取值。

应用场景

  • 常用于较深的网络或对收敛稳定性要求高的任务(如图像分类、生成模型)。
  • 在一些研究中被证明比 ReLU 和 Leaky ReLU 有更好的性能,但由于计算开销,实际部署中 ReLU 系列仍是首选。

变体:SELU(Scaled ELU)通过自动归一化使网络自带批归一化效果,适用于自归一化网络(SNN)。

GELU:Transformer 的标配

GELU(Gaussian Error Linear Unit,高斯误差线性单元)是一种结合了随机正则化思想的激活函数,近年来在 Transformer 等模型中非常流行。

公式

GELU 近似定义为$f(x) = x \cdot \Phi(x)$,其中$ Phi(x)$是标准正态分布的累积分布函数(CDF)。实际实现常用如下近似:

$$\text{GELU}(x) \approx 0.5x\left(1 + \tanh\left(\sqrt{\frac{2}{\pi}}(x + 0.044715x^3)\right)\right)$$

主要特点

  • 非线性与随机正则化融合:GELU 本质上是输入 x 乘以一个基于其自身大小的“门控”概率,值越大越倾向于保留原值,越小则越可能被抑制。这种机制类似于 Dropout,但它是确定性的、与输入相关的。
  • 光滑且非单调:在负半轴并非完全截断或线性,而是有轻微弯曲,允许小负值通过,带来更丰富的表达能力。
  • 梯度特性良好:处处可导,正区间梯度接近 1,负区间也有非零梯度,不易出现神经元死亡或梯度消失。

应用场景

  • BERT、GPT 等 NLP 预训练模型:GELU 已成为 Transformer 架构中前馈网络的标准激活函数,替代了 ReLU。
  • 计算机视觉:部分 ViT(Vision Transformer)和 MLP-Mixer 也采用 GELU。
  • 性能优势:在许多任务上,GELU 的精度略优于 ReLU 和 ELU,尤其适合深层网络。

局限性

  • 计算复杂度较高:涉及 tanh 或 CDF 计算,比 ReLU 慢,但现代框架已有高度优化的实现。
  • 内存占用稍大:由于需要保存中间结果用于反向传播。

总的来说,GELU 凭借其理论优雅性和实证效果,已成为深度学习中最主流的激活函数之一,尤其在注意力机制主导的模型中占据统治地位。

SwiGLU:大模型的门控选择

SwiGLU 是一种结合了 Swish 激活函数和门控线性单元(GLU)的改进结构,广泛应用于大型语言模型(如 LLaMA、PaLM)的前馈网络中。

基本形式

SwiGLU 的核心是将输入分别经过两个线性变换后,其中一个用 Swish 激活,再与另一个做逐元素乘积(门控):

$$\text{SwiGLU}(x) = \text{Swish}(xW_{\text{gate}}) \odot (xW_{\text{up}})$$

其中 Swish 函数为$f(x)=x\cdot\sigma(x)$($\sigma$为 Sigmoid),$\odot$表示逐元素乘。最终输出通常会再接一个线性投影层。

主要特点

  • 更强的表达能力:门控机制让网络能动态调节信息流,相比普通 ReLU 或 GELU 的 FFN,SwiGLU 在同等参数量下往往取得更好效果。
  • 与 Swish 协同:Swish 本身具有非单调、自门控特性,与 GLU 结合进一步提升了非线性拟合能力。
  • 计算成本略高:需要三个权重矩阵(gate、up、down),参数量约为标准 FFN 的5 倍,但可通过缩小隐藏维度来平衡。

应用场景

  • 目前是很多开源大模型(如 LLaMA 系列、Mistral、Qwen)的默认 FFN 结构。
  • 在文本生成、推理等任务中,SwiGLU 通常优于传统的 ReLU/GELU FFN。

局限性

  • 参数量和计算量增加,需权衡模型大小与性能。
  • 对硬件优化要求稍高,但现代框架(PyTorch、TensorFlow)已提供高效实现。

注意

PyTorch 没有内置 nn.SwiGLU,需要手写(下文给出实现);小模型上的收益不一定明显;改造 FFN 时注意参数量、显存对齐,别忘了 $\frac{2}{3}$ 缩放。

选型速查与实践

选型的默认答案只有一句话:隐藏层从 ReLU 起步,Transformer 用 GELU 或 SwiGLU,二分类输出层用 Sigmoid。先把默认选项跑通建立基线,再考虑微调。下面这张矩阵表供回头速查:

函数 公式(简) 输出范围 主要优点 主要缺点 典型场景 PyTorch
Sigmoid $1/(1+e^{-x})$ $(0,1)$ 输出可解释为概率 饱和致梯度消失;非零中心 二分类输出层 nn.Sigmoid()
Tanh $\tanh(x)$ $(-1,1)$ 零中心,快于 Sigmoid 仍饱和 LSTM/GRU 门与状态 nn.Tanh()
ReLU $\max(0,x)$ $[0,\infty)$ 正区间梯度恒 1;计算极快 死亡神经元;非零中心 CNN/MLP 隐藏层默认 nn.ReLU()
Leaky ReLU $\max(\alpha x, x)$ $(-\infty,\infty)$ 保留负区间梯度 $\alpha$ 需手调;增益不稳 死亡 ReLU 时的替补 nn.LeakyReLU(0.01)
PReLU $\max(\alpha x, x)$,$\alpha$ 可学习 $(-\infty,\infty)$ 自动学负斜率 小数据易过拟合 大型视觉模型 nn.PReLU()
ELU $x$ 或 $\alpha(e^x-1)$ $(-\alpha,\infty)$ 负端平滑,近零均值 exp 开销;调 $\alpha$ 噪声鲁棒场景 nn.ELU()
GELU $x\Phi(x)$ $\approx(-0.17,\infty)$ 平滑非单调,门控直觉 计算稍贵 Transformer FFN nn.GELU()
SwiGLU $\mathrm{Swish}(XW)\otimes XV$ $(-\infty,\infty)$ 门控表达力强,LLM 实证佳 无内置;需改参数布局 LLaMA/PaLM 等 LLM 自定义(见下文)

日常使用只需两分钟上手:

import torch.nn as nn

model = nn.Sequential(
    nn.Linear(784, 256),
    nn.ReLU(),          # 隐藏层:默认起步选择
    nn.Linear(256, 10)  # 输出层不加激活,交给损失函数内部处理
)

# 常用激活函数与关键参数
nn.Sigmoid()                  # 输出层(二分类)
nn.Tanh()                     # RNN 状态 / 旧模型隐藏层
nn.ReLU()                     # 隐藏层默认
nn.LeakyReLU(0.01)            # 死亡 ReLU 的廉价修补
nn.PReLU()                    # 负斜率可学习,每通道一个参数
nn.ELU(alpha=1.0)             # 负区间平滑饱和
nn.GELU()                     # Transformer 默认(精确版)
nn.GELU(approximate='tanh')   # tanh 近似版,更快

场景一:图像分类 CNN 的隐藏层选型

传统思路:照搬 1980~90 年代的教材惯例,隐藏层全部用 Sigmoid 或 Tanh。后果是网络一深就训不动——下面这个 60 行纯 Python 实验可以亲眼看到原因:10 层全连接网络、每层 16 个神经元,损失取输出之和,分别用 Sigmoid(Xavier 初始化)和 ReLU(He 初始化)前向再反向,打印每层梯度范数。

# grad_experiment.py —— 10 层网络梯度对比(纯 Python,随机种子 42,可复现)
import random, math

random.seed(42)
WIDTH, DEPTH = 16, 10

def make_layers(scale):
    return [[[random.gauss(0.0, scale) for _ in range(WIDTH)]
             for _ in range(WIDTH)] for _ in range(DEPTH)]

def forward(x, layers, f):
    a, zs = x, []
    for W in layers:
        z = [sum(W[i][j] * a[j] for j in range(WIDTH)) for i in range(WIDTH)]
        zs.append(z)
        a = [f(v) for v in z]
    return zs

def grad_norms(layers, zs, df):
    delta = [1.0] * WIDTH                  # dL/d 输出(损失=输出之和)
    norms = []
    for li in range(DEPTH - 1, -1, -1):
        delta = [delta[i] * df(zs[li][i]) for i in range(WIDTH)]
        norms.append(math.sqrt(sum(d * d for d in delta)))
        if li > 0:
            W = layers[li]
            delta = [sum(delta[i] * W[i][j] for i in range(WIDTH))
                     for j in range(WIDTH)]
    return norms[::-1]                     # 第 1 层 = 最靠近输入

x = [random.gauss(0.0, 1.0) for _ in range(WIDTH)]

sigmoid  = lambda v: 1.0 / (1.0 + math.exp(-v))
dsigmoid = lambda v: sigmoid(v) * (1.0 - sigmoid(v))
relu     = lambda v: max(0.0, v)
drelu    = lambda v: 1.0 if v > 0 else 0.0

for name, f, df, scale in [
        ("Sigmoid", sigmoid, dsigmoid, 1.0 / math.sqrt(WIDTH)),
        ("ReLU",    relu,    drelu,    math.sqrt(2.0 / WIDTH))]:
    random.seed(42)                        # 两次实验用同一组随机权重
    layers = make_layers(scale)
    ns = grad_norms(layers, forward(x, layers, f), df)
    print(f"== {name} 网络各层梯度范数 ==")
    for i, n in enumerate(ns, 1):
        print(f"  第 {i:2d} 层: {n:.3e}")
    print(f"  首层/末层梯度之比: {ns[0] / ns[-1]:.3e}\n")

实际运行输出(本文所有数字均来自这次运行):

== Sigmoid 网络各层梯度范数 ==
  第  1 层: 3.701e-07
  第  2 层: 1.923e-06
  第  3 层: 9.303e-06
  第  4 层: 5.018e-05
  第  5 层: 2.788e-04
  第  6 层: 1.031e-03
  第  7 层: 4.533e-03
  第  8 层: 1.654e-02
  第  9 层: 9.723e-02
  第 10 层: 9.501e-01
  首层/末层梯度之比: 3.896e-07

== ReLU 网络各层梯度范数 ==
  第  1 层: 6.086e+00
  第  2 层: 6.427e+00
  第  3 层: 5.404e+00
  第  4 层: 5.310e+00
  第  5 层: 5.695e+00
  第  6 层: 5.884e+00
  第  7 层: 5.514e+00
  第  8 层: 3.559e+00
  第  9 层: 2.873e+00
  第 10 层: 2.646e+00
  首层/末层梯度之比: 2.300e+00

方法论做法:Sigmoid 网络的首层梯度只有末层的约 $3.9 \times 10^{-7}$(衰减约 250 万倍),底层参数等于被冻结;而 ReLU 网络十层的梯度范数全部稳定在同一数量级(比值 2.3)。把它换算成 AlexNet 时代的工程语言就是:换成 ReLU + He 初始化 + BatchNorm,收敛快 6 倍。结论:隐藏层默认从 ReLU 起步;若观察到某层激活统计中位数恒为 0(大面积死亡),先降学习率,再考虑 Leaky ReLU。

场景二:Transformer FFN 的激活升级

传统思路:2017 年原版 Transformer 的 FFN 用的是 ReLU:$\mathrm{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2$,两个矩阵、一次逐元素激活,简单直接。

方法论做法:先升级到 GELU——BERT、GPT-2 把 FFN 里的 ReLU 换成 GELU,平滑门控让深层语言模型训练更稳;再升级到 SwiGLU——LLaMA、PaLM 把 FFN 改成三矩阵门控结构,并把隐藏维从 $4d$ 调到 $\frac{2}{3} \times 4d$ 以对齐参数量。PyTorch 没有内置 SwiGLU,实现如下:

import torch
import torch.nn as nn
import torch.nn.functional as F

class SwiGLU(nn.Module):
    """LLaMA 风格 FFN:Swish(xW1) ⊗ xW3,隐藏维取 2/3 对齐标准两层 FFN 参数量"""
    def __init__(self, d_model, d_ff, bias=False):
        super().__init__()
        d_hidden = int(d_ff * 2 / 3)                 # 三矩阵 → 2/3 补偿
        self.w1 = nn.Linear(d_model, d_hidden, bias=bias)  # 门控分支
        self.w3 = nn.Linear(d_model, d_hidden, bias=bias)  # 值分支
        self.w2 = nn.Linear(d_hidden, d_model, bias=bias)  # 投影回 d_model

    def forward(self, x):
        return self.w2(F.silu(self.w1(x)) * self.w3(x))

结论:新架构默认用 GELU,从零训练较大模型时值得试 SwiGLU,但要同步调整隐藏维与显存预算;输出层的激活与损失函数是绑定的(Sigmoid+BCE、Softmax+交叉熵),不要在输出层求新求变。

局限性与适用边界

激活函数是被讨论得最过度的话题之一,认清它解决不了什么,比记住它是什么更重要:

  • 它是”最后 5%”的优化:架构、数据量、归一化(BN/LN)与学习率调度对结果的影响远大于换激活函数,先把前者调好再动后者。
  • 论文增益未必可复现:新激活函数的对比实验高度依赖特定任务与超参,Swish 原论文自己的消融也显示领先幅度很小,换到你的任务上可能是平手甚至倒退。
  • 死亡 ReLU 多数是症状不是病根:真正的病根常是学习率过大或初始化不当,换 Leaky ReLU 只是治标,先降学习率再下结论。
  • 门控类有隐性成本:SwiGLU 多一个矩阵、需要调隐藏维,小模型或显存紧张时可能得不偿失。
  • 输出层不适用这套选型逻辑:Sigmoid/Softmax 与损失函数、任务类型强绑定,按任务配对即可,不需要”升级”。

参考文献 / 扩展阅读

  • Rumelhart, Hinton, Williams.Learning Representations by Back-propagating Errors. Nature, 1986.
  • Nair, Hinton.Rectified Linear Units Improve Restricted Boltzmann Machines. ICML, 2010.
  • Krizhevsky, Sutskever, Hinton.ImageNet Classification with Deep Convolutional Neural Networks. NeurIPS, 2012.
  • He, Zhang, Ren, Sun.Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. ICCV, 2015.(PReLU)
  • Clevert, Unterthiner, Hochreiter.Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs). ICLR, 2016.
  • Hendrycks, Gimpert.Gaussian Error Linear Units (GELUs). arXiv:1606.08415.
  • Ramachandran, Zoph, Le.Searching for Activation Functions. arXiv:1710.05941, 2017.(Swish)
  • GLU Variants Improve Transformer. arXiv:2002.05202, 2020.(SwiGLU)
  • Lu, Shin, Su, Karniadakis.Dying ReLU and Initialization: Theory and Numerical Examples. arXiv:1903.06733.
0