Skip to content

第 12 章:输入、内部和输出层怎样一起训练 ​

返回目录

现在回到你最后的问题:“输出层也得有一个训练过程吗,还是和输入层一起?”下面保留原回答的联合训练说明,并把输入、输出共享参数的含义说清。

嵌入表在原问答记作W_E,在补充查表式中记作E;二者是同一个角色。词表大小统一记N,以免与Value矩阵V重名。

12.1 整个模型实际上是一个联合训练的系统 ​

还是用:

患者服用华法林后出现____

正确答案是「黑便」。

模型不会先把输入层训练好,再把 Transformer 训练好,最后单独训练输出层。

在通常的预训练中,它们作为一个整体进行端到端训练(End-to-End Training)。

12.2 从数学上看,所有参数都属于同一个优化问题 ​

我们将模型所有参数写成:

\theta=\{W_E,W_Q,W_K,W_V,\ldots,W_{\mathrm{out}}\}

那么:

\boxed{L=L(\theta)}

训练目标是找到使损失尽可能小的参数:

\boxed{\theta^*=\arg\min_\theta L(\theta)}

反向传播时,分别得到:

\frac{\partial L}{\partial W_E},\quad
\frac{\partial L}{\partial W_Q},\quad
\frac{\partial L}{\partial W_K},\quad
\frac{\partial L}{\partial W_{\mathrm{out}}}

随后更新这些参数。

例如,使用最简单的梯度下降:

\begin{aligned}
W_Q^{\text{new}}&=W_Q-\eta\frac{\partial L}{\partial W_Q}\\
W_{\mathrm{out}}^{\text{new}}&=W_{\mathrm{out}}-\eta\frac{\partial L}{\partial W_{\mathrm{out}}}
\end{aligned}

所有参数都根据同一次前向传播产生的损失接受训练信号。

这里的argmin是在写训练希望实现的优化目标,不保证实际算法一定达到全局最小值,甚至不预先保证该最小值在所用参数空间取得。实际训练是在给定资源和算法下尝试降低平均损失。

12.3 但输出层和输入层还有一种非常巧妙的关系 ​

你可能会觉得:

输入层需要把 Token 变成向量:

\text{Token}\longrightarrow x_i

输出层则要把向量变回 Token 的概率分布:

h_i\longrightarrow P(\text{下一个 Token})

这两个过程在用途上一个读入Token、一个给Token打分,但不是互为逆函数。

因此,许多语言模型采用一种叫做 Weight Tying(权重共享) 的设计。

假设词表大小为 N,模型隐藏维度为 d。

输入 Embedding 矩阵:

W_E\in\mathbb R^{N\times d}

输出层可以使用:

\boxed{W_{\mathrm{out}}=W_E^T}

也就是说,输出层和输入 Embedding 层直接共享同一组参数。

这样做既能减少模型参数量,也能让输入和输出的 Token 表示使用同一个权重矩阵。

不过需要注意:不是所有 Transformer 语言模型都采用权重共享,有些模型会分别训练这两个矩阵。

12.4 为什么联合训练特别重要? ​

假设模型对「黑便」的预测概率只有 0.3。

出现这个问题,可能有许多原因:

  • 输入层没有形成足够有用的 Token 表示。
  • Q、K 的匹配没有很好地整合相关上下文。
  • V 没有提供足够有用的信息。
  • 后续 Transformer 层没有形成合适的隐藏表示。
  • 输出层没有将隐藏表示正确映射到「黑便」的分数。

我们事先并不知道问题主要出现在哪一层。

联合训练的优势,就是不需要人为确定应该修改哪一层。

反向传播根据损失对各参数的梯度,自动计算不同参数的局部调整方向。

当然,这不意味着每次更新都一定能提高所有样本的预测准确率。优化器是在大量训练数据上不断尝试降低总体损失。


所以最准确的理解是:

一次前向传播得到多个位置的预测,同一个汇总损失提供训练信号;反向传播计算输入层、Transformer各层和输出层的梯度,再由优化器更新。它们通常共同学习。

这也解释了为什么单独讨论 W_Q 的语义比较困难:一个参数是否有用,要看它与整个网络中其他参数组合起来,最终能否改善预测结果。

12.5 输入查表与输入层梯度,也用式子接起来 ​

