想分享一个小成就。过去一个月我一直在白板和笔记本上涂涂画画,试图理解…
摘要
一位开发者用TypeScript从头构建了一个Transformer模型,包括自定义的自动求导引擎,并将其作为开源教育工具发布在GitHub上。
查看缓存全文
缓存时间: 2026/06/27 09:54
想分享一个小小的成就。过去一个月,我一直在白板和笔记本上涂涂写写,试图理解现代大语言模型的工作原理,并且打算顺着这条路,逐一攻克每个随之而来的问题,一步步走完相同的历程。
今天,我终于有了一个可工作的模型——完全用 TypeScript 从零手写。没有库,没有 PyTorch,只有纯粹的 TypeScript,从简单的矩阵乘法到一个可运行的 Transformer 模型,核心是我自己实现的自动求导引擎,全部由我独自完成。 用它训练了文本,并观察到损失从 5.1 降到了 0.2。它真的能学习。
给好奇的朋友们分享仓库链接。transformer-ts,https://github.com/henit-chobisa/transformer-ts…
特别感谢 @karpathy 的视频,这是我一路遵循的参考。
henit-chobisa/transformer-ts
来源:https://github.com/henit-chobisa/transformer-ts
transformer.ts
一个用 TypeScript 从零构建的 Transformer。没有 PyTorch,没有 NumPy,没有机器学习库——只有纯数字、梯度和大量的注释。
我构建它的目的是理解 Transformer 的实际工作原理。不是为了使用一个,而是亲手打造每一个组件——从自动求引引擎一直到一个能训练的模型。如果你从头到尾阅读源码,注释就像是写给未来自己的笔记。
而且它确实有效:在 "hello world" 上训练,损失从 5.13 降到 0.23。整个模型是端到端可微的,每个梯度都由我编写的代码计算得出。
逐层构建
每个组件只依赖于它上层的组件。这就是全部的学习路线图。
Value 一个自动求导引擎 —— 一个记住自己来源的数值 ↓ 以便它能计算出自己的梯度(图上的反向传播) Neuron 权重 · 输入 + 偏置,通过 tanh 压缩 ↓ Layer 一排神经元 ↓ MLP 堆叠起来的层 —— 一个真正能训练的小型神经网络 ↓ operations 点积 · 转置 · 矩阵乘法 · softmax · 加法 · 拼接 ↓ 层归一化 · 交叉熵 —— 注意力所需的矩阵机制 Attention 查询 · 键转置 → softmax → 加权值。单头,单个模式 ↓ MultiHead 多个头并行,拼接后映射回来 + Embedding ID → 向量,加上学习到的位置表,让顺序有意义 ↓ TransformerBlock 注意力 + 残差 + 层归一化 + MLP + 残差 + 层归一化 ↓ Transformer 嵌入 → 模块 → 映射到词表 logits ↓ 训练 交叉熵损失,反向传播,微调每个权重。重复。
运行
pnpm install
# 在 "hello world" 上训练完整的 Transformer,观察损失下降
pnpm tsx src/examples/train-transformer.ts
# 热身:在一个玩具数据集上训练 MLP
pnpm tsx src/examples/train-mlp.ts
# 运行测试
pnpm test
文件结构
| 路径 | 说明 |
|---|---|
src/grad/ | Value —— 自动求导引擎及其反向传播 |
src/operations/ | dotProduct, transpose, matmul, softmax, concat, layernorm, crossEntropyLoss |
src/layers/ | Neuron, Layer, MLP, Attention, MultiHeadAttention, Embedding, PositionalEncoding, TransformerBlock, Transformer |
src/examples/ | 可运行的示例 (train-transformer.ts, train-mlp.ts) |
notes/ | 我一路走来手写的笔记 |
每个文件在其 __test__/ 文件夹中都有对应的测试——操作和层在堆叠之前各自都经过了检查。
训练方式
示例代码以字符串作为输入,每次一个字符。每个输入 token 的任务是预测下一个 token,因此 "hello world" 变为 inputIds(除最后一个字符外的所有字符)和 targetIds(除第一个字符外的所有字符)。然后是常规循环:前向传播得到 logits,与目标计算交叉熵,backward() 填充每个梯度,然后沿着梯度下降方向更新每个参数。一百步之后,模型已经记住了这个字符串。
笔记
notes/ 文件夹中是手算的数学推导——导数、链式法则、反向传播的拓扑排序。代码是这些涂鸦的精简版本。
为学习而构建。故意放慢速度。
相似文章
@sairahul1:没人告诉你GPT或Claude内部到底是什么。他们说“transformer”然后就略过了。这个仓库从头构建了一个……
一个仓库,从头构建transformer,不用高级库,解释注意力机制和完整训练流程,在免费Colab上一天内可训练。
@Fluyeporlaweb:这位天才在 GitHub 上发布了一份逐步指南,教你从零开始构建和训练自己的模型。没有魔法……
Fluyeporlaweb 在 GitHub 上发布了一份指南,展示如何从零开始构建和训练 Transformer 模型,实现了注意力机制、多头注意力、嵌入以及训练后算法(SFT、PPO、DPO、GRPO),无需使用高级库,并在 The Pile 数据集上训练。
@reach_vb: https://x.com/reach_vb/status/2057880274348695995
一名用户演示了使用OpenAI的Codex自动生成一个Colab笔记本,该笔记本在JAX/Flax/Optax中训练一个约1000万参数的transformer进行加法运算,在T4 GPU上经过4000步后达到了高准确率。
@nicodotdev:关于 Transformers.js 你一直想了解的一切,都在一个视频中。我深入探讨了 AI 模型如何从…运行
一个深入探讨的视频,解释如何使用 Transformers.js 从 JavaScript 运行 AI 模型,涵盖张量、ONNX、量化、WebGPU/WASM 等。
@_felx:如果12个月前有人告诉我,毫无软件工程背景的 @thomasdesfrancs 能用代码把项目做出来……
一位非工程师据称用代码完成了软件项目,突显开发工具正变得日益亲民。