pytorch-original-transformer

GitHub
1.1k 187 中等 1 次阅读 昨天MIT语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

pytorch-original-transformer 是经典 Transformer 模型(Vaswani 等人提出)的 PyTorch 复现版本,旨在降低学习门槛,帮助用户轻松上手并深入理解这一革命性架构。它解决了原始论文中数学公式抽象、核心概念难以直观把握的痛点,特别针对位置编码、自定义学习率调度及标签平滑等关键机制提供了可视化辅助。

该项目不仅包含完整的模型代码和预训练的机器翻译模型,更独特的亮点在于内置了 playground.py 脚本。通过该脚本,用户可以将枯燥的公式转化为直观的图表,例如将复杂的位置编码公式映射为清晰的热力图,或将学习率变化曲线具象化,让“只可意会”的概念变得一目了然。

pytorch-original-transformer 非常适合希望从零掌握 Transformer 原理的开发者、学生及研究人员使用。对于想要探究注意力机制本质,而非直接调用黑盒 API 的技术人员来说,这是一个极佳的学习资源。配合代码中详尽的注释与可视化工具,它能帮助用户快速建立对现代大语言模型基石的深刻认知,是通往高阶 NLP 研究的理想起点。

使用场景

某高校自然语言处理实验室的研究员正在指导本科生深入理解 Transformer 架构,并需要复现经典论文中的机器翻译实验以验证注意力机制原理。

没有 pytorch-original-transformer 时

  • 学生面对 Vaswani 原论文中复杂的数学公式(如位置编码和学习率调度)感到困惑,难以将抽象理论转化为直观认知。
  • 从零开始搭建符合原始论文标准的模型代码耗时费力,极易在掩码机制或层归一化等细节上引入隐蔽错误。
  • 缺乏可视化的辅助工具,无法动态观察标签平滑(Label Smoothing)如何改变概率分布,导致对正则化策略的理解停留在表面。
  • 寻找预训练权重和适配数据集(如 IWSLT)的过程繁琐,阻碍了快速开展神经机器翻译(NMT)的对比实验。

使用 pytorch-original-transformer 后

  • 通过运行自带的 playground.py,学生能直接看到位置编码波形图和学习率变化曲线,瞬间读懂原本晦涩的公式含义。
  • 直接调用高度注释且严格遵循原论文的实现代码,确保了架构的准确性,让学生能将精力集中在算法逻辑而非调试基建上。
  • 利用可视化的标签平滑示意图,清晰观察到概率质量如何在非目标词间重新分配,深刻理解了防止模型过自信的原理。
  • 一键加载已提供的 IWSLT 预训练模型,立即启动翻译任务测试,大幅缩短了从理论学习到动手实践的路径。

pytorch-original-transformer 通过将晦涩的理论可视化并提供标准化的复现基线,极大地降低了初学者掌握 Transformer 核心机制的门槛。

运行环境要求

操作系统
  • Windows
  • Linux
  • macOS
GPU
  • 需要 NVIDIA GPU(用于训练),显存大小取决于 batch_size,需避免 CUDA out of memory 错误
  • 建议预先安装系统级 CUDA 和 cuDNN 以匹配 PyTorch 版本
内存

未说明

依赖
notes建议使用 Miniconda 创建名为 'pytorch-transformer' 的环境。首次运行会自动下载 SpaCy 的英语和德语统计模型及数据集(IWSLT/WMT-14),耗时较长。训练时若使用 WMT-14 数据集,目前不支持多 GPU。Windows 用户若遇到 'DLL load failed' 错误,需重装 pywin32。代码包含自定义数据加载缓存机制以提升速度。
python通过 conda 环境管理 (environment.yml),具体版本未明确提及
pytorch
torchtext
spacy
nltk
tensorboard
jupyter
pywin32 (仅限 Windows)
pytorch-original-transformer hero image

快速开始

原始 Transformer(PyTorch):computer: = :rainbow:

此仓库包含原始 Transformer 论文的 PyTorch 实现(:link: Vaswani 等)。
其目标是让读者能够轻松上手并学习 Transformer 模型。

目录

什么是 Transformer

Transformer 最早由 Vaswani 等人在一篇开创性的论文《Attention Is All You Need》中提出(链接)。

你可能或多或少听说过 Transformer。比如GPT-3 和 BERT等知名模型 :unicorn:。其核心思想在于,他们证明了无需使用循环层或卷积层,仅通过简单的架构结合注意力机制就能发挥强大的作用。这带来了更优秀的长距离依赖建模能力,并且该架构本身高度可并行化(:computer::computer::computer:),从而显著提升计算效率!

以下是其简洁而优美的架构示意图:

理解 Transformer

