简介:这份PPT由清华大学人工智能研究院常务副院长孙茂松教授主讲,面向希望系统了解人工智能与大模型发展脉络的高校学生、研究人员及技术从业者,帮助读者建立从图灵测试到通用智能的完整认知框架。资源为1个PDF文件,压缩包约10.36MB,内容以课程讲义形式呈现,便于直接阅读与课堂对照。目前已有299人学习下载。PPT围绕“迈向通用智能的大模型技术”展开,梳理了图灵测试、2012年图像识别突破、2016年AlphaGo等关键节点,并深入讲解深度学习的三个层次——白手起家、预训练模型加大小联调、预训练大模型加一巨托众小。同时剖析GPT-3的语言生成能力与幻觉问题,结合AIGC的创造性、多样性、个性化特征及对联生成案例,展示大模型在内容生成中的实际表现。适合作为课程学习、专题汇报或技术调研的参考材料。
1. 从一份通论课件说起:大模型时代的技术地图该怎么画
很多人第一次接触大模型,是从一份通论性质的课件开始的。标题里这门“人工智能与大模型通论”,本质上不是教你调某个 API,而是帮你把从深度学习到大模型这条技术脉络串成一张地图。我带过几个刚转方向的同事,他们最大的问题不是不会写代码,而是不知道 Transformer、预训练、微调、对齐这些词各自站在流程的哪个位置,遇到问题该往哪一层找。这份课件类资料的价值就在这:它把“大模型是怎么从人工智能这个大筐里长出来的”讲清楚,让你后面动手时不至于拿着锤子找钉子。适合谁?适合已经会点 Python、想系统理解大模型全貌的工程师,也适合需要给团队做技术选型、得先建立共同语言的技术负责人。下面我按自己梳理这类通论内容的经验,把它拆成能落地对照的几块。
2. 通论课件的知识骨架:四层结构决定你后面怎么动手
2.1 从符号主义到连接主义:为什么现在的主流是大规模预训练
通论类内容一般会先铺一条历史线:早期人工智能靠规则和符号推理,后来统计学习起来,再到深度学习用神经网络端到端地学特征。这条线不是让你背年份,而是解释一个选型逻辑——为什么现在遇到问题,第一反应是“找个预训练模型微调”,而不是“写一堆 if-else”。因为连接主义路线在大规模数据和算力加持下,把特征工程这件事从人手里接过去了。课件里如果讲到这一层,你要抓住的关键词是“表示学习”:模型自己学到的中间表示,比人工设计的特征更能迁移到新任务。理解这点,后面看到“预训练+微调”范式就不会觉得是拍脑袋。
2.2 Transformer 为什么成了大模型的底座
通论课件绕不开 Transformer。我一般会提醒同事,别一上来就啃注意力公式,先理解它解决了什么问题:RNN 类模型串行处理,长序列上又慢又容易忘;Transformer 用自注意力让每个位置直接和所有位置交互,并行度高,长距离依赖也抓得住。课件里通常会画那个经典的编码器-解码器结构图,你要能对应到实际模型:BERT 类偏编码器,做理解任务;GPT 类偏解码器,做生成任务。这个区分直接决定你选基座模型的方向。下面这段伪代码帮你把自注意力的核心计算过一遍,不是让你手写,而是看懂课件里的公式在算什么。
import numpy as np def scaled_dot_product_attention(Q, K, V, mask=None): # Q, K, V 形状: [序列长度, 维度] d_k = Q.shape[-1] # 缩放点积,防止内积过大导致 softmax 梯度消失 scores = np.matmul(Q, K.T) / np.sqrt(d_k) if mask is not None: # 掩码位置填一个极小值,softmax 后趋近 0 scores = np.where(mask == 0, -1e9, scores) weights = np.exp(scores - np.max(scores, axis=-1, keepdims=True)) weights = weights / np.sum(weights, axis=-1, keepdims=True) return np.matmul(weights, V)逻辑说明:这段代码对应课件里“缩放点积注意力”那一页。Q是查询,K是键,V是值,三者都由输入线性变换得到。参数上,d_k是键的维度,除以它的平方根是原论文里的稳定化操作,你调参时如果发现注意力输出数值爆炸,先检查这里有没有漏掉缩放。mask用于解码器里遮住未来位置,做自回归生成时必加,否则模型会“偷看”答案。课件里如果只给公式,你可以用这段代码在本地跑一个小矩阵,直观感受权重是怎么分配的。
2.3 预训练、微调、对齐:三阶段各自在干什么
通论内容会把大模型训练拆成几个阶段,我习惯用一张表来对照,比纯文字好记。下面这张表是我根据常见课件结构整理的,参数列是你在实际项目里会碰到的调节点。
| 阶段 | 目标 | 数据形态 | 常见调节参数 |
|---|---|---|---|
| 预训练 | 学通用语言表示 | 海量无标注文本 | 学习率、批次大小、序列长度 |
| 监督微调 | 适配具体任务 | 任务标注数据 | 学习率(比预训练小)、训练轮数 |
| 对齐 | 让输出符合人类偏好 | 偏好对比数据 | 温度、奖励模型权重 |
这张表的价值在于:当你拿到一个业务需求,先判断它落在哪个阶段。比如做情感分类,通常微调就够了;要做对话助手,对齐阶段不能省。课件里如果讲到 RLHF,你重点理解“用人类偏好训练奖励模型,再用它指导生成模型”这个闭环,而不是纠结 PPO 的每个超参。
2.4 课件里那些“一笔带过”但你必须补上的概念
通论课件为了覆盖面,很多概念只给一句话。我列几个高频缺口,你对照着补:一是 tokenization,课件可能只说“分词”,但实际中 BPE、WordPiece 的选择直接影响模型对中文和代码的处理效果;二是位置编码,从绝对位置到旋转位置编码的演进,决定了模型能外推到多长上下文;三是混合精度训练,课件提一句“节省显存”,但你不懂 loss scaling 就会在复现时遇到梯度下溢。这些点不用一次吃透,但看到课件里出现时,知道该往哪个方向查。
3. 把课件变成可运行实验:本地复现的最小路径
3.1 环境准备:别在第一步就翻车
通论课件通常不教环境配置,但这是新手最容易卡住的地方。我一般建议用 conda 建独立环境,避免和系统 Python 打架。下面这套命令是我在多个项目里验证过的,版本不用完全照抄,但思路一致。
# 创建独立环境,指定 Python 版本 conda create -n llm-intro python=3.10 -y conda activate llm-intro # 安装深度学习框架,以 PyTorch 为例 # 注意:CUDA 版本要和你的显卡驱动匹配,别直接抄 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装 transformers 和数据集工具 pip install transformers datasets accelerate逻辑说明:第一行建环境,-n后面是环境名,你可以改成自己好记的。第二行激活。第三行装 PyTorch,这里的关键是--index-url指向的 CUDA 版本,cu118对应 CUDA 11.8,你得先用nvidia-smi看驱动支持到哪个版本,选高了会报错。第四行装 Hugging Face 生态的三个核心库:transformers提供模型和分词器,datasets管数据加载,accelerate帮你把训练放到 GPU 上。参数上,如果你没有 GPU,把第三行的cu118换成cpu,但后面实验规模要相应缩小。
3.2 用一个小模型跑通“加载-推理-微调”闭环
课件讲完理论,你得动手跑一遍才知道哪里会断。我选一个参数量小的模型做演示,这样在普通笔记本上也能跑。下面这段代码完成三件事:加载预训练模型和分词器、做一次推理、在一个小数据集上微调一步。
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset # 加载一个小型预训练模型,这里用 distilbert 做示例 model_name = "distilbert-base-uncased" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2) # 推理示例:把一句话编码后送进模型 inputs = tokenizer("this is a test sentence", return_tensors="pt") outputs = model(**inputs) print("logits shape:", outputs.logits.shape) # 应为 [1, 2] # 加载一个文本分类数据集,取一小部分 dataset = load_dataset("imdb", split="train[:200]") dataset = dataset.map(lambda x: tokenizer(x["text"], truncation=True, padding="max_length", max_length=128), batched=True) # 训练参数:小规模实验,轮数少,批次小 training_args = TrainingArguments( output_dir="./mini-ft", num_train_epochs=1, per_device_train_batch_size=8, logging_steps=10, save_steps=50, ) trainer = Trainer(model=model, args=training_args, train_dataset=dataset) trainer.train()逻辑说明:第一步加载分词器和模型,num_labels=2表示二分类,你换成自己的任务要改这个数。第二步推理,return_tensors="pt"让输出是 PyTorch 张量,outputs.logits的形状是[批次大小, 类别数],这里批次是 1。第三步加载数据集,split="train[:200]"只取前 200 条,避免跑太久。map里做分词,truncation=True截断超长文本,padding="max_length"补齐到固定长度,max_length=128是上限,你根据显存调。第四步训练参数,num_train_epochs=1只跑一轮,per_device_train_batch_size=8是单卡批次,显存不够就往下调。logging_steps和save_steps控制日志和保存频率。跑通这个闭环,你就把课件里“预训练+微调”的抽象概念落到了具体操作上。
3.3 参数怎么设:从课件里的“建议值”到你的实际值
课件里常给一些“推荐学习率 2e-5”之类的值,但直接抄往往效果不好。我一般按这个顺序调:先固定批次大小,把学习率在1e-5到5e-5之间试三四个点,看验证集损失下降曲线;然后调序列长度,它直接吃显存,长文本任务才需要拉满;最后看训练轮数,小数据集上 2 到 3 轮就够,多了会过拟合。下面这张表是我在小规模实验里常用的起点,你按任务改。
| 参数 | 小数据集起点 | 大数据集起点 | 调整方向 |
|---|---|---|---|
| 学习率 | 2e-5 | 1e-5 | 损失震荡就调小 |
| 批次大小 | 8 | 32 | 显存不够就减半 |
| 序列长度 | 128 | 512 | 任务需要长上下文才加 |
| 训练轮数 | 3 | 1 | 验证损失回升就停 |
注意:这张表是起点不是终点,你得看训练日志里的损失曲线来定。如果损失一直不降,先检查数据标签有没有错,再查学习率是不是太大。
4. 避坑与排查:通论课件不会告诉你的五个现实问题
4.1 现象:模型加载报显存不足,但显卡明明够大
原因:常见的是默认加载了全精度权重,或者分词时max_length设得太大,中间激活值撑爆显存。解决:加载模型时加torch_dtype=torch.float16用半精度,分词时把max_length降到任务实际需要的长度,训练时开梯度累积用时间换空间。
4.2 现象:微调后模型在验证集上表现还不如没微调
原因:学习率太大把预训练学到的表示冲掉了,或者训练数据太少导致过拟合。解决:把学习率降到1e-5甚至更低,加早停策略,验证损失连续几轮不降就停。另外检查数据预处理,标签和文本有没有错位。
4.3 现象:推理结果每次都不一样,没法复现
原因:生成任务里采样策略带随机性,do_sample=True时温度参数没固定。解决:做评估时设do_sample=False用贪心解码,或者固定随机种子。如果必须采样,把temperature和top_p记下来,别用默认值。
4.4 现象:中文任务上效果差,分词把词切碎了
原因:用了英文预训练模型的分词器,对中文按字切或者切得不合理。解决:换中文预训练模型,或者至少换一个在中文语料上训练过的分词器。课件里如果只讲英文例子,你得自己补这一步。
4.5 现象:训练损失正常下降,但生成文本重复啰嗦
原因:解码策略问题,贪心解码容易陷入重复循环。解决:改用束搜索或者带重复惩罚的采样,repetition_penalty设到 1.2 左右试试。这个坑在通论课件里通常不提,但实际做对话或摘要时必踩。
5. 从通论到进阶:用课件里的对齐思路做一次偏好微调
通论课件讲到对齐时,往往只给概念。我建议你动手做一次小规模的偏好微调,哪怕数据只有几十条,也能把“奖励模型”和“策略优化”的关系跑明白。具体做法:先准备一批“问题-较好回答-较差回答”的三元组,用较好和较差回答训练一个奖励模型,让它学会给回答打分;然后用这个奖励模型去指导生成模型,对生成结果打分并回传梯度。下面是一个简化流程的代码骨架。
# 假设已有 reward_model 和 policy_model # 这里只展示偏好微调的核心循环逻辑 for batch in preference_dataloader: # 生成回答 generated = policy_model.generate(batch["prompt"]) # 用奖励模型打分 rewards = reward_model(generated) # 策略梯度更新:奖励高的动作概率调大 loss = -torch.mean(rewards * policy_model.log_prob(generated)) loss.backward() optimizer.step()逻辑说明:这段代码省略了 PPO 的裁剪和 KL 惩罚,只保留最核心的“奖励加权对数概率”思想。rewards是奖励模型给的分数,log_prob是策略模型生成该回答的对数概率,两者相乘再取负号作为损失,梯度下降就会提高高奖励回答的概率。实际做的时候要加 KL 散度约束,防止策略跑偏太远。参数上,奖励模型的训练轮数别太多,否则它会过拟合到偏好数据上,反而限制策略模型。
验证方法:准备一批没参与训练的提示词,分别用微调前后的模型生成回答,人工或用一个独立的评估模型打分,看平均分有没有提升。如果提升不明显,先检查奖励模型是不是把好坏回答区分开了——可以单独测一下奖励模型在验证集上的准确率,低于 60% 就别往下走了。
我自己的习惯是,每学完一个通论概念,就找一个最小可运行的例子把它跑通,哪怕结果不完美。课件给你的是地图,但路得自己走一遍才知道哪里有坑。希望帮到你。
本文还有配套的精品资源,点击获取