ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LLMs-from-scratch 第 2 章精讲:处理文本数据——BPE 分词、滑动窗口数据加载与嵌入层

LLMs-from-scratch 第 2 章精讲:处理文本数据——BPE 分词、滑动窗口数据加载与嵌入层 示例工程大模型人工智能【免费下载链接】LLMs-from-scratchImplement a ChatGPT-like LLM in PyTorch from scratch, step by step项目地址https://gitcode.com/GitHub_Trending/ll/LLMs-from-scratch点击查看免费下载本文以 ch02/README.md 为骨架系统梳理《Build a Large Language Model From Scratch》第 2 章Working with Text Data在 LLMs-from-scratch 仓库中的全部代码资产主章节的 BPE 分词与数据加载流水线以及 5 份补充材料BPE 编码器基准对比、Embedding 与 MatMul 等价性、直觉化数据加载器、从零训练 BPE tokenizer 等。读完本文你将掌握如何把任意原始文本转换为 LLM 可消费的 token ID 序列、如何构造带输入/目标对的滑动窗口数据集并理解 token 嵌入与位置嵌入的底层原理。章节定位为什么训练 LLM 要先处理文本数据第 2 章是整本书从零构建 GPT 式 LLM 的数据地基。在进入多头注意力、Transformer 块等模型结构第 3、4 章之前必须先解决一个根本问题模型只能处理数字无法直接读取字符。因此本章围绕三条主线展开分词Tokenization把原始文本切分成 token再映射为整数 ID数据加载Data Loading把 token 序列组织成带输入-目标配对、可批量训练的样本嵌入Embedding把 token ID 变成模型可计算的稠密向量并叠加位置信息。仓库中 ch02/README.md 将全部内容划分为主章节代码与补充材料两部分下文逐一展开。主章节代码完整实现与最小流水线主章节代码位于 ch02/01_main-chapter-code 目录包含三份文件ch02.ipynb包含章节正文出现的全部代码是本章的权威实现exercise-solutions.ipynb章节练习的参考解答dataloader.ipynb跳过中间推导步骤、只保留核心数据加载流水线的最小化 Notebook适合快速回顾主线配套语料the-verdict.txt章节用来做实验的短篇英文文本Edith Wharton 的《The Verdict》全书前几章均以它为演示语料。分词用 tiktoken 加载 GPT-2 的 BPE 词表章节采用 OpenAI 的tiktoken库直接加载 GPT-2 的 BPE 编码核心调用只有一行import tiktoken tokenizer tiktoken.get_encoding(gpt2)该编码的词表大小为50257tokenizer.n_vocab即返回此值见 test_ch02.py其中包含 256 个原始字节 token、约 5 万个合并后的子词 token 以及 1 个特殊 token|endoftext|。编码/解码示例如下输出与 compare-bpe-tiktoken.ipynb 中的运行结果一致text Hello, world. Is this-- a test? integers tokenizer.encode(text, allowed_special{|endoftext|}) print(integers) # [15496, 11, 995, 13, 1148, 428, 438, 257, 1332, 30] print(tokenizer.decode(integers)) # Hello, world. Is this-- a test?注意allowed_special{|endoftext|}默认情况下tiktoken遇到特殊 token 会报错此参数显式声明该文本允许出现|endoftext|分隔符训练时可用于拼接多篇文档。数据集构造滑动窗口生成输入/目标对分词之后章节用自定义Dataset类把整本书切分为重叠的定长序列。仓库中的可执行实现位于 pkg/llms_from_scratch/ch02.py与 Notebook 完全一致核心逻辑如下class GPTDatasetV1(Dataset): def __init__(self, txt, tokenizer, max_length, stride): self.tokenizer tokenizer self.input_ids [] self.target_ids [] # Tokenize the entire text token_ids tokenizer.encode(txt, allowed_special{|endoftext|}) # Use a sliding window to chunk the book into overlapping sequences for i in range(0, len(token_ids) - max_length, stride): input_chunk token_ids[i:i max_length] target_chunk token_ids[i 1: i max_length 1] self.input_ids.append(torch.tensor(input_chunk)) self.target_ids.append(torch.tensor(target_chunk)) def __len__(self): return len(self.input_ids) def __getitem__(self, idx): return self.input_ids[idx], self.target_ids[idx]关键设计是目标序列相对输入序列右移一个 tokeninput_chunk取[i, imax_length)target_chunk取[i1, imax_length1)。这样每个样本都天然构成预测下一个 token的训练对是自回归语言模型监督信号的来源也解释了为什么必须用stride步长小于max_length的滑动窗口——让相邻窗口重叠使每个位置都有机会作为被预测的目标出现。数据加载器create_dataloader_v1 参数全解def create_dataloader_v1(txt, batch_size4, max_length256, stride128, shuffleTrue, drop_lastTrue, num_workers0): tokenizer tiktoken.get_encoding(gpt2) dataset GPTDatasetV1(txt, tokenizer, max_length, stride) dataloader DataLoader( dataset, batch_sizebatch_size, shuffleshuffle, drop_lastdrop_last, num_workersnum_workers) return dataloader各参数含义与默认值如下参数默认值作用txt必填原始文本字符串通常由open(the-verdict.txt).read()读入batch_size4每个 batch 的样本数决定梯度更新粒度与显存占用max_length256每个样本的 token 长度上下文窗口对应后续模型的context_lengthstride128滑动窗口步长小于max_length时窗口重叠样本量增加shuffleTrue训练时打乱样本顺序避免模型学到文档顺序偏差drop_lastTrue丢弃无法凑满一个 batch 的末尾样本保证张量形状整齐num_workers0DataLoader 子进程数0 表示在主进程加载简单场景推荐嵌入层token 嵌入 位置嵌入数据准备好之后章节用两个nn.Embedding层把整数 ID 变成向量见 dataloader.ipynb 与测试 test_ch02.pyvocab_size 50257 output_dim 256 context_length 1024 token_embedding_layer torch.nn.Embedding(vocab_size, output_dim) # token - 向量 pos_embedding_layer torch.nn.Embedding(context_length, output_dim) # 位置 - 向量 batch_size 8 max_length 4 dataloader create_dataloader_v1(raw_text, batch_sizebatch_size, max_lengthmax_length, stridemax_length) for x, y in dataloader: token_embeddings token_embedding_layer(x) pos_embeddings pos_embedding_layer(torch.arange(max_length)) input_embeddings token_embeddings pos_embeddings break print(input_embeddings.shape) # torch.Size([8, 4, 256])token 嵌入层nn.Embedding(50257, 256)维护一张 50257×256 的可学习查表把每个 token ID 映射为 256 维向量位置嵌入层nn.Embedding(1024, 256)为序列中每个绝对位置提供 256 维向量。位置向量由torch.arange(max_length)一次性生成对所有 batch 共享二者逐元素相加后得到形状[8, 4, 256]batch × 序列长度 × 嵌入维度的模型输入这是后续 Transformer 各层的标准入口张量。这一token 嵌入 位置嵌入叠加的输入构造方式与 pkg/llms_from_scratch/ch04.py 中 GPT 模型接收的输入格式一脉相承是第 4 章搭建完整 GPT 架构的直接前置。补充材料一BPE 编码器实现基准对比ch02/02_bonus_bytepair-encoder 提供了一份对三种 BPE 实现逐一 benchmark 的 Notebookcompare-bpe-tiktoken.ipynb核心对比脚本依次演示并计时三种实现tiktokentiktoken.get_encoding(gpt2)OpenAI 官方维护的高性能 BPE 实现OpenAI 原始实现导入 bpe_openai_gpt2.py 中的get_encoder先执行download_vocab()下载词表再以get_encoder(model_namegpt2_model, models_dir.)加载Hugging Face transformersGPT2Tokenizer.from_pretrained(gpt2)需transformers4.33.2。bpe_openai_gpt2.pyOpenAI GPT-2 仓库原版encoder.py的完整移植含bytes_to_unicode()、get_pairs()、Encoder类等核心逻辑是理解 BPE 算法细节的权威参考gpt2_model预下载的 GPT-2 词表文件包含encoder.jsontoken 到 ID 的映射与vocab.bpeBPE 合并规则使原始实现无需联网即可加载requirements-extra.txtrequests、tqdm、transformers4.33.2运行对比 Notebook 前执行pip install -r requirements-extra.txt安装。三种实现对同一文本的编码结果完全一致[15496, 11, 995, 13, 1148, 428, 438, 257, 1332, 30]证明它们等价差异主要体现在代码复杂度和运行速度上这正是 benchmark 的目的所在。补充材料二Embedding 层与全连接层的等价性ch02/03_bonus_embedding-vs-matmul/embeddings-and-linear-layers.ipynb 用实验证明一个常被忽略的数学事实嵌入层等价于作用在一热编码one-hot向量上的全连接层。具体而言nn.Embedding相当于一个权重矩阵为嵌入表的线性层输入经过 one-hot 编码后做矩阵乘法结果只是挑出权重矩阵中对应的一行。由于 one-hot 向量中只有一个 1全连接层的输出恰好等于嵌入表对应行的复制。该 Notebook 用简单数值演示了这种等价性帮助读者理解为什么实际实现都采用查表式的nn.Embedding而非显式的 one-hot 线性层——后者在词表规模如 50257下会浪费大量内存与算力。补充材料三用数字直觉理解数据加载器ch02/04_bonus_dataloader-intuition/dataloader-intuition.ipynb 把主章节的文本数据加载逻辑降维到最简单的场景用一组普通数字而非文本演示滑动窗口、输入/目标偏移和 batch 组装过程。通过观察数字序列如何被切分为x输入与y目标读者可以脱离 tokenizer 的干扰直观理解max_length与stride如何决定样本数量与重叠程度从而真正吃透GPTDatasetV1的切片逻辑。这是主章节数据流水线的最佳入门补充。补充材料四从零实现并训练 GPT-2 BPE tokenizerch02/05_bpe-from-scratch 是本章最有深度的补充材料包含两套从零实现 BPE 的 Notebookbpe-from-scratch-simple.ipynb为可读性优先设计的简化版。它逐步展示 BPE 的核心流程——从统计相邻字符对频次、迭代合并最高频对到把合并规则应用于新文本让读者在几十行代码内看清 BPE 的完整机制bpe-from-scratch.ipynb功能完备的进阶版行为上与tiktoken高度一致覆盖各类边界情况如 Unicode 字节映射、特殊 token 处理等并额外支持加载官方 GPT-2 词表encoder.jsonvocab.bpetests.py配套测试验证自研 tokenizer 与参考实现的行为一致性。从训练一个 tokenizer的角度这两份 Notebook 完整覆盖了 BPE 的两个阶段训练阶段统计语料、学习合并规则与推理阶段用学到的规则编码新文本是对主章节直接使用 tiktoken做法的底层拆解。补充材料五Simple Tokenizer v3ch02/06_bonus_simple-tokenizer-v3/simple-tokenizer-v3.ipynb 提供了一个自研的轻量 tokenizer 第三版。与依赖tiktoken的主章节实现不同它完全基于 Python 标准库实现分词逻辑不依赖 OpenAI 的 BPE 词表适合在无法安装第三方库的环境中使用或作为理解tokenizer 内部到底做了什么的教学工具。仓库中的可运行版本pkg 包与测试验证除 Notebook 外仓库把第 2 章核心代码抽离为可直接导入的 Python 模块方便在脚本与测试中复用pkg/llms_from_scratch/ch02.pyGPTDatasetV1与create_dataloader_v1的独立可执行版本签名与 Notebook 完全一致pkg/llms_from_scratch/tests/test_ch02.py端到端测试用the-verdict.txt构建 DataLoader验证 token/位置嵌入叠加后张量形状为[8, 4, 256]并确认vocab_size50257、context_length1024等关键超参。该测试同时演示了标准使用流程create_dataloader_v1(raw_text, batch_size8, max_length4, stride4)遍历得到(x, y)批次后分别过 token 与位置嵌入层求和。若从源码克隆本仓库可直接在pkg/目录下运行测试验证本章实现。小结第 2 章处理文本数据打通了从原始文本到模型输入张量的完整链路tiktoken负责 BPE 分词50257 词表GPTDatasetV1create_dataloader_v1用滑动窗口生成输入/目标对nn.Embedding完成 token 与位置的向量化。五份补充材料则从不同维度深化理解BPE 三种实现基准对比、Embedding 与 MatMul 的数学等价、数字版数据加载器直觉、从零训练 BPE tokenizer以及轻量自研 tokenizer。掌握本章后你便拥有了训练自建 LLM 的第一块基石可以无缝进入第 3 章的多头注意力机制与第 4 章的完整 GPT 架构搭建。赞分享示例工程大模型人工智能【免费下载链接】LLMs-from-scratchImplement a ChatGPT-like LLM in PyTorch from scratch, step by step项目地址https://gitcode.com/GitHub_Trending/ll/LLMs-from-scratch点击查看免费下载相关推荐如何快速上手 BrewUI Discover搜索、浏览与安装 Homebrew 包全流程指南如何快速上手 BrewUI Discover搜索、浏览与安装 Homebrew 包全流程指南 BrewUIHomebrew 官方 macOS 图形界面应用桌面应用开发工具用数字数据直观理解 LLM 数据加载器LLMs-from-scratch 滑动窗口采样实战指南用数字数据直观理解 LLM 数据加载器LLMs from scratch 滑动窗口采样实战指南 导读 本篇技术指南聚焦于 LLMs from scratch示例工程大模型人工智能LLMs-from-scratch数据加载器实现高效文本数据处理技巧LLMs from scratch数据加载器实现高效文本数据处理技巧 痛点与解决方案 你是否在训练大型语言模型LLM时遇到过文本数据处理效率低下的问题是示例工程大模型人工智能上一篇Impeccable Finish Reviewer读懂 Impeccable 终审机制——从证据校验、保真度矩阵到四词裁决的设计交付门禁下一篇3DS游戏文件处理神器轻松解密与下载CIA文件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表