private plot

应无所住 | 而生其心

引言

BERT 的“预训练范式”是现代自然语言处理(NLP)的核心。它让我们能够从未标记的原始文本数据中学习语言的深层结构。

为什么要强调 BERT?

在企业场景中,数据往往碎片化、存在数据孤岛,并且严重缺乏标签。人工标注公司内部文档的成本极高,几乎不可行。
而 BERT 的预训练范式完美地解决了这个问题:

  • 利用无标签数据:能自动从海量原始文本中学习语言知识;
  • 领域适应性强:可在公司内部语料上进行二次预训练,让模型理解行业术语与内部流程。

本文将带你在 个人电脑(例如:RTX 3060 Ti,12GB 显存) 上,从零构建一个 完整的 BERT 预训练实验,将散乱的内部数据转化为 AI 资产。


阶段一:项目规划与数据准备

🎯 核心目标

收集原始数据,并完成基础清洗。

1. 明确目标与硬件限制

  • 硬件:RTX 3060 Ti,12GB 显存
  • 目标:掌握 BERT 预训练全流程(无需工业级性能)
  • 建议数据量:100MB ~ 1GB 文本

2. 数据收集与清洗

假设你已收集若干 .txt 格式的原始文本。

数据清洗要点:

  • 移除 HTML 标签、多余空格与换行;
  • 去除重复行;
  • 保持语言一致(全中文或全英文)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import re

def clean_text(text):
text = re.sub(r'<.*?>', '', text) # 移除 HTML 标签
text = re.sub(r'\s+', ' ', text).strip() # 合并多余空格
return text

# 示例:读取并清洗数据
with open('raw_data.txt', 'r', encoding='utf-8') as f:
raw_data = f.read()

cleaned_data = clean_text(raw_data)

with open('cleaned_data.txt', 'w', encoding='utf-8') as f:
f.write(cleaned_data)

⚠️ 请谨慎执行脚本,先在小样本上验证清洗效果。


阶段二:环境搭建与模型选择

🎯 核心目标

安装依赖库,选择适合低显存环境的模型。

1. 安装依赖

1
pip install torch transformers datasets accelerate

accelerate 是 Hugging Face 提供的轻量化训练工具,可显著优化低显存设备的训练效率。

2. 选择基础模型

12GB 显存无法从零训练 BERT-Base(110M 参数)。
建议选择较小模型进行 领域二次预训练(Domain Pre-training)

  • 推荐模型(中文):
    • uer/t5-small-chinese(轻量)
    • bert-base-chinese(需减小 batch size)

3. 配置 Tokenizer

1
2
3
4
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
tokenizer.save_pretrained("./my_tokenizer")

阶段三:数据加载与二次预训练

🎯 核心目标

使用 Hugging Face 官方脚本进行 Masked Language Model (MLM) 训练。

1. 准备数据集

cleaned_data.txt 保存为纯文本文件,然后通过 datasets 库加载。

2. 下载官方脚本

在 Hugging Face 官方仓库中找到 run_mlm.py,放入你的工作目录。
(路径示例:https://github.com/huggingface/transformers/tree/main/examples/pytorch/language-modeling)

3. 启动训练

使用 accelerate launch 命令启动预训练:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
accelerate launch run_mlm.py \
--model_name_or_path bert-base-chinese \
--tokenizer_name ./my_tokenizer \
--train_file cleaned_data.txt \
--validation_file cleaned_data.txt \
--output_dir ./my_bert_model \
--do_train \
--do_eval \
--max_seq_length 128 \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 8 \
--num_train_epochs 3 \
--save_steps 1000 \
--overwrite_output_dir \
--dataloader_num_workers 2

参数与显存管理:

参数 说明
--max_seq_length 128 限制句子长度,节省显存
--per_device_train_batch_size 8 核心参数,越小显存占用越低,可调至 4
--dataloader_num_workers 2 提升数据加载速度

阶段四:训练监控与评估

1. 监控损失函数

关键指标包括:

  • train_loss:训练集损失;
  • eval_loss:验证集损失(衡量泛化性能)。

理想情况下,两者应一同下降,直到验证损失趋稳。

2. 早停(Early Stopping)

eval_loss 停止下降并开始上升时,应立即停止训练。
此时保存的 checkpoint 通常为性能最优模型。


阶段五:模型微调与落地应用

🎯 核心目标

利用预训练模型解决特定任务(如分类、匹配、检索等)。

1. 准备有标签数据

收集一小部分带标签的数据(如文本分类任务)。

2. 微调(Fine-tuning)

使用 Hugging Face 官方脚本 run_glue.py 或自定义训练脚本,加载你训练好的模型:

1
--model_name_or_path ./my_bert_model

在小规模标注数据上进行有监督训练。

3. 部署与测试

微调完成后,可将模型封装为 REST API 服务,供内部系统调用。
至此,你已完成从无标签文本 → 自研 BERT 模型 → 任务应用的闭环。


结语

BERT 的预训练范式让我们摆脱了标签依赖,能从企业内部碎片化文档中直接提炼知识。
通过以上步骤,即便只拥有一块消费级 GPU,也能实践现代 NLP 的核心思想。

“语言模型不仅理解语言,更理解企业的知识。”

You shall know a word by the company it keeps.
一个词的意义取决于它经常出现的上下文(语境)
语言的逻辑是代数的,语义的结构是几何的。
—— 现代人工智能思想的核心洞见

阅读全文 »

向量、导数与偏导构成了大语言模型的数学基础,损失函数与梯度计算则是其核心机制。
向量用于表达语义,损失函数用于衡量模型预测与真实目标的偏差。
对损失函数各参数求偏导,得到梯度,从而揭示最优方向。模型沿梯度不断更新参数,反复迭代,使损失逐步减小、性能持续提升——这正是大模型“学习”的本质过程。

阅读全文 »

中国电竞强不强?强。
但为什么每次遇到韩国的 T1,总是在第五局崩盘?
明明我们有更悠久的文化、更深的底蕴、更庞大的投入,却总差那么一点冷静。
这不是技术问题,而是体系与文化底层结构的问题。

阅读全文 »

为团队提供一个共享的开发环境,能在代码更新时自动拉取最新代码、构建并启动服务,同时轻量化、易维护。本文记录了从需求到最终实现 Windows 上自动更新服务的全过程,包括问题分析、脚本优化与定时执行的思路。

阅读全文 »

在早期 Markdown 的语境中,符号 >引用(Blockquote) 的标记,用来表示这段文字不是作者原文,而是引用他人或前文的内容。

然而,随着 Markdown 在文档与知识写作领域的广泛使用,这个符号逐渐演化为一种语义块的载体——它不仅能表达“引用”,还承担“提示”“结论”“说明”等作用。

阅读全文 »

“软件工程的目标是掌握复杂性,而非制造复杂性。”
—— Niklaus Wirth

尼古拉斯·维尔特(Niklaus Wirth,1934–2023)是计算机科学界的先驱之一,他的思想奠定了现代软件工程和编程语言设计的基础。
他以极强的系统思维与简洁美学著称,其核心理念可概括为:简单、高效、系统化

阅读全文 »
0%