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

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

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

云间运维发布于 2025/2/6更新于 2026/7/2443 浏览
从零构建并训练基于 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]", , , , ]
trainer = WordPieceTrainer(
    vocab_size=,
    show_progress=,
    special_tokens=special_tokens
)
tokenizer.train(files, trainer)
"[PAD]"
"[CLS]"
"[SEP]"
"[MASK]"
50000
True

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. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Sobel 边缘检测算法详解
  • 基于 Microi 低代码框架构建 Vue 高效应用指南
  • 基于 YOLO 标注格式的无人机航拍人员搜救检测数据集
  • 后端一次性返回千万数据的前端渲染优化方案
  • Flutter 三方库 flutter_cors 解决鸿蒙 Web 与混合开发跨域问题
  • Naiz AI:从语义到像素的全球视频本地化方案
  • AI 大模型本地部署:Google Gemma 在 MacOS 上的实践与评估
  • 使用文心一言为智能体设计稳定调用工作流的提示词
  • RESTful API 接口设计规范与实战
  • 通义灵码企业知识库 RAG 五大核心应用场景
  • C++ 算法:DFS 与 BFS 详解及经典例题
  • AI 安全:Stable Diffusion 视觉提示词注入攻击原理与实现
  • SpringBoot 自动配置原理与实战详解
  • 基于 Rokid AR 眼镜的健康饮水提醒应用开发
  • Codex 与字节跳动 Trae 的 AI 代码生成实践
  • Retinaface+CurricularFace 在 Jetson Orin 上的部署与优化实践
  • Spring AI 框架入门与应用指南
  • 基于 Coze 构建专属 AI 应用:从智能体到 Web 部署实战
  • C++ STL vector 容器模拟实现及迭代器失效问题详解
  • 通义万相 2.1 上手与效果观察

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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