平面上有四个点:两个对角上的点属于一类,另外两个属于另一类。一条直线分不开它们。把更多线性层接起来也没用,因为它们仍能合成一个线性变换。下面从这个 XOR 例子看起:加入非线性以后,隐藏层怎样把原来分不开的点重新表示。

先看结构:隐藏层学特征,线性头读出

先看一种常见的分类网络:隐藏层学习特征,线性分类头读出结果。二分类时再接 sigmoid,就像在学到的特征上做逻辑回归。这是理解本章的入口,不是所有神经网络都必须采用的输出结构。

这一页从最小二乘推到反向传播,每一步都给出公式和一份不依赖框架的 Python 实现。

线性回归:决策边界只能是超平面

$$\hat{y} = \mathbf{w}^\top \mathbf{x} + b = \sum_{i=1}^{n} w_i x_i + b, \qquad \mathbf{x}, \mathbf{w} \in \mathbb{R}^n$$

配平方损失 $\mathcal{L} = \frac{1}{2}\sum_k (y_k - \hat y_k)^2$,把偏置吸收进 $\mathbf{w}$(给 $\mathbf{x}$ 补一维常数 1)。当 $X$ 列满秩时,令梯度为零可以解出:

$$\nabla_{\mathbf{w}}\mathcal{L} = X^\top(X\mathbf{w} - \mathbf{y}) = 0 \;\Longrightarrow\; \hat{\mathbf{w}} = (X^\top X)^{-1} X^\top \mathbf{y}$$

如果特征线性相关,$X^\top X$ 可能不可逆,可以用伪逆求最小范数解。实际代码通常用 QR / SVD 最小二乘求解器,不显式计算逆矩阵。

拿它做分类的话,判定面是

$$\{\mathbf{x} : \mathbf{w}^\top \mathbf{x} + b = 0\}$$

一个超平面(hyperplane)。二维是直线,三维是平面。这是线性模型能画出的唯一形状。

加入交互项后还算线性吗?

这里容易绕晕,因为「线性」有两个意思。

$$\hat{y} = w_1 x_1 + w_2 x_2 + w_3 \underbrace{x_1 x_2}_{\text{交互项}} + b$$

  • 对参数线性:$\hat y$ 是 $\mathbf{w}$ 的线性函数,所以统计课仍叫它 linear regression,上面那个闭式解照用。
  • 对输入线性:不是了。令 $\hat y = 0$ 解出来的不是直线,是双曲线。

发生了什么?你其实手动构造了一个特征映射(feature map)

$$\phi(x_1, x_2) = (x_1,\; x_2,\; x_1 x_2)$$

把二维的点映射到三维,在三维里用一个超平面分割,投影回原平面就成了曲线。$x^2$ 项给你抛物线,$x_1^2 + x_2^2$ 给你圆。polynomial regression、kernel SVM 都遵循这个思路:先确定一个 $\phi$,再使用线性边界。

问题是 $\phi$ 得你自己猜。

Sigmoid 改变输出形式,不增加表达能力

先算同一个线性分数,再压成概率:

$$z = \mathbf{w}^\top \mathbf{x} + b, \qquad \sigma(z) = \frac{1}{1 + e^{-z}}$$

决策边界(decision boundary)还是超平面:$\sigma(z) = 0.5 \iff z = 0 \iff \mathbf{w}^\top\mathbf{x} + b = 0$。sigmoid 单调,动不了那个面的形状,只是把「离面多远」翻译成概率。

那 sigmoid 到底解决什么

一个优化问题。假设不加 sigmoid,直接拿分数配 MSE 拟合 0/1 标签。有个点 $\mathbf{w}^\top\mathbf{x} = 100$,标签是 1,已经分对得不能再对——但残差是 99,梯度巨大,它会拼命把决策面往自己这边拉。已经分对的点在主导训练。

换成 sigmoid + 交叉熵(cross-entropy):

$$\mathcal{L} = -\big[\, y \log \sigma(z) + (1-y)\log(1 - \sigma(z)) \,\big]$$

推一遍梯度。先记住 sigmoid 的一个漂亮性质:

$$\sigma'(z) = \sigma(z)\big(1 - \sigma(z)\big)$$

代入链式法则,令 $s = \sigma(z)$:

$$\frac{\partial \mathcal{L}}{\partial s} = -\frac{y}{s} + \frac{1-y}{1-s} = \frac{s - y}{s(1-s)}$$

