基于 PyTorch 从零构建与训练大型语言模型入门指南
LLM(Large Language Model)是如今大多数 AI 聊天机器人的核心基础,例如 ChatGPT、Gemini、MetaAI、Mistral AI 等。这些 LLM 背后的核心架构通常是 Transformer。
本文介绍如何一步步使用 PyTorch 从零开始构建和训练一个大型语言模型(LLM)。该模型以 Transformer 架构为基础,实现英文到马来语的翻译功能,同时也适用于其他语言翻译任务。
步骤 1:加载数据集
为了让 LLM 模型能够执行从英文到马来语的翻译任务,需要使用含有英马双语对照的数据集。
这里选择 Huggingface 提供的'Helsinki-NLP/opus-100'数据集。它包含百万级的英文 - 马来语对照句对,足以确保模型训练的准确性。此外,该数据集还包含了 2000 条验证和测试数据,且已经预先完成了分割工作,省去了手动分割的繁琐步骤。
from datasets import load_dataset
# 加载 Helsinki-NLP/opus-100 数据集
dataset = load_dataset("Helsinki-NLP/opus-100", "en-my")
# 查看数据集结构
print(dataset)
步骤 2:创建分词器
Transformer 模型不处理原始文本,只处理数字。因此,需要将原始文本转换为数字格式。
这里使用名为 BPE(Byte Pair Encoding)的流行分词器来完成这一转换过程。这是一种子词级别的分词技术,已在 GPT-3 等先进模型中得到应用。
通过训练数据集来训练这个 BPE 分词器,生成英马双语的词汇表,这些词汇表是从语料中提取的独特标记的集合。
分词器的作用是将原始文本中的每个单词或子词映射到词汇表中的相应标记,并为这些标记分配唯一的索引或位置 ID。
这种子词分词方法的优势在于,它能有效解决 OOV 问题,即词汇表外单词的处理难题。通过这种方式,我们能够确保模型在处理翻译任务时,无论是常见词汇还是生僻词汇,都能准确无误地进行编码,为后续的嵌入表示打下坚实基础。
from tokenizers import Tokenizer, models, trainers
# 初始化 BPE 分词器
tokenizer = Tokenizer(models.BPE())
# 配置训练参数
trainer = trainers.BpeTrainer(
vocab_size=8000,
special_tokens=["<pad>", "<unk>", "<s>", "</s>"]
)
# 准备文件列表进行训练
files = ["train_en.txt", "train_my.txt"]
tokenizer.train(files, trainer)
步骤 3:准备数据集和数据加载器
在构建模型的第三步,着手准备数据集及其加载器。这一阶段的目标是为源语言(英语)和目标语言(马来语)的数据集做好训练与验证的准备。
为此,需要编写一个类,能够接收原始数据集,并利用英语和马来语的分词器(分别为 tokenizer_en 和 tokenizer_my)对文本进行编码处理。编码后的数据会通过数据加载器进行管理,该加载器将按照设定的批次大小(本例中为 10)来迭代处理数据集。
如有需要,还可以根据数据量和计算资源的实际情况,对批次大小进行调整。
torch
torch.utils.data Dataset, DataLoader
():
():
.dataset = dataset
.tokenizer_en = tokenizer_en
.tokenizer_my = tokenizer_my
():
(.dataset)
():
source_text = .dataset[idx][][]
target_text = .dataset[idx][][]
enc_en = .tokenizer_en.encode(source_text).ids
enc_my = .tokenizer_my.encode(target_text).ids
{
: torch.tensor(enc_en),
: torch.tensor(enc_my)
}
dataset_obj = TranslationDataset(dataset[], tokenizer_en, tokenizer_my)
dataloader = DataLoader(dataset_obj, batch_size=, shuffle=)


