函数的表达能力,决定了计算机能在多大程度上逼近对自然语言的理解。

本文尝试用直觉性的方式,从"计算机如何理解语言"这个根本问题出发,逐步推导出大语言模型背后的核心数学原理。

假设词典中有若干单词,单词之间存在各种语义关系——近义、反义、上下位等。如何让计算机捕捉这些关系?

如何让计算机理解单词?

可以借助一种数学工具——向量

两个向量的夹角余弦可以衡量它们的相似度:

$$\cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|}$$

$\cos(\theta)$ 越接近 1,两个向量越相似;越接近 -1,越相反。

因此,可以用向量来表示单词,向量之间的余弦相似度就反映了两个词之间的语义关系。这种表示方式称为 Token Embedding:每个单词对应一个 d 维向量 $\mathbf{x} = (x_1, x_2, \dots, x_d)$。

如何让计算机理解句子?

同一个词在不同句子中含义不同。Token Embedding 只能表示孤立单词的语义,还需要一种方式来编码单词在上下文中的含义。

为此引入位置向量(Positional Embedding):假设句子由 m 个单词组成,为每个位置分配一个 d 维向量 $\mathbf{p}_j$。将两者相加得到最终表示:

$$\mathbf{x}_j = \text{token\_embedding}_j + \text{pos\_embedding}_j$$

直觉上理解:向量加法会让结果同时保留两个加数的特征。就像把"红色"和"大"两个标签贴在同一个物体上,加法后的向量 $\mathbf{x}_j$ 就同时携带了"这个词是什么"和"它在第几个位置"两层信息。

这样,一个由 m 个单词组成的句子就可以用 m 个向量 $(\mathbf{x}_1, \mathbf{x}_2, \dots, \mathbf{x}_m)$ 来表示,计算机便能通过向量运算"理解"句子的含义。

如何训练模型生成文本?

GPT 类 LLM 的核心目标是预测下一个词——给定前面的所有词,预测最可能的下一个词:

$$P(x_{t+1} \mid x_1, x_2, \dots, x_t)$$

例如输入"今天天气真",模型应输出"好"的概率最高。生成长文本时,只需不断把预测出的词拼接到输入末尾,重复这个过程即可。

完整的流程是:

  1. 将输入文本通过 Embedding 转换为向量序列
  2. 向量序列经过模型的函数映射,得到输出向量
  3. 输出向量与词表中所有词的向量计算相似度,通过 softmax 得到每个词的概率分布
  4. 从概率分布中选出下一个词

其中 Embedding 映射表(词 → 向量)也是函数的一部分,无法手工指定,需要和整个模型一起学习。

如何学习? 用一个简单的例子来说明:

假设 $f(x) = ax + b$,模型预测值为 $y$,真实目标值为 $y'$。可以计算二者的误差,然后通过导数(梯度)来判断参数 $a$ 应该增大还是减小,从而使 $y$ 逐步逼近 $y'$。

对于 LLM 这样的复杂函数,原理完全一致——通过梯度下降不断调整所有参数(包括 Embedding 映射表),使模型预测的下一个词的概率分布逼近真实分布。

模型的核心结构

$f(x) = ax + b$ 是线性关系,但自然语言显然不是简单的线性映射。实践证明,关键不在于使用多复杂的数学函数,而在于如何巧妙地组合简单函数——Transformer 正是这一思想的产物。

自注意力机制(Self-Attention)

单词的含义受上下文影响,因此每个词的新表示应该是它与所有上下文词交互的结果:

$$x_i^{\text{new}} = f(x_i, x_1, x_2, \dots, x_m)$$

Transformer 论文中使用 Q、K、V 三组向量来实现这种交互。它们由同一个输入向量 $\mathbf{x}$ 分别乘以三个可学习的权重矩阵 $W^Q, W^K, W^V$ 得到——同一份输入,通过不同的线性变换,分别扮演三种不同的角色:

  • Q(Query,查询向量): $Q = \mathbf{x} W^Q$,“我需要寻找什么样的上下文信息?”
  • K(Key,键向量): $K = \mathbf{x} W^K$,“我具备什么特征可以被匹配?”
  • V(Value,值向量): $V = \mathbf{x} W^V$,“匹配成功后,我能传递什么语义内容?”
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + M\right)V$$

其中 $\sqrt{d_k}$ 是缩放因子,防止点积值过大导致 softmax 梯度消失;$M$ 是掩码矩阵,在生成任务中用于遮挡未来位置的词,确保模型只能看到当前词及之前的上下文。

多头注意力机制(Multi-Head Attention)

单词在句子中的依存关系是多维的:语法结构、感情色彩、时间状态等。如果在一个高维空间里统一计算注意力,各种特征会被相互稀释,模型难以捕捉关键信息。

解决方案是将高维向量切分成 h 个低维子空间,让每个"头"独立关注不同类型的特征:

$$(\mathbf{x}_{i_1}, \mathbf{x}_{i_2}, \dots, \mathbf{x}_{i_h}) = \text{split}(\mathbf{x}_i)$$$$\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \text{head}_2, \dots, \text{head}_h) \cdot W^O$$

训练中可能遇到的问题

实际模型由大量 $f(x) = ax + b$(线性变换)与 $g(x) = \max(0, x)$(激活函数,引入非线性)交替堆叠组成。在这条长计算链中,容易出现以下问题:

数值爆炸 → 归一化(Normalization)

经过多层计算后,数值可能急剧增长(例如从 1 膨胀到 $2^{32}$)。归一化操作会按比例缩放中间结果,将其约束在合理范围内,保证训练稳定。

过拟合 → Dropout(正则化)

如果模型过度适应训练数据中的细节和噪声,在新数据上表现就会变差(过拟合)。Dropout 在训练时随机将一部分神经元的激活值置零,迫使模型不依赖任何单一特征路径,从而学习更均衡、更鲁棒的表示。

回顾

回过头看,LLM 的本质可以归结为一条线索:

用向量表示语言 → 用注意力机制捕捉上下文关系 → 用梯度下降学习所有参数 → 逐词预测生成文本。

每一步都建立在基础的数学运算之上——向量加法、矩阵乘法、softmax、求导。这些简单操作经过精巧组合和大规模堆叠,就涌现出了对自然语言的强大处理能力。

参考资料