简介:这份PDF是一份面向初学者的《大语言模型入门的基础知识》讲义,适合希望理解LLM底层逻辑、语言模型演化脉络的读者。内容从LLM背景切入,先澄清语言模型的定义与评估指标,再按规则统计模型、神经语言模型、预训练模型到大模型的路径展开,重点讲解N-gram的计数原理、马尔科夫假设及其优缺点,并过渡到神经网络语言模型的网络结构与训练思路。资源仅1个PDF文件,约3.24MB,整体结构清晰,包含目录、阶段图示和实例计算,可直接作为入门笔记或备课材料。已有129人学习下载,对正在建立大模型知识框架、需要系统性扫盲的学习者尤其有价值。
1. 先把玄学拆掉:大语言模型就是一台“猜词机器”
我刚开始接触“大语言模型”的时候,满脑子都是“神经网络”“深度学习”“参数量”这些词,听上去像一门玄学。后来我换了个角度想:它其实特别像你手机输入法里的那个“联想”。你敲出“我想”,输入法会猜下一个字是“吃”还是“去”,猜得准不准,取决于它见过多少人的聊天记录。大语言模型,本质上就是一台见过海量文本、被训练得特别会“猜下一个词”的机器。它能做问答、翻译、写文案,都是因为“猜词”能力强到一定程度之后,自然涌现出来的本事。这篇文章适合完全零基础的新手,不要求你会写代码,也不要求你学过数学,只用大白话把“这是什么、为什么要学、第一步怎么迈”讲清楚。
2. 为什么要学语言模型:从“一句人话”到“一段对话”
2.1 语言模型到底在算什么:一句话是人话的概率
语言模型(Language Model,缩写 LM)有一个很容易理解的通俗定义:它是一个用来计算“一个句子看起来像不像人话”的模型。比如“我想去打篮球”这句话,正常人都会说,模型会给它一个很高的概率;而“我篮球去想想打”这种乱序词串,模型会给它一个很低的概率。
标准定义稍微严谨一点:假设一个句子由词序列组成,比如 S = {W1, W2, W3, …, Wn},语言模型就是在计算这个序列出现的概率 P(S)。如果给出的词序符合人们的使用习惯,概率就高;如果不符合,概率就低。你可能会想:这有什么难的?直接数一数语料里这句话出现过几次不就行了?理论上可以,但你很快就会翻车。因为真实语言里,几乎每一句话都是第一次出现,你不可能靠着“数数”去覆盖无限多种句子组合。所以,语言模型要解决的核心问题不是“背下见过的句子”,而是“给没见过的句子也估算出一个靠谱的概率”。
2.2 从文本生成视角看:给定上文猜下一个词
语言模型还有另一种更常见的定义,也是现在大模型产品最直观的样子:给定一个短语或一句话,模型能预测接下来最可能出现的词。你可以把它想象成“成语接龙”或者“歌词接龙”。我说“床前明月”,你大概率会接“光”;我说“举头望明”,你大概率会接“月”。语言模型做的就是这件事,只不过它见过的文本比你多得多,接词的能力也强得多。
从概率角度说,一个句子的概率可以用链式法则拆开:P(W1, W2, …, Wn) = P(W1) × P(W2|W1) × P(W3|W1,W2) × … × P(Wn|W1,…,Wn-1)。也就是说,只要能把每一步“在已知前文的情况下下一个词是谁的概率”算出来,整个句子的概率就能算出来。所以很多文献里也直接说:语言模型就是能算出 P(W1,W2,…,Wn) 的模型。这个视角很重要,因为大语言模型的生成过程,就是一步一步把下一个词“猜”出来,再把所有词拼成一段话。
2.3 为什么大模型突然“像人”了:规模带来的质变
语言模型不是新鲜事物,它已经发展了几十年。早期是规则和统计模型,之后是神经网络模型,再之后是预训练语言模型,最后才走到今天的大语言模型。很多人好奇:为什么以前的语言模型那么“笨”,现在的突然像能聊天一样?关键在“规模”两个字。
大语言模型通常指参数量非常大的模型。目前比较常见的说法是,参数量超过 100 亿(10B)的才算大语言模型。举个直观的例子:在 2020 年前后,有人发布了参数量高达 1750 亿的模型,第一次让外界看到“原来模型大到一定程度,不用专门训练,它也能根据你给的例子完成任务”。后来各种大模型陆续出现,有的几百亿参数,有的上万亿参数。参数量变大,模型见过的文本变多,它“猜词”的能力和知识储备就会明显上升。这也是为什么我们感觉“大模型突然像人一样聪明了”:它不是换了新魔法,而是把同一套“猜词”逻辑做到了极致。
3. 核心概念:从 N-gram 到神经网络,第一个能算的例子
3.1 N-gram:用“前几个词”猜下一个
要让没接触过的人第一次理解语言模型,我特别推荐从 N-gram 入手。它的思路特别朴素:一个词出现的概率,只和它前面有限的几个词有关。如果只和前面一个词有关,就叫 bigram(二元模型);如果和前面两个词有关,就叫 trigram(三元模型)。一般来说,N-gram 模型假设当前词只依赖于它前面的 N-1 个词。
为什么做这个假设?因为要准确猜下一个词,理论上需要把前面所有历史都考虑进去,但这样的话可能性太多,根本算不过来。N-gram 直接砍掉长距离依赖:我不看完整历史,只看最近的一两个词。这样参数少、好计算,而且在实际语料里能算出可用的概率。它最大的缺陷也很明显:只会用“前面有没有出现这个词对”来判断,比如遇到从没见过的词组合,模型就会给出 0 概率,这在实际应用中非常尴尬。
3.2 手把手算一个 bigram 概率:计数、除法、验证
我们来做一个不用电脑也能算的例子,目标就是算出 P(想|我),也就是“当上一个词是‘我’时,下一个词是‘想’的概率”。假设我们有这样一个小语料库,一共 5 个句子:
| 编号 | 句子 |
|---|---|
| 1 | 我 想 去 打 篮球 |
| 2 | 我 想 吃 晚饭 |
| 3 | 我 喜欢 打 篮球 |
| 4 | 我 爱 学习 |
| 5 | 他 想 去 打 篮球 |
第一步,统计“我”后面出现过的所有词。你会发现“我”后面分别跟过“想”“想”“喜欢”“爱”,所以 C(我) = 4,也就是“我”作为前一个词出现了 4 次。
第二步,统计“我”和“想”连续出现的次数。句子 1 和句子 2 里有“我 想”,其他句子没有,所以 C(我, 想) = 2。
第三步,计算条件概率:P(想|我) = C(我, 想) / C(我) = 2 / 4 = 0.5。
这个 0.5 的意思就是:在这个语料里,看到“我”之后,有 50% 的可能性下一个词是“想”。用同样的方法,你可以算出任意两个词之间的转移概率。是不是很简单?N-gram 模型的训练过程就是把所有这种计数统计清楚,然后做一次除法。这就是它的“训练”。
你可能会问:这个模型这么简陋,有什么用?它的价值在于你能亲手算出来、亲手验证,能直观理解“概率从哪来”。我第一次学的时候,自己拿 Excel 把这 5 个句子数了一遍,才真正明白原来机器“学会”语言的方式这么朴实:先数,再除,然后拿去猜。这个经验也成了我后来理解所有复杂模型的地基。
3.3 神经网络语言模型:跳出“只看前几个词”的限制
N-gram 有个天然短板:它只能看到前 N-1 个词,看不了更长的上下文。为了解决这个问题,人们开始用神经网络来做语言模型。神经网络方案的思路是:把每个词用一个向量表示,然后把前几个词的向量拼起来,经过一个全连接层,再用激活函数处理一下,最后通过 softmax 输出下一个词的概率分布。
具体来说,第一层会把前 n-1 个词对应的词向量首尾拼接,形成一个长向量。第二层是一个全连接层,把拼接后的向量做线性变换,再用 tanh 激活函数引入非线性。第三层输出 V 个节点,V 是词汇表大小,每个节点代表“下一个词是词汇表里第 i 个词”的得分,最后用 softmax 把这些得分转成概率。
这样的好处是:模型可以通过训练自动调整词向量,让意思相近的词在向量空间里也相近,所以对于没见过的词组合,它也能根据语义给出估计,泛化能力比 N-gram 强得多。而且词向量本身就是一个很有用的副产品,很多自然语言处理任务都会拿它当输入。当然,神经网络语言模型也有缺点,比如对很长的序列建模能力有限,训练过程中也容易出现梯度消失之类的问题。但不管怎样,它已经比你亲手算的 bigram 聪明太多了。
4. 从 N-gram 到大模型:四代模型各自在解决什么问题
4.1 第一代:规则和统计模型为什么撑不住
语言模型的发展大致可以分成四个阶段。最早期是基于规则和统计的语言模型,典型代表就是我上面讲的 N-gram 模型。那个时代,专家设计规则,再用统计方法对固定长度的文本窗口建模。它的优点是参数容易训练,可解释性强,直观好理解。但它的缺陷也特别致命。
第一个缺陷是参数空间过大。如果用链式法则把整个句子的条件概率都算出来,可能性几乎无穷多,根本没法学。第二个缺陷是数据稀疏。很多词对在语料里一次都没出现过,按最大似然估计算出来的概率就是 0,可现实里人家可能只是没赶上你这份语料而已。由于这两个问题,早期的统计模型只能在小词汇量、短文本场景里凑合用,一旦遇到真实世界的海量文本,就立刻力不从心。
4.2 第二代:神经网络语言模型如何改进
随着神经网络技术成熟,第二代语言模型开始出现。它不再依赖“数前面几个词出现几次”这种硬计数,而是用词向量把词转换成数值表示,再用神经网络去学习词与词之间的组合规律。相比 N-gram,它的泛化能力更好,数据稀疏问题也缓解了不少。
我第一次看神经网络语言模型结构图的时候,最惊讶的一点是:它居然能把“国王”和“王后”这类词的位置关系在向量空间里对应出来。虽然它当时的目标只是“预测下一个词”,但为了把下一个词猜准,模型不得不把很多语义信息也学到手。这就像你为了做好菜天天背菜谱,最后不但学会做菜,还顺带认识了不少食材。不过第二代模型仍然有局限:它处理长序列的能力有限,而且一旦序列变长,训练时容易出现梯度消失,导致模型学不到远处的信息。
4.3 第三代:预训练语言模型
第三代是预训练语言模型,代表思路是 BERT、GPT、T5 这一类。它们的核心做法特别像“先实习、再上岗”:先在大规模通用文本上做“预训练”,让模型学到通用的语言表示;再针对具体任务做“微调”,也就是拿下游任务的数据再训练一下,让模型适应某个特定场景。
预训练阶段,模型读海量文本,学着填空、猜下一句、判断两句话是否连贯,这些“自监督训练目标”不需要人工标注,文本本身就是答案。微调阶段,你在已有模型基础上,用少量带标签的数据继续训练,把它调整成能分类、能问答、能翻译的专用模型。这个范式的最大优势是:一个预训练模型可以服务多个下游任务,而且效果通常比从零开始训练好得多。
当然,它的缺点也很明显:预训练需要非常大的计算资源,而且模型的解释性比较差。它就像一个知识渊博但不太会解释自己心思的人,你知道它能力强,但很难说清它到底为什么这样判断。
4.4 第四代:大语言模型
第四阶段就是我们所说的大语言模型时代。这个阶段的标志是模型参数规模急剧增大,架构逐步走向自回归,模型开始强调生成、对话和多模态,核心生产范式也变成“和各种内容生成”挂钩,也就是常说的 AIGC。
大语言模型最让人惊艳的能力,是它可以通过和人类对话进行“对齐”,也就是不断调整自己的输出,让回答更可靠、更安全、更符合人类偏好。很多你看到的大模型产品,背后都做了大量这种对齐工作,才让人觉得“它真的像个人”。它的优点是:能像人类一样沟通聊天,甚至能调用插件去自动检索信息。它的缺点也很现实:参数量大,算力要求高,训练时间长,还可能生成有害的或有偏见的内容。
但你要记住:大语言模型并不是“另一种语言模型”,它是在前面三代基础上,把数据、参数、算力一起堆上去之后产生的质变。理解了前几代模型是怎么一步步解决问题的,你就能明白大模型并不是天上掉下来的黑匣子,而是一路踩坑踩出来的产物。
5. 新手避坑指南:这些坑我当年全踩过
5.1 坑一:把“语言模型”和“对话产品”画等号
现象:很多新手第一次接触大模型,直接就用聊天窗口,于是以为大语言模型就等于那个对话框,甚至觉得“模型就是产品”。
原因:你看到的对话产品其实只是一个壳,外壳里除了语言模型,还有提示词设计、鉴权、安全过滤、下游插件等一系列组件。模型本身并没有“产品”那么多花哨功能,它真正做的还是“猜下一个词”。
解决:学的时候把“模型”和“产品”分开。用“模型”的视角看问题时就先想它的核心能力,不要被产品界面的花哨功能带偏。
5.2 坑二:以为参数越大越好
现象:看到“1750 亿参数”“上万亿参数”就热血沸腾,觉得参数越大就是越强,于是选模型只盯着参数规模。
原因:参数大确实能带来更强的能力,但参数量不是唯一指标。训练数据质量、训练方式、对齐程度、推理成本都很重要。而且参数越大,对硬件要求越恐怖,很多时候你根本跑不动。
解决:入门阶段先不要纠结超大模型。先拿小型开源模型或在线 API 练手,把“输入、输出、概率”这些基础概念吃透,再用大模型去解决实际问题。
5.3 坑三:把“概率生成”当成“确定答案”
现象:同一个问题,你问两次,得到的答案有时不同,你就会觉得模型坏了,或者觉得它在胡言乱语。
原因:大语言模型生成文本时本身就是按概率采样的,它每次预测下一个词都有一个概率分布,然后从分布里挑一个。这不是 bug,而是模型生成机制的一部分。
解决:想让它稳定,就需要设置好温度参数或采样策略,并且明确告诉它“请给出确定性的回答”。如果只是拿来做体验,你就要接受它偶尔给你来点“小惊喜”。
5.4 坑四:只会看“答得好不好”,不懂看评估指标
现象:你训练完一个小模型,试了几个句子觉得还行,就以为万事大吉了。但换一批句子立刻崩,你都不知道崩在哪。
原因:凭感觉评估非常不靠谱,因为你看到的样本太少,而且人眼容易被“看起来通顺”欺骗。真正的语言模型评估要用指标,比如困惑度(Perplexity),它衡量的是模型对真实文本的预测能力。困惑度越低,通常代表模型对语料的拟合越好。
解决:入门阶段就可以给自己的小模型算一个困惑度,先跑通评估流程,再慢慢接触 BLEU、ROUGE 这类任务专用指标。这样你以后看到“这个模型效果很好”的说法时,至少知道别人是用什么尺子量的。
6. 下一步怎么学:从跑通一个最小的 bigram 开始
6.1 准备好环境和语料
我建议你学习大语言模型的第一课,不是直接跑一个几百亿参数的大模型,而是自己亲手写一个最小的 bigram 语言模型。你不用装任何深度学习的库,只要电脑里有 Python 就行。你先准备一段很小的中文语料,比如:
corpus = [ "我 想 去 打 篮球", "我 想 吃 晚饭", "我 喜欢 打 篮球", "我 爱 学习", "他 想 去 打 篮球" ]注意我在每个词之间都加了空格,这样方便按空格切词。这一段语料总共 5 个句子,足够你跑通整个流程。
6.2 写出第一个 bigram 计数模型
下面这段代码实现的是我前面讲的三步:统计前一个词出现次数、统计前后两个词连续出现次数、计算条件概率。
from collections import defaultdict # 1. 统计词对出现次数 pair_count = defaultdict(int) # 2. 统计每个前驱词出现次数 prev_count = defaultdict(int) for line in corpus: words = line.split() for i in range(len(words) - 1): prev, cur = words[i], words[i + 1] pair_count[(prev, cur)] += 1 prev_count[prev] += 1 # 3. 计算条件概率 def bigram_prob(prev, cur): if (prev, cur) not in pair_count: return 0.0 return pair_count[(prev, cur)] / prev_count[prev] print(bigram_prob("我", "想")) # 输出 0.5 print(bigram_prob("我", "爱")) # 输出 0.25代码逻辑很直白:第一个循环统计“我 想”这种连续词对出现了几次,同时统计“我”作为前一个词出现几次。最后用词对次数除以前一个词次数,就得到了条件概率。比如“我 想”出现了 2 次,“我”作为前驱出现了 4 次,所以概率就是 2/4 = 0.5。
你可以试着把“我”后面换成别的词,或者自己加几个句子重新运行。你会直观看到:数据变了,概率就变了,模型的“语言习惯”也跟着变。
6.3 用模型预测下一个词
接下来可以加一个小函数:给定一个词,从所有可能的下一个词里挑概率最高的那个。这就是最原始版“猜下一个词”的功能。
def predict_next(prev): candidates = {} for (p, c), cnt in pair_count.items(): if p == prev: candidates[c] = pair_count[(p, c)] / prev_count[p] if not candidates: return None return max(candidates, key=candidates.get) print(predict_next("我")) # 输出 "想"这个函数会遍历所有词对,找到所有“以‘我’开头”的词对,算概率后选最大值。在刚才的语料里,“我 想”概率最高,因此输出“想”。等你跑通了这个例子,你就亲手实现了一个完整的统计语言模型,虽然它很小,但所有语言模型要解决的核心问题你都已经接触到了。
6.4 之后的学习路线建议
如果你还想继续往前走,我的建议是接着做三件事。第一,给这个 bigram 模型加上平滑策略,处理没出现过的词对,别让它一遇到新组合就概率归零。第二,去看一个开源预训练模型库,用现成工具加载一个小模型,感受一下微调流程。第三,去找一份含困惑度计算的代码,把评估指标跑通,以后你就能用数字说话,而不是全靠感觉。
我从那以后每次学一个新模型,都强制自己走一遍“先看结构、再跑最小例子、最后算评估指标”的流程。哪怕只是训练一个 5 句话的玩具模型,也要完整走完,免得自己停留在“看着都会、动手就慌”的状态。希望帮到你。
本文还有配套的精品资源,点击获取