下面的查表公式只是把“按编号取一行”写清楚。E_{t_i,:}里冒号表示该行的全部列;one-hot行向量u_i只在编号t_i处为1,其他项为0,所以u_iE会选出E的那一行。

Tokenizer 把文本变成离散编号。假设“患者”编号为 17,“服用”编号为 92,这两个数之差 75 不表示语义距离。编号用于索引,不直接拿来做语言意义上的加减。

输入嵌入矩阵定义为:

E\in\mathbb R^{N\times d}.

第 w 行是词表中第 w 个 Token 的可训练向量。第 i 个位置先查表得到行向量:

e_i=E_{t_i,:}\in\mathbb R^{1\times d}.

若用 one-hot 行向量 u_i\in\mathbb R^{1\times N} 表示编号,则 e_i=u_iE。查表和这个乘法数学上等价;实现无需真的构造巨大 one-hot。

若 x_i=E_{t_i,:}+p_i,则:

\bar E_{w,:}=\sum_{i:t_i=w}\bar X_{i,:}.

可训练的位置向量同样收到对应梯度;固定位置编码不更新。若 U=E^\mathsf T,还需加来自输出路径的 \bar U^\mathsf T。训练更新可以同时影响“输入如何表示”和“输出如何打分”,无需分开进行两个训练过程。

12.6 预测函数、损失函数和优化目标的区别 ​

对第i个位置,若加上输出偏置b:

\ell_i=h_iU+b,\qquad p_i=\operatorname{softmax}(\ell_i).

下标i表示这是第i位置作出的下一Token预测。p_i是一整组概率,不是单个数;要问“黑便”的概率,需要取这一组中属于“黑便”的那一项。

有时会写:

p_\theta(\text{黑便}\mid t_1,\ldots,t_5).

这里t1到t5是已有五块前文,竖线读作“在这些前文已知的条件下”。θ代表模型当前全部参数;把它写在p的下标,是提醒你换一套参数,预测概率也可能改变。整个式子表示一个数:这套模型给“黑便”分了多少概率。

公式并没有额外执行一步操作,只是把前面讲过的整个预测过程压缩记下来。

对可微标量损失 L(\theta),把所有参数展开成向量。由一阶展开:

L(\theta-\eta g)=L(\theta)-\eta\|g\|^2+o(\eta),
\qquad g=\nabla L(\theta).

若 g\ne0,充分小的正 \eta 使损失下降。有限步长不自动满足条件;批次损失下降也不保证所有样本或测试集表现改善。

反向传播是多元链式法则在计算图上的高效应用,求的是当前参数处的局部导数。梯度下降是更新规则;Adam 类方法再使用梯度的历史统计量调整更新。本文数值例子只用最简单的梯度下降。

12.7 这和反向传播有什么关系? ​

现在逻辑才真正完整。

因为损失函数可以写成:

L=L(W_Q,W_K,W_V,\ldots,W_{\text{out}})

所以我们才能对这些矩阵求偏导。

例如:

\frac{\partial L}{\partial W_Q}

它的意思是:

如果稍微改变 W_Q 中的某个元素,最终预测「黑便」的损失会如何变化?

虽然 W_Q 并不直接产生最终概率,但它会影响:

W_Q\rightarrow Q\rightarrow A\rightarrow Z
\rightarrow h_5\rightarrow\ell\rightarrow P\rightarrow L

因此可以通过链式法则,一直把梯度传递回 W_Q。

这就是反向传播。

而且,输出层的 W_{\text{out}} 也需要训练,并不是一开始就知道「哪个隐藏向量应该对应黑便」。


12.8 现在我们可以把整个训练写成一个优化问题 ​

最终,模型希望找到一组参数:

\theta^*=\arg\min_\theta L(\theta)

这里把 Transformer 和输出层的所有可训练参数统称为 \theta。

更完整地说,是希望在大量训练样本上,使平均的下一个 Token 预测损失尽可能小。

所以三个概念需要明确区分:

概念数学对象作用
TransformerF_\theta(X)将输入转化为上下文相关的隐藏表示
预测函数\operatorname{softmax}(hW_{\text{out}}+b)计算下一个 Token 的概率
损失函数-\ln P(\text{正确Token})衡量预测结果与正确答案的差异

这里最重要的理解是:Transformer 并不是直接输出文字,而是先计算一个高维向量,再通过同样需要训练的输出矩阵,把它映射到词表上的概率分布。

保留每一次追问,认真走完每一步证明。