LLMBook
PDF 原文 PDF LLMBook.pdf 保留原始文档,可在线查看或直接下载 查看 下载 [图片] 图 1 [图片] 图 2 [图片] 图 3 THE CHINESE BOOK FOR LARGE LANGUAGE MODELS 大语言模型 赵鑫李军毅周昆唐天一文继荣著 Copyright © RUC AI Bo…
作者:作家
THE CHINESE BOOK
FOR LARGE LANGUAGE MODELS
大语言模型
赵鑫李军毅周昆唐天一文继荣著
Copyright © RUC AI Box
前言
2022年底,ChatGPT震撼上线,大语言模型技术迅速“席卷”了整个社会,人
工智能技术因此迎来了一次重要进展。面对大语言模型的强大性能,我们不禁要
问:支撑这些模型的背后技术究竟是什么?这一问题无疑成为了众多科研人员的
思考焦点。
必须指出的是,大模型技术并不是一蹴而就,其发展历程中先后经历了统计语
言模型、神经网络语言模型、预训练语言模型等多个发展阶段,每一步的发展都凝
结了众多科研工作者的心血与成果。作为大语言模型技术的重要推动者,OpenAI
公司引领了本次技术变革,让我们再次回顾其针对大模型技术的研发历程。2015
年,OpenAI公司正式创立,开始探索通用人工智能的技术路线。早期的OpenAI
团队围绕强化学习、多模态、语言模型等几个重要方向进行了深入研究。其中,由
IlyaSutskever领导的团队主要关注语言模型的研究。当谷歌2017年推出基于注意
力机制的Transformer模型后,OpenAI团队迅速洞察到了其潜在的优越性,认为这
种模型可能是一种大规模可扩展训练的理想架构。基于此,OpenAI团队开始构建GPT系列模型,并于2018年推出了第一代GPT模型—GPT-1,能够通过“通用文本训练-特定任务微调”的范式去解决下游任务。接下来,GPT-2和GPT-3模型通
过扩大预训练数据和模型参数规模,显著提升了模型性能,并且确立了基于自然
语言形式的通用任务解决路径。在GPT-3的基础上,OpenAI又通过代码训练、人
类对齐、工具使用等技术对于模型性能不断升级,推出了功能强大的GPT-3.5系
列模型。2022年11月,ChatGPT正式上线,能够以对话形式解决多种任务,使得
用户能够通过网络API体验到语言模型的强大功能。2023年3月,OpenAI推出了
标志性的GPT-4模型,将模型能力提升至全新高度,并将其扩展至拥有多模态功
能的GPT-4V模型。
反观GPT系列模型的发展历程,有两点令人印象深刻。第一点是可拓展的训
练架构与学习范式:Transformer架构能够拓展到百亿、千亿甚至万亿参数规模,并且将预训练任务统一为预测下一个词这一通用学习范式;第二点是对于数据质量
与数据规模的重视:不同于BERT时代的预训练语言模型,这次大语言模型的成
功与数据有着更为紧密的关系,高质量数据、超大规模数据成为大语言模型的关
键基础。上述的思路看似简单,但能够从早期众多的技术路线中寻找到这条路线,
并且坚定地去执行这条路线,这就是OpenAI成功的关键所在。回顾OpenAI的早
期论文,实际上早在GPT-2的论文中,就深入讨论了基于大规模文本预训练的通
用任务学习范式,让人不禁感叹OpenAI团队的技术前瞻性。虽然这种研究模式很
难复制,但是值得我们去思考、学习。
OpenAI团队自GPT-3开始,就很少在公开的材料中提及相关技术细节,很
多技术报告主要是介绍评测相关的内容。到目前为止,关于GPT系列模型的核心
技术仍然难以完全解密。虽然有众多公司在尝试复刻GPT水平的大语言模型(如
Anthropic、Google等),但是整体来说,OpenAI仍然在大模型技术上有着较大的
领先性。根据SamAltman的公开采访介绍,尚未发布的GPT-5相比GPT-4将会有
重要的技术进步。如果事实如此,那么GPT-5的到来将再次拉大了与当前其他大
语言模型的差距,可能意味着人类向着通用人工智能又迈出了重要一步。
相信有很多人都会有一个共同的疑问:为什么GPT水平的大模型难训练?关
于为何GPT级别的大模型难以训练,许多人可能会首先想到算力的限制。确实,为
了训练百亿级别的高水平大模型,通常需要最少百卡级别的A100/A800(80G)资
源,而为了充分探索训练过程中的各种细节,往往需要有千卡级别的A100/A800
(80G)资源作为支撑。而对于千亿、万亿模型来说,所需要耗费的算力资源更是极
为庞大。目前,学术界面临的重大挑战是真正有充足资源去尝试预训练技术的团
队少之又少,因此导致了第一手经验匮乏,难以直接开展相关研究。
大模型训练涉及众多训练的细节,这些细节很多时候无法从已有科研论文中
直接获取。在统计学习时代,可以针对机器学习模型进行非常充分的实证研究,例
如使用栅格搜索参数的最优值、选择核函数、执行交叉验证等。通过广泛的调优
实验,研究人员很快就能积累充足的训练经验,进而形成对于这些统计机器学习
模型的深入理解。但是,大语言模型由于参数众多、组件复杂、训练过程也比较
复杂,早期的实验探索如果不引入任何先验知识,可能会导致指数级增长的实验
数量。然而,现实情况是,很多研究人员并没有足够的资源去完成一次完整的大
规模预训练实验,这使得掌握大模型技术的第一手经验变得尤为困难,更不用说
从零开始探索相关科研问题,极大限制了学术界在此次人工浪潮中所起到的作用。
目前,能力较强的大语言模型基本都源自工业界,这一趋势随着时间的推移可能
会变得更加明显。从第一手经验中“Know-How”,对于科研人员来说非常重要,只
有接触到技术核心,才能真正理解哪些问题是有意义的,并找到解决方案。
令人欣喜的是,无论是在学术界还是工业界,人们都逐渐认识到了“开放”的
重要性,能够看到越来越多的公开的基础模型、技术代码以及学术论文,有力地
推动了大模型技术的“透明化”。只有通过开放和共享,才能汇聚全人类的智慧,
共同推进人工智能技术的发展。实际上,根据现有公开的资料,大模型技术也是
“有章可循”的,如整体训练流程、数据清洗方法、指令微调技术、人类偏好对齐
算法等。根据这些技术,在算力资源支持下,研发人员已经能够较为顺利地完成
大模型的整体训练流程,并取得不错的模型效果。随着更多核心技术的揭示和开
放,大模型技术的“透明化”将进一步提高。
为了更好地整理和传播大模型技术的最新进展与技术体系,我们在2023年3
月发表了大语言模型综述文章《ASurveyofLargeLanguageModels》,并不断进行
更新完善。这篇综述文章已经更新到第13个版本,包含了83页的正文内容,并
收录了900余篇参考文献。自英文综述文章上线后,陆续有读者询问是否有对应
的中文版本。为此,我们于2023年8月发布了该综述(v10)的中文翻译版。在
2023年12月底,为了更好地提供大模型技术的中文参考资料,我们启动了中文书
的编写工作,并且于近日完成初稿。与英文综述文章的定位不同,中文版书籍更
注重为大模型技术的入门读者提供讲解,为此我们在内容上进行了大幅度的更新与重组,力图展现一个整体的大模型技术框架和路线图。本书适用于具有深度学习基础的高年级本科生以及低年级研究生使用,可以作为一本入门级的技术书籍。
在准备中文书的过程中,我们广泛阅读了现有的经典论文、相关代码和教材,
从中提炼出核心概念、主流算法与模型,并进行了系统性的组织与介绍。我们对于
每个章节的内容初稿都进行了多次修正,力求表达的清晰性与准确性。然而,在书
写过程中,我们深感自身能力与知识的局限性,尽管已经付出了极大的努力,但
难免会有遗漏或不当之处。本书的初版仅是一个起点,我们计划在网上持续进行
内容的更新和完善,并特别欢迎读者提出宝贵的批评与建议,也会同步在网站上
对于提出宝贵建议的读者进行致谢。我们将编写此书的过程当做一个自身的学习
过程,也希望能够通过本书与读者进行深入交流,向更多的行业同行学习。
总之,大模型技术正处于快速发展阶段,基础原理亟待探索、关键技术亟待
改善。对于科研人员而言,大模型研究工作充满了想象空间,令人为之神往。随
着技术的不断进步与共享开放,我们有理由相信,未来人工智能技术将取得更大
的进展,将在更多领域带来更为深远的影响。
作者
2024年3月31日
内容贡献
本书各章节的主要负责人和参与人名单如下:
第三章的负责人是闵映乾和杨晨,参与人有李军毅、周昆;
第四章的负责人是张君杰、侯宇蓬和周昆;
第五章的负责人是董梓灿,参与人有田震和唐天一;
第六章的负责人是唐天一和陈昱硕;
第七章的负责人是唐天一,参与人有成晓雪;
第八章的负责人是李军毅和陈志朋;
第九章的负责人是陈昱硕、刘沛羽和唐天一,参与人有周昆;
第十章的负责人是李军毅、汤昕宇和都一凡,参与人有王晓磊;
第十一章的负责人是任瑞阳和蒋锦昊,参与人有李军毅;
第十二章的负责人是张北辰和周昆,参与人有张高玮;
第十三章的负责人是周昆,参与人(按拼音字母排序)有蒋锦昊、李依凡、刘
子康、孙文奇、王禹淏、徐澜玲、杨锦霞和郑博文。
同时感谢其他参与本书编写、校对的同学,他们(按拼音字母排序)是曹乾、
曹展硕、陈杰、程伽雅琪、戴孙浩、邓欣、丁毅杰、冯雪扬、高泽峰、苟志斌、辜
子惠、郭歌扬、何东楠、侯新铭、胡译文、李炳黔、李成远、李欣潼、刘恩泽、刘
炯楠、刘子涵、罗文扬、梅朗、欧柯杉、彭涵、阮恺、苏炜航、孙一丁、汤奕如、
王家鹏、王磊、王淑婷、姚峰、尹彦彬、詹玉梁、张景森、张良、朱天宇和朱余韬。
本书在编写过程得到了中国人民大学大型科学仪器共享平台的算力资源支持,
在此对于陈跃国、鲁蔚征、石源三位老师表示衷心的感谢。
本书封面图片由AI工具辅助进行生成,制作人为徐澜玲。
符号表
𝑎标量(变量)
𝐴标量(常量)
A集合
𝒂向量
𝑎𝑖向量𝒂的第𝑖个元素
[𝑎1, 𝑎2, . . . , 𝑎𝑁] 序列
𝑨矩阵
𝒂𝑖矩阵𝑨的第𝑖行𝑨⊺矩阵𝑨的转置𝑨−1矩阵𝑨的逆
diag(𝒂)将向量𝒂转换为对角矩阵
∥·∥2向量、矩阵的2范数
⊙向量、矩阵逐元素相乘(哈达玛积)
⊕向量、矩阵拼接
⊗批次矩阵乘法
∗卷积
∇梯度
𝑁从𝑁个不同元素中取出𝐾个元素的组合数
𝐾𝑃(·)概率分布
𝑂(·)渐进上界符号
R实数集
E期望
目录
第一部分背景与基础知识1
第一章引言2
1.1 语言模型的发展历程. . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 大语言模型的能力特点. . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3大语言模型关键技术概览.........................8
1.4大语言模型对科技发展的影响.......................11
1.5 本书的内容组织. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
第二章基础介绍15
2.1 大语言模型的构建过程. . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.1 大规模预训练. . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.2 指令微调与人类对齐. . . . . . . . . . . . . . . . . . . . . . . . 17
2.2 扩展法则. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.1 KM 扩展法则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.2 Chinchilla 扩展法则. . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.3 关于扩展法则的讨论. . . . . . . . . . . . . . . . . . . . . . . . 21
2.3 涌现能力. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.1 代表性的涌现能力 . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.2涌现能力与扩展法则的关系....................24
2.4 GPT 系列模型的技术演变 . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.4.1 早期探索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.4.2 规模扩展. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.4.3 能力增强. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.4.4 性能跃升. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
第三章大语言模型资源32
3.1公开可用的模型检查点或API.......................32
3.1.1公开可用的通用大语言模型检查点................32
3.1.2 LLaMA 变体系列. . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.1.3 大语言模型的公共API . . . . . . . . . . . . . . . . . . . . . . . 39
3.2 常用的预训练数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2.1 网页 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2.2 书籍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.3 维基百科. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.4 代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.5 混合型数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3 常用微调数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.3.1 指令微调数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.3.2 人类对齐数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.4 代码库资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.4.1 Hugging Face 开源社区. . . . . . . . . . . . . . . . . . . . . . . 52
3.4.2 DeepSpeed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.4.3 Megatron-LM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.4.4 本书配套资源说明 . . . . . . . . . . . . . . . . . . . . . . . . . 54
第二部分预训练56
第四章数据准备57
4.1 数据来源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.1.1 通用文本数据. . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.1.2 专用文本数据. . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2 数据预处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.2.1 质量过滤. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.2.2 敏感内容过滤. . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2.3 数据去重. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.2.4数据对预训练效果的影响.....................65
4.2.5 数据预处理实践. . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3 词元化(分词). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.3.1 BPE 分词. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.3.2 WordPiece 分词 . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.3.3 Unigram 分词 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.3.4 分词器的选用. . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.4 数据调度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.4.1 数据混合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.4.2 数据课程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.4.3预训练数据准备概述——以YuLan模型为例...........79
第五章模型架构81
5.1 Transformer 模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.1.1 输入编码. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.1.2 多头自注意力机制 . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.1.3 前馈网络层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.1.4 编码器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.1.5 解码器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.2 详细配置. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
5.2.1 归一化方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
5.2.2 归一化模块位置. . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.2.3 激活函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.2.4 位置编码. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.2.5 注意力机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.2.6 混合专家模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.2.7 LLaMA 的详细配置. . . . . . . . . . . . . . . . . . . . . . . . . 97
5.3 主流架构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.3.1 编码器-解码器架构. . . . . . . . . . . . . . . . . . . . . . . . . 100
5.3.2 因果解码器架构. . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.3.3 前缀解码器架构. . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.4 长上下文模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.4.1 扩展位置编码. . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.4.2 调整上下文窗口. . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.4.3 长文本数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.5 新型模型架构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.5.1 参数化状态空间模型. . . . . . . . . . . . . . . . . . . . . . . . 108
5.5.2 状态空间模型变种 . . . . . . . . . . . . . . . . . . . . . . . . . 109
第六章模型预训练112
6.1 预训练任务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.1.1 语言建模. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.1.2 去噪自编码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.1.3 混合去噪器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.2 优化参数设置. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.2.1 基于批次数据的训练. . . . . . . . . . . . . . . . . . . . . . . . 116
6.2.2 学习率. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
6.2.3 优化器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.2.4 稳定优化技术. . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.3 可扩展的训练技术 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.3.1 3D 并行训练. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.3.2 零冗余优化器. . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
6.3.3 激活重计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.3.4 混合精度训练. . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.4模型参数量计算与效率分析........................123
6.4.1 参数量计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
6.4.2 训练运算量估计. . . . . . . . . . . . . . . . . . . . . . . . . . . 124
6.4.3 训练时间估计. . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
6.4.4 训练显存估计. . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
6.5 预训练代码实践. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
第三部分微调与对齐135
第七章指令微调136
7.1 指令数据的构建. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
7.1.1基于现有的NLP任务数据集构建.................136
7.1.2 基于日常对话数据构建. . . . . . . . . . . . . . . . . . . . . . . 138
7.1.3 基于合成数据构建 . . . . . . . . . . . . . . . . . . . . . . . . . 139
7.1.4指令数据构建的提升方法.....................142
7.1.5 指令微调的作用. . . . . . . . . . . . . . . . . . . . . . . . . . . 144
7.2 指令微调的训练策略. . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
7.2.1 优化设置. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
7.2.2 数据组织策略. . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
7.3 参数高效的模型微调. . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.3.1 低秩适配微调方法 . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.3.2 其他高效微调方法 . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.4 代码实践与分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
7.4.1 指令微调的代码实践. . . . . . . . . . . . . . . . . . . . . . . . 153
7.4.2 指令微调的实验性分析. . . . . . . . . . . . . . . . . . . . . . . 157
7.4.3 LoRA 代码实践与分析. . . . . . . . . . . . . . . . . . . . . . . 160
第八章人类对齐164
8.1 人类对齐的背景与标准. . . . . . . . . . . . . . . . . . . . . . . . . . . 164
8.1.1 背景 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
8.1.2 对齐标准. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
8.2基于人类反馈的强化学习.........................167
8.2.1 RLHF 概述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
8.2.2 人类反馈数据的收集. . . . . . . . . . . . . . . . . . . . . . . . 169
8.2.3 奖励模型的训练. . . . . . . . . . . . . . . . . . . . . . . . . . . 171
8.2.4 强化学习训练. . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
8.2.5 代表性RLHF 工作介绍. . . . . . . . . . . . . . . . . . . . . . . 181
8.2.6 进阶RLHF 工作介绍. . . . . . . . . . . . . . . . . . . . . . . . 183
8.3 非强化学习的对齐方法. . . . . . . . . . . . . . . . . . . . . . . . . . . 185
8.3.1 对齐数据的收集. . . . . . . . . . . . . . . . . . . . . . . . . . . 186
8.3.2 代表性监督对齐算法DPO . . . . . . . . . . . . . . . . . . . . . 187
8.3.3 其他有监督对齐算法. . . . . . . . . . . . . . . . . . . . . . . . 193
8.4 关于SFT 和RLHF 的进一步讨论. . . . . . . . . . . . . . . . . . . . . 194
8.4.1基于学习方式的总体比较.....................195
8.4.2 SFT 的优缺点. . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
8.4.3 RLHF 的优缺点. . . . . . . . . . . . . . . . . . . . . . . . . . . 196
第四部分大模型使用198
第九章解码与部署199
9.1 解码策略. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
9.1.1 背景 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
9.1.2 贪心搜索的改进. . . . . . . . . . . . . . . . . . . . . . . . . . . 201
9.1.3 随机采样的改进策略. . . . . . . . . . . . . . . . . . . . . . . . 202
9.1.4 实际使用设置. . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
9.2 解码加速算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
9.2.1 解码效率分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
9.2.2 系统级优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
9.2.3 解码策略优化. . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
9.2.4 解码代码实践. . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
9.3 低资源部署策略. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
9.3.1 量化基础知识. . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
9.3.2 大模型训练后量化方法. . . . . . . . . . . . . . . . . . . . . . . 219
9.3.3 经验性分析与相关结论. . . . . . . . . . . . . . . . . . . . . . . 224
9.4 其他模型压缩方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
9.4.1 模型蒸馏. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
9.4.2 模型剪枝. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
第十章提示学习233
10.1 基础提示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
10.1.1 人工提示设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
10.1.2 自动提示优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
10.2 上下文学习. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
10.2.1上下文学习的形式化定义.....................243
10.2.2 示例设计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
10.2.3 底层机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
10.3 思维链提示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
10.3.1 思维链提示的基本形式. . . . . . . . . . . . . . . . . . . . . . 251
10.3.2 思维链提示的优化策略. . . . . . . . . . . . . . . . . . . . . . 252
10.3.3关于思维链的进一步讨论.....................255
第十一章规划与智能体258
11.1 基于大语言模型的规划. . . . . . . . . . . . . . . . . . . . . . . . . . 258
11.1.1 整体框架. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
11.1.2 方案生成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
11.1.3 反馈获取. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
11.2基于大语言模型的智能体.........................264
11.2.1 智能体概述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
11.2.2大语言模型智能体的构建.....................265
11.2.3 多智能体系统的构建 . . . . . . . . . . . . . . . . . . . . . . . 268
11.2.4大语言模型智能体的典型应用..................270
11.2.5 待解决的关键技术问题. . . . . . . . . . . . . . . . . . . . . . 271
第五部分评测与应用274
第十二章评测275
12.1 评测指标与评测方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
12.1.1 常见评测指标 . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
12.1.2 评测范式与方法. . . . . . . . . . . . . . . . . . . . . . . . . . 281
12.2 基础能力评测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
12.2.1 语言生成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
12.2.2 知识利用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
12.2.3 复杂推理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
12.3 高级能力评测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
12.3.1 人类对齐. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
12.3.2 环境交互. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
12.3.3 工具使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
12.4 公开综合评测体系. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
12.4.1 MMLU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
12.4.2 BIG-Bench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
12.4.3 HELM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
12.4.4 C-Eval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
12.4.5 其他评测数据集与资源. . . . . . . . . . . . . . . . . . . . . . 315
12.4.6 公开评测资源选择参考. . . . . . . . . . . . . . . . . . . . . . 317
12.4.7 评测代码实践 . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
第十三章应用320
13.1大语言模型在研究领域的应用......................320
13.1.1传统自然语言处理任务中的大语言模型.............320
13.1.2信息检索中的大语言模型.....................322
13.1.3推荐系统中的大语言模型.....................326
13.1.4 多模态大语言模型. . . . . . . . . . . . . . . . . . . . . . . . . 329
13.1.5知识图谱增强的大语言模型...................333
13.2大语言模型在专业领域的应用......................336
13.2.1医疗场景下的大语言模型.....................336
13.2.2教育场景下的大语言模型.....................339
13.2.3法律场景下的大语言模型.....................340
13.2.4金融场景下的大语言模型.....................341
13.2.5科学研究场景下的大语言模型..................343
第十四章总结345
参考文献350
第一部分
背景与基础知识
第一章引言
人类主要使用语言进行表达与交流。语言能力通常在人类幼儿时代就已初步
形成,并且在人的一生中不断发展与完善[1,2]。为了使计算机能够与人类进行有
效交流,科研人员一直致力于研发具有类人语言能力的人工智能(ArtificialIntelli-
gence,AI)算法,使之能够掌握以自然语言形式进行沟通与交流。让机器拥有像人
类一样阅读、理解、写作和交流的能力是一个长期的研究挑战[3]。
从技术路径上来说,语言模型(LanguageModel,LM)是提升机器语言智能
(LanguageIntelligence)的主要技术途径之一,全书将聚焦这一主题展开讨论。本
章将主要回顾语言模型的发展历程,并且介绍大语言模型与传统语言模型的不同
之处及其对于科研发展所带来的机遇与挑战。
1.1语言模型的发展历程
一般来说,语言模型旨在对于人类语言的内在规律进行建模,从而准确预测
词序列中未来(或缺失)词或词元(Token)的概率。根据所采用技术方法的不同,
针对语言模型的研究工作可以分为以下四个主要发展阶段:
•统计语言模型(StatisticalLanguageModel,SLM).在20世纪90年代兴起的
统计语言模型[4,5]是基于统计学习方法研发的。具体来说,统计语言模型使用马
尔可夫假设(MarkovAssumption)来建立语言序列的预测模型,通常是根据词序
列中若干个连续的上下文单词来预测下一个词的出现概率,即根据一个固定长度
的前缀来预测目标单词。具有固定上下文长度𝑛的统计语言模型通常被称为𝑛元
(𝑛-gram)语言模型,如二元或三元语言模型。统计语言模型被广泛应用于信息检索
(Information Retrieval, IR)和自然语言处理(Natural Language Processing, NLP)等领
域的早期研究工作。对于高阶统计语言模型来说,随着阶数𝑛的增加,需要估计的转移概率项数将会指数级增长,经常会受到“维数灾难”(CurseofDimensionality)
的困扰。为了缓解数据稀疏问题,需要设计专门的语言模型平滑策略,如回退估
计(Back-off Estimation)和古德-图灵估计(Good-Turing Estimation)。然而平滑方
法对于高阶上下文的刻画能力仍然较弱,无法精确建模复杂的高阶语义关系。
•神经语言模型(NeuralLanguageModel,NLM).神经语言模型[6,7]使用神经
网络来建模文本序列的生成,如循环神经网络(RecurrentNeuralNetworks,RNN)。图
1.1语言模型的发展历程
灵奖获得者YoshuaBengio在一项早期工作中[6]引入了分布式词表示(Distributed
WordRepresentation)这一概念,并构建了基于聚合上下文特征(即分布式词向量)
的目标词预测函数。分布式词表示使用低维稠密向量来表示词汇的语义,这与基
于词典空间的稀疏词向量表示(One-HotRepresentation)有着本质的不同,能够刻
画更为丰富的隐含语义特征。同时,稠密向量的非零表征对于复杂语言模型的搭
建非常友好,能够有效克服统计语言模型中的数据稀疏问题。分布式词向量又称为“词嵌入”(WordEmbedding)。这种基于隐含语义特征表示的语言建模方法为自然
语言处理任务提供了一种较为通用的解决途径。在这一系列工作中,word2vec[8,
9]是一个具有代表性的词嵌入学习模型,它构建了一个简化的浅层神经网络来学
习分布式词表示,所学习到的词嵌入可以用作后续任务的语义特征提取器,在自
然语言处理任务中得到了广泛使用,取得了显著的性能提升。这些创新性的研究
工作将语言模型用于文本表示学习(超越了原始的词序列建模目标),在自然语言
处理领域产生了重要影响。
| 1 | 0000 GPT-4 8000 LLaMA 1500 ChatGPT GPT-4 6000 InstructGPT 1000 LLaMA 4000 Codex ChatGPT 2000 GPT-3 500 T5 InstructGPT GPT-1GPT-2 T5 GPT-3 Codex 0 BERT 0 2018 2019 2020 2021 2022 2023 2020 2021 2022 2023 | 00 | ||||||||||||||
| GPT-4 | ||||||||||||||||
| 00 | L Chat | LaMA GPT | ||||||||||||||
| 00 | T | 5 | G | PT- | 3 | Co | I dex | nstructGPT | ||||||||
| 0 | ||||||||||||||||
| GPT-4 LLaMA | ||||||||
| ChatGPT | ||||||||
| InstructG | PT | |||||||
| G | Codex PT-3 | |||||||
| G | PT-1G | PT- | T5 2 | |||||
| BERT |
(a) 查询=“Language model” (b) 查询=“Large language model”
图1.1标题中包含查询短语“LanguageModel”(从2018年6月起)和“LargeLanguageModel”(从2019年10月起)的arXiv论文累计数量的变化趋势(图片来源:[10])
•预训练语言模型(Pre-trainedLanguageModel,PLM).与早期的词嵌入模型相
比,预训练语言模型在训练架构与训练数据两个方面进行了改进与创新。ELMo[11]
是一个早期的代表性预训练语言模型,提出使用大量的无标注数据训练双向LSTM
(BidirectionalLSTM,biLSTM)网络,预训练完成后所得到的biLSTM可以用来学
习上下文感知的单词表示,这与word2vec学习固定的词表示有着显著不同。进一
步,ELMo可以根据下游任务数据对biLSTM网络进行微调(Fine-Tuning),从而实
现面向特定任务的模型优化。然而,传统序列神经网络的长文本建模能力较弱,并
1.1语言模型的发展历程
GPT-3/4、ChatGPT、Claude
ELMO、BERT、GPT-1/2规模扩展带来性能重要提升通用的任务求解途径
任RNN-LM、word2vec有效捕捉上下文语义任务迁移性有了显著提升学习成本高、适配灵活性差
务求n-gram统计模型有效克服数据稀疏问题无监督学习语义特征表示仍然需要监督数据微调大语言模型
解具备一定生成能力辅助解决部分任务缺乏知识、可迁移性差预训练语言模型
能数据稀疏影响严重神经语言模型力统计语言模型
1990s 2013 2018 2022
图1.2基于任务求解能力的四代语言模型的演化过程(图片来源:[10])
且不容易并行训练,这些缺点限制了早期预训练模型(如ELMo)的性能。在2017
年,谷歌提出了基于自注意力机制(Self-Attention)的Transformer模型[12],通过
自注意力机制建模长程序列关系。Transformer的一个主要优势就是其模型设计对
于硬件非常友好,可以通过GPU或者TPU进行加速训练,这为研发大语言模型提
供了可并行优化的神经网络架构。基于Transformer架构,谷歌进一步提出了预训
练语言模型BERT[13],采用了仅有编码器的Transformer架构,并通过在大规模
无标注数据上使用专门设计的预训练任务来学习双向语言模型。在同期,OpenAI
也迅速采纳了Transformer架构,将其用于GPT-1[14]的训练。与BERT模型不同
的是,GPT-1采用了仅有解码器的Transformer架构,以及基于下一个词元预测的
预训练任务进行模型的训练。一般来说,编码器架构被认为更适合去解决自然语
言理解任务(如完形填空等),而解码器架构更适合解决自然语言生成任务(如文本摘要等)。以ELMo、BERT、GPT-1为代表的预训练语言模型确立了“预训练-微调”这一任务求解范式。其中,预训练阶段旨在通过大规模无标注文本建立模型
的基础能力,而微调阶段则使用有标注数据对于模型进行特定任务的适配,从而
更好地解决下游的自然语言处理任务。
•大语言模型(LargeLanguageModel,LLM).研究人员发现,通过规模扩展
(如增加模型参数规模或数据规模)通常会带来下游任务的模型性能提升,这种现象通常被称为“扩展法则”(ScalingLaw)[15]。一些研究工作尝试训练更大的预
训练语言模型(例如175B参数的GPT-3和540B参数的PaLM)来探索扩展语言
模型所带来的性能极限。这些大规模的预训练语言模型在解决复杂任务时表现出
了与小型预训练语言模型(例如330M参数的BERT和1.5B参数的GPT-2)不同的行为。例如,GPT-3可以通过“上下文学习”(In-ContextLearning,ICL)的方
式来利用少样本数据解决下游任务,而GPT-2则不具备这一能力。这种大模型具有但小模型不具有的能力通常被称为“涌现能力”(EmergentAbilities)。为了区
1.2大语言模型的能力特点
别这一能力上的差异,学术界将这些大型预训练语言模型命名为“大语言模型”1
(LargeLanguageModel,LLM)[16]。作为大语言模型的一个代表性应用,ChatGPT
将GPT系列大语言模型适配到对话任务中,展现出令人震撼的人机对话能力,一
经上线就取得了社会的广泛关注。ChatGPT发布后,与大语言模型相关的arXiv论
文数量迅速增长(如图1.1所示),这一研究方向受到了学术界的高度关注。
通过回顾上述发展历程,可以看到语言模型并不是一个新的技术概念,而是
历经了长期的发展历程。早期的语言模型主要面向自然语言的建模和生成任务,而最新的语言模型(如GPT-4)则侧重于复杂任务的求解。从语言建模到任务求解,这是人工智能科学思维的一次重要跃升,是理解语言模型前沿进展的关键所
在。图1.2通过任务求解能力的角度对比了四代语言模型所表现出的能力优势与
局限性。首先,早期的统计语言模型主要被用于(或辅助用于)解决一些特定任
务,主要以信息检索、文本分类、语音识别等传统任务为主。随后,神经语言模型
专注于学习任务无关的语义表征,旨在减少人类特征工程的工作量,可以大范围
扩展语言模型可应用的任务。进一步,预训练语言模型加强了语义表征的上下文
感知能力,并且可以通过下游任务进行微调,能够有效提升下游任务(主要局限
于自然语言处理任务)的性能。随着模型参数、训练数据、计算算力的大规模扩
展,最新一代大语言模型的任务求解能力有了显著提升,能够不再依靠下游任务
数据的微调进行通用任务的求解。综上所述,在语言模型的演化过程中,可以解
决的任务范围得到了极大扩展,所获得的任务性能得到了显著提高,这是人工智
能历史上的一次重要进步。
1.2大语言模型的能力特点
大语言模型的出现为科研人员再次带来了实现通用人工智能(ArtificialGen-
eralIntelligence)的曙光。尽管通用人工智能在学术界被广泛讨论与探索,但是之
前的机器学习算法的泛化性和通用性非常局限,只有大语言模型初步实现了通过
统一形式来解决各种下游任务。本部分内容将简要介绍一下大语言模型的主要能
力特点,特别是针对传统模型不具备的性能优势进行讨论。
•具有较为丰富的世界知识.与传统机器学习模型相比,大语言模型经过超大
规模文本数据的预训练后能够学习到较为丰富的世界知识。实际上,最早期的专
1值得注意的是,大语言模型不一定比小型预训练语言模型具有更强的任务效果,而且某些大语言模型中也可能不具有某种涌现能力。
1.2大语言模型的能力特点
家系统也是希望能够通过设计基于知识库与知识表示的推理引擎系统,进而解决
特定领域的应用任务。然而,当时所采用的技术路径主要是基于逻辑、规则以及
初期的机器学习算法,系统能力还比较局限,无法充分建模以及利用世界知识信
息。尽管早期的预训练模型(如BERT、GPT-1等)也是基于相似的预训练思路,
但是模型参数规模与数据规模都相对较小,无法充分学习到海量的世界知识。因
此,之前的预训练语言模型需要使用微调为主要手段来解决下游任务。
•具有较强的通用任务解决能力.大语言模型第二个代表性的能力特点是具有
较强的通用任务求解能力。大语言模型主要通过预测下一个词元的预训练任务进
行学习,虽然并没有针对特定的下游任务进行优化,却能够建立远强于传统模型
的通用任务求解能力。实际上,基于大规模无标注文本的下一个词元预测任务本
质上可以看作一个多任务学习过程[17],因为针对不同词元的预测任务可能涉及到情感分类(“...这部电影真好看”)、数值计算(“3+4=7”)、知识推理(“中国陆地面积最大的省份是新疆”)等非常多样的训练任务。由于具有通用的任务求解能
力,大语言模型深刻地影响了很多研究领域的科研范式。例如,在自然语言处理
领域,很多传统任务(如摘要、翻译等)都可以采用基于大语言模型的提示学习
方法进行解决,而且能够获得较好的任务效果,早期任务特定的解决方案已经被
逐步替代。
•具有较好的复杂任务推理能力.除了具有通用性外,大语言模型在复杂任务
中还展现出了较好的推理能力。例如,大语言模型能够回答知识关系复杂的推理
问题[18],还可以解决涉及复杂数学推理过程的数学题目[19]。在这些任务中,传
统方法的性能相对较差,为了提升与其相关的特定能力,往往需要针对性地修改
模型架构或者使用特定训练数据进行学习。相比之下,大语言模型在大规模文本
数据预训练后,能够展现出比传统模型更强的综合推理能力。尽管有些研究工作
认为大语言模型不具备真正的推理能力,而是通过“记忆”数据模式来进行任务
求解,但在许多复杂应用场景中(参阅微软针对GPT-4的测试报告[20]),大语言
模型展现出了令人震撼的推理性能,这种现象很难完全通过数据模式的记忆与组
合来进行解释。
•具有较强的人类指令遵循能力.大语言模型建立了自然语言形式的统一任务
解决模式:任务输入与执行结果均通过自然语言进行表达。通过预训练与微调两
个阶段的学习,大语言模型具备了较好的人类指令遵循能力,能够直接通过自然
语言描述下达任务指令(又称为“提示学习”)。在早期的对话系统中,指令遵循