@_rohit_tiwari_:用PyTorch从头构建类似GPT的LLM > 将LLM架构拆分为简单部分 > 对初学者友好 > Fu…
摘要
一个对初学者友好的动手GitHub仓库,将类似GPT的LLM架构拆分为简单部分,包含10个Jupyter笔记本,涵盖分词、注意力机制、Transformer块以及用PyTorch实现的微型GPT。
查看缓存全文
缓存时间: 2026/06/05 17:17
从零开始用PyTorch构建GPT类大语言模型
将LLM架构拆解为简单部分
适合初学者
完全动手实践
https://github.com/analyticalrohit/llms-from-scratch…
每一步都有详细解释
仅需10个Jupyter笔记本
01_tokenization.ipynb
02_token_embeddings.ipynb
03_positional_embeddings.ipynb
04_self_attention_mechanism.ipynb
05_multi_head_self_attention.ipynb
06_feedforward_neural_networks.ipynb
07_residual_connections.ipynb
08_layer_normalization.ipynb
09_transformer_block.ipynb
10_mini_gpt.ipynb
analyticalrohit/llms-from-scratch
来源:https://github.com/analyticalrohit/llms-from-scratch
从零构建大语言模型
概述
本仓库是一份动手实践指南,教你用PyTorch构建类似ChatGPT的大语言模型。它将架构拆解为简单部分,并逐步解释每个部分。
LLM架构
我们先鸟瞰一下生成式预训练Transformer(GPT)类LLM的架构。
示例:Every moment is a beginning
LLM的工作原理是每次预测一个词或token。LLM通过迭代生成文本。每个预测出的词token会被追加到之前的输入中,形成下一次预测的上下文。
内容
- Tokenization
- Token Embeddings
- Positional Embeddings
- Self Attention Mechanism
- Multi-Head Self Attention
- FeedForward Neural Networks
- Residual Connections
- Layer Normalization
- Transformer Block
- MiniGPT
代码笔记本
通过交互式Jupyter笔记本深入了解每个LLM组件的实践示例。
| 主题 | 代码 |
|---|---|
| Tokenization(分词) | 01_tokenization.ipynb |
| Token Embeddings(词嵌入) | 02_token_embeddings.ipynb |
| Positional Embeddings(位置嵌入) | 03_positional_embeddings.ipynb |
| Self Attention Mechanism(自注意力机制) | 04_self_attention_mechanism.ipynb |
| Multi-Head Self Attention(多头自注意力) | 05_multi_head_self_attention.ipynb |
| FeedForward Neural Networks(前馈神经网络) | 06_feedforward_neural_networks.ipynb |
| Residual Connections(残差连接) | 07_residual_connections.ipynb |
| Layer Normalization(层归一化) | 08_layer_normalization.ipynb |
| Transformer Block(Transformer块) | 09_transformer_block.ipynb |
| MiniGPT(迷你GPT) | 10_mini_gpt.ipynb |
安装依赖
pip install -r requirements.txt
如果你要安装支持CUDA的torch,请确保从PyTorch官网(https://pytorch.org/get-started/locally/)使用正确的安装命令,因为某些版本需要特定的安装方法。
Tokenization(分词)
分词是将文本拆分成更小单元(称为token)的过程。这些token是LLM处理的基本构建块。
输入句子:“Every moment is a beginning”
Tokens:[“Every”, “moment”, “is”, “a”, “beginning”]
这展示了一个分词器如何将句子拆分成token。分词后,每个唯一的token会被分配一个唯一的数字ID。下面是一个简单的可视化示例:
Token Embeddings(词嵌入)
现在我们有了一个数字列表,但这些数字本身并不携带任何含义。“Every”的ID“15745”并不能告诉机器“Every”是一个用来描述名词的限定词。这就是嵌入发挥作用的地方。
Token Embeddings本质上是token的数值表示(向量),即一个由描述其特征的数字组成的列表(向量)。
Positional Embeddings(位置嵌入)
想象一下句子:
- The dog jumps on the cat.
- The cat jumps on the dog.
单词相同,但含义完全不同,因为位置不同。我们的数值token ID和token嵌入本身并不能告诉LLM任何关于单词顺序的信息。这通过位置嵌入来解决。
位置嵌入是另一组数字列表(向量),它们被加到token嵌入上。这些向量帮助模型理解序列中每个token的绝对或相对位置。
Self Attention Mechanism(自注意力机制)
自注意力帮助模型理解句子中单词之间的关系。每个token可以查看其他token,并决定哪些token最重要,而不是单独读取每个单词。
以这句话为例:“Every moment is a beginning.”
为了理解单词“beginning”,模型会关注像“moment”和“Every”这样的词。这提供了上下文,帮助模型捕捉到“每个时刻都可能代表一个新的开始”这一概念。
我们计算所有Query和Key之间的点积,以衡量它们的匹配程度。结果会通过键维度的平方根进行缩放,以在训练过程中保持数值稳定。
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
现在每个token都包含了从序列中其他token收集到的信息。这是Transformer的核心思想。
在标准自注意力中,每个token可以关注序列中的所有其他token。但在语言模型中,预测时未来token不应可见。例如,在预测:Every moment is -> a 时,模型不应提前看到未来的单词beginning。
因果自注意力通过使用一个掩码来解决这个问题,该掩码阻断了未来token的访问。掩码如下所示:
\begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ 1 & 1 & 1 \end{bmatrix}
其中:
1表示允许注意力0表示阻止注意力
这确保了:
- token 1 只能看到自己
- token 2 可以看到 token 1 和 2
- token 3 可以看到 token 1、2 和 3
现在每个token只能关注自身及其之前的token。这是仅解码器Transformer模型(如GPT)所使用的机制。
Multi-Head Self Attention(多头自注意力)
多头注意力允许Transformer同时学习不同类型的关系。模型不是使用单一的注意力机制,而是并行使用多个注意力头。每个头以不同的方式查看同一个句子,并学习其自身的关系模式。
以句子“Every moment is a beginning.”为例:
不同的注意力头可能关注不同的含义:
- 一个头可能连接“moment” ↔ “beginning”,以理解更新或变化的概念。
- 另一个头可能关注语法:“Every” ↔ “moment”,以理解“Every”在描述“moment”。
- 另一个头可能关注句子含义:“is” ↔ “beginning”,以理解句子的主要陈述。
单个注意力头一次只能学习一种类型的关系。多个头使模型能够捕捉:语法、含义、长距离依赖、主宾关系和上下文模式。
工作原理:
- 输入嵌入被分割成更小的部分,称为头。
- 每个头独立执行注意力计算。
- 所有头的输出被拼接在一起。
- 一个最终的线性层将信息组合成一个表示。
每个头在独立的维度上工作。这使模型能够学习更丰富、更多样化的单词间关系。所有头的输出被组合成一个表示。这提高了模型理解语言的能力。
FeedForward Neural Networks(前馈神经网络)
注意力允许token在序列中相互通信并交换信息。例如,在句子“Every moment is a beginning.”中,注意力帮助token“beginning”从“moment”和“Every”等单词中收集上下文。但是,在信息混合之后,每个token仍然需要额外的处理来学习更复杂的模式。这就是前馈网络(通常称为FFN或MLP块)的作用。
前馈神经网络通常由两个线性层组成,中间有一个激活函数(如GELU),临时扩展隐藏维度(通常为4倍),以帮助模型学习更复杂的模式。
- 线性层
- 激活函数
- 第二个线性层
Residual Connections(残差连接)
深度神经网络很难训练。随着网络变深,反向传播过程中的梯度可能会变得非常小或非常大。这被称为梯度消失或梯度爆炸问题。当梯度消失时,较浅的层学习非常缓慢,因为训练信号在向后传播经过许多层时会减弱。
残差连接(也称为跳跃连接)有助于解决这个问题。模型不是学习一个全新的变换,而是学习相对于原始值如何修改输入。原始输入被加回到层的输出中:
\text{Output} = x + \text{Sublayer}(x)
Transformer在以下两个位置周围都使用了残差连接:
- 多头注意力
- 前馈网络
残差连接帮助Transformer:
- 训练更深的网络
- 稳定梯度
- 保留信息
它们是现代深度学习架构的核心构建块之一。
Layer Normalization(层归一化)
神经网络中的激活值在训练过程中可能会变得不稳定。当数据经过许多层时,数值可能会变得过大或过小。这使得优化变得困难,并可能减慢学习速度。层归一化有助于稳定这些激活值。它对每个token的特征进行独立归一化,使数值保持:
- 均值 ≈ 0
- 标准差 ≈ 1
这使训练更快、更稳定、更可靠。
假设一个token嵌入是:
x = [x_1, x_2, x_3]
LayerNorm计算:
均值 \mu = \frac{1}{n}\sum x_i
方差 \sigma^2 = \frac{1}{n}\sum (x_i - \mu)^2
归一化后的输出 \hat{x}_i =\frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}}
这将特征变换为近似零均值和单位方差。在每个Transformer块内部,层归一化会被多次应用。
Transformer Block(Transformer块)
Transformer块结合了:
- 多头注意力
- 前馈神经网络
- 残差连接
- 层归一化
这是GPT模型的核心构建块。一个Transformer块以特定的顺序将这些部分链接在一起。
在GPT模型中(采用“预归一化”架构),顺序是:
- LayerNorm
- 多头注意力
- 残差相加
- LayerNorm
- 前馈
- 残差相加
通常在注意力和前馈层之后还会使用Dropout,以减少过拟合并提高泛化能力。
现代GPT模型将多个Transformer块堆叠在一起。每个块都会精炼token的表示。
MiniGPT(迷你GPT)
MiniGPT是一个使用Transformer块构建的小型GPT风格语言模型。它结合了:
- 词嵌入
- 位置嵌入
- Transformer块
- 层归一化
- 输出投影层
该模型处理输入token并预测序列中的下一个token。
参数
| 参数 | 描述 |
|---|---|
vocab_size | 词汇表中的token总数 |
block_size | 最大序列长度 |
embed_dim | 词嵌入大小 |
num_heads | 注意力头数 |
hidden_dim | 前馈网络的隐藏大小 |
num_layers | Transformer块的数量 |
整体流程
text Input Tokens ↓ Token Embeddings ↓ Positional Embeddings ↓ Transformer Blocks ↓ LayerNorm ↓ Linear Layer ↓ Vocabulary Logits
MiniGPT以自回归方式训练。它利用之前的token预测下一个token。这是GPT风格语言模型的核心思想。
博客文章
在配套的博客中阅读完整的分解和见解。
- LLM可视化指南(第一部分):从文本到数字:分词与嵌入(https://awesomeneuron.substack.com/p/a-visual-guide-to-llms-part-1)
- LLM可视化指南(第二部分):深入Transformer架构
通讯
📌 加入来自150多个国家的10,000多名机器学习爱好者和专业人士。
✅ 通过可视化、易于理解的见解免费学习AI。
✅ 每周在收件箱中获取GenAI、RAG和LLM等前沿话题。
订阅AwesomeNeuron通讯(https://awesomeneuron.substack.com/)
贡献
欢迎贡献!如果你有改进、新笔记本或修复建议:
- Fork此仓库。
- 创建一个功能分支:
git checkout -b feature/YourTopic。 - 在
notebooks/文件夹中添加或更新笔记本。 - 提交你的更改:
git commit -m '添加或更新YourTopic笔记本'。 - 推送你的分支:
git push origin feature/YourTopic。 - 开一个Pull Request供审查。
许可证
本项目基于MIT许可证授权
⭐️ 如果你觉得这个仓库有帮助,请考虑给它一颗星!
星历图(https://www.star-history.com/#analyticalrohit/llms-from-scratch&type=date&legend=top-left)
关键词:AI, Machine Learning, Deep Learning, PyTorch, Generative AI, LLMs, Transformers
相似文章
@akshay_pachaar: 从头开始训练你自己的LLM。这个仓库从头构建了一个GPT风格的Transformer,完全不用高级库…
一个从零开始构建GPT风格Transformer的仓库,不使用高级库,涵盖了从数据预处理到生成的整个过程,并包括SFT和RLHF的指南。
@Xx15573208: 看了很多 Transformer 的文章,能听懂原理,但真正坐下来写代码,完全无从下手。 LLMs-from-scratch 专门解决这个问题:配套《Build a Large Language Model》一书,带你用 PyTorch …
LLMs-from-scratch 是一个 GitHub 仓库,配套《Build a Large Language Model》一书,提供从零用 PyTorch 实现 GPT 的完整代码,涵盖预训练、微调、RLHF 等全流程,已获 93K+ stars,适合想深入理解大模型原理的开发者。
@techNmak: 从零构建LLMs 发现来自Vizuara的宝藏,一个43讲的系列课程,真正兑现了承诺:构建…
Vizuara的43讲系列课程教你如何从零构建LLMs,涵盖Transformer架构、GPT内部原理、分词(BPE)和注意力机制,并提供完整的Python实现。
@sairahul1:没人告诉你GPT或Claude内部到底是什么。他们说“transformer”然后就略过了。这个仓库从头构建了一个……
一个仓库,从头构建transformer,不用高级库,解释注意力机制和完整训练流程,在免费Colab上一天内可训练。
@Modular: MAX-LLM 书籍让从零开始构建 LLM 变得更加简单。新的笔记本格式让你可以运行 GPT-2 …
MAX-LLM 书籍现在提供交互式 Jupyter 笔记本,逐步指导用户使用 MAX 框架从零开始构建完整的 GPT-2 实现,使用户能够探索张量形状、运行组件并生成文本。