本仓库旨在作为学习资源,帮助大家理解 Transformer 模型,因为原始的 Transformer 已经不再是当前的 SOTA 模型了。

为此,代码中添加了详尽的注释,并且我编写了 playground.py 文件,用于可视化一些难以用文字描述、但通过图像却能直观理解的概念。接下来就让我们开始吧!

位置编码

你能一眼看懂这个公式吗?

我也不行。不过,运行 playground.py 中的 visualize_positional_encodings() 函数后,我们得到如下可视化结果:

根据源语言或目标语言词元的位置,只需“选取这张图中的一行”,将其加到对应的嵌入向量中即可,就这么简单。当然,位置编码也可以通过学习获得,但显然这样实现起来更加优雅! :nerd_face:

自定义学习率调度

同样地,你能瞬间读懂下面这个公式吗?

不行吧?那我就把它可视化出来:

现在是不是就很容易理解了呢?至于这部分是否对 Transformer 的成功至关重要,我表示怀疑。不过,它确实很酷,也让事情变得更复杂一些。 :nerd_face: (.set_sarcasm(True)

注:模型维度基本上就是嵌入向量的大小,基准 Transformer 使用的是 512 维,更大的版本则是 1024 维。

标签平滑

初次听到“标签平滑”时,可能会觉得很难理解,但实际上并不复杂。通常情况下,我们会将目标词汇表分布设置为“独热编码”。也就是说,在 3 万个词(或你的词汇表大小是多少)中,只有一个位置的概率为 1,其余均为 0。

而在应用标签平滑时,我们不会直接将概率设为 1,而是例如设为 0.9,然后将剩余的概率均匀分配到其他位置上。 (如上图所示,在一个虚构的 4 个词的词汇表中,这些概率被表示为不同深浅的紫色条带——因此有 4 列。)

注:填充符(Pad token)的概率分布始终为零,因为我们不希望模型预测这些符号!

除了这个仓库之外(这还用说吗?),我还强烈推荐你阅读 Jay Alammar 的精彩博客:这里

机器翻译

Transformer 最初是在 WMT-14 数据集 上针对 NMT(神经机器翻译)任务进行训练的:

  • 英语到德语的翻译任务(BLEU 得分为 28.4)
  • 英语到法语的翻译任务(BLEU 得分为 41.8)

目前,我则在规模小得多的 IWSLT 数据集 上,针对英德语言对训练了自己的模型。由于我本人会说这两种语言,调试和实验起来更加方便。

不久之后,我也计划在 WMT-14 数据集上训练模型,请关注 待办事项 部分。


总之!让我们来看看这个仓库究竟能为你做些什么吧!没错,它可以进行翻译!

以下是我基于 IWSLT 数据集训练的德英模型的一些简短翻译示例:

输入:Ich bin ein guter Mensch, denke ich.(“金句”:我认为自己是个好人)
输出:['<s>', 'I', 'think', 'I', "'m", 'a', 'good', 'person', '.', '</s>']
或者以人类可读的形式呈现:I think I'm a good person.

这其实相当不错!在我看来,甚至比 Google Translate 的“金句”翻译还要好。


当然也有失败的情况,比如:

输入:Hey Alter, wie geht es dir?(哥们儿,最近怎么样?)
输出:['<s>', 'Hey', ',', 'age', 'how', 'are', 'you', '?', '</s>']
或者以人类可读的形式呈现:Hey, age, how are you?

不过这也算不上完全糟糕,原因在于:

  • 首先,模型是在 IWSLT 数据集上训练的,该数据集主要包含类似 TED 演讲的对话内容。
  • “Alter” 是一种口语化的表达,意为“老兄”或“哥们儿”,但其字面意思确实是“年龄”。

类似的逻辑也适用于英德翻译模型。

设置

我们已经讨论了 Transformer 是什么以及它能为你做什么(以及其他用途)。
现在就让我们把它跑起来吧!请按照以下步骤操作:

  1. git clone https://github.com/gordicaleksa/pytorch-original-transformer
  2. 打开 Anaconda 控制台,进入项目目录:cd path_to_repo
  3. 在项目目录下运行 conda env create(这将创建一个新的 conda 环境)。
  4. 运行 activate pytorch-transformer(以便从控制台运行脚本,或在 IDE 中设置解释器)。

就这样!执行 environment.yml 文件后,应该可以开箱即用,自动处理所有依赖关系。
由于需要自动下载 SpaCy 的英语和德语统计模型,这个过程可能需要一些时间。


虽然 PyTorch 的 pip 包会自带某个版本的 CUDA/cuDNN,但强烈建议你事先在系统级别安装 CUDA,主要是为了确保 GPU 驱动程序的兼容性。 此外,我推荐使用 Miniconda 安装程序来在你的系统上部署 conda。 请参考 这篇设置指南 中的第 1 和第 2 步, 并为你的系统选择最新版本的 Miniconda 和 CUDA/cuDNN。

使用方法

选项 1:Jupyter Notebook

只需在 Anaconda 控制台中运行 jupyter notebook,它就会在您的默认浏览器中打开会话。
打开 The Annotated Transformer ++.ipynb,您就可以开始玩了!


注意: 如果您遇到 DLL 加载失败,在导入 win32api 时:指定的模块未找到 的错误
只需执行 pip uninstall pywin32,然后要么 pip install pywin32,要么 conda install pywin32 应该可以解决这个问题

选项 2:使用您选择的 IDE

您只需要将您在 设置 部分创建的 Python 环境链接到您的 IDE 即可。

训练

要运行训练,请启动 training_script.py。有几个参数您需要指定:

  • --batch_size - 这个参数很重要,应设置为不会导致 CUDA 内存不足的最大值。
  • --dataset_name - 在 IWSLTWMT14 之间选择(在添加多 GPU 支持之前,不建议使用 WMT14 见待办事项)。
  • --language_direction - 在 E2GG2E 之间选择。

因此,一个示例运行(从控制台)看起来如下:
python training_script.py --batch_size 1500 --dataset_name IWSLT --language_direction G2E

代码中有详细的注释,因此您应该能够理解训练过程是如何进行的。

该脚本会:

  • 将检查点模型以 .pth 格式保存到 models/checkpoints/ 目录下。
  • 将最终模型以 .pth 格式保存到 models/binaries/ 目录下。
  • 下载 IWSLT/WMT-14 数据集(首次运行时),并将其放置在 data/ 目录下。
  • tensorboard 数据 保存到 runs/ 目录下,您只需在 Anaconda 中运行 tensorboard --logdir=runs 即可。
  • 定期将一些训练元数据输出到控制台。

注意:torch text 中的数据加载速度较慢,因此我实现了一个自定义包装器,增加了缓存机制,使加载速度提高了约 30 倍!(首次运行时仍然会比较慢)

推理(翻译)

第二部分是关于使用这些模型进行翻译,并观察它们的表现!
要进行翻译,请启动 translation_script.py。有几个参数您需要设置:

  • --source_sentence - 根据您指定的模型,这应该是英语或德语句子。
  • --model_name - 预训练模型名称之一:iwslt_e2giwslt_g2e,或者您自己的模型(*)。
  • --dataset_name - 与模型保持一致,如果模型是在 IWSLT 数据集上训练的,则设置为 IWSLT
  • --language_direction - 与模型保持一致,如果模型是用于英译德的,则设置为 E2G

(*) 注意:在您训练完模型后,它会被保存到 models/binaries 目录下。请查看其文件名,并通过 --model_name 参数指定,以便用于翻译任务。如果您指定了一些预训练模型,它们将在您首次运行翻译脚本时 自动下载

我也会在此处提供 IWSLT 预训练模型的链接:英译德德译英

就是这样!您还可以可视化注意力机制,详情请参阅 可视化注意力 部分。

评估 NMT 模型

我在训练过程中跟踪了三条曲线:

  • 训练损失(KL 散度,批次均值)
  • 验证损失(KL 散度,批次均值)
  • BLEU-4 分数

BLEU 是一种基于 n-gram 的指标,用于定量评估机器翻译模型的质量。
我使用了由优秀的 nltk Python 模块提供的 BLEU-4 指标。

当前结果:模型均训练了 20 个 epoch(DE 代表德语,即 German in German :nerd_face:):

模型 BLEU 分数 数据集
基准 Transformer(EN-DE) 27.8 IWSLT 验证集
基准 Transformer(DE-EN) 33.2 IWSLT 验证集
基准 Transformer(EN-DE) x WMT-14 验证集
基准 Transformer(DE-EN) x WMT-14 验证集

这些结果是使用贪婪解码得到的,因此是一个偏保守的估计。我计划很快加入束搜索解码 见待办事项

重要提示: 初始化对 Transformer 的性能影响很大!我最初认为其他实现中使用的 Xavier 初始化只是一种任意的启发式方法,PyTorch 的默认初始化就足够了——但我错了:

您可以看到这里有 3 次运行,下面的 2 次使用了 PyTorch 的默认初始化(其中一次使用 KL 散度损失的 mean,另一次使用 batchmean),而上面的一次则使用了 Xavier 均匀 初始化!


想法:您也可以定期为一组参考源句生成翻译结果。
这样可以为您提供关于 Transformer 行为的定性见解,尽管我没有这样做。类似的做法也常用于难以定量评估模型的情况,例如 GANsNST 领域。

使用 TensorBoard 跟踪

上述图表是我使用 Azure ML 运行时截取的一部分,但在本地运行时,我会使用 TensorBoard。

只需在 Anaconda 控制台中运行 tensorboard --logdir=runs,即可在训练过程中跟踪各项指标。

可视化注意力

您可以使用 translation_script.py,并将 --visualize_attention 设置为 True,以进一步了解您的模型在源句和目标句中“关注”的内容。

以下是针对输入句子 Ich bin ein guter Mensch, denke ich. 所获得的注意力图。

这些属于编码器的第 6 层。您可以看到所有的 8 个多头注意力头。

而这张图则属于解码器第 6 层的自注意力 MHA(多头注意力)模块。
您会注意到一个有趣的 三角形模式,这是由于目标词无法“向前看”造成的!

第三种类型的 MHA 模块是源端注意力模块,其图示与您之前看到的编码器注意力图相似。
您可以根据自己的节奏随意探索这些注意力图!

注意:显然,这个模型存在一些偏差问题,但在这里我们暂不深入分析。

硬件要求

如果你想在 WMT-14 数据集上训练 Transformer 模型,确实需要一台性能不错的硬件。

作者们使用了:

  • 在 8 张 P100 GPU 上花费 12 小时 来训练基准模型,而训练大型模型则用了 3.5 天

如果我的计算没错的话,这相当于基准模型大约进行了 ~19 个 epoch(共 10 万个 step,每个 step 约有 2.5 万个 token,而 WMT-14 总共有约 1.3 亿个源端/目标端 token),而大型模型则是其三倍,即 30 万个 step。

另一方面,在 IWSLT 数据集上训练模型则要容易得多。我在自己的 RTX 2080 机器上(8 GB 显存)的训练时间为:

  • 每个 epoch 约 13.2 分钟(1500 个 token 的 batch 大小); 而在 Azure ML 的 K80s 上(24 GB 显存)则约为:
  • 每个 epoch 约 34 分钟(1500 个 token 的 batch 大小)。

我本可以把 K80s 的 batch 大小提高到 3500+ 个 token,但遇到了一些 CUDA 内存不足的问题。

待办事项:

最后还有一些待办事项,我希望很快就能添加上去:

  • 多 GPU/多节点训练支持(这样你就可以在 WMT-14 数据集上训练 19 个 epoch 的模型);
  • 束搜索解码(事实证明实现起来并不那么容易!);
  • BPE 和共享的源目标词汇表(我现在使用的是 SpaCy)。

这个仓库已经具备了所需的一切功能,这些只是额外的补充。我已经测试过从环境搭建到自动下载模型等所有内容。

视频学习资料

如果你在理解代码时遇到困难,我在这段视频中对这篇论文做了深入的概述:点击观看

深入解读《Attention Is All You Need》论文

我还有一些其他视频可以帮助你更好地理解 Transformer 模型:

致谢

在开发这个项目的过程中,以下资源对我很有帮助:

我在设计模型时从 The Annotated Transformer 中获得了一些灵感,但它的内容比较难懂,而且还存在一些 bug。它主要是为研究人员编写的。希望这个仓库也能让普通大众更容易理解 Transformer 模型! :nerd_face:

引用

如果你觉得这段代码有用,请引用如下:

@misc{Gordić2020PyTorchOriginalTransformer,
  author = {Gordić, Aleksa},
  title = {pytorch-original-transformer},
  year = {2020},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/gordicaleksa/pytorch-original-transformer}},
}

与我联系

如果你想在生活中多接触一些与人工智能相关的内容 :nerd_face:,不妨考虑:

许可证

License: MIT

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|今天
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|昨天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

140.4k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|3天前
开发框架图像Agent

Deep-Live-Cam

Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具,用户仅需一张静态照片,即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点,让高质量的数字内容创作变得触手可及。 这款工具不仅适合开发者和技术研究人员探索算法边界,更因其极简的操作逻辑(仅需三步:选脸、选摄像头、启动),广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换,还是制作趣味短视频和直播互动,Deep-Live-Cam 都能提供流畅的支持。 其核心技术亮点在于强大的实时处理能力,支持口型遮罩(Mouth Mask)以保留使用者原始的嘴部动作,确保表情自然精准;同时具备“人脸映射”功能,可同时对画面中的多个主体应用不同面孔。此外,项目内置了严格的内容安全过滤机制,自动拦截涉及裸露、暴力等不当素材,并倡导用户在获得授权及明确标注的前提下合规使用,体现了技术发展与伦理责任的平衡。

88.9k|★★★☆☆|今天
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|昨天
开发框架语言模型