前两篇文章分别介绍了大模型的发展脉络和基础数学知识。到了第三篇,我们还需要补上一块很关键的地基:基本的算法原理。不过,这里的“算法原理”并不是一堂严肃的算法课。本文会尽量站在非算法同学的视角,用更通俗、直观的方式,把语言模型背后那些看起来复杂、晦涩的概念拆开讲清楚。

我们不追求推导公式,也不会一上来就深入 Transformer 的细节。本文更希望回答一个核心问题:

  • 机器到底是如何一步步学会处理语言的?

理解这个问题之后,再去看 LLM、Transformer、Attention、预训练、微调这些概念,就不会只是记住一堆名词,而是能知道它们分别解决了什么问题,为什么会一步步演进到今天的大语言模型。

读完这篇文章,希望你能清晰回答下面几个问题:

  1. 为什么要把文本变成 token 和向量?
  2. 为什么模型可以从数据中学习?
  3. 为什么神经网络比手写规则更强?
  4. 为什么传统序列模型不够用?
  5. 为什么 Transformer 会成为大模型的核心架构?

前言

简单来说,这篇文章是为后面深入理解 Transformer 和 LLM 工作原理做准备。我们会从 NLP、词向量、感知机、神经网络讲起,再一路过渡到 CNN、RNN、双向 RNN 等经典模型。核心概念如下表所示:

概念 它解决什么问题 它的不足 和 LLM 的关系
NLP 让机器处理自然语言 语言有歧义和上下文 定义了 LLM 要处理的问题
Token 把文本拆成基本单位 切分方式会影响理解 LLM 的输入和输出单位
词向量 把 token 变成可计算的语义向量 早期词向量难表达上下文变化 LLM 计算语言的基础表示
感知机 让机器学会简单分类 只能处理线性问题 神经网络的原始雏形
神经网络 自动学习复杂特征 需要大量数据和训练 LLM 的基本学习框架
CNN 捕捉局部词组特征 不擅长长距离依赖 早期文本分类常用模型
RNN / 双向 RNN 按顺序读取文本上下文 训练慢,长文本容易遗忘 Transformer 出现前的重要序列模型
Attention 动态关注相关信息 本篇只做引出 Transformer 的核心入口

文章核心内容思路

NLP:让机器处理语言

NLP,全称 Natural Language Processing,也就是自然语言处理,研究的是如何让机器处理、理解和生成自然语言。它并不是大语言模型出现后才有的概念,早期 NLP 主要依赖人工编写规则和词典,后来逐渐发展到基于统计的方法,再到机器学习和深度学习方法。

对非算法同学来说,可以先不用把 NLP 想得太玄。它本质上是在做一件事:把自然语言问题,转换成机器学习任务。比如:

人类要解决的问题 对应的机器学习任务
这条评论是好评还是差评 文本分类
这句话里的公司名是什么 序列标注
两个问题是不是同一个意思 文本匹配
把中文翻译成英文 序列生成
根据文档回答问题 阅读理解或生成
根据上文继续写 语言建模

语言为什么难?

自然语言难处理,主要不是因为字多,而是因为它不够“规整”。

1
2
苹果很好吃。
苹果发布了新产品。

同样是苹果,第一个是水果,第二个是公司。机器如果只看字面,很难判断。再比如:

1
这个模型不太稳定。

在不同场景里,模型可能是机器学习模型、业务模型、3D 模型,也可能只是一个抽象方案。也就是说,语言的含义往往不是由单个词决定的,而是由上下文、语序、场景和表达意图共同决定的。

可以把自然语言的难点简单总结成下面几类:

难点 NLP 术语 例子 机器为什么难
一词多义 词义消歧 苹果、模型、银行 同一个词在不同上下文里含义不同
指代关系 指代消解 它、这个、那个 必须结合前后文判断指的是谁
语序变化 句法分析 狗咬人,人咬狗 词一样但顺序不同,意思完全不同
同义表达 语义匹配 页面很卡、打开很慢 表达不同,但语义可能相同
隐含意图 意图识别 页面有点慢 可能不是描述现象,而是在提出优化诉求

所以,NLP 的第一步并不是让机器“真正理解语言”,而是先把这些灵活、模糊、上下文相关的自然语言,转换成机器可以表示、计算和学习的形式。

从文本到 token

模型不能直接处理一整段原始文本。对模型来说,文本需要先被拆成一个个更小的基本单位,这个单位就叫 token。比如下面这句话:

1
我喜欢机器学习

经过 tokenizer 处理后,可能会被拆成:

1
[我] [喜欢] [机器] [学习]

也可能被拆成:

1
[我] [喜欢] [机器学习]

不同模型使用的 tokenizer 不完全一样,所以切分结果也可能不同。但它们的目标是一致的:把连续的自然语言文本,转换成模型可以接收的 token 序列。

接下来,每个 token 通常会被映射成一个对应的编号,也就是 token id。比如可以简单理解为:

  • [我] -> 101
  • [喜欢] -> 245
  • [机器学习] -> 1024

这样,文本就从“文字”变成了“数字序列”。tokenizer 整体流程如下所示:

tokenizer 流程

不过,到这一步还不够。token id 只是编号,本身并不包含语义信息。模型知道 101、245、1024 是不同的编号,但并不知道“机器学习”和“深度学习”更接近,也不知道“猫”和“狗”比“猫”和“桌子”更相似。

所以,下一步还需要 embedding,把这些 token 编号转换成真正可以表达语义关系的向量。

Embedding:让 token 有意义

Embedding 可以简单理解为:给每个 token 分配一个向量,让模型能够用数学方式计算词与词之间的关系。也就是说,模型不再只知道“猫”“狗”“桌子”是三个不同的 token,而是能够进一步表示它们在语义上的远近关系。

token 向量直觉
接近动物、宠物
接近动物、宠物
桌子 接近家具
学习 接近教育、训练

在这样的向量空间里,“猫”和“狗”应该更接近,因为它们都和动物、宠物相关;而“猫”和“桌子”距离会更远,因为它们属于完全不同的语义类别。

这就是 embedding 的核心作用:把离散的 token,变成可以计算相似度和语义关系的向量

不同模型中,token 的切分方式不同、token 的 embedding 也是不同,embedding 是对应模型训练出来的参数。

词向量:从 one-hot 到 word2vec

在词向量出现之前,常见的文本表示方式是 one-hot(词向量可以看作 embedding 的一种,主要指把词表示成向量)。假设词表里只有 4 个词,每个词都可以用一个只有一位是 1、其余都是 0 的向量表示:

one-hot 表示
[1, 0, 0, 0]
[0, 1, 0, 0]
桌子 [0, 0, 1, 0]
学习 [0, 0, 0, 1]

one-hot 的好处是简单,能清楚表示“这个词是谁”。但它的问题也很明显:它不能表示“这个词和谁更像”。

比如“猫”和“狗”在语义上更接近,因为它们都和动物、宠物有关;而“猫”和“桌子”明显不是一类东西。但在 one-hot 表示里,这些词都是彼此独立的编号,模型看不出它们之间的语义远近。

词向量的出现,就是为了解决这个问题。

  • word2vec 这类方法的核心直觉是:一个词的意思,可以从它经常出现的上下文中学出来。

比如:我 今天 喝 了 一杯 咖啡

如果“咖啡”经常出现在“喝”“一杯”“早上”这些词附近,模型就会逐渐学到:咖啡更可能和饮品、早餐、杯子这些语义场景相关。

word2vec

word2vec 中经典训练方式有两类:

方法 直觉
CBOW 根据上下文预测中间词
Skip-gram 根据中心词预测周围词

这类词向量的价值在于,它把词从离散编号,放进了一个连续的语义空间。这样一来,模型不仅知道“猫”和“狗”是不同的词,还能知道它们在语义上比“猫”和“桌子”更接近。不过,早期词向量也有明显不足:

不足 例子
一个词通常只有一个固定向量 “苹果”既可能是水果,也可能是公司
上下文变化表达不够细 “模型不稳定”在不同场景含义不同
主要学习词级别关系 对长句结构和篇章关系表达有限

后来 BERT、GPT 这类模型进一步发展出了上下文相关表示。也就是说,同一个 token 在不同句子里,经过模型计算后可以得到不同的上下文表示。

感知机:机器学习的最小原型

理解神经网络之前,可以先理解感知机。感知机是一个非常早期、非常简单的机器学习模型。它可以看作神经网络的最小原型。

感知机

感知机要解决的问题很简单:给定一些输入特征,模型能不能学会做一个基本判断?比如,我们想判断一封邮件是不是垃圾邮件,可以先把邮件拆成一些特征:

特征 含义
是否包含“中奖” 可疑词
是否包含链接 可疑行为
发件人是否陌生 来源特征
邮件长度 内容特征

