跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

从零构建并训练基于 BERT 架构的生成式大模型

综述由AI生成详细阐述了从零开始构建并训练基于 BERT 架构的大语言模型的完整流程。内容涵盖分词器(Tokenizer)的训练与配置,包括 WordPiece 算法原理、特殊标记处理及保存方法;模型架构搭建,涉及 BertConfig 配置与解码器模式开启;训练阶段的数据加载、参数设定及 Trainer 使用;最后提供推理测试代码及生成策略优化建议。通过该指南,开发者可掌握预训练大模型的核心技术栈,理解从数据预处理到模型部署的关键环节,适用于希望深入理解 NLP 底层机制的技术人员。

云间运维发布于 2025/2/6更新于 2026/6/225 浏览
从零构建并训练基于 BERT 架构的生成式大模型

从零构建并训练基于 BERT 架构的生成式大模型

本文旨在详细阐述从零开始构建并训练基于 BERT 架构的大语言模型的完整流程。与常见的微调(Fine-tuning)不同,本指南侧重于预训练(Pre-training)阶段,涵盖分词器(Tokenizer)的独立训练、模型架构的配置、训练循环的实现以及推理测试。通过该教程,开发者可以深入理解 NLP 底层机制,掌握从数据预处理到模型部署的关键环节。

第一部分:Tokenizer 分词器训练

BERT 模型通常使用 WordPiece 算法进行分词。分词器的训练过程分为四个核心步骤:归一化(Normalize)、预分词(Pre-tokenizer)、模型训练(Model)和后处理(Post-processor)。

1. 环境准备与依赖导入

在开始之前,请确保已安装 tokenizers 和 transformers 库。建议使用 Python 3.8+ 环境。

from tokenizers import Tokenizer, processors
from tokenizers.models import WordPiece
from tokenizers.trainers import WordPieceTrainer
from tokenizers.normalizers import BertNormalizer
from tokenizers.pre_tokenizers import BertPreTokenizer
from tokenizers.decoders import WordPiece as WordPieceDecoder

2. 初始化 Tokenizer 与数据集

我们需要实例化一个 WordPiece 模型,并指定未识别词的标记(unk_token)。同时加载用于训练的文本文件。此处以《三国演义》为例,实际应用中应替换为大规模语料。

tokenizer = Tokenizer(WordPiece(unk_token="[UNK]"))
files = ["./sanguo.txt"]  # 训练数据路径,支持多文件列表

3. 配置归一化(Normalize)

BERT 标准要求将文本转换为小写并去除多余空格。我们使用 BertNormalizer 进行配置。

tokenizer.normalizer = BertNormalizer(lowercase=True)

4. 配置预分词(Pre-tokenizer)

预分词器负责将原始字符串分割成初步的单词或子词单元。BERT 默认使用空格和标点作为分隔符。

tokenizer.pre_tokenizer = BertPreTokenizer()

5. 添加特殊标记并训练模型

定义特殊标记集合,包括未知词、填充、分类和掩码标记。设置词汇表大小(vocab_size),通常为 30000 至 50000 之间,根据显存和任务需求调整。

special_tokens = ["[UNK]", "[PAD]", "[CLS]", "[SEP]", "[MASK]"]
trainer = WordPieceTrainer(
    vocab_size=50000,
    show_progress=True,
    special_tokens=special_tokens
)
tokenizer.train(files, trainer)

6. 后处理及解码器配置

为了符合 BERT 的输入格式,需要配置 TemplateProcessing 来处理单句和双句的 [CLS] 和 [SEP] 标记位置。同时设置解码器前缀,以便 WordPiece 还原时能正确拼接子词。

class_token_id = tokenizer.token_to_id("[CLS]")
sep_token_id = tokenizer.token_to_id("[SEP]")
tokenizer.post_processor = processors.TemplateProcessing(
    single=f"[CLS]:0 $A:0 [SEP]:0",
    pair=f"[CLS]:0 $A:0 [SEP]:0 $B:1 [SEP]:1",
    special_tokens=[("[CLS]", class_token_id), ("[SEP]", sep_token_id)],
)
tokenizer.decoder = WordPieceDecoder(prefix="##")

7. 保存分词器

将训练好的分词器保存为 JSON 格式,以便后续加载。

tokenizer.save("tokenizer.json")

若要在 Hugging Face Transformers 中使用此分词器,需将其包装在 BertTokenizerFast 类中。

from transformers import BertTokenizerFast

wrapped_tokenizer = BertTokenizerFast(tokenizer_object=tokenizer)
wrapped_tokenizer.save_pretrained("./bert")

此时,./bert 目录下将包含 vocab.txt、tokenizer.json 等必要文件。

第二部分:模型训练

1. 导入训练相关模块

加载模型配置、模型类、数据集加载器及训练参数。

from transformers import (
    BertConfig, BertLMHeadModel, BertTokenizer,
    LineByLineTextDataset, DataCollatorForLanguageModeling,
    Trainer, TrainingArguments
)

注意:LineByLineTextDataset 在新版 Transformers 中可能已被弃用,建议在实际生产环境中使用 datasets 库中的 load_dataset 替代,或自定义 Dataset 类以确保兼容性。

2. 加载分词器

加载第一步中训练并保存的分词器。

tokenizer = BertTokenizer.from_pretrained("./bert")

3. 模型配置与初始化

配置 BERT 模型结构。关键点是将 is_decoder 设置为 True,使其具备自回归生成能力(类似 GPT 模式),尽管底层仍是 BERT 架构。

