01.LLM的背景知识
一、大语言模型 (LLM) 背景
大语言模型 (英文:Large Language Model,缩写LLM) 是一种人工智能模型, 旨在理解和生成人类语言. 大语言模型可以处理多种自然语言任务,如文本分类、问答、翻译、对话等等.

通常, 大语言模型 (LLM) 是指包含数千亿 (或更多) 参数的语言模型(目前定义参数量超过10B的模型为大语言模型),这些参数是在大量文本数据上训练的,例如模型 GPT-3、ChatGPT、PaLM、BLOOM和 LLaMA等.
截止23年3月底,语言模型发展走过了三个阶段:
- 第一阶段:设计一系列的自监督训练目标(MLM、NSP等),设计新颖的模型架构(Transformer),遵循Pre-training和Fine-tuning范式。典型代表是BERT、GPT、XLNet等;
- 第二阶段 :逐步扩大模型参数和训练语料规模,探索不同类型的架构。典型代表是BART、T5、GPT-3等;
- 第三阶段 :走向AIGC(Artificial Intelligent Generated Content)时代,模型参数规模步入千万亿,模型架构为自回归架构,大模型走向对话式、生成式、多模态时代,更加注重与人类交互进行对齐,实现可靠、安全、无毒的模型。典型代表是InstructionGPT、ChatGPT、Bard、GPT-4等。
二、语言模型 (Language Model, LM)
语言模型(Language Model)旨在建模词汇序列的生成概率,提升机器的语言智能水平,使机器能够模拟人类说话、写作的模式进行自动文本输出。
通俗理解: 用来计算一个句子的概率的模型,也就是判断一句话是否是人话的概率。
标准定义:对于某个句子序列, 如S=W1,W2,W3,…,WnS = {W_1, W_2, W_3, …, W_n}S=W1,W2,W3,…,Wn, 语言模型就是计算该序列发生的概率, 即P(S)P(S)P(S). 如果给定的词序列符合语用习惯, 则给出高概率, 否则给出低概率.