感知机会给每个特征一个权重,然后算一个总分。

1
总分 = 特征1 * 权重1 + 特征2 * 权重2 + ... + 偏置

如果总分超过某个阈值,就判断为垃圾邮件,否则不是。

所以,感知机本质上就像一张自动学习出来的打分表。它不是靠人手写“如果出现中奖就一定是垃圾邮件”这样的死规则,而是通过数据学习每个特征到底应该占多大权重。

感知机为什么重要?

感知机的重要性在于,它把“机器如何学习”这件事变得非常具体。在感知机之前,我们很容易把机器判断理解成一堆人工规则:如果出现某个词,就执行某个判断。但感知机提供了另一种思路:

  • 模型不再完全依赖人手写规则,而是通过数据不断调整权重

比如一开始,模型可能把“包含链接”这个特征看得太重,导致很多正常邮件也被误判成垃圾邮件。经过训练后,如果模型发现自己判断错了,就会调整相关权重。下一次再遇到类似样本时,判断就可能更准确。

也就是说,感知机已经具备了机器学习最核心的雏形:预测、犯错、调整,再预测

它和后来的神经网络之间,也有很自然的对应关系:

感知机里的东西 后来神经网络里的对应物
输入特征 输入向量
权重 参数
加权求和 线性变换
阈值判断 激活函数
调整权重 训练

感知机的不足

感知机的优点是简单,缺点也正是太简单。它主要适合处理“线性可分”的问题。简单来说,如果两类样本可以用一条直线分开,感知机就比较擅长;如果样本分布更复杂,无法用一条直线清楚分开,感知机就会很吃力。

可以把它想象成下面这种情况:一边是类别 A,一边是类别 B,中间只需要一条分界线,就能把它们区分开。

感知机

但真实语言问题显然没有这么简单。一句话的含义,往往不是几个特征简单加权就能判断出来的。比如,“这家店的服务可真好,等了两个小时都没人理我”。这句话里,如果只看 “服务”“真好”这些词,模型可能会判断成正面评价,但结合后半句看,实际可能是在表达不满。

语言里有词语组合、上下文变化、语气反转、长距离依赖等复杂现象。单个感知机很难处理这些非线性、上下文相关的问题。所以,我们需要更强的模型:能够把简单特征不断组合,学习更复杂的表示。这就走向了神经网络

神经网络:从简单到复杂

神经网络可以粗略理解为:把很多类似感知机的计算单元连接起来,形成一个可以学习复杂模式的系统。感知机只做一次加权求和。神经网络会把这种计算堆很多层。如下图所示:

神经网络

每一层都会对输入做一次表示变换。层数多了以后,模型就有机会学习更复杂的关系。

为什么需要“多层”?

可以用图片识别来类比:模型最底层可能先识别边缘、颜色、纹理;中间层再组合出局部形状;更高层才逐渐识别出完整对象,比如猫、狗、汽车。

语言处理里也类似。模型不是一开始就能理解“这句话表达了什么意图”,它通常需要从更基础的信息一层层组合上来:

层次 可能学习到什么
底层 token、词形、局部搭配
中层 短语、语法关系
高层 语义、意图、任务模式

这就是“表示学习”的直觉:模型不只是接收特征,而是在训练中自己学习更有用的中间表示。

神经网络如何训练?

神经网络的训练循环可以概括成三个词:预测 -> 评估 -> 修正

这和人做题有点像:先根据当前能力做出答案,再对照标准答案看错在哪里,最后根据错误调整方法。模型训练也是类似的过程。完整流程可以简化成下面这张图:

神经网络核心处理流程

其中几个关键概念可以这样理解:

概念 小白解释
前向传播 输入一路经过模型,得到预测
Loss 模型预测和正确答案之间的差距
反向传播 把错误反向传回每一层
梯度 参数应该往哪个方向改
梯度下降 沿着让错误变小的方向更新参数

模型不是一次就学会的,而是在大量样本上不断预测、犯错、修正,再继续预测。训练的过程,本质上就是让模型的参数一点点变得更合适。

神经网络的不足

神经网络比感知机强很多,它可以通过多层结构学习更复杂的模式。但普通的前馈神经网络并不天然适合处理语言。原因很简单:语言是有顺序的。比如,下面两句话:

1
2
我不喜欢这个方案。
我喜欢这个方案。

这两句话只差一个“不”,但含义完全不同。如果模型只是把词当成一组特征,而不能理解它们出现的位置和顺序,就很容易判断错误。