$$\frac{\partial \mathcal{L}}{\partial z} = \frac{\partial \mathcal{L}}{\partial s}\cdot \sigma'(z) = \frac{s-y}{s(1-s)} \cdot s(1-s) = \boxed{\;s - y\;}$$

分母被 $\sigma'$ 完全约掉,只剩预测减真值:

$$\nabla_{\mathbf{w}} \mathcal{L} = (\sigma(z) - y)\,\mathbf{x}, \qquad \frac{\partial \mathcal{L}}{\partial b} = \sigma(z) - y$$

这就是二分类里常用 sigmoid 配交叉熵的一个原因:

  • 分对的远点 $\sigma(100) \approx 1$,$s - y \approx 0$ —— 自动闭嘴。
  • 分错的点 $\sigma(-10) \approx 0$ 而 $y=1$,$s - y \approx -1$ —— 梯度饱和不了,优化器专心处理它。

如果 sigmoid 后面改接 MSE,梯度会多出一个 $\sigma'(z)$ 因子,在饱和区趋近 0,分错的点反而很难更新。对这里的线性 logistic regression,交叉熵关于参数是凸的,但不自动保证唯一或有限的最优解:特征共线可能带来多解;完全可分的数据上,无正则的参数还可能越长越大。换成多层网络后,也不能沿用这个凸性结论。

sigmoid 及其导数

$\sigma'$ 在 $z=0$ 处最大($0.25$),两端趋近 $0$——这正是梯度消失(vanishing gradient)的来源,也是后来隐藏层多改用 ReLU 的主要原因之一。

Python:从零写一遍

只用 numpy,梯度是上面推出来的那一行。

import numpy as np

def sigmoid(values):
    values = np.asarray(values, dtype=float)
    return np.exp(-np.logaddexp(0.0, -values))

def fit_logistic(X, y, lr=0.1, steps=2000):
    """X: (N, d)   y: (N,) in {0, 1}"""
    w = np.zeros(X.shape[1])
    b = 0.0
    for _ in range(steps):
        s = sigmoid(X @ w + b)          # (N,)
        err = s - y                     # 就是 dL/dz —— 全部推导浓缩成这一行
        w -= lr * (X.T @ err) / len(y)
        b -= lr * err.mean()
    return w, b

四个常见函数:看起来都在“变数值”,角色完全不同

$$ \boxed{ \begin{aligned} \text{Sigmoid}&:\text{独立的软开关或二分类概率}\\ \text{Softmax}&:\text{在多个选项之间分配总量为 1 的概率}\\ \text{ReLU}&:\text{给隐藏层引入分段线性非线性}\\ \text{Tanh}&:\text{产生带正负方向的有界状态} \end{aligned}} $$

函数 怎样处理输入 输出范围 输出和为 1? 导数 / Jacobian 典型角色
Sigmoid 逐元素 $(0,1)$ 否 $\sigma(x)(1-\sigma(x))$ 二分类、多标签、gate
Softmax 一个向量联合归一化 每项 $(0,1)$ 是 $p_i(\delta_{ij}-p_j)$ 多分类、attention、词表(vocabulary)分布
ReLU 逐元素 $[0,\infty)$ 否 $\mathbf 1[x>0]$($x=0$ 取约定的 subgradient) 隐藏层非线性
Tanh 逐元素 $(-1,1)$ 否 $1-\tanh^2(x)$ RNN state、LSTM candidate

最重要的分类不是“输出长什么样”,而是元素是否竞争。Sigmoid、ReLU、Tanh 对每个元素独立计算;Softmax 的每个输出都依赖整条输入向量,增大一个 logit 会改变其他类别的相对概率。

Sigmoid:什么时候把一个 logit 解释成概率或开关?

$$ \sigma(x)=\frac{1}{1+e^{-x}},\qquad \sigma'(x)=\sigma(x)(1-\sigma(x)). $$

$x=0$ 输出 $0.5$;很大的负数趋近 0,很大的正数趋近 1。一个 binary classifier 可以把 $\sigma(z)$ 解释为正类概率;multi-label classifier 则对每个标签独立做 sigmoid,因此“人、汽车、道路”可以同时为真。LSTM 的 forget / input / output gate 也使用它,把每个通道控制在 0 到 1。

代价是饱和:导数最大只有 $0.25$,$|x|$ 很大时趋近 0。因此它适合输出与门控(gating)语义,而不是现代深层网络的一般隐藏层。

