大语言模型介绍

这里先给出大语言模型的进化树

不难看出,从左到右,分支模型架构大致可以分为 encoder-only,encoder-decoder,decoder-only

大语言模型(Large Language Model):一种人工智能模型,旨在理解和生成人类语言,大语言模型可以处理杜仲NLP任务 → 文本分类、文旦、翻译、对话等

对于大预言模型的的,主要体现在其参数量,一般认为,包含千亿级别以上参数的语言模型(目前定义参数量超过10B的模型为大语言模型);当然,除了参数量,庞大的语料库也是其一大特点。

语言模型发展阶段

第一阶段

设计一系列的自监督训练目标(MLM、NSP等),设计新颖的模型架构(Transformer), 遵循Pre-training和Fine-tuning范式. 典型代表是BERT、GPT、XLNet等;

第二阶段

逐步扩大模型参数和训练语料规模,探索不同类型的架构。典型代表是BART、T5、GPT-3等;

第三阶段

走向AIGC(Artificial Intelligent Generated Content)时代, 模型参数规模步入千万亿, 模型架构为自回归架构, 大模型走向对话式、生成式、多模态时代,更加注重与人类交互进行对齐,实现可靠、安全、无毒的模型. 典型代表是InstructionGPT、ChatGPT、Bard、GPT-4等.

语言模型技术发展

第一阶段

基于规则和统计的语言模型 → N-gram模型

第二阶段

神经网络语言模型

第三阶段

预训练语言模型

第四阶段

大语言模型

N-gram模型

基于规则和统计的模型的典型或者可以说就是N-gram模型

这里引入了马尔科夫假设:随意一个词出现的概率只与它前面出现的有限的一个或者几个词有关

  • 如果一个词的出现与它周围的词是独立的,那么我们称之为 unigram,也就是一元语言模型。


  • 如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为 bigram。


  • 如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为 trigram。

一般来说,N元模型就是假设当前词的出现概率只与它前面的N-1个词有关,而这些概率参数都是可以通过大规模语料库来计算,比如三元概率:

简单理解上述公式,在语料库中,出现 我爱你 的次数比上 我爱 出现的次数

N-gram模型特点

  • 采用极大似然估计,参数易训练
  • 完全包含了前n-1个词的全部信息
  • 可解释性强,直观易理解

上面说的是其优点,但是:

  • 只能建模前n-1个词
  • 随着n增大,参数空间指数增长
  • 数据稀疏,会出现OOV问题(out of vocabulary)
  • 泛化能力差

神经网络语言模型

基于N-gram语言模型以上的问题,以及随着神经网络技术的发展,人们开始尝试使用神经网络来建立语言模型

  • 模型的输入: wt-n+1, …, wt-2, wt-1就是前n-1个词. 现在需要根据这已知的n-1个词预测下一个词 wt,C(w)表示单词w所对应的词向量
  • 网络的第一层: 是将C(wt-n+1),..,C(wt-2), C(wt-1)这n-1个向量首尾拼接起来形成一个(n-1)*m大小的向量
  • 网络的第二层: 定义一个全连接层, 通过全连接层后结果再使用tanh 激活函数进行处理
  • 网络的第三层: 输出一共V个节点 (V代表语料的词汇总数), 本质上为一个全连接层. 每个输出节点y_i表示下一个词语为i的未归一化logits值. 最后使用 softmax 激活函数将输出值y进行归一化。得到最大概率值,就是我们需要预测的结果

相比于N-gram有更好的泛化能力,降低了数据稀疏带来的问题;但是对于长序列建模能力有限,可能会出现梯度消失问题。

基于Transformer的预训练语言模型

基于Transformer的预训练模型:包括GPT、BERT、T5等.这些模型能够从大规模通用文本数据中学习大量的语言表示,并将这些知识运用到下游任务中,获得较好的效果

预训练模型的使用方式:

  • 预训练:在大规模数据集上事先训练神经网络模型,使其学习到通用的特征表示和知识
  • 微调:在具体的下游任务中使用预训练好的模型进行迁移学习,以获取更好的泛化效果

预训练模型的特点:

  • 优点:更强大的泛化能力,丰富的语义表示,可以有效防止过拟合
  • 缺点:计算资源需求大,可解释性差等

大语言模型

随着预训练模型参数的指数级提升,其语言模型性能也会线性上升。2020年,OpenAI发布了参数量高达1750亿的GPT-3,首次展示了大语言模型的性能。

大语言模型的特点:

  • 优点:像“人类”一样智能,具备了能与人类沟通聊天的能力,甚至具备了使用插件进行自动信息检索的能力
  • 缺点:参数量大,算力要求高、训练时间长、可能生成部分有害的、有偏见的内容等等

语言模型评估指标