语言模型技术的发展可以总结为四个阶段:
- 基于规则和统计的语言模型
- 神经语言模型
- 预训练语言模型
- 大语言模型
1.基于规则和统计的语言模型(N-gram)
由人工设计特征并使用统计方法对固定长度的文本窗口序列进行建模分析,这种建模方式也被称为N-gram语言模型。在上述例子中,通过链式法则计算句子序列概率的方法存在两个核心缺陷:
- 参数空间过大:条件概率 P(Wn∣W1,W2,…,Wn−1)P(W_n \mid W_1, W_2, \dots, W_{n-1})P(Wn∣W1,W2,…,Wn−1) 的可能组合数量极多,既难以估算,也存在大量冗余且无用的参数。
- 数据稀疏严重:语料库中许多词对(或多词)组合从未出现,依据最大似然估计得到的概率会直接为0,导致模型失效。
为解决上述问题,N-gram模型引入马尔科夫假设:任意一个词的出现概率,仅与它前面出现的有限k个词有关(与更早的词无关)。基于该假设,可将复杂的条件概率简化为以下几种常见模型:
一元模型(Unigram)
假设每个词的出现与周围所有词完全独立,仅依赖自身的先验概率。
概率计算公式:P(S)=P(W1)×P(W2)×⋯×P(Wn)P(S) = P(W_1) \times P(W_2) \times \dots \times P(W_n)P(S)=P(W1)×P(W2)×⋯×P(Wn)
- 示例:计算“程序员来学习”的概率
P(S)=P(程序)×P(员)×P(来)×P(学习)P(S) = P(\text{程序}) \times P(\text{员}) \times P(\text{来}) \times P(\text{学习})P(S)=P(程序)×P(员)×P(来)×P(学习)
二元模型(Bigram)
假设每个词的出现仅依赖于它前面的1个词。
概率计算公式: P(S)=P(W1)×P(W2∣W1)×P(W3∣W2)×⋯×P(Wn∣Wn−1)P(S) = P(W_1) \times P(W_2 \mid W_1) \times P(W_3 \mid W_2) \times \dots \times P(W_n \mid W_{n-1})P(S)=P(W1)×P(W2∣W1)×P(W3∣W2)×⋯×P(Wn∣Wn−1)
- 示例:计算“程序员来学习”的概率
P(S)=P(程序)×P(员∣程序)×P(来∣员)×P(学习∣来)P(S) = P(\text{程序}) \times P(\text{员} \mid \text{程序}) \times P(\text{来} \mid \text{员}) \times P(\text{学习} \mid \text{来})P(S)=P(程序)×P(员∣程序)×P(来∣员)×P(学习∣来)
三元模型(Trigram)
假设每个词的出现仅依赖于它前面的2个词,是实际应用中平衡效果与复杂度的常用模型。
概率计算公式: P(S)=P(W1)×P(W2∣W1)×P(W3∣W1,W2)×⋯×P(Wn∣Wn−2,Wn−1)P(S) = P(W_1) \times P(W_2 \mid W_1) \times P(W_3 \mid W_1, W_2) \times \dots \times P(W_n \mid W_{n-2}, W_{n-1})P(S)=P(W1)×P(W2∣W1)×P(W3∣W1,W2)×⋯×P(Wn∣Wn−2,Wn−1)
- 示例:计算“程序员来学习”的概率
P(S)=P(程序)×P(员∣程序)×P(来∣程序,员)×P(学习∣员,来)P(S) = P(\text{程序}) \times P(\text{员} \mid \text{程序}) \times P(\text{来} \mid \text{程序}, \text{员}) \times P(\text{学习} \mid \text{员}, \text{来})P(S)=P(程序)×P(员∣程序)×P(来∣程序,员)×P(学习∣员,来)
N-gram模型的概率计算通用方法
对于N元模型(假设当前词依赖前N-1个词),核心条件概率可通过语料库计数(最大似然估计)得到:
以三元模型为例,计算 P(Wi∣Wi−2,Wi−1)P(W_i \mid W_{i-2}, W_{i-1})P(Wi∣Wi−2,Wi−1) 的公式为:
P(Wi∣Wi−2,Wi−1)=Count(Wi−2,Wi−1,Wi)Count(Wi−2,Wi−1)
P(W_i \mid W_{i-2}, W_{i-1}) = \frac{Count(W_{i-2}, W_{i-1}, W_i)}{Count(W_{i-2}, W_{i-1})}
P(Wi∣Wi−2,Wi−1)=Count(Wi−2,Wi−1)Count(Wi−2,Wi−1,Wi)
其中:
- Count(Wi−2,Wi−1,Wi)Count(W_{i-2}, W_{i-1}, W_i)Count(Wi−2,Wi−1,Wi):语料库中“Wi−2Wi−1WiW_{i-2} W_{i-1} W_iWi−2Wi−1Wi”这三个词连续出现的总次数。
- Count(Wi−2,Wi−1)Count(W_{i-2}, W_{i-1})Count(Wi−2,Wi−1):语料库中“Wi−2Wi−1W_{i-2} W_{i-1}Wi−2Wi−1”这两个词连续出现的总次数。
N-gram语言模型的特点:
- 优点:采用极大似然估计, 参数易训练; 完全包含了前n-1个词的全部信息; 可解释性强, 直观易理解。
- 缺点:缺乏长期以来,只能建模到前n-1个词; 随着n的增大,参数空间呈指数增长3.数据稀疏,难免会出现OOV问题; 单纯的基于统计频次,泛化能力差。
2.神经网络语言模型
基于N-gram语言模型以上的问题,以及随着神经网络技术的发展,人们开始尝试使用神经网络来建立语言模型。

