大语言模型 (英文:Large Language Model,缩写LLM) 是一种人工智能模型, 旨在理解和生成人类语言. 大语言模型可以处理多种自然语言任务,如文本分类、问答、翻译、对话等等。
💥通常,大语言模型 (LLM) 是指包含数千亿 (或更多) 参数的语言模型(目前定义参数量超过10B的模型为大语言模型),这些参数是在大量文本数据上训练的,例如模型 GPT-3、ChatGPT、PaLM、BLOOM和 LLaMA等.
💥截止2023年,语言模型发展走过了三个阶段:
🗨️语言模型(Language Model)旨在建模词汇序列的生成概率,提升机器的语言智能水平,使机器能够模拟人类说话、写作的模式进行自动文本输出。
通俗理解: 用来计算一个句子的概率的模型,也就是判断一句话是否是人话的概率.
标准定义:对于某个句子序列, 如S = {W1, W2, W3, …, Wn}, 语言模型就是计算该序列发生的概率, 即P(S). 如果给定的词序列符合语用习惯, 则给出高概率, 否则给出低概率
举例说明:
表示词典,
={大家、去、图书馆、学习},
属于
。语言模型描述:给定词典
, 能够计算出任意单词序列
是一句话的概率
, 其中
呢?最简单的方法就是计数,假设数据集中共有
个句子,我们可以统计一下数据集中
每个句子出现的次数,如果假设为
,则
. 那么可以想象一下,这个模型的预测能力几乎为0,一旦单词序列没在之前数据集中出现过,模型的输出概率就是0,显然相当不合理。
可以表示为:
如果能计算
,那么就能轻松得到
, 所以在某些文献中,我们也可以看到语言模型的另外一个定义:能够计算出
的模型就是语言模型。
从文本生成角度,也可以这样定义语言模型:给定一个短语(一个词组或者一句话),语言模型可以生成(预测)接下来的一个词。
基于语言模型技术的发展,可以将语言模型分为四种类型:
由人工设计特征并使用统计方法对固定长度的文本窗口序列进行建模分析,这种建模方式也被称为N-gram语言模型。在上述例子中计算句子序列概率我们使用链式法则计算, 该方法存在两个缺陷:
的可能性太多,无法估算,也不一定有用
💯为了解决上述问题,引入马尔科夫假设:随意一个词出现的概率只与它前面出现的有限的一个或者几个词有关。
在实践中用的最多的就是bigram和trigram,接下来以bigram语言模型为例,理解其工作原理:
,我们要先计数即
,然后计数
, 再用除法可得到概率。
,计算过程如下显示:(其他参数计算过程类似)
,因此mask = 篮球,对比真实语境下,也符合人类习惯。
N-gram语言模型的特点:
💫伴随着神经网络技术的发展,人们开始尝试使用神经网络来建立语言模型进而解决N-gram语言模型存在的问题。
一个最基础的神经网络架构:
就是前n-1个词。现在需要根据这已知的n-1个词预测下一个词
。
表示
所对应的词向量.
这n-1个向量首尾拼接起来形成一个
大小的向量,记作
.
这个激活函数进行处理。
个节点 (
代表语料的词汇),本质上这个输出层也是一个全连接层。每个输出节点
表示下一个词语为
的未归一化log 概率。最后使用 softmax 激活函数将输出值
进行归一化。得到最大概率值,就是我们需要预测的结果。
神经网络特点:
💫Transformer模型由一些编码器和解码器层组成,学习复杂语义信息的能力强,很多主流预训练模型在提取特征时都会选择Transformer结构,并产生了一系列的基于Transformer的预训练模型,包括GPT、BERT、T5等.这些模型能够从大量的通用文本数据中学习大量的语言表示,并将这些知识运用到下游任务中,获得了较好的效果.
预训练语言模型的使用方式:
预训练语言模型的特点:
随着对预训练语言模型研究的开展,人们逐渐发现可能存在一种标度定律(Scaling Law),即随着预训练模型参数的指数级提升,其语言模型性能也会线性上升。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系列,等等。
大语言模型的特点:
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: It is a nice day today
reference: Today is a nice day
candidate: {it, is, a, nice, day, today}
reference: {today, is, a, nice, day}
结果:
其中{today, is, a, nice, day}匹配,所以匹配度为5/6
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
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
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
对匹配的N-grams
计数进行修改,以确保它考虑到reference
文本中单词的出现,而非奖励生成大量合理翻译单词的候选结果.
candidate: the the the the
reference: The cat is standing on the ground
如果按照1-gram的方法进行匹配,则匹配度为1,显然是不合理的,所以计算某个词的出现次数进行改进
表示在机器译文(candidate)中出现的第
个词语,
则代表在机器译文中这个词语出现的次数,而
则代表在人工译文(reference)中这个词语出现的次数。
python代码实现:
# 第一步安装nltk的包-->pip install nltk
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))
# 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 = "This is some generated text."
# 参考文本列表
reference_texts = ["This is a reference text.", "This is another reference text."]
# 计算 Bleu 指标
c_bleu = cumulative_bleu(reference_texts, generated_text)
# 打印结果
print("The Bleu score is:", c_bleu)
# The Bleu score is: (0.8571, 0.6900, 0.5711, 0.4920)
ROUGE指标是在机器翻译、自动摘要、问答生成等领域常见的评估指标。ROUGE通过将模型生成的摘要或者回答与参考答案(一般是人工生成的)进行比较计算,得到对应的得分。
ROUGE指标与BLEU指标非常类似,均可用来衡量生成结果和标准结果的匹配程度,不同的是ROUGE基于召回率,BLEU更看重准确率。
ROUGE分为四种方法:ROUGE-N, ROUGE-L, ROUGE-W, ROUGE-S.
下面举例说计算过程(这里只介绍ROUGE_N):
candidate: It is a nice day today
reference: Today is a nice day
candidate: {it, is, a, nice, day, today}
reference: {today, is, a, nice, day}
结果:
:其中{today, is, a, nice, day}匹配,所以匹配度为5/5=1,这说明生成的内容完全覆盖了参考文本中的所有单词,质量较高。
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
PPL用来度量一个概率分布或概率模型预测样本的好坏程度。
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
}
# 计算困惑度
perplexity = 0
for sentence in sentences:
sentence_prob = 1
for word in sentence:
sentence_prob *= unigram[word]
sentence_perplexity = 1/sentence_prob
perplexity += math.log(sentence_perplexity, 2) #以2为底
perplexity = 2 ** (-perplexity/len(sentences))
print('困惑度为:', perplexity)
# 困惑度为: 0.000325