大语言模型 (LLM) 入门学习路线图
本路线图全面涵盖了大语言模型所需的基础知识、前沿算法架构以及工程化实践。无论是初学者还是有一定基础的开发者,均可作为系统学习大型语言模型的参考指南。内容重点介绍了核心知识体系,并推荐了优质的学习资源,旨在帮助大家掌握 LLM 相关技术。
大语言模型(Large Language Model, LLM)入门学习路线主要包含三个方面:
- 大语言模型基础:涵盖数学、Python 编程语言及神经网络原理等基础知识。
- 大语言模型前沿算法和框架:利用最新技术构建 LLM,研究先进算法和模型架构以提升性能。
- 大语言模型工程化:专注于创建基于 LLM 的应用程序,并将其部署到实际环境中,确保系统的稳定性和可扩展性。
1. 大语言模型基础
本部分包括数学基础知识、Python 基础、神经网络和自然语言处理(NLP)四个方面的学习。
1.1 机器学习的数学
- 线性代数:理解算法的关键。主要概念包括向量、矩阵、行列式、特征值和特征向量、向量空间和线性变换。Transformer 架构中的注意力机制本质上就是矩阵运算。
- 微积分:许多机器学习算法涉及连续函数的优化,需要理解导数、积分、极限和级数。多变量微积分和梯度的概念对于反向传播至关重要。
- 概率与统计:对于理解模型如何从数据中学习同样重要。主要概念包括概率论、随机变量、概率分布、期望、方差、协方差、相关性、假设检验、置信区间、最大似然估计和贝叶斯推断。
学习资源建议:
- 观看直观的视频教程来建立线性代数的几何直觉。
- 阅读统计学基础文章以理解数据分布特性。
- 参考可汗学院等平台的课程适合初学者入门。
1.2 机器学习的 Python
Python 一直是机器学习和深度学习的首选语言,得益于其可读性、一致性和丰富的数据科学库生态系统。
- Python 基础:理解基本语法、数据类型、错误处理和面向对象编程。
- 数据科学库:熟悉 NumPy 进行数值操作,Pandas 进行数据操作和分析,Matplotlib 和 Seaborn 进行数据可视化。
- 数据预处理:涉及特征缩放和规范化、处理缺失数据、异常值检测、分类数据编码以及将数据分割成训练、验证和测试集。
- 机器学习库:熟练掌握 Scikit-learn,了解如何实现线性回归、逻辑回归、决策树、随机森林、最近邻 (K-NN) 和 K 均值聚类等算法。
学习资源建议:
- 使用官方文档或在线教程学习 Python 核心概念。
- 通过实战项目练习 Pandas 和 NumPy 的数据处理能力。
- 在 Kaggle 等平台参与机器学习竞赛以巩固技能。
1.3 神经网络
- 基础知识:理解神经网络的结构,如层、权重、偏置和激活函数(sigmoid、tanh、ReLU 等)。
- 训练和优化:熟悉反向传播和不同类型的损失函数,如均方误差(MSE)和交叉熵。理解各种优化算法,如梯度下降、随机梯度下降、RMSprop 和 Adam。
- 过拟合:理解过拟合的概念(模型在训练数据上表现良好但在未见数据上表现差),并学习各种正则化技术(dropout、L1/L2 正则化、早停、数据增强)以防止它。
- 实现多层感知器(MLP):使用 PyTorch 构建一个 MLP,也称为全连接网络,这是理解更复杂架构的基础。
学习资源建议:
- 阅读经典深度学习教材,如《动手学深度学习》。
- 观看针对深度学习的视频课程,理解网络内部工作原理。
- 尝试复现经典的神经网络结构以加深理解。
1.4 自然语言处理(NLP)
NLP 在许多应用中扮演着关键角色,如翻译、情感分析、聊天机器人等。
- 文本预处理:学习各种文本预处理步骤,如分词(将文本分割成单词或句子)、词干提取、词形还原、停用词去除等。
- 特征提取技术:熟悉将文本数据转换为机器学习算法能理解的格式的技术。关键方法包括词袋模型(BoW)、词频 - 逆文档频率(TF-IDF)和 n-gram。
- 词嵌入:词嵌入是一种单词表示,允许具有相似含义的单词具有相似的表示。关键方法包括 Word2Vec、GloVe 和 FastText。
- 循环神经网络(RNNs):理解 RNNs 的工作原理,这是一种为序列数据设计的神经网络类型。探索 LSTMs 和 GRUs,两种 RNN 变体,它们能够学习长期依赖关系。
学习资源建议:
- 学习 spaCy 库进行 NLP 任务。
- 参考关于 Word2Vec 架构的理论文章。
- 在 PyTorch 中实现 RNN、LSTM 和 GRU 模型的实际操作。
2. 大语言模型前沿算法和框架
2.1 大语言模型(LLM)架构
需要清楚地了解模型的输入(token)和输出(logits),而原始的注意力机制(attention mechanism)是另一个必须掌握的关键部分,因为它是很多改进算法的基础。
- 高层视角:编码器 encoder-解码器 decoder 的 Transformer 架构,特别是仅有解码器的 GPT 架构,几乎所有流行 LLM 都应用了该架构。
- 令牌化(Tokenization):如何将原始文本数据转换成模型能理解的格式,这包括将文本拆分成 Token(通常是单词或子词)。
- 注意力机制(Attention mechanisms):掌握注意力机制的理论,包括自注意力和缩放点积注意力,这使得模型能够在产生输出时关注输入的不同部分。
- 文本生成:模型生成输出序列的多种方式。常见方法包括了贪婪解码(greedy decoding)、束搜索(beam search)、top-k 采样和核心采样(nucleus sampling)。
学习资源建议:
- 阅读 Jay Alammar 关于 Transformer 模型的直观解释文章。
- 观看 Andrej Karpathy 从头开始重新实现 GPT 的视频。
- 参考 Lilian Weng 关于注意力机制需求的正式介绍。
2.2 构建指令数据集
虽然从维基百科和其他网站可以轻松地找到原始数据,但如何将数据转换为问题和答案的配对却很难。数据集的质量将直接影响模型的质量,它们是大模型微调(finetune)过程中最重要的组成部分。
- 合成数据集:使用 OpenAI API(GPT)从头开始生成合成数据。你可以指定种子和系统提示以创建多样化的数据集。
- 高级技术:学习如何通过改进现有数据集,生成高质量的合成数据。
- 数据过滤:使用正则表达式、移除近似重复项、关注令牌数较多的答案等传统技术。
- 提示模板:在没有真正标准的问题和答案的情况下,了解不同的聊天模板很重要。
学习资源建议:
- 探索 Alpaca 和 Alpaca-GPT4 数据集及其格式化方法。
- 学习如何使用 GPT-4 创建合成指令数据集。
- 参考 Hugging Face 关于提示模板的页面。
2.3 模型预训练
是指从大量的无监督数据集中进行模型预训练,模型预训练是一个非常漫长和消耗资源的过程,因此它不是本学习路线教程的重点。但是我们可以了解它,以方便后续的学习。
- 数据管道:预训练需要巨大的数据集(例如,是在 2 万亿令牌上训练的),这些数据集需要被过滤、令牌化,并与预定义的词汇表进行整合。
- 因果语言模型:了解因果和掩码语言模型的区别,以及在这种情况下使用的损失函数。
- 规模化定律:描述了基于模型大小、数据集大小和用于训练的计算量的预期模型性能。
- 高性能计算:如果你计划从头开始创建自己的 LLM(硬件、分布式工作负载等),则需要更多关于 HPC 的知识。
学习资源建议:
- 查看 Hugging Face 使用 transformers 库从头开始预训练 GPT-2 模型的教程。
- 参考 BigScience 提供的 BLOOM 模型构建经验。
- 阅读 Meta 关于 LLaMA 模型的研究日志。
2.4 监督式微调(Supervised Fine-Tuning)
监督式微调就是让我们在已经标注的数据集上对已经预训练好的模型进行再次训练,以符合任务需求,它是一个非常重要的过程。
- 完全微调(Full fine-tuning):完全微调指的是训练模型中的所有参数。这不是一种高效的技术,但它产生稍好的结果。
- LoRA:一种基于低秩适配器的参数高效技术(PEFT)。我们只训练这些适配器,而不是所有参数。
- QLoRA:另一种基于 LoRA 的 PEFT,它还将模型的权重量化为 4 位,并引入分页优化器来管理内存峰值。
- 工具:使用用户友好且强大的微调工具,如 Axolotl,被用于许多最先进的开源模型。
学习资源建议:
- 阅读 Sebastian Raschka 关于 LoRA 的实际洞察和如何选择最佳参数。
- 参考 Hugging Face 库微调 Llama 2 模型的动手教程。
- 学习如何使用 Axolotl 微调 CodeLlama 模型。
2.5 通过人类反馈进行强化学习(Reinforcement Learning from Human Feedback)
在监督式微调之后,RLHF 是一个用来将 LLM 产生的答案达到和人类回答差不多的重要步骤。其思想是从人工反馈中学习偏好。
- 偏好数据集(Preference datasets):这些数据集通常包含几个答案,并有某种排名,但是这种数据集更难产生。
- PPO:这个算法利用一个奖励模型来预测给定文本是否被人类高度评价。然后使用这个预测来优化 SFT 模型。
- DPO(Direct Preference Optimization):DPO 简化将其重新构架为一个分类问题。它使用参考模型而不是奖励模型,使其更稳定和高效。
学习资源建议:
- 阅读关于 RLHF 减少偏见并提高 LLM 性能的文章。
- 参考 Hugging Face 提供的奖励模型训练教程。
- 学习使用 DPO 微调 Mistral-7b 模型的教程。
2.6 评估(Evaluation)
评估 LLM 是一个被低估的部分,它既耗时但是又相对可靠。你的下游任务应该决定你想评估什么。
- 传统指标:困惑度和 BLEU 分数这样的指标不再像以前那样受欢迎,因为在大多数情况下它们是有缺陷的。
- 通用基准:基于 LMSYS Chatbot Arena 是通用 LLM 的主要基准。还有其他流行的基准,如 MMLU 等。
- 特定任务基准:如摘要、翻译和问答等任务有专门的基准、指标甚至子领域(医疗、金融等)。
- 人类评估:最可靠的评估是用户的接受率或人类做出的比较。如果你想知道模型是否表现良好,最简单但最可靠的方式是自己使用它。
学习资源建议:
- 阅读关于困惑度概述及实现的代码。
- 参考关于 BLEU 分数及其问题的概述。
- 查阅综合论文了解评估什么、在哪里评估以及如何评估。
2.7 量化
量化是将模型的权重(和激活)使用更低精度进行转换的过程。这项技术已经越来越重要,因为它可以减少与 LLM 相关的计算和内存成本,以使其在计算资源更低的设备上运行。
- 基础技术:了解不同的精度水平(FP32, FP16, INT8 等)以及如何使用 absmax 和零点技术进行朴素量化。
- GGUF 和 llama.cpp:最初设计用于在 CPU 上运行,GGUF 格式已成为在消费级硬件上运行 LLM 的最受欢迎的工具。
- GPTQ 和 EXL2:特别是 GPTQ 格式提供了惊人的速度,但只能在 GPU 上运行。
- AWQ:这种新格式比 GPTQ 更准确,但使用的 VRAM 更多,不一定更快。
学习资源建议:
- 阅读量化概述及 LLM.int8() 的代码。
- 参考如何使用 llama.cpp 和 GGUF 格式量化 Llama 2 模型的教程。
- 学习使用 AutoGPTQ 算法量化 LLM 的教程。
2.8 新趋势
- 位置嵌入:了解 LLM 如何编码位置,尤其是 RoPE 这样的相对位置编码方案。实现 YaRN 或 Attention Sink 以延长上下文长度。
- 模型合并(Model merging):合并训练好的模型已成为创建性能模型而无需任何微调的流行方式。流行的库实现了最受欢迎的合并方法,如 SLERP、Linear Interpolation 等。
- 专家混合:因其出色的性能而重新流行化 MoE 架构。OSS 社区出现了一种通过合并模型的 frankenMoE,这是一个更便宜且性能良好的选项。
- 多模态模型:这些模型处理多种类型的输入(文本、图像、音频等),具有统一的嵌入空间,解锁了强大的应用,如文本到图像。
学习资源建议:
- 阅读 EleutherAI 总结不同位置编码技术的文章。
- 参考 Hugging Face 关于 MoEs 及其工作原理的详尽指南。
- 阅读 Chip Huyen 关于多模态系统及其近期历史的概述。
3. LLM 工程化
在这阶段集中于如何构建和部署基于大语言模型(LLM)的应用程序,以便在生产环境中使用。
3.1 运行大型语言模型 (LLMs)
运行 LLMs 可能会因为硬件要求而变得困难。我们可以通过 API 的方式(如 GPT-4)来简单的使用大模型。当然也可以进行本地运行。
- LLM APIs:API 是部署 LLMs 的一种比较简单的方式,它不要求设备拥有显卡资源,但是这种一般需要付费得到 API。这个领域分为私有 LLMs 和开源 LLMs。
- 开源 LLMs:开源了大量的 LLMs。你可以直接在 LM Studio 中运行其中一些,或者下载并在像 Ollama 这样的应用程序中或通过 CLI 与它们在本地运行它们。
- 提示工程(Prompt engineering):常见技术包括零次提示、少数提示、思维链和 ReAct。它们在更大的模型上效果更好,也可以适应更小的模型。
- 结构化输出(Structuring outputs):大部分任务需要结构化输出,如严格的模板或 JSON 格式。可以使用 Outlines、LMQL 等库来指导生成并遵循给定的结构。
学习资源建议:
- 阅读 DAIR.AI 撰写的提示工程学习指南。
- 了解 Outlines 启动的指导生成技术。
- 学习 LMQL 语言的介绍。
3.2. 构建向量存储(Building a Vector Storage)
有时候我们想要在特定知识库下让 LLMs 搜索答案,而检索增强生成(RAG)结合了信息检索(IR)方法的能力,提高文本生成任务的质量和相关性。
- 文档加载:文档加载器可以处理多种格式:PDF、JSON、HTML、Markdown 等。它们还可以直接从一些数据库和 API 检索数据。
- 文档拆分:文本拆分器将文档拆分成更小、有语义信息的块。与其在固定字符后拆分文本,不如更好地按标题或递归拆分,附加一些额外的元数据。
- 嵌入模型:嵌入模型将文本转换为向量表示。这对于执行语义搜索至关重要,可以深入并更细致地理解语言。
- 向量数据库:向量数据库(如 Chroma、Milvus、Weaviate 等)旨在存储嵌入向量。它们能够根据向量相似度高效检索与查询'最相似'的数据。
学习资源建议:
- 参考 LangChain 实现的不同文本拆分器列表。
- 浏览流行的嵌入模型库。
- 阅读关于最好和最流行的向量数据库的比较文章。
3.3. 检索增强生成 (Retrieval Augmented Generation, RAG)
RAG 技术可以使 LLMs 从数据库检索上下文文档以提高其答案的准确性。RAG 是一种流行的增强模型知识的方式,无需任何微调。
- 协调器(Orchestrators):协调器(如 LangChain、LlamaIndex 等)是将 LLMs 与工具、数据库、记忆等连接并增强其能力的流行框架。
- 检索器(Retrievers):用户指令并不是为检索优化的。可以应用不同技术(例如,多查询检索器、HyDE 等)来重述/扩展它们并提高性能。
- 记忆(Memory):为了记住以前的指令和答案,LLMs 和聊天机器人将这个历史添加到它们的上下文窗口中。这个缓冲区可以通过摘要、向量存储 +RAG 等来改进。
- 评估:我们需要评估文档检索(上下文的精度和召回率)和生成阶段(保真度和答案相关性)。可以使用 RAGAS 工具和 TruLens 来简化这一过程。
学习资源建议:
- 阅读构建 RAG 管道时需要了解的主要概念。
- 参考检索增强过程的概述文章。
- 学习构建典型 RAG 管道的分步教程。
3.4. 高级 RAG
现实生活中的应用可能需要复杂的管道,包括 SQL 或图数据库,以及自动选择相关工具和 API。
- 查询构造(Query construction):存储在传统数据库中的结构化数据需要特定的查询语言,如 SQL、Cypher、元数据等。我们可以直接将用户指令翻译成查询以访问数据。
- 代理和工具(Agents and tools):代理通过自动选择最相关的工具来增强 LLMs,以提供答案。这些工具可以简单到使用 Google 或 Wikipedia,或更复杂,如 Python 解释器或 Jira。
- 后处理(Post-processing):向 LLM 提供输入的最终步骤。它通过重新排列、重排序和分类等方式增强检索到的文档的相关性和多样性。
学习资源建议:
- 阅读关于不同类型查询构造的博客文章。
- 学习如何使用 LLMs 与 SQL 数据库交互的教程。
- 参考 Lilian Weng 撰写的关于 LLM 代理的理论文章。
3.5. 推理优化(Inference optimization)
文本生成是一个成本高昂的过程,需要昂贵的硬件资源。除了量化,还提出了各种技术来最大化吞吐量并降低推理成本。
- Flash Attention:优化注意力机制,将其复杂度从二次方降低到线性,加速训练和推理。
- 键值缓存:了解键值缓存以及 MQA(Multi-Query Attention)和 GQA(Grouped Query Attention)中引入的改进。
- 推测解码:使用小型模型生成草稿,然后由更大的模型审查,以加速文本生成。
学习资源建议:
- 阅读 Hugging Face 提供的如何在 GPUs 上优化推理的解释。
- 参考 Databricks 提供的如何在生产中优化 LLM 推理的最佳实践。
- 学习 HF 版本的推测解码博客,包括实现它的代码。
3.6. 部署 LLMs
部署 LLMs 是一项工程壮举,可能需要多个 GPU 集群。
- 本地部署:与私有 LLMs 相比,开源 LLMs 可以保护用户隐私,是它的一大优势。本地 LLM 服务器(如 Ollama、vLLM 等)利用这一优势为本地应用提供动力。
- demo 部署:Streamlit 和 Gradio 等框架有助于原型化应用程序并分享 demo。你也可以轻松地在线托管它们,例如使用 Hugging Face Spaces。
- 服务器部署:在规模上部署 LLMs 需要云(参见 AWS、Azure)或本地基础设施,并常常利用优化的文本生成框架,如 TGI、vLLM 等。
- 边缘部署:在受限环境中,高性能框架如 CTranslate2 和 mlc 可以在网页浏览器、Android 和 iOS 中部署 LLM。
学习资源建议:
- 参考使用 Streamlit 制作基础 ChatGPT-like 应用的教程。
- 阅读关于使用 Amazon SageMaker 部署 LLM 的高质量文章集。
- 了解 TGI、vLLM、CTranslate2 和 mlc 在吞吐量和延迟方面的比较。
3.7. 保护 LLMs
除了与软件相关的传统安全问题外,由于 LLMs 的训练和提示方式,它们还有独特的弱点。
- 提示黑客攻击:与提示工程相关的不同技术,包括提示注入(额外指令以劫持模型的答案)、数据/提示泄露(检索其原始数据/提示)和越狱(制作提示以绕过安全功能)。
- 后门:攻击向量可以针对训练数据本身,通过在训练数据中下毒(例如,使用错误信息)或创建后门(秘密触发器以在推理期间改变模型的行为)。
- 防御措施:保护你的 LLM 应用程序的最佳方式是针对这些漏洞测试它们(例如,使用红队测试和像 Garak 这样的检查)并在生产中观察它们(使用框架,如 LangSmith)。
学习资源建议:
- 阅读关于 LLM 安全性的综述文章。
- 学习使用红队测试工具进行漏洞扫描。
- 了解生产环境中的监控和日志记录最佳实践。