config = BertConfig(
    vocab_size=tokenizer.vocab_size,
    is_decoder=True
)
model = BertLMHeadModel(config)

4. 数据加载与处理

加载文本数据并进行分块处理。block_size 决定了每个样本的最大长度,需根据显存大小调整。

dataset = LineByLineTextDataset(
    tokenizer=tokenizer,
    file_path="./sanguo.txt",
    block_size=512  # 建议根据显存调整为 512 或 1024
)

data_collator = DataCollatorForLanguageModeling(
    tokenizer=tokenizer,
    mlm=False,  # 设为 False 表示进行 Next Token Prediction
    mlm_probability=0.15
)

5. 训练参数设定

配置训练超参数,包括输出目录、训练轮数、批次大小及保存策略。

training_args = TrainingArguments(
    output_dir="./output",
    overwrite_output_dir=True,
    num_train_epochs=3,
    per_device_train_batch_size=4,
    save_steps=1000,
    save_total_limit=2,
    logging_steps=100,
    learning_rate=5e-5,
    weight_decay=0.01
)

trainer = Trainer(
    model=model,
    args=training_args,
    data_collator=data_collator,
    train_dataset=dataset
)

trainer.train()

6. 模型保存

训练完成后,保存模型权重和配置。

model.save_pretrained("./bert_model")

第三部分:模型推理测试

训练完成后,可以使用 Pipeline 接口进行文本生成测试。建议设置随机种子以保证结果可复现。

from transformers import pipeline, set_seed

generator = pipeline("text-generation", model="./bert_model")
set_seed(42)

# 测试生成
result = generator("吕布", max_length=50, do_sample=True, top_k=50, temperature=0.7)
print(result)

再次尝试不同的提示词:

result = generator("接着奏乐", max_length=50, do_sample=True, top_k=50, temperature=0.7)
print(result)

第四部分:常见问题与优化建议

1. 显存不足问题

如果训练过程中出现 OOM(Out Of Memory)错误,请尝试以下措施:

  • 减小 per_device_train_batch_size。
  • 减小 block_size。
  • 启用梯度累积(Gradient Accumulation)。
  • 使用混合精度训练(FP16),在 TrainingArguments 中设置 fp16=True。

2. 过拟合与欠拟合

  • 过拟合:验证集 Loss 上升而训练集 Loss 下降。可增加 Dropout 比例,减少训练轮数,或使用正则化。
  • 欠拟合:Loss 下降缓慢或不降。可增加学习率,延长训练时间,或检查数据质量。

3. 生成质量优化

在推理阶段,调整采样参数可显著影响生成效果:

  • temperature:值越小越保守,值越大越随机。
  • top_p:核采样,限制候选词范围。
  • repetition_penalty:惩罚重复出现的 token,防止死循环。

总结

本文详细介绍了从零构建 BERT 架构大模型的完整技术链路。从分词器的 WordPiece 训练,到模型架构的解码器模式配置,再到具体的训练循环实现与推理测试,涵盖了核心代码与关键参数说明。通过实践本教程,开发者能够掌握大模型预训练的基础技能,为进一步探索更复杂的 Transformer 变体打下坚实基础。

目录

  1. 从零构建并训练基于 BERT 架构的生成式大模型
  2. 第一部分:Tokenizer 分词器训练
  3. 1. 环境准备与依赖导入
  4. 2. 初始化 Tokenizer 与数据集
  5. 3. 配置归一化(Normalize)
  6. 4. 配置预分词(Pre-tokenizer)
  7. 5. 添加特殊标记并训练模型
  8. 6. 后处理及解码器配置
  9. 7. 保存分词器
  10. 第二部分:模型训练
  11. 1. 导入训练相关模块
  12. 2. 加载分词器
  13. 3. 模型配置与初始化
  14. 4. 数据加载与处理
  15. 5. 训练参数设定
  16. 6. 模型保存
  17. 第三部分:模型推理测试
  18. 测试生成
  19. 第四部分:常见问题与优化建议
  20. 1. 显存不足问题
  21. 2. 过拟合与欠拟合
  22. 3. 生成质量优化
  23. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • VS2019 C++ 调用 YOLOv3 动态库实现目标检测
  • Python 音频隐写术实现:基于 LSB 算法的敏感信息加密传输方案
  • 前端组件库实战:告别重复造轮子
  • Stable Diffusion 底模 VAE 推荐与配置指南
  • FPGA 高云 PLL 锁相环 IP 核配置与多时钟域设计
  • Python 基础:五分钟理解 Jupyter Notebook 的核心价值
  • 前端内容创作 Agent 提示词
  • 基于 n8n 与 AI 模型的智能写作工作流实战指南
  • Java 顺序表实现杨辉三角
  • GraphRAG:基于知识图谱的检索增强技术深度解析
  • QUEST 一体机 SideQuest 安装 APK 与 OBB 数据包教程
  • AI 产品经理必备技能与成长路径详解
  • 前端登录页“记住密码”功能的实现原理与最佳实践
  • Spring AI 框架入门指南
  • Testsigma 开源自动化测试平台新手入门指南
  • SDXL Prompt Styler 如何破解 AI 绘画创作失控难题
  • Spring AI 深入解析 MCP 协议、开发部署与安全最佳实践
  • Python 程序员应摒弃的 18 个常见坏习惯
  • WebEx Player:播放.wrf 格式会议录制文件的官方方案
  • RAGFlow:融合检索与生成的系统架构及应用解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online