Tanh:为什么 RNN 状态需要正负都有的有界值?

$$ \tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}},\qquad \tanh'(x)=1-\tanh^2(x),\qquad \tanh(x)=2\sigma(2x)-1. $$

Tanh 以 0 为中心,把值压进 $(-1,1)$。普通 RNN 用

$$h_t=\tanh(W_xx_t+W_hh_{t-1}+b),$$

LSTM 用它生成带正负方向的 candidate memory。Sigmoid gate 回答“通过多少”,tanh candidate 回答“写入什么带符号的内容”。它同样会在大绝对值区域饱和,所以不能解决长距离梯度消失;LSTM 真正关键的是 cell-state 的加法通路。

ReLU:为什么一个简单的 max 能让深层网络不再等价于线性层?

$$ \operatorname{ReLU}(x)=\max(0,x),\qquad \operatorname{ReLU}'(x)=\begin{cases}0,&x<0\\1,&x>0.\end{cases} $$

没有 activation 时,$W_2(W_1x)=(W_2W_1)x$,多层仍是一层线性映射。ReLU 在不同输入区域打开不同的线性路径,使网络成为 piecewise-linear function。正区间的导数为 1,避免了 sigmoid / tanh 的正侧饱和,计算也很便宜。

若一个单元长期落在负区间,输出和梯度都为 0,可能出现 dying ReLU。Leaky ReLU 保留负侧小斜率;现代 Transformer FFN 则更常见 GELU、SiLU 与 SwiGLU。

Softmax:为什么它不是逐元素 activation?

$$ p_i=\operatorname{softmax}(z)_i=\frac{e^{z_i}}{\sum_j e^{z_j}}, \qquad \sum_i p_i=1. $$

Softmax 把整组 logits 变成一个 categorical distribution。$[2,1,0]$ 大约变成 $[0.665,0.245,0.090]$。它用于 mutually exclusive 多分类、attention 每一行的权重,以及语言模型(language model, LM)的 next-token distribution。

它对整体平移不变,因此稳定实现先减最大值:

$$ \operatorname{softmax}(z)=\operatorname{softmax}(z-\max_j z_j). $$

这一步避免 $e^{z_i}$ 上溢但不改变结果。Softmax 本身不是“选最大值”;它保留多个非零权重,只是在 logit 差距很大时趋近 one-hot 并出现饱和。

Sigmoid 与 Softmax:独立标签还是互斥选择

问题 输出层 原因
“图片里有哪些物体?” 每类独立 Sigmoid + BCE 人、车、道路可以同时出现,概率不必和为 1
“图片的唯一主类别是什么?” Softmax + categorical CE 类别相互竞争,概率总和为 1
“是否为正类?” 单 logit Sigmoid,或两个 logits 的 Softmax 二分类时,两类 Softmax 等价于对 logit difference 做 Sigmoid

把四者放回模型

LSTM gates                 → Sigmoid:每个通道通过多少
LSTM candidate / RNN state → Tanh:写入带正负方向的值
Transformer attention      → row-wise Softmax:在 key 之间分配注意力
LM head                    → vocabulary Softmax:下一个 token 的分布
Vanilla Transformer FFN    → ReLU;现代模型多用 GELU / SiLU / SwiGLU

一句话记忆:Sigmoid 像独立阀门,Softmax 像在候选(candidate)项之间分票,ReLU 像截断负半轴,Tanh 像把带方向的状态压进 $(-1,1)$。

神经网络真正多做的事:把 $\phi$ 学出来

$$\mathbf{h} = \phi(W_1 \mathbf{x} + \mathbf{b}_1), \qquad \hat{y} = \sigma(\mathbf{w}_2^\top \mathbf{h} + b_2)$$

其中 $W_1 \in \mathbb{R}^{m \times n}$,$\mathbf{h} \in \mathbb{R}^m$,$\phi$ 是逐元素的激活函数(activation function)。第二行就是逻辑回归,只不过输入从 $\mathbf{x}$ 换成了 $\mathbf{h}$。

$\phi$ 不能省。 去掉它:

$$W_2(W_1\mathbf{x}) = (W_2 W_1)\mathbf{x} = W'\mathbf{x}$$

线性映射的复合还是线性映射。堆多少层都一样,整个网络塌回逻辑回归。

反向传播就是链式法则

