第2章:大语言模型(LLM)基础 2.1 LLM 概述 2.1.1 LLM 的定义与特点 大语言模型(Large Language Models,LLMs)是一类基于深度学习技术,通过海量文本数据训练而成的自然语言处理模型。它们能够理解、生成和操纵人类语言,展现出近乎人类水平的语言能力。 LLM 的主要特点包括: 规模巨大:通常包含数十亿到数万亿个参数。 自监督学习:主要通过预测下一个词的任务进行训练,无需大量标注数据。 上下文学习:能够理解和利用长文本上下文信息。 少样本学习:能够快速适应新任务,无需大量针对性训练数据。 多任务能力:单一模型可以执行多种不同类型的自然语言处理任务。 涌现能力:随着规模增大,展现出一些意想不到的新能力。
大语言模型(Large Language Models,LLMs)是一类基于深度学习技术,通过海量文本数据训练而成的自然语言处理模型。它们能够理解、生成和操纵人类语言,展现出近乎人类水平的语言能力。
LLM 的主要特点包括:
LLM 的基本工作原理可以用以下数学公式简要表示:
给定输入序列 x = (x_1, ..., x_t),LLM 预测下一个词的概率分布:
P(x_{t+1}|x_1, ..., x_t) = \text{softmax}(W h_t + b)
其中 h_t 是模型的隐藏状态,W 和 b 是可学习的参数。
目前,主流的 LLM 模型主要包括:
GPT(Generative Pre-trained Transformer)系列
BERT(Bidirectional Encoder Representations from Transformers)系列
T5(Text-to-Text Transfer Transformer)
LaMDA(Language Model for Dialogue Applications)
PaLM(Pathways Language Model)
LLaMA(Large Language Model Meta AI)
比较表格:
| 模型 | 开发者 | 参数规模 | 主要特点 | 适用场景 |
|---|---|---|---|---|
| GPT-3 | OpenAI | 175B | 强大的生成能力 | 文本生成、对话、翻译 |
| BERT | 340M | 双向上下文理解 | 文本分类、问答、情感分析 | |
| T5 | 11B | 统一的文本到文本框架 | 多任务 NLP | |
| LaMDA | 137B | 对话优化 | 聊天机器人、对话系统 | |
| PaLM | 540B | 强大的推理能力 | 复杂问题解决、代码生成 | |
| LLaMA | Meta | 65B | 开源、高效 | 研究、定制应用 |
LLM 展现出了许多令人印象深刻的能力,但同时也存在一些局限性。
能力:
局限性:
LLM 能力和局限性的可视化:
Transformer 架构是现代 LLM 的基础,它由 Vaswani 等人在 2017 年提出,通过自注意力机制实现了并行处理和长距离依赖建模。
Transformer 的核心组件:
Transformer 架构图:
自注意力机制是 Transformer 的核心,它允许模型在处理序列时考虑所有位置的信息。
自注意力的计算过程:
多头注意力通过并行计算多个自注意力,然后拼接结果,增加了模型的表达能力:
\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O
其中 \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)
LLM 的训练通常分为两个阶段:预训练和微调。
预训练:
预训练损失函数(以下一词预测为例):
L = -\sum_{i} \log P(x_i|x_{<i})
微调:
微调过程可以表示为:
\theta_t = \theta_{t-1} - \alpha \nabla_{\theta} L(\theta)
其中 \theta 是模型参数,\alpha 是学习率,L 是任务特定的损失函数。
预训练和微调的过程可以用以下图表示:
零样本学习(Zero-shot Learning)是 LLM 的一种强大能力,它允许模型在没有见过特定任务的训练样本的情况下,直接执行该任务。
原理:
示例(使用 OpenAI API 进行零样本分类):
import openai openai.api_key = 'your_api_key_here' def zero_shot_classification(text, categories): prompt = f"请将以下文本分类到这些类别之一:{', '.join(categories)}。\n\n文本:{text}\n\n类别:" response = openai.Completion.create( engine="text-davinci-002", prompt=prompt, max_tokens=10, n=1, stop=None, temperature=0.5, ) return response.choices[0].text.strip() # 使用示例 text = "苹果公司发布了新款 iPhone,引起了消费者的广泛关注。" categories = ["科技", "娱乐", "体育", "政治"] result = zero_shot_classification(text, categories) print(f"分类结果:{result}")
少样本学习(Few-shot Learning)允许 LLM 通过少量示例快速适应新任务。
原理:
示例(使用 OpenAI API 进行少样本情感分析):
import openai openai.api_key = 'your_api_key_here' def few_shot_sentiment_analysis(text): prompt = """ 请判断以下评论的情感倾向。 评论:这部电影太棒了,我非常喜欢! 情感:积极 评论:服务态度很差,再也不会光顾了。 情感:消极 评论:这本书还行,但不算特别出色。 情感:中性 评论:""" + text + """ 情感: """ response = openai.Completion.create( engine="text-davinci-002", prompt=prompt, max_tokens=10, n=1, stop=None, temperature=0.5, ) return response.choices[0].text.strip() # 使用示例 text = "这家餐厅的食物味道一般,但是环境很好。" result = few_shot_sentiment_analysis(text) print(f"情感分析结果:{result}")
提示工程(Prompt Engineering)是优化 LLM 输入以获得更好输出的技术。
关键技巧:
示例(使用提示工程改进文本摘要):
import openai openai.api_key = 'your_api_key_here' def improved_summarization(text): prompt = f""" 请按照以下步骤为给定的文本生成一个简洁的摘要: 1. 识别文本的主要主题 2. 提取关键信息点(不超过3个) 3. 用一到两句话总结主要内容 4. 确保摘要清晰、准确,并保持中立的语气 文本: {text} 摘要: """ response = openai.Completion.create( engine="text-davinci-002", prompt=prompt, max_tokens=150, n=1, stop=None, temperature=0.7, ) return response.choices[0].text.strip() # 使用示例 long_text = """ 人工智能(AI)正在迅速改变各个行业的面貌。在医疗领域,AI 辅助诊断系统能够快速分析医学影像,提高疾病检测的准确性。在金融sector,机器学习算法被用于预测市场趋势和识别欺诈行为。教育方面,个性化学习平台利用 AI 技术为学生提供量身定制的学习计划。然而,AI 的广泛应用也带来了一系列挑战,如隐私保护、算法偏见和就业市场变革等问题。专家们呼吁,在推进 AI 技术发展的同时,也要注重制定相关的伦理准则和监管框架。 """ summary = improved_summarization(long_text) print(f"生成的摘要:\n{summary}")
评估 LLM 的性能是一个复杂的任务,需要考虑多个方面。以下是一些常用的评估指标:
困惑度是评估语言模型质量的一个基本指标,它衡量模型对测试集的预测能力。
数学定义:
\text{PPL} = \exp(-\frac{1}{N}\sum_{i=1}^N \log p(x_i|x_{<i}))
其中,N 是序列长度,p(x_i|x_{<i}) 是模型对第 i 个词的预测概率。
特点:
Python 实现示例:
import numpy as np def calculate_perplexity(probabilities): return np.exp(-np.mean(np.log(probabilities))) # 假设这是模型对一个序列中每个词的预测概率 word_probabilities = [0.1, 0.2, 0.05, 0.3, 0.15] perplexity = calculate_perplexity(word_probabilities) print(f"Perplexity: {perplexity}")
BLEU(Bilingual Evaluation Understudy)主要用于评估机器翻译质量,但也可用于其他文本生成任务。
计算步骤:
数学表达:
\text{BLEU} = \text{BP} \cdot \exp(\sum_{n=1}^N w_n \log p_n)
其中,\text{BP} 是简短惩罚因子,w_n 是权重,p_n 是 n-gram 精确度。
特点:
Python 实现示例(使用 NLTK 库):
from nltk.translate.bleu_score import sentence_bleu reference = [['这', '是', '一个', '测试', '句子']] candidate = ['这', '是', '一个', '测试'] score = sentence_bleu(reference, candidate) print(f"BLEU score: {score}")
尽管自动评估指标很有用,但人工评估仍然是评估 LLM 输出质量的重要方法。
常用人工评估维度:
评分标准示例:
| 分数 | 描述 |
|---|---|
| 5 | 优秀 - 完全满足要求,无明显缺陷 |
| 4 | 良好 - 基本满足要求,有minor缺陷 |
| 3 | 一般 - 部分满足要求,有明显缺陷 |
| 2 | 差 - 勉强满足要求,有重大缺陷 |
| 1 | 很差 - 完全不满足要求 |
人工评估流程:
实施人工评估的注意事项:
评估结果分析示例代码:
import numpy as np from scipy import stats def analyze_human_evaluation(scores): mean_score = np.mean(scores) median_score = np.median(scores) std_dev = np.std(scores) # 计算评分者间一致性(使用肯德尔和谐系数) kendall_w = stats.kendalltau(scores).correlation print(f"平均分: {mean_score:.2f}") print(f"中位数: {median_score:.2f}") print(f"标准差: {std_dev:.2f}") print(f"评分者间一致性 (Kendall's W): {kendall_w:.2f}") # 绘制分数分布直方图 import matplotlib.pyplot as plt plt.hist(scores, bins=5, range=(1,6), align='left') plt.title("评分分布") plt.xlabel("分数") plt.ylabel("频次") plt.show() # 使用示例 scores = [4, 5, 3, 4, 5, 4, 3, 4, 5, 4] analyze_human_evaluation(scores)
综合使用自动评估指标和人工评估方法,可以全面地评估 LLM 的性能。自动指标提供了快速、可重复的评估手段,而人工评估则能捕捉到更细微的质量差异。在实际应用中,应根据具体任务和资源情况,选择合适的评估策略。
随着 LLM 技术的不断发展,评估方法也在不断演进。未来可能会出现更加精细和全面的评估框架,以更好地衡量 LLM 在各种复杂任务中的表现。同时,如何评估 LLM 的安全性、公平性和道德性也将成为重要的研究方向。