简介:本文从“预测下一个词”这一朴素任务出发,系统拆解大语言模型的核心原理:文本如何转为数字、注意力机制如何捕捉上下文、 Transformer 架构如何堆叠出深层语义,以及规模扩大后翻译、推理、对话等能力为何会“涌现”。读完你将建立一条从分词、嵌入、注意力到生成采样的完整知识链路。
如果有人告诉你,大语言模型(LLM)的全部工作就是“根据前面的文字,猜下一个字是什么”,你可能会觉得这过于简单,甚至怀疑它凭什么能写代码、做翻译、答问题。但事实恰恰如此:LLM 的核心训练目标就是自回归语言建模——给定前文,预测下一个 token 的概率分布。
用一句话概括:
给我前面的字,我猜下一个字。
这个任务看似朴素,但当它在全网规模的文本上被做到极致时,翻译、总结、写代码、推理、对话等能力便“冒”了出来。这种现象被称为涌现(Emergence):当模型参数量、数据量和计算量跨过某个阈值后,综合能力会出现非线性的跃升。换句话说,规模本身堆出了某种通用性。
下面,我们沿着“文字→数字→向量→注意力→生成”的链路,把原理讲清楚。
机器不认识汉字和英语,它只认数字。所以第一步是分词(Tokenization):
例如概念示意:
“我 喜欢 猫” → [314, 52, 998]
注意,这里的编号本身没有语义,只是一个索引。真正的语义信息在下一步——嵌入(Embedding)。
你可以把 embedding 理解成:每个词在模型脑子里都有一组坐标。语义接近的词,坐标也更接近。比如“猫”和“狗”在高维空间中的距离,通常比“猫”和“民主”更近。嵌入层本质上是一个可学习的查找表:输入 token 编号,输出一个稠密向量。
# 概念示意:嵌入查找embedding_table = nn.Embedding(vocab_size, d_model)token_ids = torch.tensor([314, 52, 998])vectors = embedding_table(token_ids) # shape: [3, d_model]
到这里,文本已经变成了模型可以计算的数值矩阵。
接下来是关键问题:模型怎么决定一句话里哪些词更重要?
注意力机制做的事很朴素:
用大白话说:你读到 A 时,会回头找 A 指谁。 注意力就是把这种“回头看”写成了矩阵运算。
更具体地说,当前 token 是查询(Query),前面的每个 token 提供两个东西:
然后 Query 去匹配每个 Key,算相似度。相似度越高,就把对应的 Value 拿更多出来。
注意力机制的经典公式:
[
\text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
]
拆解一下:
最终得到的东西可以理解为:这个词在当前语境下应该带着哪些历史信息。
单个注意力头只能捕捉一种相关性模式。Transformer 使用多头注意力(Multi-Head Attention),让模型同时从多个子空间观察上下文。比如一个头关注语法主谓关系,另一个头关注指代关系,还有一个头关注位置邻近性。多个头的输出拼接后再做线性变换,得到更丰富的表示。
# 概念示意:多头注意力attn_output = MultiHeadAttention(d_model, num_heads)(query, key, value)
注意力本身对位置不敏感——打乱输入顺序,结果可能一样。但语言是有顺序的。因此需要位置编码(Positional Encoding),把位置信息注入到 token 表示中。常见做法包括正弦余弦编码和可学习的位置嵌入。
一个 Transformer 层通常包含:
残差连接让梯度可以绕过深层网络直接回传,使得堆叠几十层甚至上百层成为可能。层归一化则稳定训练过程。
class TransformerBlock(nn.Module):def __init__(self, d_model, num_heads):super().__init__()self.attn = MultiHeadAttention(d_model, num_heads)self.ffn = FeedForward(d_model)self.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)def forward(self, x):x = x + self.attn(self.norm1(x))x = x + self.ffn(self.norm2(x))return x
堆叠 N 个这样的块,就得到了 Transformer 的主体。输入 token 序列经过嵌入和位置编码后,逐层向上传递,每一层都在前一层的基础上提炼更抽象的语义。
模型最后一层输出每个位置上的隐藏状态,经过一个线性层映射到词表大小,再经 softmax 得到下一个 token 的概率分布。
生成时,模型根据概率分布采样:
logits = model(input_ids)probs = softmax(logits[:, -1, :] / temperature)next_token = torch.multinomial(probs, num_samples=1)
然后把这个 token 拼接到输入后面,重复上述过程,就完成了自回归生成。
训练时,模型在大量文本上做下一 token 预测,损失函数是交叉熵:
[
\mathcal{L} = -\sum{t} \log P(x_t \mid x{<t})
]
梯度下降调整所有参数,使得模型对真实下一个 token 的预测概率越来越高。
这个目标看似简单,但要真正做好,模型必须隐式地学会:
因为只有理解了这些,才能更准确地预测下一个词。这就是为什么“猜下一个词”能催生出通用能力。
当模型规模(参数量、数据量、计算量)较小时,能力提升是线性的。但当跨过某个阈值后,某些能力会突然出现,比如:
这被称为涌现能力。目前学术界对涌现的机制仍在研究中,但一个直观解释是:大规模模型学到了更通用的表示,使得原本需要专门训练的任务,可以通过提示(Prompt)直接完成。
回顾全文,LLM 的原理可以浓缩为一条链路:
所以,LLM 并不是真的“懂”你在说什么。它只是把语言这件事,变成了一个最朴素的任务:给我前面的字,我猜下一个字。但把这个任务在全网文本上做到极致,就足以让机器表现出令人惊讶的智能。