所以,对于语言任务来说,仅仅能学习复杂特征还不够。模型还必须能够处理 token 之间的顺序关系、上下文关系,以及长句中前后信息的依赖关系。这就引出了下一类模型:能够处理文本结构和上下文关系的经典神经网络,比如 CNN、RNN、LSTM 和双向 RNN。

序列模型:让模型读懂上下文

语言不是一组孤立的特征,而是一串有顺序的 token。前面的词会影响后面的词,后面的表达也依赖前面的上下文。因此,在 NLP 中有一个非常核心的问题:

  • 给定前面的内容,模型能不能预测接下来最可能出现什么?

这就是语言模型要解决的问题。

语言模型:预测下一个 token

语言模型最朴素的直觉,就是根据前面的内容,预测接下来最可能出现什么。比如:

  • 我今天早上喝了一杯 __

模型需要判断空白处更可能出现哪个 token:

候选 token 可能性
咖啡
桌子

这个过程看起来像“填空题”,但它非常关键。因为只要上下文足够丰富,很多 NLP 任务都可以转化成“继续生成后面的内容”。比如:

任务 输入方式 输出方式
翻译 请翻译这句话 生成译文
摘要 请总结这篇文章 生成摘要
问答 根据材料回答问题 生成答案
分类 判断正面还是负面 生成类别
写代码 根据需求写函数 生成代码

这就是大语言模型的统一性:它没有为每个任务单独设计一套模型,而是把很多任务都转化成“给定上下文后继续生成”。

所以,LLM 的很多能力,底层都可以先用一句话来理解:根据上下文,预测下一个 token

模型一:CNN 捕捉局部特征

很多人第一次接触 CNN(Convolutional Neural Network,又叫做卷积神经网络),是在图像识别里。图像里的 CNN 会用卷积核扫描图片的局部区域,提取边缘、纹理、形状等特征。文本里也可以使用 CNN。只不过它扫描的不是像素,而是一串 token 对应的向量。

可以把它理解成:

  • CNN 擅长从文本中抓局部模式,比如几个词组成的短语。

例如:

1
这个 产品 非常 好用

CNN 可以用不同大小的窗口扫过句子:

CNN

在早期文本分类里,CNN 很实用。比如情感分析中,“非常好用”“极其糟糕”“不推荐购买”这些局部短语很有判断价值。但 CNN 的不足也明显:

优点 不足
擅长提取局部 n-gram 特征 对很远的词之间关系不敏感
并行效率较好 需要通过多层堆叠扩大感受野
适合分类任务 不天然适合逐步生成文本

所以,CNN 在 NLP 里更像是一个“局部特征提取器”。它能很好地抓住短语级别的模式,但不擅长处理长距离依赖。也就是说,如果一句话前面很远的信息会影响后面的判断,CNN 就会比较吃力。

模型二:RNN 按顺序读取文本

RNN,全称 Recurrent Neural Network,中文叫循环神经网络。它是一类专门用来处理序列数据的模型,比如文本、语音、时间序列等。它的基本思路是:

  • 从左到右依次读取文本,每读一个 token,就把当前 token 的信息和前面已经读到的信息合并起来,更新成一个新的隐藏状态。

可以简单理解为,RNN 在读一句话时,会一边读当前词,一边带着前面的“记忆”继续往后读。如下图所示:

RNN

这里的 状态 可以理解为模型到目前为止读到的信息摘要。每读一个新的 token,模型都会更新一次状态。相比 CNN,RNN 更适合表达文本顺序,因为它不是只看局部窗口,而是按顺序一步步读取整句话。

比如读到“我不喜欢这个方案”时,RNN 有机会把“不”这个信息传到后面,影响对整句话的判断。但 RNN 有两个经典问题:

问题 说明
长距离依赖困难 前面很远的信息传到后面时容易变弱
并行能力弱 后一个状态依赖前一个状态,训练不容易并行

所以,RNN 比 CNN 更擅长处理顺序,但当文本变长时,它对长距离上下文的记忆能力仍然有限。

模型三:LSTM 和 GRU 试图增强记忆

LSTM 和 GRU 都是 RNN 的改进版本。它们出现的主要目的,是缓解普通 RNN 容易“忘记前文”的问题。普通 RNN 在读取长文本时,前面的信息需要一步步传到后面。句子越长,早期信息越容易被稀释。LSTM 和 GRU 的改进思路是:给模型增加一种 门控机制

