前言:最近 LLM 大火,相关领域熟人都想往这个方向靠,好几个朋友咨询了这块,也有帮做模拟面试。最近有个哥们让我推荐对这个领域整体快速了解的资料。于是我就花了些时间整理资料,希望可以俯瞰当前 LLM 领域,能够给个整体的印象,如若对某个细分板块感兴趣,读者也可以找更深入的资料。
本文假设读者有一定相关领域的知识,至少是机器学习,深度学习,或者数据科学的经验。
Overview 概观
- 首先 Andrej 的 State of GPT 是必看的:对整个 LLM 的全景讲的很清晰,不亏是我辈 CS231n 的好老师,高屋建瓴
- W&B 关于 LLM 的 Tutorial 干货不少:Current Best Practices for Training LLMs from Scratch
- 两篇比较好的综述:
- An Overview on Language Models: Recent Developments and Outlook:偏训练技巧
- Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond:偏应用
前沿模型观摩
- GPT4 Technical Report:GPT4技术报告
- Spark of AGI[视频]:对 GPT4 的详细测评
- PALM2 Technical Report:PALM2技术报告
大概看看现在最好能做到什么程度,虽然细节干货少。
接着按不同模块分别推荐些我能想到的比较重要入门论文和资料,精力有限,肯定是挂一漏万,欢迎指正完善。
预训练
整体
预训练可先看一些经典基座模型训练流程:
- GPT3 论文:不用多说
- LLAMA:经历各种检验最靠谱英文模型,很多训练细节值得参考
- BloombergGPT:虽是金融领域模型,但各种思想都类似,很踏实,特别给训领域模型借鉴
- Transformer Math 101:很干的一篇关于训练中各种计算的博客,扎实
- [可选] 谷歌系的:PaLM,Flan-PaLM:一个预训练,一个指令微调,大公司还是挺多insight可学习
- [可选] BLOOM,BLOOMZ:可以大概看看,比较糙,特别是和大公司几篇对比
数据相关
- W&B 关于预训练数据处理较全面博客:Processing Data for Large Language Models
- 实际数据集参考,会有各种细节:
- ROOTS:BigScience 开源数据集
- The RefinedWeb Dataset:最近模型 Falcon 的数据集
- [可选] RedPajama:号称复刻 LLAMA,没有报告,更多都在源代码里面,可以简单看看有时间看代码
- [可选] The Stack:代码领域的数据集,感兴趣也值得一看
- 近期一些关于数据推荐论文:
- Scaling Data-Constrained Language Models
- A Pretrainer's Guide to Training Data: Measuring the Effects of Data Age, Domain Coverage, Quality, & Toxicity
训练相关
- Megatron-DeepSpeed:现在基本都基于这套框架训,有必要浏览下原论文
- DeepSpeed 相关:ZeRO优化器必看,可能看视频会更好理解些
- 混合精度及其他相关训练技巧:
- Performance and Scalability:How To Fit a Bigger Model and Train It Faster Hugging face相关博客
- 更多关于混合精度的讨论,Nvidia 相关文档,看2和3就行,关于 BF16 的讨论(结论能上BF16就上)
- lilian写的关于大规模分布式训练相关的综述:How to Train Really Large Models on Many GPUs?
Tokenization
- Huggingface 的 Tokenizers 的相关 Tutorial:看下面这几节就行
- Normalization and pre-tokenization
- Byte-Pair Encoding tokenization
- [感兴趣看] WordPiece tokenization
- [感兴趣看] Unigram tokenization
- Building a tokenizer, block by block
- [可选] SentencePiece 的 Readme,就是另一个训练词表的库
SFT(Supervised FineTuning)/Instruction Tuning
就是搜集到指令数据,然后直接 finetune 训练,难点在于在于怎么收集到较好的SFT数据。
主要可分成下面几种方法:
- 人工标注写
- 基于模板
- 基于开源共享数据
- 网上相似数据爬取
- OpenAI API接口通过 Prompt 工程构建
SFT 模型
- 基于模板:
- FLAN 模型:前 ChatGPT 时代,可以看看如何基于模板构建一些传统指令数据,还出了v2
- 基于 OpenAI API 和开源共享数据(后 ChatGPT 时代):
- Exploring the Impact of Instruction Data Scaling on Large Language Models
- Towards Better Instruction Following Language Models for Chinese
- 直接从 ChatGPT 和 GPT4 抓数据来训SFT:Alpaca,Vicuna,GPT4ALL
- 中文这块:Belle 的两篇论文也可以简单看看,看怎么构建数据(比如Self-Instruct)
- 基于网络爬取数据及人工标注
- LIMA: Less Is More for Alignment:怎么构建一个多样化的SFT数据集
RLHF 部分
建议给 OpenAI 在这块的努力都刷一遍,会有很清晰了解,各种细节。现在大多引 22 年 InstructGPT,但 OpenAI 这整套流程也都是一步步完善出来的。最早期在 GPT2 就探索用 Human Preference,中间如何尝试、遇到什么问题、以及怎么解决都写得挺清楚,甚至还专门写了怎么培训标注人员,当时 OpenAI 是真的挺 Open:
- Fine-Tuning GPT-2 from Human Preference(Blog):做 SFT 来获得人类偏好,但 SFT 数据都是模型采样后人标出来的
- Learning to summarize from human feedback(Blog):基本这套 SFT、Reward Model、RLHF 流程齐全了,用在 Summarization 任务,只标了 Pair-wise 的数据,而不是后面的 Rank
- Summarizing Books with Human Feedback(Blog):当摸清楚这套流程之后,OpenAI 开始对 RLHF 增大规模,也开始发现生成这块的评估难,引入模型辅助的评估
- WebGPT: Improving the Factual Accuracy of Language Models through Web Browsing[Blog]:OpenAI 想用强化来训练模型浏览网络,然后做检索增强
- InstructGPT:Training language models to follow instructions with human feedback[Blog]:最后才到 InstructGPT,罗马不是一天建成,能看到 OpenAI 在 RLHF 上是积累了很长时间的,到 InstructGPT 可能是 API 用户反馈有类似需求,当时没引起太大反响,直到加入了对话数据,并且给模型放出来给大家用,也就是 ChatGPT.
推理使用
解码方法
- 关于 Search 和 Sample,还有 Topp Topk 讨论:献丑了
Prompt Engineering
Zero-shot 和 Few-Shot 给 GPT3 那篇看完就差不多懂了,这里列些较经典方法
- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models:思维链,开山之作,本质上给LLM模型更多 token 来用来思考,增加结果准确性
- Self-Consistency Improves Chain of Thought Reasoning in Language Models:思维链后续,其实就是类似search算法给搜索空间扩大,比如beam从1改成多个,然后最后结果 ensemble 一下
- Tree of Thoughts: Deliberate Problem Solving with Large Language Models:给链扩展成树,进行检索和集成,上面两种都变成树的某个特例
- [可选] ChatGPT Prompt Engineering for Developers:吴教授 DeepLearning AI 关于 ChatGPT prompt 相关
反思以及其他高阶应用
- Reflexion: Language Agents with Verbal Reinforcement Learning:提出反思系统,模型能对自己之前的结果进行反思,之后再做出修改
- AutoGPT介绍:基于 GPT API 非常酷的应用,通过设计维护几个GPT角色,还有Memory系统,给AutoGPT一个目标和初始任务,就能让它成为一个无情的做任务机器人,完成任务,创造新任务,排好优先级,继续做任务
- [可选] Generative Agents: Interactive Simulacra of Human Behavior:写 AutoGPT 的时候莫名让我想起这篇,虽然是讲用GPT做游戏任务的思考机器,但是本身里面就涉及到大量应用相关的设计
- [可选] Large Language Models as Tool Makers:idea 也很酷,维护几个GPT角色,让一个做工具,一个使用工具解决问题,还有个判断什么时候需要做新工具,也是系统的设计
其他
Tools (API 调用)
有些能力调外部接口会容易很多,包括最新信息获取
- Toolformer: Language Models Can Teach Themselves to Use Tools:占坑之作,方法较 naive
- TaskMatrix.AI: Completing Tasks by Connecting Foundation Models with Millions of APIs:给 Tools 理念推到更大的框架
- [可选]对这个领域兴趣,还可以看Gorilla,HuggingGPT
- 搜索增强LLM(虽然我认为检索也只是一个工具):REPLUG: Retrieval-Augmented Black-Box Language Models
Code Related
- CodeX:Evaluating Large Language Models Trained on Code:Code相关必读,现在普遍认为Code对推理能力会有一定提升
Math Related
因为数学涉及到模型的推理能力,所以一般认为较重要
- Training Verifiers to Solve Math Word Problems:让模型解数学题,提出了 Verifier 的思路,就是对多条打分选最高。
[可选] GPT API相关应用
- Building Systems with the ChatGPT API:吴教授关于 OpenAI API应用的课程
- [可选] OpenAI CookBook:OpenAI 官方的 API 使用说明,里面很多特别实用的建议
[可选] 损失函数
- Efficient Training of Language Models to Fill in the Middle:无损 FIM 损失,增加模型中间填充能力
- UL2: Unifying Language Learning Paradigms:对T5的损失进行改进,兼容考虑了GPT单向生成损失,PALM2声称用的是它的变种