沿用上面的结论 $\delta_2 \equiv \partial\mathcal{L}/\partial z_2 = \hat y - y$,往回推一层:

$$\frac{\partial \mathcal{L}}{\partial \mathbf{w}_2} = \delta_2\, \mathbf{h}, \qquad \frac{\partial \mathcal{L}}{\partial b_2} = \delta_2$$

$$\boldsymbol{\delta}_1 = \underbrace{(\delta_2\, \mathbf{w}_2)}_{\text{误差传回来}} \odot \underbrace{\phi'(\mathbf{z}_1)}_{\text{过激活的门}}, \qquad \frac{\partial \mathcal{L}}{\partial W_1} = \boldsymbol{\delta}_1 \mathbf{x}^\top$$

$\odot$ 是逐元素乘。对 ReLU,$\phi'(z) = \mathbb{1}[z > 0]$——梯度要么原样通过,要么被完全掐断。这就是全部。

def init(n_in, n_hidden, seed=0):
    rng = np.random.default_rng(seed)
    return {"W1": rng.normal(0, np.sqrt(2 / n_in), (n_hidden, n_in)),  # He 初始化
            "b1": np.zeros(n_hidden),
            "w2": rng.normal(0, np.sqrt(2 / n_hidden), n_hidden),
            "b2": 0.0}

def step(p, X, y, lr=0.05):
    N = len(y)
    z1 = X @ p["W1"].T + p["b1"]        # (N, m)   前向
    h = np.maximum(z1, 0)              # ReLU
    z2 = h @ p["w2"] + p["b2"]         # (N,)
    yhat = sigmoid(z2)

    d2 = (yhat - y) / N                            # (N,)     反向:还是那一行
    gw2, gb2 = h.T @ d2, d2.sum()
    d1 = np.outer(d2, p["w2"]) * (z1 > 0)          # (N, m)   过 ReLU 的门
    gW1, gb1 = d1.T @ X, d1.sum(0)

    for k, g in (("W1", gW1), ("b1", gb1), ("w2", gw2), ("b2", gb2)):
        p[k] = p[k] - lr * g
    loss = -np.mean(y * np.log(yhat + 1e-9) + (1 - y) * np.log(1 - yhat + 1e-9))
    return loss, ((z2 > 0) == y).mean()

完整可运行版本在 code/why_nonlinear.py(PyTorch)和 code/make_figures.py(生成本页所有图)。

用 XOR 验证表达能力

四团高斯点,对角同类。没有任何直线能分开——这就是 1969 年 Minsky & Papert 用来说明感知机做不到什么的例子。

三个模型,同样的数据和训练配置:

模型 参数量 准确率
A Linear(2,1) 3 50.0%
B Linear(2,8) → Linear(8,1),无激活 33 50.0%
C Linear(2,8) → ReLU → Linear(8,1) 33 100%

三种决策边界

B 和 C 是同一个架构、同样 33 个参数,只差一个 ReLU。 B 的两个权重矩阵乘起来是 $(1,8)\times(8,2) = (1,2)$,一行而已,和 A 的形式完全相同——所以它和 3 参数的逻辑回归一样弱。

50% 不是没训好。对称 XOR 上,交叉熵的最优解就是权重全为 0:每个点都预测 0.5,损失停在 $\ln 2 \approx 0.693$,按 0.5 切分的准确率也就是 50%。就算换个目标直接追求准确率,一条直线最好的分法也只是把其中一团单独切出来,做到 75%,仍有一整团分错。

隐藏层在几何上做了什么

把输入空间的方格网推过隐藏层,看它被揉成什么样:

输入空间到隐藏空间的形变

(画图用的是 2 个隐藏单元的版本,因为二维才画得出来。)ReLU 沿一条折痕把平面对折,两类点落到了同一条直线的两侧——输出层依然只是逻辑回归,只是长在了这个新坐标系上。

图解 自己训一遍:把激活函数关掉试试
0步 —loss —准确率

一张表:从线性模型到 Transformer

特征映射 $\phi$ 最后一步 边界形状
线性回归 无 $\mathbf{w}^\top\mathbf{x}$ 超平面
逻辑回归 无 $\sigma(\mathbf{w}^\top\mathbf{x})$ 超平面
polynomial / kernel 你自己选 线性分类器 输入空间里的曲面
MLP 学出来 线性分类器 同上,但 $\phi$ 是学的
CNN 学出来,卷积共享权重,满足平移等变 线性分类器 同上
Transformer 学出来,$N$ 层注意力 + FFN 线性分类器 同上

Transformer 的最后一层也是线性分类器

$$\mathbf{h} = \text{TransformerBlocks}\big(\text{Embed}(\mathbf{x})\big), \qquad \text{logits} = W_{\text{head}}\, \mathbf{h}$$

$$p(\text{token}_i) = \text{softmax}(\text{logits})_i = \frac{e^{z_i}}{\sum_j e^{z_j}}$$

softmax 是 sigmoid 在多类上的推广(两类时二者等价)。而且那个漂亮的性质原样保留:配交叉熵时

$$\frac{\partial \mathcal{L}}{\partial z_i} = p_i - y_i$$

还是预测减真值。lm_head 就是那个线性分类器,类别数换成 vocab_size。可以这样理解底下几十层的作用:把表示空间一步步弯折,直到「下一个 token 是什么」能被一个线性头读出来。

最终都是 function approximator 吗?

广义上是。监督学习模型都在一个参数化的函数族里,寻找一个函数 $f_\theta$,去逼近未知的真实映射 $f^*$,或真实的条件分布 $p^*$:

$$ \theta^*=\arg\min_\theta \frac{1}{N}\sum_{i=1}^{N}\ell\big(f_\theta(x_i),y_i\big). $$

这里最容易混淆的是:“整个模型是 approximator”不等于“整个模型是 linear approximator”。

名称 形式 到底哪里是 linear
线性逼近器(linear approximator) $\hat f(x)=\mathbf{w}^\top\mathbf{x}+b$ 对输入和参数都线性
固定 basis 的线性逼近器 $\hat f(x)=\sum_j w_j\phi_j(x)$ 对 $w_j$ 线性;对原始输入可以非线性
神经网络逼近器(neural function approximator) $f_\theta(x)=W_L\phi(\cdots\phi(W_1x))$ 最后一层常是 linear readout,但整个映射通常非线性
语言模型 $p_\theta(x_t\mid x_{<t})$ 逼近的是 next-token conditional distribution,不是一个固定答案函数

所以 polynomial regression 很有代表性:加入 $x^2$ 后,它对 $x$ 已经不是线性的,但仍然对参数线性(linear in parameters)。神经网络再向前一步,连 basis / feature map $\phi$ 也一起从数据中学习。

Universal approximation theorem 到底保证了什么?

对合适的非线性激活和足够宽的网络,在紧致集合(compact set)$K$ 上,对任意连续目标函数(objective function) $f^*$ 和任意 $\varepsilon>0$,都存在一组参数使

$$ \sup_{x\in K}\left|f_\theta(x)-f^*(x)\right|<\varepsilon. $$

它说明网络的函数族有足够强的表达能力(expressivity),但没有保证:

  • gradient descent 一定能找到这组参数;
  • 有限训练数据足以确定正确函数;
  • 所需网络足够小、训练足够便宜;
  • 训练分布外(out-of-distribution)仍能正确外推;
  • 训练 loss 很低就一定有好的 generalization。

因此 “universal approximator” 是一个存在性结论(existence result),不是“这个模型一定学得好”的质量认证。

对 Transformer 也一样:最后的 lm_head 是线性的,但

$$ x_{<t}\longmapsto \mathbf{h}_t\longmapsto \operatorname{softmax}(W_{\text{head}}\mathbf{h}_t) $$

这条完整映射包含 attention、Softmax、MLP activation 和多层组合,所以整体是一个高度非线性的 conditional-distribution approximator。真正决定它是否有用的,不只是“能不能逼近”,还包括 inductive bias、data、objective、optimization 与 evaluation。

能表示,不等于能学到,更不等于能泛化

用折线逼近 $f(x)=x^2$。区间 $[a,b]$ 上的端点连线是 $s(x)=(a+b)x-ab$,所以

$$s(x)-x^2=(x-a)(b-x)\leq (b-a)^2/4.$$

在 $[0,1]$ 上均匀分成 $M$ 段,最大误差是 $1/(4M^2)$:4 段为 0.015625,10 段为 0.0025。折线也可以写成初始直线加上各拐点的斜率变化:

$$s(x)=b_0+a_0x+\sum_j c_j\operatorname{ReLU}(x-t_j).$$

$t_j$ 是拐点,$c_j$ 是斜率增量。这就给出了一个 ReLU 表示,但还没证明训练会找到它。

def square_interpolant(value, segments):
    if type(segments) is not int or segments < 1 or not 0 <= value <= 1:
        raise ValueError("Expected x in [0, 1] and a positive segment count")
    index = min(int(value * segments), segments - 1)
    left, right = index / segments, (index + 1) / segments
    return (left + right) * value - left * right

for segments in (4, 10):
    errors = [
        square_interpolant((index + 0.5) / segments, segments)
        - ((index + 0.5) / segments) ** 2
        for index in range(segments)
    ]
    assert abs(max(errors) - 1 / (4 * segments ** 2)) < 1e-12

再看数据够不够:如果只观察 $x=0,1$,$x^2$ 与 $x^2+10x(1-x)$ 在训练点上完全相同,中间却差很多。零训练误差无法判断哪个正确。需要更多数据、合理的先验或约束,而不是只扩大网络。

前面的经验损失最小化是在样本上选参数,不等于已经找到了真实规律。带噪声时,平方损失的总体最优预测在适当条件下是 $\mathbb E[Y\mid X=x]$,也不是逐次猜对所有随机波动。

什么时候先试更简单的方法?

场景 值得比较的 baseline 主要检查
特征少、关系近似线性、数据有限 带正则的线性 / logistic regression 缩放、校准(calibration)、解释性
结构化表格,有非线性和交互 树与 boosting 类别、缺失值、跨时间迁移
有合适的相似性、样本量可控 Kernel 方法 正则、kernel 和计算成本
文本、图像、需要迁移表示 神经网络 / 预训练(pre-training)表示 数据量、迁移收益、算力

这不是按数据类型选模型的死规则。公平比较要用相同切分、可比的调参预算,以及只在训练集拟合的预处理。时间序列随机打散不能证明未来泛化;同一个人的多条记录可能需要分组切分。结论应是“在这些数据和约束下更合适”,不是“函数族更强就一定赢”。

自检

不看上面的表,试着回答:
  1. 为什么很多层 linear layer 中间没有 activation,最后仍然只是一层 linear?
  2. sigmoid + cross-entropy 真正改善的是表达能力,还是优化行为?
  3. “隐藏层学习一个新坐标系”这句话,怎样用 XOR 的图来证明?
  4. 为什么 multi-label 用 Sigmoid,而 mutually exclusive multi-class 用 Softmax?
  5. 为什么 LSTM 的 gate 用 Sigmoid,而 candidate memory 用 Tanh?
  6. 为什么 lm_head 是 linear readout,但整个 Transformer 不是 linear approximator?
  7. Universal approximation theorem 保证了什么,又没有保证什么?

继续阅读

快速学习:从 linear readout 到 learned feature map

一句话主线与标准回答

快速记忆:线性模型在给定特征空间里画超平面;神经网络用 nonlinear layers 学习新的坐标 $\phi_\theta(x)$,再由 linear head 读出结果。

面试回答

多层 linear layers 没有 activation 时仍可合并成一个矩阵。加入 ReLU 等非线性后,网络可以学习 piecewise nonlinear feature map,使原空间中的复杂边界在 hidden space 里变得 linearly separable。最后一层线性不代表整个模型线性。

被追问 universal approximation 时,回到上面那一节:它是存在性结论,不保证找得到、学得好。

参考论文

本页术语 13
超平面 hyperplane
n 维空间里的 n−1 维平面;二维是直线,三维是平面
特征映射 feature map
把原始输入换到另一个坐标系的函数 φ
决策边界 decision boundary
模型对输入作出不同分类的分界线或分界面
交叉熵 cross-entropy
分类任务的标准损失,−log 正确类的概率
梯度消失 vanishing gradient
激活饱和导致梯度趋近 0,深层学不动
词表 vocabulary
模型能输出的所有 token 的集合
门控 gating
用可学习权重控制信息写入、保留或输出
语言模型 language model, LM
对文本序列建模,用上下文预测或生成后续内容
候选 candidate
召回阶段捞出来、等待精排挑选的内容
激活函数 activation function
逐元素的非线性函数,网络深度靠它才有意义
目标函数 objective function
训练直接优化的数学量;它不一定等于最终产品目标
校准 calibration
模型给出的置信度是否等于真实正确率
预训练 pre-training
先用大量数据学习通用表示和能力,再适配具体任务