docs:add docsify deploy

This commit is contained in:
KMnO4-zx
2025-05-25 00:02:24 +08:00
parent 40dc5de2fc
commit f9fe12d99a
62 changed files with 225 additions and 69 deletions

0
docs/.nojekyll Normal file
View File

View File

@@ -1,25 +1,98 @@
# 前言
<div align='center'>
<img src="./images/head.jpg" alt="alt text" width="95%">
<h1>Happy-LLM</h1>
</div>
2022年底ChatGPT 的横空出世改变了人们对人工智能的认知也给自然语言处理Natural Language ProcessNLP领域带来了阶段性的变革以 GPT 系列模型为代表的大语言模型Large Language ModelLLM成为 NLP 乃至人工智能领域的研究主流。自 2023年至今LLM 始终是人工智能领域的核心话题,引发了一轮又一轮的科技浪潮。
<div align="center">
<img src="https://img.shields.io/github/stars/datawhalechina/happy-llm?style=for-the-badge&logo=github" alt="GitHub stars"/>
<img src="https://img.shields.io/github/forks/datawhalechina/happy-llm?style=for-the-badge&logo=github" alt="GitHub forks"/>
<img src="https://img.shields.io/github/license/datawhalechina/happy-llm?style=for-the-badge" alt="License"/>
<img src="https://img.shields.io/badge/language-Chinese-brightgreen?style=for-the-badge" alt="Language"/>
</div>
LLM 其实是 NLP 领域经典研究方法预训练语言模型Pretrain Langguage ModelPLM的一种衍生成果。NLP 领域聚焦于人类书写的自然语言文本的处理、理解和生成,从诞生至今经历了符号主义阶段、统计学习阶段、深度学习阶段、预训练模型阶段到而今大模型阶段的多次变革。以 GPT、BERT 为代表的 PLM 是上一阶段 NLP 领域的核心研究成果,以注意力机制为模型架构,通过预训练-微调的阶段思想通过在海量无监督文本上进行自监督预训练,实现了强大的自然语言理解能力。但是,传统的 PLM 仍然依赖于一定量有监督数据进行下游任务微调且在自然语言生成任务上性能还不尽如人意NLP 系统的性能距离人们所期待的通用人工智能还有不小的差距。
<div align="center">
<h3>📚 从零开始的大语言模型原理与实践教程</h3>
<p><em>深入理解 LLM 核心原理,动手实现你的第一个大模型</em></p>
</div>
LLM 是在 PLM 的基础上,通过大量扩大模型参数、预训练数据规模,并引入指令微调、人类反馈强化学习等手段实现的突破性成果。相较于传统 PLMLLM 具备涌现能力具有强大的上下文学习能力、指令理解能力和文本生成能力。在大模型阶段NLP 研究者可以一定程度抛弃大量的监督数据标注工作通过提供少量监督示例LLM 即能在指定下游任务上达到媲美大规模微调 PLM 的性能。同时,强大的指令理解能力与文本生成能力使 LLM 能够直接、高效、准确地响应用户指令,从而真正向通用人工智能的目标逼近。
---
LLM 的突破性进展激发了 NLP 领域乃至整个人工智能领域的研究热度,海内外高校、研究院、大厂乃至众多传统领域企业都投入到 LLM 研究的浪潮中。自 2023年至今LLM 阶段性成果层出不穷,模型性能不断刷新上限,从一开始的 ChatGPT到 GPT-4再到以 DeepSeek-R1 为代表的推理大模型、以 Qwen-VL 为代表的多模态大模型等更强大、更定制化的模型LLM 应用也不断涌现出能够提升实际生产力、赋能用户实际生活的创新应用从”百模大战“到”Agent 元年“LLM 基座研究或许已趋向稳定的格局LLM 的研究始终方兴未艾。可以肯定的是在并不遥远的未来LLM 及以 LLM 为基础的应用一定会成为人们生活中的基础设施,与每个人的生活、学习、工作密不可分。
## 🎯 项目介绍
在这样的背景下,深入理解、掌握 LLM 原理,能够动手应用、训练任意一个 LLM 的能力,对每一位 NLP 研究者乃至其他领域的 AI 研究者至关重要。我们在 2023年底分别创建了 self-llm开源大模型食用指南https://github.com/datawhalechina/self-llm 、llm-universe动手学大模型应用开发https://github.com/datawhalechina/llm-universe )两个原创开源大模型教程,前者旨在为开发者提供一站式开源 LLM 部署、推理、微调的使用教程,后者旨在指导开发者从零开始搭建自己的 LLM 应用。两个教程都帮助到了广泛的国内外开发者,也获得了众多开发者的支持和认可,在学习者的反馈中,我们发现目前还缺乏一个从零开始讲解 LLM 原理、并引导学习者亲手搭建、训练 LLM 的完整教程。
> &emsp;&emsp;*很多小伙伴在看完 [self-llm 开源大模型食用指南](https://github.com/datawhalechina/self-llm) 后感觉意犹未尽想要深入了解大语言模型的原理和训练过程。于是我们决定推出《Happy-LLM》项目旨在帮助大家深入理解大语言模型的原理和训练过程。*
鉴于此,我们编写了这本结合 LLM 原理及实战的教程。本书将从 NLP 的基本研究方法出发,根据 LLM 的思路及原理逐层深入,依次为读者剖析 LLM 的架构基础和训练过程。同时,我们会结合目前 LLM 领域最主流的代码框架,演练如何亲手搭建、训练一个 LLM期以实现授之以鱼更授之以渔。希望读者能从这本书开始走入 LLM 的浩瀚世界,探索 LLM 的无尽可能。
&emsp;&emsp;本项目是一个**系统性的 LLM 学习教程**将从 NLP 的基本研究方法出发,根据 LLM 的思路及原理逐层深入,依次为读者剖析 LLM 的架构基础和训练过程。同时,我们会结合目前 LLM 领域最主流的代码框架,演练如何亲手搭建、训练一个 LLM期以实现授之以鱼更授之以渔。希望大家能从这本书开始走入 LLM 的浩瀚世界,探索 LLM 的无尽可能。
## 写给读者的建议
### ✨ 你将收获什么?
本书包含 LLM 的理论基础、原理介绍和项目实战,全书包括 LLM 及 NLP 的核心思路剖析、公式解析与代码实战,旨在帮助开发者深入理解并掌握 LLM 的基本原理与应用。因此本书适合大学生、研究人员、LLM 爱好者阅读。在阅读本书之前,你需要具备一定的编程经验,尤其是要对 Python 编程语言有一定的了解。同时,你最好具备深度学习的相关知识,并了解 NLP 领域的相关概念和术语,以便更轻松地阅读本书。
- 🔍 **深入理解** Transformer 架构和注意力机制
- 📚 **掌握** 预训练语言模型的基本原理
- 🧠 **了解** 现有大模型的基本结构
- 🏗️ **动手实现** 一个完整的 LLaMA2 模型
- ⚙️ **掌握训练** 从预训练到微调的全流程
- 🚀 **实战应用** RAG、Agent 等前沿技术
本书分为两部分——基础知识与实战应用。第1章第4章是基础知识部分从浅入深介绍 LLM 的基本原理。其中第1章简单介绍 NLP 的基本任务和发展,为非 NLP 领域研究者提供参考第2章介绍 LLM 的基本架构——Transformer包括原理介绍及代码实现作为 LLM 最重要的理论基础第3章整体介绍经典的 PLM包括 Encoder-Only、Encoder-Decoder 和 Decoder-Only 三种架构,也同时介绍了当前一些主流 LLM 的架构和思想第4章则正式进入 LLM 部分,详细介绍 LLM 的特点、能力和整体训练过程。第5章第7章是实战应用部分将逐步带领读者深入 LLM 的底层细节。其中第5章将带领读者基于 PyTorch 层亲手搭建一个 LLM并实现预训练、有监督微调的全流程第6章将引入目前业界主流的 LLM 训练框架 Transformers带领读者基于该框架快速、高效地实现 LLM 训练过程第7章则将介绍 基于 LLM 的各种应用,补全读者对 LLM 体系的认知,包括 LLM 的评测、检索增强生产Retrieval-Augmented GenerationRAG、智能体Agent的思想和简单实现。你可以根据个人兴趣和需求选择性地阅读相关章节。
## 📖 内容导航
在阅读本书的过程中建议你将理论和实际相结合。LLM 是一个快速发展、注重实践的领域,我们建议你多投入实战,复现本书提供的各种代码,同时积极参加 LLM 相关的项目与比赛,真正投入到 LLM 开发的浪潮中。我们鼓励你关注 Datawhale 及其他 LLM 相关开源社区,当遇到问题时,你可以随时在 Datawhale 社区提问。Datawhale 也会始终跟进 LLM 及其他人工智能技术的发展,欢迎你关注或加入到 Datawhale 社区的共建中。
| 章节 | 关键内容 | 状态 |
| --- | --- | --- |
| [前言](./前言.md) | 本项目的缘起、背景及读者建议 | ✅ |
| [第一章 NLP 基础概念](chapter1/第一章%20NLP基础概念.md) | 什么是 NLP、发展历程、任务分类、文本表示演进 | ✅ |
| [第二章 Transformer 架构](chapter2/第二章%20Transformer架构.md) | 注意力机制、Encoder-Decoder、手把手搭建 Transformer | ✅ |
| [第三章 预训练语言模型](chapter3/第三章%20预训练语言模型.md) | Encoder-only、Encoder-Decoder、Decoder-Only 模型对比 | ✅ |
| [第四章 大语言模型](chapter4/第四章%20大语言模型.md) | LLM 定义、训练策略、涌现能力分析 | ✅ |
| [第五章 动手搭建大模型](chapter5/第五章%20动手搭建大模型.md) | 实现 LLaMA2、训练 Tokenizer、预训练小型 LLM | ✅ |
| [第六章 大模型训练实践](chapter6/第六章%20大模型训练流程实践.md) | 预训练、有监督微调、LoRA/QLoRA 高效微调 | ✅ |
| [第七章 大模型应用](chapter7/第七章%20大模型应用.md) | 模型评测、RAG 检索增强、Agent 智能体 | ✅ |
最后,欢迎每一位读者在阅读完本书后加入到 LLM 开发者的行列。作为国内 AI 开源社区,我们希望充分聚集共创者,一起丰富这个开源 LLM 的世界,打造更多、更全面特色 LLM 的教程。星火点点,汇聚成海。我们希望成为 LLM 与普罗大众的阶梯,以自由、平等的开源精神,拥抱更恢弘而辽阔的 LLM 世界。
## 💡 如何学习
感谢你选择本书,祝你阅读愉快!
&emsp;&emsp;本项目适合大学生、研究人员、LLM 爱好者。在学习本项目之前,建议具备一定的编程经验,尤其是要对 Python 编程语言有一定的了解。最好具备深度学习的相关知识,并了解 NLP 领域的相关概念和术语,以便更轻松地学习本项目。
&emsp;&emsp;本项目分为两部分——基础知识与实战应用。第1章第4章是基础知识部分从浅入深介绍 LLM 的基本原理。其中第1章简单介绍 NLP 的基本任务和发展,为非 NLP 领域研究者提供参考第2章介绍 LLM 的基本架构——Transformer包括原理介绍及代码实现作为 LLM 最重要的理论基础第3章整体介绍经典的 PLM包括 Encoder-Only、Encoder-Decoder 和 Decoder-Only 三种架构,也同时介绍了当前一些主流 LLM 的架构和思想第4章则正式进入 LLM 部分,详细介绍 LLM 的特点、能力和整体训练过程。第5章第7章是实战应用部分将逐步带领大家深入 LLM 的底层细节。其中第5章将带领大家者基于 PyTorch 层亲手搭建一个 LLM并实现预训练、有监督微调的全流程第6章将引入目前业界主流的 LLM 训练框架 Transformers带领学习者基于该框架快速、高效地实现 LLM 训练过程第7章则将介绍 基于 LLM 的各种应用,补全学习者对 LLM 体系的认知,包括 LLM 的评测、检索增强生产Retrieval-Augmented GenerationRAG、智能体Agent的思想和简单实现。你可以根据个人兴趣和需求选择性地阅读相关章节。
&emsp;&emsp;在阅读本书的过程中建议你将理论和实际相结合。LLM 是一个快速发展、注重实践的领域,我们建议你多投入实战,复现本书提供的各种代码,同时积极参加 LLM 相关的项目与比赛,真正投入到 LLM 开发的浪潮中。我们鼓励你关注 Datawhale 及其他 LLM 相关开源社区,当遇到问题时,你可以随时在本项目的 issue 区提问。
&emsp;&emsp;最后,欢迎每一位读者在学习完本项目后加入到 LLM 开发者的行列。作为国内 AI 开源社区,我们希望充分聚集共创者,一起丰富这个开源 LLM 的世界,打造更多、更全面特色 LLM 的教程。星火点点,汇聚成海。我们希望成为 LLM 与普罗大众的阶梯,以自由、平等的开源精神,拥抱更恢弘而辽阔的 LLM 世界。
## 🤝 如何贡献
我们欢迎任何形式的贡献!
- 🐛 **报告 Bug** - 发现问题请提交 Issue
- 💡 **功能建议** - 有好想法就告诉我们
- 📝 **内容完善** - 帮助改进教程内容
- 🔧 **代码优化** - 提交 Pull Request
## 🙏 致谢
### 核心贡献者
- [宋志学-项目负责人](https://github.com/KMnO4-zx) (Datawhale成员-中国矿业大学(北京))
- [邹雨衡-项目负责人](https://github.com/logan-zou) (Datawhale成员-对外经济贸易大学)
### 特别感谢
- 感谢 [@Sm1les](https://github.com/Sm1les) 对本项目的帮助与支持
- 感谢所有为本项目做出贡献的开发者们 ❤️
<div align=center style="margin-top: 30px;">
<a href="https://github.com/datawhalechina/happy-llm/graphs/contributors">
<img src="https://contrib.rocks/image?repo=datawhalechina/happy-llm" />
</a>
</div>
## 关于 Datawhale
<div align='center'>
<img src="./images/datawhale.png" alt="Datawhale" width="30%">
<p>扫描二维码关注 Datawhale 公众号,获取更多优质开源内容</p>
</div>
---
<div align="center">
<p>⭐ 如果这个项目对你有帮助,请给我们一个 Star</p>
</div>
## 📜 开源协议
本作品采用[知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-sa/4.0/)进行许可。

View File

@@ -1,8 +1,9 @@
- 第1章 [我是第1章的标题](chapter1/chapter1)
- 第2章 我是第2章的标题
- [2.1 我是2.1的标题](chapter2/chapter2_1)
- [2.2 我是2.2的标题](chapter2/chapter2_2)
- 第3章 我是第3章的标题
- 3.1 我是3.1的标题
- 3.1.1 [我是3.1.1的标题](chapter3/chapter3_1/chapter3_1_1)
- 3.1.2 [我是3.1.2的标题](chapter3/chapter3_1/chapter3_1_2)
- [Happy-LLM](./README.md)
- [前言](./前言.md)
- [第一章 NLP 基础概念](./chapter1/第一章%20NLP基础概念.md)
- [第二章 Transformer 架构](./chapter2/第二章%20Transformer架构.md)
- [第三章 预训练语言模型](./chapter3/第三章%20预训练语言模型.md)
- [第四章 大语言模型](./chapter4/第四章%20大语言模型.md)
- [第五章 动手搭建大模型](./chapter5/第五章%20动手搭建大模型.md)
- [第六章 大模型训练实践](./chapter6/第六章%20大模型训练流程实践.md)
- [第七章 大模型应用](./chapter7/第七章%20大模型应用.md)

View File

@@ -9,21 +9,21 @@
- 前馈神经网络Feedforward Neural NetworkFNN即每一层的神经元都和上下两层的每一个神经元完全连接如图2.1所示:
<div align="center">
<img src="./figures/1-0.png" alt="图片描述" width="90%"/>
<img src="../images/2-figures/1-0.png" alt="图片描述" width="90%"/>
<p>图2.1 前馈神经网络</p>
</div>
- 卷积神经网络Convolutional Neural NetworkCNN即训练参数量远小于前馈神经网络的卷积层来进行特征提取和学习如图2.2所示:
<div align="center">
<img src="./figures/1-1.png" alt="图片描述" width="90%"/>
<img src="../images/2-figures/1-1.png" alt="图片描述" width="90%"/>
<p>图2.2 卷积神经网络</p>
</div>
- 循环神经网络Recurrent Neural NetworkRNN能够使用历史信息作为输入、包含环和自重复的网络如图2.3所示:
<div align="center">
<img src="./figures/1-2.png" alt="图片描述" width="90%"/>
<img src="../images/2-figures/1-2.png" alt="图片描述" width="90%"/>
<p>图2.3 循环神经网络</p>
</div>
@@ -222,7 +222,7 @@ scores = F.softmax(scores.float(), dim=-1).type_as(xq)
在原论文中作者也通过实验证实多头注意力计算中每个不同的注意力头能够拟合语句中的不同信息如图2.4所示:
<div align="center">
<img src="./figures/1-3.jpeg" alt="图片描述" width="90%"/>
<img src="../images/2-figures/1-3.jpeg" alt="图片描述" width="90%"/>
<p>图2.4 多头注意力机制</p>
</div>
@@ -346,7 +346,7 @@ Seq2Seq即序列到序列是一种经典 NLP 任务。具体而言,是
Transformer 中的 Encoder就是用于上述的编码过程Decoder 则用于上述的解码过程。Transformer 结构如图2.5所示:
<div align="center">
<img src="./figures/2-0.jpg" alt="图片描述" width="90%"/>
<img src="../images/2-figures/2-0.jpg" alt="图片描述" width="90%"/>
<p>图2.5 编码器-解码器结构</p>
</div>
@@ -732,7 +732,7 @@ $$
上述编码结果如图2.6所示:
<div align="center">
<img src="./figures/3-0.png" alt="图片描述" width="90%"/>
<img src="../images/2-figures/3-0.png" alt="图片描述" width="90%"/>
<p>图2.6 编码结果</p>
</div>
@@ -773,7 +773,7 @@ class PositionalEncoding(nn.Module):
上述所有组件,再按照下图的 Tranfromer 结构拼接起来就是一个完整的 Transformer 模型了如图2.7所示:
<div align="center">
<img src="./figures/3-1.png" alt="图片描述" width="80%"/>
<img src="../images/2-figures/3-1.png" alt="图片描述" width="80%"/>
<p>图2.7 Transformer 模型结构</p>
</div>

View File

@@ -26,7 +26,7 @@ BERT 是一个统一了多种思想的预训练模型。其所沿承的核心思
BERT 的模型架构是取了 Transformer 的 Encoder 部分堆叠而成其主要结构如图3.1所示:
<div align="center">
<img src="./figures/1-0.png" alt="图片描述" width="100%"/>
<img src="../images/3-figures/1-0.png" alt="图片描述" width="100%"/>
<p>图3.1 BERT 模型结构</p>
</div>
@@ -35,7 +35,7 @@ BERT 是针对于 NLU 任务打造的预训练模型,其输入一般是文本
模型整体既是由 Embedding、Encoder 加上 prediction_heads 组成:
<div align="center">
<img src="./figures/1-1.png" alt="图片描述" width="70%"/>
<img src="../images/3-figures/1-1.png" alt="图片描述" width="70%"/>
<p>图3.2 BERT 模型简略结构</p>
</div>
@@ -44,21 +44,21 @@ BERT 是针对于 NLU 任务打造的预训练模型,其输入一般是文本
prediction_heads 其实就是线性层加上激活函数一般而言最后一个线性层的输出维度和任务的类别数相等如图3.3所示:
<div align="center">
<img src="./figures/1-5.png" alt="图片描述" width="20%"/>
<img src="../images/3-figures/1-5.png" alt="图片描述" width="20%"/>
<p>图3.3 prediction_heads 结构</p>
</div>
而每一层 Encoder Layer 都是和 Transformer 中的 Encoder Layer 结构类似的层如图3.4所示:
<div align="center">
<img src="./figures/1-2.png" alt="图片描述" width="40%"/>
<img src="../images/3-figures/1-2.png" alt="图片描述" width="40%"/>
<p>图3.4 Encoder Layer 结构</p>
</div>
如图3.5所示,已经通过 Embedding 层映射的 hidden_states 进入核心的 attention 机制,然后通过残差连接的机制和原输入相加,再经过一层 Intermediate 层得到最终输出。Intermediate 层是 BERT 的特殊称呼,其实就是一个线性层加上激活函数:
<div align="center">
<img src="./figures/1-3.png" alt="图片描述" width="40%"/>
<img src="../images/3-figures/1-3.png" alt="图片描述" width="40%"/>
<p>图3.5 Intermediate 结构</p>
</div>
@@ -71,7 +71,7 @@ GELU 的核心思路为将随机正则的思想引入激活函数,通过输入
BERT 的 注意力机制和 Transformer 中 Encoder 的 自注意力机制几乎完全一致,但是 BERT 将相对位置编码融合在了注意力机制中将相对位置编码同样视为可训练的权重参数如图3.6所示:
<div align="center">
<img src="./figures/1-4.png" alt="图片描述" width="40%"/>
<img src="../images/3-figures/1-4.png" alt="图片描述" width="40%"/>
<p>图3.6 BERT 注意力机制结构</p>
</div>
@@ -230,14 +230,14 @@ T5 的大一统思想将不同的 NLP 任务如文本分类、问答、翻译等
BERT 采用了 Encoder-Only 结构,只包含编码器部分;而 GPT 采用了 Decoder-Only 结构只包含解码器部分。T5 则采用了 Encoder-Decoder 结构,其中编码器和解码器都是基于 Transformer 架构设计。编码器用于处理输入文本解码器用于生成输出文本。编码器和解码器之间通过注意力机制进行信息交互从而实现输入文本到输出文本的转换。其主要结构如图3.7所示:
<div align="center">
<img src="./figures/2-1.png" alt="图片描述" width="100%"/>
<img src="../images/3-figures/2-1.png" alt="图片描述" width="100%"/>
<p>图3.7 T5 模型详细结构</p>
</div>
如图3.8所示,从整体来看 T5 的模型结构包括 Tokenizer 部分和 Transformer 部分。Tokenizer 部分主要负责将输入文本转换为模型可接受的输入格式包括分词、编码等操作。Transformer 部分又分为 EncoderLayers 和 DecoderLayers 两部分,他们分别由一个个小的 Block组成每个 Block 包含了多头注意力机制、前馈神经网络和 Norm 层。Block 的设计可以使模型更加灵活,像乐高一样可以根据任务的复杂程度和数据集的大小来调整 Block 的数量和层数。
<div align="center">
<img src="./figures/2-2.png" alt="图片描述" width="70%"/>
<img src="../images/3-figures/2-2.png" alt="图片描述" width="70%"/>
<p>图3.8 T5 模型整体结构</p>
</div>
@@ -246,14 +246,14 @@ T5 模型的 Encoder 和 Decoder 部分都是基于 Transformer 架构设计的
和 Encoder 不一样的是,在 Decoder 中还包含了 Encoder-Decoder Attention 结构,用于捕捉输入和输出序列之间的依赖关系。这两种 Attention 结构几乎完全一致,只有在位置编码和 Mask 机制上有所不同。如图3.9所示Encoder 和 Decoder 的结构如下:
<div align='center'>
<img src="./figures/2-3.png" alt="alt text" width="50%">
<img src="../images/3-figures/2-3.png" alt="alt text" width="50%">
<p>图3.9 Encoder 和 Decoder</p>
</div>
T5 的 Self-Attention 机制和 BERT 的 Attention 机制是一样的,都是基于 Self-Attention 机制设计的。Self-Attention 机制是一种全局依赖关系建模方法,通过计算 Query、Key 和 Value 之间的相似度来捕捉输入序列中的全局依赖关系。Encoder-Decoder Attention 仅仅在位置编码和 Mask 机制上有所不同主要是为了区分输入和输出序列。如图3.10所示Self-Attention 结构如下:
<div align='center'>
<img src="./figures/2-4.png" alt="alt text" width="50%">
<img src="../images/3-figures/2-4.png" alt="alt text" width="50%">
</p>图3.10 Self-Attention 结构</p>
</div>
@@ -298,7 +298,7 @@ T5通过大规模的文本数据进行预训练然后在具体任务上进行
我们可以通过图3.11,更加直观地理解 T5 的大一统思想:
<div align='center'>
<img src="./figures/2-0.png" alt="alt text" width="90%">
<img src="../images/3-figures/2-0.png" alt="alt text" width="90%">
<p>图3.11 T5 的大一统思想</p>
</div>
@@ -323,7 +323,7 @@ GPT即 Generative Pre-Training Language Model是由 OpenAI 团队于 2018
#### 1 模型架构——Decoder Only
<div align='center'>
<img src="./figures/3-0.png" alt="alt text" width="100%">
<img src="../images/3-figures/3-0.png" alt="alt text" width="100%">
<p>图3.12 GPT 模型结构</p>
</div>
@@ -394,7 +394,7 @@ LLaMA模型是由Meta前Facebook开发的一系列大型预训练语言模
与GPT系列模型一样LLaMA模型也是基于Decoder-Only架构的预训练语言模型。LLaMA模型的整体结构与GPT系列模型类似只是在模型规模和预训练数据集上有所不同。如图3.13是LLaMA模型的架构示意图
<div align='center'>
<img src="./figures/3-1.png" alt="alt text" width="100%">
<img src="../images/3-figures/3-1.png" alt="alt text" width="100%">
<p>图3.13 LLaMA-3 模型结构</p>
</div>
@@ -460,7 +460,7 @@ GLM 通过优化一个自回归空白填充任务来实现 MLM 与 CLM 思想的
通过将 MLM 与 CLM 思想相结合,既适配逐个 token 生成的生成类任务,也迫使模型从前后两个方向学习输入文本的隐含关系从而适配了理解类任务。使用 GLM 预训练任务产出的 GLM 模型,在一定程度上展现了其超出同体量 BERT 系模型的优越性能:
<div align='center'>
<img src="./figures/3-2.png" alt="alt text" width="90%">
<img src="../images/3-figures/3-2.png" alt="alt text" width="90%">
<p>图3.14 alt text</p>
</div>
@@ -479,7 +479,7 @@ ChatGLM3-6B 发布于 23年 10月相对于二代在语义、数学、推理
图3.15展示了 GLM 系列模型在基准集上的表现演进:
<div align='center'>
<img src="./figures/3-3.png" alt="alt text" width="90%">
<img src="../images/3-figures/3-3.png" alt="alt text" width="90%">
<p>图3.15 alt text</p>
</div>

View File

@@ -96,7 +96,7 @@ LLM 的强大能力也为其带来了跨模态的强大表现。随着 LLM 的
在上一节,我们分析了 LLM 的定义及其特有的强大能力,通过更大规模的参数和海量的训练语料获得远超传统预训练模型的涌现能力,展现出强大的上下文学习、指令遵循及逐步推理能力,带来 NLP 领域的全新变革。那么,通过什么样的步骤,我们才可以训练出一个具有涌现能力的 LLM 呢?训练一个 LLM与训练传统的预训练模型又有什么区别
<div align='center'>
<img src="./figures/2-0.jpg" alt="alt text" width="90%">
<img src="../images/4-figures/2-0.jpg" alt="alt text" width="90%">
<p>图4.1 训练 LLM 的三个阶段</p>
</div>
@@ -128,7 +128,7 @@ GPT-3|96|12288|96|175B|300B
也正因如此,分布式训练框架也成为 LLM 训练必不可少的组成部分。分布式训练框架的核心思路是数据并行和模型并行。所谓数据并行,是指训练模型的尺寸可以被单个 GPU 内存容纳,但是由于增大训练的 batch_size 会增大显存开销,无法使用较大的 batch_size 进行训练;同时,训练数据量非常大,使用单张 GPU 训练时长难以接受。
<div align='center'>
<img src="./figures/2-1.jpg" alt="alt text" width="60%">
<img src="../images/4-figures/2-1.jpg" alt="alt text" width="60%">
<p>图4.2 模型、数据并行</p>
</div>
@@ -137,7 +137,7 @@ GPT-3|96|12288|96|175B|300B
但是,当 LLM 扩大到上百亿参数,单张 GPU 内存往往就无法存放完整的模型参数。如图4.3所示,在这种情况下,可以将模型拆分到多个 GPU 上,每个 GPU 上存放不同的层或不同的部分,从而实现模型并行。
<div align='center'>
<img src="./figures/2-2.jpg" alt="alt text" width="30%">
<img src="../images/4-figures/2-2.jpg" alt="alt text" width="30%">
<p>图4.3 模型并行</p>
</div>
@@ -297,7 +297,7 @@ RLHF全称是 Reinforcement Learning from Human Feedback即人类反馈强
如图4.4所示ChatGPT 在技术报告中将对齐分成三个阶段,后面两个阶段训练 RM 和 PPO 训练,就是 RLHF 的步骤:
<div align='center'>
<img src="./figures/2-3.png" alt="alt text" width="100%">
<img src="../images/4-figures/2-3.png" alt="alt text" width="100%">
<p>图4.4 ChatGPT 训练三个的阶段</p>
</div>
@@ -331,7 +331,7 @@ RMReward Model即奖励模型。RM 是用于拟合人类偏好,来给 LL
在具体 PPO 训练过程中会存在四个模型。如图4.5所示,两个 LLM 和两个 RM。两个 LLM 分别是进行微调、参数更新的 actor model 和不进行参数更新的 ref model均是从 SFT 之后的 LLM 初始化的。两个 RM 分别是进行参数更新的 critic model 和不进行参数更新的 reward model均是从上一步训练的 RM 初始化的。
<div align='center'>
<img src="./figures/2-4.jpg" alt="alt text" width="100%">
<img src="../images/4-figures/2-4.jpg" alt="alt text" width="100%">
<p>图4.5 PPO 训练流程</p>
</div>

View File

@@ -1326,7 +1326,7 @@ class PretrainDataset(Dataset):
在以上代码和图5.1可以看出,`Pretrain Dataset` 主要是将 `text` 通过 `tokenizer` 转换成 `input_id`,然后将 `input_id` 拆分成 `X``Y`,其中 `X``input_id` 的前 n-1 个元素,`Y``input_id` 的后 n-1 `个元素。loss_mask` 主要是用来标记哪些位置需要计算损失,哪些位置不需要计算损失。
<div align='center'>
<img src="./images/pretrain_dataset.png" alt="alt text" width="100%">
<img src="../images/5-images/pretrain_dataset.png" alt="alt text" width="100%">
<p>图5.1 预训练损失函数计算</p>
</div>
@@ -1413,7 +1413,7 @@ class SFTDataset(Dataset):
在 SFT 阶段,这里使用的是多轮对话数据集,所以就需要区分哪些位置需要计算损失,哪些位置不需要计算损失。在上面的代码中,我使用了一个 `generate_loss_mask` 函数来生成 `loss_mask`。这个函数主要是用来生成 `loss_mask`,其中 `loss_mask` 的生成规则是:当遇到 `|<im_start|>assistant\n` 时,就开始计算损失,直到遇到 `|<im_end|>` 为止。这样就可以保证我们的模型在 SFT 阶段只计算当前轮的对话内容如图5.2所示。
<div align='center'>
<img src="./images/sftdataset.png" alt="alt text" width="90%">
<img src="../images/5-images/sftdataset.png" alt="alt text" width="90%">
<p>图5.2 SFT 损失函数计算</p>
</div>

View File

@@ -15,7 +15,7 @@
Transformers 是由 Hugging Face 开发的 NLP 框架,通过模块化设计实现了对 BERT、GPT、LLaMA、T5、ViT 等上百种主流模型架构的统一支持。通过使用 Transformers开发者无需重复实现基础网络结构通过 AutoModel 类即可一键加载任意预训练图6.1 为 Hugging Face Transformers 课程首页:
<div align='center'>
<img src="./images/1-1.png" alt="alt text" width="90%">
<img src="../images/6-images/1-1.png" alt="alt text" width="90%">
<p>图6.1 Hugging Face Transformers</p>
</div>
@@ -24,7 +24,7 @@ Transformers 是由 Hugging Face 开发的 NLP 框架,通过模块化设计实
对 LLM 时代的 NLP 研究者更为重要的是HuggingFace 基于 Transformers 框架搭建了其庞大的 AI 社区开放了数亿个预训练模型参数、25万+不同类型数据集,通过 Transformers、Dataset、Evaluate 等多个框架实现对预训练模型、数据集及评估函数的集成,从而帮助开发者可以便捷地使用任一预训练模型,在开源模型及数据集的基础上便捷地实现个人模型的开发与应用。
<div align='center'>
<img src="./images/1-2.png" alt="alt text" width="90%">
<img src="../images/6-images/1-2.png" alt="alt text" width="90%">
<p>图6.2 Hugging Face Transformers 模型社区</p>
</div>
@@ -35,14 +35,14 @@ Transformers 是由 Hugging Face 开发的 NLP 框架,通过模块化设计实
我们可以使用 transformers 的 AutoModel 类来直接初始化已经实现好的模型。对于任意预训练模型,其参数中都包含有模型的配置信息。如果是想要从头训练一个 LLM可以使用一个已有的模型架构来直接初始化。这里我们以 [Qwen-2.5-1.5B](https://huggingface.co/Qwen/Qwen2.5-1.5B/tree/main)的模型架构为例:
<div align='center'>
<img src="./images/1-3.png" alt="alt text" width="90%">
<img src="../images/6-images/1-3.png" alt="alt text" width="90%">
<p>图6.3 Qwen-2.5-1.5B</p>
</div>
该界面即为 HuggingFace 社区中的 Qwen-2.5-1.5B 模型参数,其中的 `config.json` 文件即是模型的配置信息包括了模型的架构、隐藏层大小、模型层数等如图6.4所示:
<div align='center'>
<img src="./images/1-4.png" alt="alt text" width="90%">
<img src="../images/6-images/1-4.png" alt="alt text" width="90%">
<p>图6.4 Qwen-2.5-1.5B config.json 文件</p>
</div>
@@ -59,7 +59,7 @@ os.system('huggingface-cli download --resume-download Qwen/Qwen2.5-1.5B --local-
如图6.5,此处的 “Qwen/Qwen2.5-1.5B”即为要下载模型的标识符,对于其他模型,可以直接复制 HuggingFace 上的模型名即可:
<div align='center'>
<img src="./images/1-5.png" alt="alt text" width="90%">
<img src="../images/6-images/1-5.png" alt="alt text" width="90%">
<p>图6.5 模型下载标识</p>
</div>
@@ -87,7 +87,7 @@ model = AutoModelForCausalLM.from_config(config,trust_remote_code=True)
由于 LLM 一般都是 CausalLM 架构,此处使用了 AutoModelForCausalLM 类进行加载。如果是用于分类任务训练,可使用 AutoModelForSequenceClassification 类来加载。查看该 model图6.6可以看到其架构和定义的配置文件相同:
<div align='center'>
<img src="./images/1-6.png" alt="alt text" width="70%">
<img src="../images/6-images/1-6.png" alt="alt text" width="70%">
<p>图6.6 模型结构输出结果</p>
</div>
@@ -130,7 +130,7 @@ ds["train"][0]
```
<div align='center'>
<img src="./images/1-7.png" alt="alt text" width="100%">
<img src="../images/6-images/1-7.png" alt="alt text" width="100%">
<p>图6.7 数据集展示</p>
</div>
@@ -788,7 +788,7 @@ trainer.save_model()
具体而言,其在预训练模型每层中插入用于下游任务的参数,即 Adapter 模块在微调时冻结模型主体仅训练特定于任务的参数如图6.8所示。
<div align='center'>
<img src="./images/3-1.png" alt="alt text" width="90%">
<img src="../images/6-images/3-1.png" alt="alt text" width="90%">
<p>图6.8 Adapt Tuning</p>
</div>
@@ -840,7 +840,7 @@ $$h = W_0 x + \Delta W x = W_0 x + B A x$$
训练思路如图6.9所示:
<div align='center'>
<img src="./images/3-2.jpg" alt="alt text" width="90%">
<img src="../images/6-images/3-2.jpg" alt="alt text" width="90%">
<p>图6.9 LoRA</p>
</div>

View File

@@ -47,7 +47,7 @@
Open LLM Leaderboard 为由 Hugging Face 提供的开放式榜单汇集了多个开源大模型的评测结果帮助用户了解不同模型在各种任务上的表现。该榜单通过多个标准化测试集来评估模型的性能并通过持续更新的方式反映最新的技术进展为研究者和开发者提供了高价值的对比参考如图7.1所示。
<div align='center'>
<img src="./images/7-1-Open%20LLM%20Leaderboard.png" alt="alt text" width="90%">
<img src="../images/7-images/7-1-Open%20LLM%20Leaderboard.png" alt="alt text" width="90%">
<p>图 7.1 Open LLM Leaderboard</p>
</div>
@@ -56,7 +56,7 @@ Open LLM Leaderboard 为由 Hugging Face 提供的开放式榜单,汇集了多
由lmsys提供的聊天机器人评测榜单通过多维度的评估展示各类大模型在对话任务中的能力。该榜单采用真实用户与模型交互的方式来评测对话质量重点考察模型的自然语言生成能力、上下文理解能力以及用户满意度是当前评估聊天机器人性能的重要工具如图7.2所示。
<div align='center'>
<img src="./images/7-1-lmsys%20Chatbot%20Arena%20Leaderboard.png" alt="alt text" width="90%">
<img src="../images/7-images/7-1-lmsys%20Chatbot%20Arena%20Leaderboard.png" alt="alt text" width="90%">
<p>图7.2 Lmsys Chatbot Arena Leaderboard</p>
</div>
@@ -65,7 +65,7 @@ Open LLM Leaderboard 为由 Hugging Face 提供的开放式榜单,汇集了多
OpenCompass 是国内的评测榜单,针对大模型在多种语言和任务上的表现进行评估,提供了中国市场特定应用的参考。该榜单结合了中文语言理解和多语言能力的测试,以适应本地化需求,并特别关注大模型在中文语境下的准确性、鲁棒性和适应性,为国内企业和研究者选择合适的模型提供了重要参考。
<div align='center'>
<img src="./images/7-1-opencompass.png" alt="alt text" width="90%">
<img src="../images/7-images/7-1-opencompass.png" alt="alt text" width="90%">
<p>图7.3 OpenCompass</p>
</div>
@@ -84,7 +84,7 @@ OpenCompass 是国内的评测榜单,针对大模型在多种语言和任务
- 医疗榜基于MedBench评测集评估大语言模型在医学知识问答、安全伦理理解等方面的表现。由上海人工智能实验室提供。
<div align='center'>
<img src="./images/7-1-垂直领域榜单.png" alt="alt text" width="90%">
<img src="../images/7-images/7-1-垂直领域榜单.png" alt="alt text" width="90%">
<p>图7.4 垂直领域榜单</p>
</div>
@@ -118,7 +118,7 @@ RAG的基本结构有哪些呢
上述也就是 TinyRAG 的所有模块内容如图7.5所示。
<div align='center'>
<img src="./images/7-2-tinyrag.png" alt="alt text" width="90%">
<img src="../images/7-images/7-2-tinyrag.png" alt="alt text" width="90%">
<p>图7.5 TinyRAG 项目结构</p>
</div>
@@ -131,7 +131,7 @@ RAG的基本结构有哪些呢
如下图7.6所示的流程图,图片出处 ***[Retrieval-Augmented Generation for Large Language Models: A Survey](https://arxiv.org/pdf/2312.10997.pdf)***
<div align='center'>
<img src="./images/7-2-rag.png" alt="alt text" width="90%">
<img src="../images/7-images/7-2-rag.png" alt="alt text" width="90%">
<p>图7.6 RAG 流程图</p>
</div>
@@ -403,7 +403,7 @@ print(chat.chat(question, [], content))
传统的LLM像一个知识渊博但只能纸上谈兵的图书馆员而 LLM Agent 则更像一个全能的私人助理,不仅懂得多,还能跑腿办事,甚至能主动思考最优方案。
<div align='center'>
<img src="./images/7-3-Agent工作原理.png" alt="alt text" width="90%">
<img src="../images/7-images/7-3-Agent工作原理.png" alt="alt text" width="90%">
<p>图7.7 Agent 工作原理</p>
</div>
@@ -440,7 +440,7 @@ LLM Agent 通过将大型语言模型的强大语言理解和生成能力与规
最终的实现效果如图7.8所示:
<div align='center'>
<img src="./images/7-3-tinyagent-example.png" style="width: 100%;">
<img src="../images/7-images/7-3-tinyagent-example.png" style="width: 100%;">
<p>图7.8 效果示意图</p>
</div>
@@ -633,7 +633,7 @@ Agent 的工作流程如下:
如图7.9所示Agent 调用工具流程:
<div align='center'>
<img src="./images/7-3-Tiny_Agent.jpg" alt="alt text" width="80%">
<img src="../images/7-images/7-3-Tiny_Agent.jpg" alt="alt text" width="80%">
<p>图7.9 Agent 工作流程</p>
</div>

View File

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 212 KiB

View File

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 149 KiB

View File

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 191 KiB

View File

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

View File

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

View File

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 174 KiB

View File

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 140 KiB

View File

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 640 KiB

After

Width:  |  Height:  |  Size: 640 KiB

View File

Before

Width:  |  Height:  |  Size: 195 KiB

After

Width:  |  Height:  |  Size: 195 KiB

View File

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 140 KiB

View File

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 126 KiB

View File

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 172 KiB

View File

Before

Width:  |  Height:  |  Size: 907 KiB

After

Width:  |  Height:  |  Size: 907 KiB

View File

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 168 KiB

View File

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

View File

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 KiB

BIN
docs/images/datawhale.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
docs/images/head.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

57
docs/index.html Normal file
View File

@@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Happy-LLM</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="Description">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@latest/lib/themes/vue.css">
</head>
<body>
<div id="app"></div>
<script src="//cdn.jsdelivr.net/npm/mermaid@8.0.0-rc.8/dist/mermaid.min.js"></script>
<script>
window.$docsify = {
name: 'Happy-LLM',
repo: 'https://github.com/datawhalechina/happy-llm',
loadSidebar: true,
auto2top: true,
subMaxLevel: 2,
relativePath: false, // 启用相对路径支持
alias: {
'/.*/_sidebar.md': '/_sidebar.md'
},
pagination: {
previousText: '上一章节',
nextText: '下一章节',
},
count: {
countable: true,
fontsize: '0.9em',
color: 'rgb(90,90,90)',
language: 'chinese'
}
}
</script>
<!-- Put them above docsify.min.js -->
<script src="//cdn.jsdelivr.net/npm/docsify@latest/lib/docsify.min.js"></script>
<!-- code render-->
<script src="//cdn.jsdelivr.net/npm/prismjs@latest/components/prism-bash.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@latest/components/prism-python.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-pagination@latest/dist/docsify-pagination.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-copy-code"></script>
<script src="https://cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.js"></script>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.css" />
<script src="https://cdn.jsdelivr.net/npm/marked@3"></script>
<!-- CDN files for docsify-katex -->
<script src="//cdn.jsdelivr.net/npm/docsify-katex@latest/dist/docsify-katex.js"></script>
<!-- 字数统计 -->
<script src="//unpkg.com/docsify-count/dist/countable.js"></script>
</body>
</html>

25
docs/前言.md Normal file
View File

@@ -0,0 +1,25 @@
# 前言
2022年底ChatGPT 的横空出世改变了人们对人工智能的认知也给自然语言处理Natural Language ProcessNLP领域带来了阶段性的变革以 GPT 系列模型为代表的大语言模型Large Language ModelLLM成为 NLP 乃至人工智能领域的研究主流。自 2023年至今LLM 始终是人工智能领域的核心话题,引发了一轮又一轮的科技浪潮。
LLM 其实是 NLP 领域经典研究方法预训练语言模型Pretrain Langguage ModelPLM的一种衍生成果。NLP 领域聚焦于人类书写的自然语言文本的处理、理解和生成,从诞生至今经历了符号主义阶段、统计学习阶段、深度学习阶段、预训练模型阶段到而今大模型阶段的多次变革。以 GPT、BERT 为代表的 PLM 是上一阶段 NLP 领域的核心研究成果,以注意力机制为模型架构,通过预训练-微调的阶段思想通过在海量无监督文本上进行自监督预训练,实现了强大的自然语言理解能力。但是,传统的 PLM 仍然依赖于一定量有监督数据进行下游任务微调且在自然语言生成任务上性能还不尽如人意NLP 系统的性能距离人们所期待的通用人工智能还有不小的差距。
LLM 是在 PLM 的基础上,通过大量扩大模型参数、预训练数据规模,并引入指令微调、人类反馈强化学习等手段实现的突破性成果。相较于传统 PLMLLM 具备涌现能力具有强大的上下文学习能力、指令理解能力和文本生成能力。在大模型阶段NLP 研究者可以一定程度抛弃大量的监督数据标注工作通过提供少量监督示例LLM 即能在指定下游任务上达到媲美大规模微调 PLM 的性能。同时,强大的指令理解能力与文本生成能力使 LLM 能够直接、高效、准确地响应用户指令,从而真正向通用人工智能的目标逼近。
LLM 的突破性进展激发了 NLP 领域乃至整个人工智能领域的研究热度,海内外高校、研究院、大厂乃至众多传统领域企业都投入到 LLM 研究的浪潮中。自 2023年至今LLM 阶段性成果层出不穷,模型性能不断刷新上限,从一开始的 ChatGPT到 GPT-4再到以 DeepSeek-R1 为代表的推理大模型、以 Qwen-VL 为代表的多模态大模型等更强大、更定制化的模型LLM 应用也不断涌现出能够提升实际生产力、赋能用户实际生活的创新应用从”百模大战“到”Agent 元年“LLM 基座研究或许已趋向稳定的格局LLM 的研究始终方兴未艾。可以肯定的是在并不遥远的未来LLM 及以 LLM 为基础的应用一定会成为人们生活中的基础设施,与每个人的生活、学习、工作密不可分。
在这样的背景下,深入理解、掌握 LLM 原理,能够动手应用、训练任意一个 LLM 的能力,对每一位 NLP 研究者乃至其他领域的 AI 研究者至关重要。我们在 2023年底分别创建了 self-llm开源大模型食用指南https://github.com/datawhalechina/self-llm 、llm-universe动手学大模型应用开发https://github.com/datawhalechina/llm-universe )两个原创开源大模型教程,前者旨在为开发者提供一站式开源 LLM 部署、推理、微调的使用教程,后者旨在指导开发者从零开始搭建自己的 LLM 应用。两个教程都帮助到了广泛的国内外开发者,也获得了众多开发者的支持和认可,在学习者的反馈中,我们发现目前还缺乏一个从零开始讲解 LLM 原理、并引导学习者亲手搭建、训练 LLM 的完整教程。
鉴于此,我们编写了这本结合 LLM 原理及实战的教程。本书将从 NLP 的基本研究方法出发,根据 LLM 的思路及原理逐层深入,依次为读者剖析 LLM 的架构基础和训练过程。同时,我们会结合目前 LLM 领域最主流的代码框架,演练如何亲手搭建、训练一个 LLM期以实现授之以鱼更授之以渔。希望读者能从这本书开始走入 LLM 的浩瀚世界,探索 LLM 的无尽可能。
## 写给读者的建议
本书包含 LLM 的理论基础、原理介绍和项目实战,全书包括 LLM 及 NLP 的核心思路剖析、公式解析与代码实战,旨在帮助开发者深入理解并掌握 LLM 的基本原理与应用。因此本书适合大学生、研究人员、LLM 爱好者阅读。在阅读本书之前,你需要具备一定的编程经验,尤其是要对 Python 编程语言有一定的了解。同时,你最好具备深度学习的相关知识,并了解 NLP 领域的相关概念和术语,以便更轻松地阅读本书。
本书分为两部分——基础知识与实战应用。第1章第4章是基础知识部分从浅入深介绍 LLM 的基本原理。其中第1章简单介绍 NLP 的基本任务和发展,为非 NLP 领域研究者提供参考第2章介绍 LLM 的基本架构——Transformer包括原理介绍及代码实现作为 LLM 最重要的理论基础第3章整体介绍经典的 PLM包括 Encoder-Only、Encoder-Decoder 和 Decoder-Only 三种架构,也同时介绍了当前一些主流 LLM 的架构和思想第4章则正式进入 LLM 部分,详细介绍 LLM 的特点、能力和整体训练过程。第5章第7章是实战应用部分将逐步带领读者深入 LLM 的底层细节。其中第5章将带领读者基于 PyTorch 层亲手搭建一个 LLM并实现预训练、有监督微调的全流程第6章将引入目前业界主流的 LLM 训练框架 Transformers带领读者基于该框架快速、高效地实现 LLM 训练过程第7章则将介绍 基于 LLM 的各种应用,补全读者对 LLM 体系的认知,包括 LLM 的评测、检索增强生产Retrieval-Augmented GenerationRAG、智能体Agent的思想和简单实现。你可以根据个人兴趣和需求选择性地阅读相关章节。
在阅读本书的过程中建议你将理论和实际相结合。LLM 是一个快速发展、注重实践的领域,我们建议你多投入实战,复现本书提供的各种代码,同时积极参加 LLM 相关的项目与比赛,真正投入到 LLM 开发的浪潮中。我们鼓励你关注 Datawhale 及其他 LLM 相关开源社区,当遇到问题时,你可以随时在 Datawhale 社区提问。Datawhale 也会始终跟进 LLM 及其他人工智能技术的发展,欢迎你关注或加入到 Datawhale 社区的共建中。
最后,欢迎每一位读者在阅读完本书后加入到 LLM 开发者的行列。作为国内 AI 开源社区,我们希望充分聚集共创者,一起丰富这个开源 LLM 的世界,打造更多、更全面特色 LLM 的教程。星火点点,汇聚成海。我们希望成为 LLM 与普罗大众的阶梯,以自由、平等的开源精神,拥抱更恢弘而辽阔的 LLM 世界。
感谢你选择本书,祝你阅读愉快!