- 模型的输入:wt−n+1,…,wt−2,wt−1w_{t-n+1}, \dots, w_{t-2}, w_{t-1}wt−n+1,…,wt−2,wt−1 就是前 n−1n-1n−1 个词。现在需要根据这已知的 n−1n-1n−1 个词预测下一个词 wtw_twt。C(w)C(w)C(w) 表示 www 所对应的词向量。
- 网络的第一层(输入层)是将 C(wt−n+1),…,C(wt−2),C(wt−1)C(w_{t-n+1}), \dots, C(w_{t-2}), C(w_{t-1})C(wt−n+1),…,C(wt−2),C(wt−1) 这 n−1n-1n−1 个向量首尾拼接起来形成一个 (n−1)∗m(n-1)*m(n−1)∗m 大小的向量,记作 xxx。
- 网络的第二层(隐藏层)就如同普通的神经网络,直接使用一个全连接层,通过全连接层后再使用 tanh\tanhtanh 这个激活函数进行处理。
- 网络的第三层(输出层)一共有 VVV 个节点(VVV 代表语料的词汇),本质上这个输出层也是一个全连接层。每个输出节点 yiy_iyi 表示下一个词语为 iii 的未归一化log 概率。最后使用 softmax 激活函数将输出值 yyy 进行归一化。得到最大概率值,就是我们需要预测的结果。
神经网络特点:
- 优点:利用神经网络去建模当前词出现的概率与其前 n-1 个词之间的约束关系,很显然这种方式相比 n-gram 具有更好的泛化能力,只要词表征足够好。从而很大程度地降低了数据稀疏带来的问题。
- 缺点:对长序列的建模能力有限,可能会出现长距离遗忘以及训练时的梯度消失等问题,构建的模型难以进行稳定的长文本输出。
3.基于Transformer的预训练语言模型

Transformer模型由一些编码器和解码器层组成(见图),学习复杂语义信息的能力强,很多主流预训练模型在提取特征时都会选择Transformer结构,并产生了一系列的基于Transformer的预训练模型,包括GPT、BERT、T5等.这些模型能够从大量的通用文本数据中学习大量的语言表示,并将这些知识运用到下游任务中,获得了较好的效果.
预训练语言模型的使用方式:
1.预训练:预训练指建立基本的模型,先在一些比较基础的数据集、语料库上进行训练,然后按照具体任务训练,学习数据的普遍特征。
2.微调:微调指在具体的下游任务中使用预训练好的模型进行迁移学习,以获取更好的泛化效果。
预训练语言模型的特点:
- 优点:更强大的泛化能力,丰富的语义表示,可以有效防止过拟合。
- 缺点:计算资源需求大,可解释性差等
4.大语言模型
随着对预训练语言模型研究的开展,人们逐渐发现可能存在一种标度定律(ScalingLaw)(Scaling Law)(ScalingLaw),即随着预训练模型参数的指数级提升,其语言模型性能也会线性上升。2020年,OpenAI发布了参数量高达1750亿的GPT-3,首次展示了大语言模型的性能。
相较于此前的参数量较小的预训练语言模型,例如,3.3亿参数的Bert-large和17亿参数的GPT-2,GPT-3展现了在Few-shot语言任务能力上的飞跃,并具备了预训练语言模型不具备的一些能力。后续将这种现象称为能力涌现。例如,GPT-3能进行上下文学习,在不调整权重的情况下仅依据用户给出的任务示例完成后续任务。这种能力方面的飞跃引发研究界在大语言模型上的研究热潮,各大科技巨头纷纷推出参数量巨大的语言模型,例如,Meta公司1300亿参数量的LLaMA模型以及谷歌公司5400亿参数量的PaLM。国内如百度推出的文心一言ERNIE系列、清华大学团队推出的GLM系列,等等。
大语言模型的特点:
- 优点:像“人类”一样智能,具备了能与人类沟通聊天的能力,甚至具备了使用插件进行自动信息检索的能力
- 缺点:参数量大,算力要求高、生成部分有害的、有偏见的内容等等
三、语言模型的评估指标
1.BLEU
BLEU (双语评估替补)分数是评估一种语言翻译成另一种语言的文本质量的指标。它将“质量”的好坏定义为与人类翻译结果的一致性程度。
BLEU算法实际上就是在判断两个句子的相似程度. BLEU 的分数取值范围是 0~1,分数越接近1,说明翻译的质量越高。
BLEU有许多变种,根据n-gram可以划分成多种评价指标,常见的评价指标有BLEU-1、BLEU-2、BLEU-3、BLEU-4四种,其中n-gram指的是连续的单词个数为n,BLEU-1衡量的是单词级别的准确性,更高阶的BLEU可以衡量句子的流畅性.实践中,通常是取N=1~4,然后对进行加权平均
下面举例说计算过程:
-
基本步骤:
-
分别计算candidate句和reference句的N-grams模型,然后统计其匹配的个数,计算匹配度:
-
公式:candidate和reference中匹配的 n−gram 的个数 /candidate中n−gram 的个数
-
假设机器翻译的译文candidate和一个参考翻译reference如下:
candidate: it is a nice day today
reference: today is a nice day
- 使用1-gram进行匹配
candidate: {it, is, a, nice, day, today}
reference: {today, is, a, nice, day}结果:其中{today, is, a, nice, day}匹配,所以匹配度为5/6
- 使用2-gram进行匹配
candidate: {it is, is a, a nice, nice day, day today}
reference: {today is, is a, a nice, nice day}
结果:其中{is a, a nice, nice day}匹配,所以匹配度为3/5
使用3-gram进行匹配
candidate: {it is a, is a nice, a nice day, nice day today}
reference: {today is a, is a nice, a nice day}结果:其中{is a nice, a nice day}匹配,所以匹配度为2/4
使用4-gram进行匹配
candidate: {it is a nice, is a nice day, a nice day today}
reference: {today is a nice, is a nice day}结果:其中{is a nice day}匹配,所以匹配度为1/3