可以先不用记复杂结构,只抓住一个直觉:LSTM / GRU 给模型增加了 ,让模型自己决定哪些信息要记住,哪些信息要忘掉。

LSTM / GRU简化流程

比如这句话:我昨天在朋友推荐的一家店里喝了一杯咖啡。如果模型要预测或理解最后的“咖啡”,它需要记住前面的“喝了一杯”。LSTM/GRU 就是在努力让这种关键信息不要太快丢失。

所以,相比普通 RNN,LSTM / GRU 更擅长处理稍长一些的上下文,也曾经广泛用于机器翻译、语音识别、文本分类等任务。但它们仍然没有彻底解决问题:

不足 说明
仍然偏顺序处理 长文本训练效率有限
远距离信息仍可能衰减 只是缓解,不是根治
很难直接建模任意两个 token 的关系 信息主要通过状态逐步传递

也就是说,LSTM / GRU 让模型“记得更久了一些”,但还没有让模型真正做到“直接看到所有相关信息”。

模型四:双向 RNN 同时看前后文

普通 RNN 通常是从左往右读取文本,因此它在处理当前位置时,主要依赖已经读过的前文信息。但很多语言理解任务,只看前文是不够的,还需要结合后文一起判断。

比如: 苹果 发布 了 新产品

如果只看“苹果”前面的内容,几乎没有有效信息;但如果同时看到后面的“发布”“新产品”,就更容易判断这里的“苹果”指的是公司,而不是水果。

双向 RNN 的思路就是:让模型从两个方向同时读句子

  1. 一条 RNN 从左往右读,获取前文信息;
  2. 另一条 RNN 从右往左读,获取后文信息;
  3. 最后把两个方向的信息合并起来,得到更完整的上下文表示。

可以简单理解为:

双向 RNN

双向 RNN 在很多语言理解任务中非常有用,比如命名实体识别、文本分类、序列标注、句子匹配等。因为这些任务通常可以先看到完整句子,再做判断。不过,双向 RNN 也有自己的边界:

场景 是否适合
句子理解、分类、标注 适合
实时生成下一个 token 不太适合,因为它依赖未来信息

原因也很直观:生成式语言模型在写下一个 token 时,只能根据已经出现的内容继续往后生成,不能提前看到未来答案。因此,双向 RNN 更适合理解类任务,而不适合作为自回归生成模型的直接结构。

小结

把这些经典模型放在一起看,脉络就很清楚:

模型 擅长什么 主要不足
CNN 抓局部短语特征 不擅长长距离依赖
RNN 按顺序建模文本 长文本容易遗忘,训练慢
LSTM / GRU 增强记忆能力 仍然偏顺序传递
双向 RNN 同时利用前后文 不适合自回归生成

这些模型都在不同阶段推动了 NLP 的发展,但它们也都没有彻底解决一个核心问题:长距离依赖。比如:

  • 虽然我昨天在朋友推荐的那家开在巷子深处、装修很有特色、排队也很久的咖啡店里坐了很久,但最后只点了一杯 __

要预测最后空白处的词,模型需要记住前面较早出现的“咖啡店”。如果前文信息在传递过程中被不断稀释,模型可能就无法准确判断这里更可能是“咖啡”,而不是“水”“酒”或其他东西。

这就是 Transformer 出现前,序列建模面临的关键挑战:如何让模型在处理当前位置时,更高效地找到上下文中真正相关的信息。

总结

回到文章开头提出的问题:机器到底是如何一步步学会处理语言的?

现在我们可以把这条路径串起来看:

  1. 首先,NLP 把自然语言问题转换成机器可以处理的任务;
  2. 接着,token 和 embedding 把文本从“文字”变成可计算的数字表示;
  3. 然后,感知机和神经网络说明模型并不是靠人手写规则,而是可以通过数据不断调整参数、学习规律;
  4. 再往后,CNN、RNN、LSTM/GRU、双向 RNN 等模型不断尝试处理语言中的局部特征、顺序关系和上下文依赖;
  5. 最后,Transformer 通过 Attention 机制,让模型能够更直接地关注上下文中真正相关的信息。

所以,LLM 并不是突然出现的“魔法”。它背后是一条长期演进出来的技术路线。LLM 的能力不是来自某一个单点技术,而是来自语言表示、模型训练、上下文建模和大规模数据共同作用的结果。

最后,用一张图总结本文的核心内容:从语言进入模型,到模型学会预测,再到 Transformer 成为现代 LLM 的核心架构。

总结