常见的有以下几种

  • Accuracy (准确率): 模型预测正确的样本数量占总样本量的比重
  • Precision(精确率): 在被识别为正类别的样本中,为正类别的比例
  • Recall(召回率): 在所有正类别样本中,被正确识别为正类别的比例
  • BLEU 分数:评估一种语言翻译成另一种语言的文本质量的指标. 它将“质量”的好坏定义为与人类翻译结果的一致性程度. 取值范围是[0, 1], 越接近1, 表明翻译质量越好
  • ROUGE 指标:在机器翻译、自动摘要、问答生成等领域常见的评估指标. ROUGE 通过将模型生成的摘要或者回答与参考答案(一般是人工生成的)进行比较计算,得到对应的得分
  • PPL:用来度量一个概率分布或概率模型预测样本的好坏程度. PPL越小,标明模型越好

前三个相信都不陌生,机器学习就在使用了,涉及到的就是混淆矩阵中值得简单运算

这里主要介绍后面三个

BLEU

BLEU 根据n-gram可以划分成多种评价指标,其中n-gram指的是连续的单词个数为n,实践中,通常是取N=1~4,然后对进行加权平均

基本步骤:

  1. 分别计算candidate句和reference句的N-grams模型,然后统计其匹配的个数,计算匹配度
  2. 公式:candidate和reference中匹配的 n−gram 的个数 /candidate中n−gram 的个数

candidate 候选值,即模型预测值

reference 参考值,即真实值

举个简单例子:

使用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

以此类推,还是比较好理解的

不难发现,匹配个数越多,BLEU值越大,说明候选句子越好

但是,也会有特殊情况,比如:

  • candidate: the the the the
  • reference: The cat is standing on the ground
  • 如果按照1-gram的方法进行匹配,则匹配度为1,显然是不合理的

解决办法就是:首先,计算一个单词在任意一个参考句子出现的最大次数, 然后用每个(非重复)单词在参考句子中出现的最大

次数来修剪—单词在候选句子的出现次数. 如下所示的公式

其中k表示在候选句子(candidate)中出现的第k个词语, ck则代表在候选句子中这个词语出现的次数,而sk则代表

在参考文本(reference)中这个词语出现的次数

代码实现

先安装工具包 pip install nltk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from nltk.translate.bleu_score import sentence_bleu
def 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))
return bleu_1_gram, bleu_2_gram, bleu_3_gram, bleu_4_gram
# 生成文本
generated_text = ["This", "is", "some", "generated", "text"]
# 参考文本列表
reference_texts = [["This", "is", "a", "reference", "text"]]
# 计算 Bleu 指标
c_bleu = cumulative_bleu(reference_texts, generated_text)
# 打印结果
print("The Bleu score is:", c_bleu)
#The Bleu score is: (0.6, 0.387, 1.5e-102, 9.2e-155)

ROUGE

ROUGE指标与BLEU指标非常类似,均可用来衡量生成结果和标准结果的匹配程度,不同的是ROUGE基于召回率,BLEU更看重准确率。

ROUGE也分为四种方法:ROUGE-N, ROUGE-L, ROUGE-W, ROUGE-S

这里仅介绍ROUGE-N

还是举个简单例子说明:

使用ROUGE-1进行匹配:

  • candidate: {it, is, a, nice, day, today}

  • reference: {today, is, a, nice, day}

  • 结果:其中{today, is, a, nice, day}匹配,所以匹配度为5/5=1,这说明生成的内容完全覆盖了参考文本中的所有单词,质量较高

代码实现

先安装工具包pip install rouge

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import Rouge
# 生成文本
generated_text = "This is some generated text."
# 参考文本列表
reference_texts = ["This is another generated reference text."]
# 计算 ROUGE 指标
rouge = Rouge()
scores = rouge.get_scores(generated_text, reference_texts[0])
# 打印结果
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

PPL

困惑都(perplexity)

PPL用来度量一个概率分布或概率模型预测样本的好坏程度

给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好

公式:

两种形式

从公式可以看出,句子概率越大,语言模型越好,困惑度越小

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import math
# 定义语料库
sentences = [
['I', 'have', 'a', 'pen'],
['He', 'has', 'a', 'book'],
['She', 'has', 'a', 'cat']
]
# 定义语言模型
unigram = {'I': 1/12, 'have': 1/12, 'a': 3/12, 'pen': 1/12,'He': 1/12, 'has': 2/12,'book': 1/12,'She': 1/12, 'cat': 1/12}
# 计算困惑度
perplexity = 0
for sentence in sentences:
sentence_prob = 1
for word in sentence:
sentence_prob *= unigram[word]
temp = -math.log(sentence_prob, 2)/len(sentence)
perplexity+=2**temp
perplexity = perplexity/len(sentences)
print('困惑度为:', perplexity)
# 困惑度为: 8.15

LLM架构类别

这一块内容比较多,分开几章讲,这里简单介绍

LLM本身基于Transformer架构,原始Transformer为不同领域模型提供了灵感和启发

基于原始Transformer衍生出一系列模型,一些模型仅使用encoder,一些模型仅使用decoder,有些模型同时使用encoder和decoder

LLM大致可以分为三种:自编码模型(encoder)、自回归模型(decoder)和序列到序列模型(encoder-decoder)