python代码实现:
# 第一步安装nltk的包-->pip install nltk
from nltk.translate.bleu_score import sentence_bleudef cumulative_bleu(reference, candidate):bleu_1_gram = sentence_bleu(reference, candidate, weights=(1, 0, 0, 0))bleu_2_gram = sentence_bleu(reference, candidate, weights=(0.5, 0.5, 0, 0))bleu_3_gram = sentence_bleu(reference, candidate, weights=(0.33, 0.33, 0.33, 0))bleu_4_gram = sentence_bleu(reference, candidate, weights=(0.25, 0.25, 0.25, 0.25))# print('bleu 1-gram: %f' % bleu_1_gram)# print('bleu 2-gram: %f' % bleu_2_gram)# print('bleu 3-gram: %f' % bleu_3_gram)# print('bleu 4-gram: %f' % bleu_4_gram)return bleu_1_gram, bleu_2_gram, bleu_3_gram, bleu_4_gram# 生成文本
generated_text = "it is a nice day today".split(" ")# 参考文本列表
reference_texts = ["today is a nice day".split(" ")]# 计算 Bleu 指标
c_bleu = cumulative_bleu(reference_texts, generated_text)# 打印结果print("The Bleu score is:", c_bleu)
# The Bleu score is: (0.8333333333333334, 0.7071067811865476, 0.63287829698514, 0.537284965911771)
2.ROUGE
ROUGE指标是在机器翻译、自动摘要、问答生成等领域常见的评估指标。ROUGE通过将模型生成的摘要或者回答与参考答案(一般是人工生成的)进行比较计算,得到对应的得分。
ROUGE指标与BLEU指标非常类似,均可用来衡量生成结果和标准结果的匹配程度,不同的是ROUGE基于召回率,BLEU更看重准确率。
ROUGE分为四种方法:ROUGE-N, ROUGE-L, ROUGE-W, ROUGE-S.
下面举例说计算过程(这里只介绍ROUGE_N):
- 基本步骤:
- Rouge-N实际上是将模型生成的结果和标准结果按N-gram拆分后,计算召回率
- 假设模型生成的文本candidate和一个参考文本reference如下:
candidate: it is a nice day today
reference: today is a nice day
- 使用ROUGE-1进行匹配
candidate: {it, is, a, nice, day, today}
reference: {today, is, a, nice, day}
结果::其中{today, is, a, nice, day}匹配,所以匹配度为5/5=1,这说明生成的内容完全覆盖了参考文本中的所有单词,质量较高。
通过类似的方法,可以计算出其他ROUGE指标(如ROUGE-2、ROUGE-L、ROUGE-S)的评分,从而综合评估系统生成的文本质量。
python代码实现:
# 第一步:安装rouge-->pip install rouge
import Rouge# 生成文本
generated_text = "This is some generated text."# 参考文本列表
reference_texts = ["This is a reference text.", "This is another generated reference text."]# 计算 ROUGE 指标
rouge = Rouge()
scores = rouge.get_scores(generated_text, reference_texts[1])# 打印结果
print("ROUGE-1 precision:", scores[0]["rouge-1"]["p"])
print("ROUGE-1 recall:", scores[0]["rouge-1"]["r"])
print("ROUGE-1 F1 score:", scores[0]["rouge-1"]["f"])
# ROUGE-1 precision: 0.8
# ROUGE-1 recall: 0.6666666666666666
# ROUGE-1 F1 score: 0.7272727223140496
3. 困惑度 PPL (perplexity)
PPL 是衡量概率分布或概率模型对样本预测能力的核心指标,
PPL 用来度量一个概率分布或概率模型在预测样本的好坏程度。
PPL 基本思想
-
给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好。
-
基本公式(两种方式):
PPL(S)=p(w1,w2,⋯ ,wn)−1NPPL(S) = p(w_1, w_2, \cdots, w_n)^{-\frac{1}{N}}PPL(S)=p(w1,w2,⋯,wn)−N1PPL(S)=exp(logp(w1,w2,⋯ ,wn)−1N)=exp(−1Nlogp(w1,w2,⋯ ,wn))PPL(S) = \exp\left(\log p(w_1, w_2, \cdots, w_n)^{-\frac{1}{N}}\right) = \exp\left(-\frac{1}{N}\log p(w_1, w_2, \cdots, w_n)\right)PPL(S)=exp(logp(w1,w2,⋯,wn)−N1)=exp(−N1logp(w1,w2,⋯,wn))
对于 1-gram 的语言模型来说,上面的公式简化为:
PPL(S)=exp(−1Nlogp(w1,w2,⋯ ,wn))=exp(−1N∑i=1nlogp(wi))PPL(S) = \exp\left(-\frac{1}{N}\log p(w_1, w_2, \cdots, w_n)\right) = \exp\left(-\frac{1}{N}\sum_{i=1}^n \log p(w_i)\right)PPL(S)=exp(−N1logp(w1,w2,⋯,wn))=exp(−N1i=1∑nlogp(wi))
- 由公式可知,PPL 越小,模型对文本的预测能力越强。
python代码实现:
import math# 定义语料库
sentences = [['I', 'have', 'a', 'pen'],['He', 'has', 'a', 'book'],['She', 'has', 'a', 'cat']
]
# 定义语言模型
unigram = {'I': 1 / 11,'have': 1 / 11,'a': 3 / 11,'pen': 1 / 11,'He': 1 / 11,'has': 2 / 11,'book': 1 / 11,'She': 1 / 11,'cat': 1 / 11
}# 计算 PPL
log_p = 0 # 计算对数化概率
total_words = 0 # 统计token 数for sent in sentences:for word in sent:log_p += math.log(unigram[word])total_words += 1ppl = math.exp(-1 / total_words * log_p)
print("最终计算的 PPL 为:", ppl)
# 最终计算的 PPL 为: 7.446303021787182
