Morizeyao/GPT2-Chinese
Star7.6k Fork1.7k 最后更新2024-04-25

GPT2-Chinese 是中文 GPT-2 预训练与文本生成代码仓库,使用 BERT Tokenizer,支持字级、词级与 BPE 级分词,可训练通用中文、古诗词、对联、文言文、中文歌词等 GPT-2 中文预训练模型,用于中文文本生成、诗歌生成、小说续写、对话等场景。

仓库简介#

GPT2-Chinese中文 GPT-2 预训练与文本生成 代码仓库,基于 Hugging Face Transformers 实现,使用 BERT Tokenizer 完成中文分词,支持 字级 / 词级 / BPE 级 三种粒度,可用于中文文本生成、古诗词生成、对联生成、文言文生成、中文歌词生成、小说续写、对话系统等中文 NLP 场景。2021 年 4 月大版本使用 PyTorch Lightning + Transformers 重写训练与预测流程,在易用性与维护性上得到明显提升。

仓库包含两部分配套:

  • 代码:在中文大规模语料上预训练 GPT-2 模型,支持通用中文、古诗词、对联、文言文、中文歌词等多种垂类场景;提供 train.py / train_single.py / generate.py / generate_texts.py / eval.py 全流程脚本。
  • 教程:配套「跟我一起学深度学习」第 10 章系列教程,从 GPT-1 原理、Transformer 自注意力机制,到 GPT-2 中文预训练与 ChatGPT 演进,配套 PyTorch 教程与可视化代码。

适用人群#

  • 想深入理解 中文 GPT-2 预训练模型(基于 BERT Tokenizer、字级 / 词级 / BPE 级)的研究 / 工程人员;
  • 想训练中文古诗词、对联、文言文、歌词、小说等垂类文本生成模型的 NLP 开发者;
  • 想从零搭建中文语言模型预训练 pipeline 的 PyTorch Lightning 实战学习者;
  • 想使用现成中文 GPT-2 模型做中文文本生成、对话、续写的应用工程师;
  • 教学场景中需要"中文分词 + 预训练 + 文本生成"完整闭环的讲师与学生。

内容结构#

  • train.py / train_single.py — 训练入口:加载语料 → BERT WordPiece / BPE / 字级分词 → 构造训练样本 → GPT-2 中文预训练;
  • generate.py / generate_texts.py — 推理入口:加载 checkpoint,对输入前缀(带 [CLS] 起始符)做自回归生成,输出中文续写文本;
  • eval.py — 中文文本生成评测脚本;
  • train.json — 训练语料,每行一个 JSON 对象(建议大规模中文语料);
  • config/ — 模型配置:
    • model_config.json:标准 GPT-2 中文模型配置;
    • model_config_small.json:轻量 GPT-2 中文模型配置;
    • model_config_test.json:测试用配置;
  • tokenizations/ — 中文分词实现:
    • tokenization_bert.py:BERT WordPiece 分词器(默认使用 BERT 中文词表);
    • tokenization_bert_word_level.py:BERT 词级分词;
    • bpe_tokenizer.py:BPE 分词器实现;
    • encoder.json / vocab.bpe:BPE 编码表与词表;
    • thulac_dict/:THULAC 中文分词词典(词级模式使用);
  • scripts/train.sh / generate.sh 一键训练与生成脚本;
  • cache/ — 训练缓存目录;
  • sample/ — README 中的中文文本生成样例(散文、斗破苍穹、古诗词、金庸武侠小说等);
  • requirements.txt — PyTorch Lightning、Transformers 等 Python 依赖。

配套章节#

以下 4 讲系统讲解 GPT 系列模型原理与中文 GPT-2 预训练实战,覆盖 GPT-1 生成式预训练、GPT-2/3 模型结构对比、中文 GPT-2 预训练代码实践与 InstructGPT/ChatGPT 演进,均配套 PyTorch Python 实现与可视化代码,是中文文本生成与预训练语言模型入门到实战的完整教程。

章节 重点小节
第 13 讲 GPT-1 原理 GPT-1 原理:生成式预训练模型入门
第 14 讲 GPT-2 与 GPT-3 GPT-2 与 GPT-3:模型结构、数据规模与能力差异
第 15 讲 GPT-2 中文预训练 基于 GPT-2 的中文预训练模型:中文生成模型实践

使用方式#

1. 环境准备#

git clone https://github.com/Morizeyao/GPT2-Chinese.git
cd GPT2-Chinese
pip install -r requirements.txt

依赖包含 PyTorch Lightning、Hugging Face Transformers 等。中文分词使用 BERT Tokenizer,可直接加载 bert-base-chinese 中文词表。

2. 准备训练语料#

把语料放到 train.json,每行一个 JSON 对象,例如:

{"text": "青砖黛瓦马头墙,徽派建筑是江南水乡最具辨识度的传统民居形制之一。"}
{"text": "夜雨寄北,唐代诗人李商隐在巴山夜雨时写下的千古名篇。"}

支持大规模中文语料训练(古诗、宋词、文言文、歌词、小说等皆可)。

3. 训练 GPT-2 中文模型#

python train.py      # 完整训练(多卡 / Lightning)
# 或
python train_single.py  # 单卡训练

训练配置可在 config/model_config.json 中调整(层数、隐藏维度、注意力头数、词表大小等)。

4. 中文文本生成#

训练完成后用 generate.py 加载 checkpoint 做中文文本生成,输入需带 [CLS] 起始符:

python generate.py

示例(古诗词生成):

[CLS]梅山如积翠,
——模型续写:日落映残红,云深锁翠峰。

示例(中文歌词生成、对话生成)同样可在 scripts/generate.sh 中一键调用。

预训练模型分享#

仓库作者与社区训练并公开了多类 GPT-2 中文预训练模型,可直接下载使用:

模型 Hugging Face 适用场景
通用中文 GPT-2 预训练模型 uer/gpt2-chinese-cluecorpussmall 中文文本生成、对话、续写
通用中文 GPT-2 轻量模型 uer/gpt2-distil-chinese-cluecorpussmall 中文文本生成、低资源部署
中文歌词 GPT-2 预训练模型 uer/gpt2-chinese-lyric 中文歌词生成
文言文 GPT-2 预训练模型 uer/gpt2-chinese-ancient 文言文生成
古诗词 GPT-2 预训练模型 uer/gpt2-chinese-poem 古诗词生成
对联 GPT-2 预训练模型 uer/gpt2-chinese-couplet 对联生成(输入格式:“上联-下联”)

使用所有模型时,需在输入文本前加 [CLS] 起始符,例如「最美的不是下雨天,是曾与你躲过雨的屋檐」应写作 [CLS]最美的不是下雨天,是曾与你躲过雨的屋檐

生成样例#

以下是我们使用原仓库作者提供的与训练模型测试的生成样例,讲解过程可参见「基于GPT-2的中文预训练模型:中文生成模型实践」

(gpt2) root@moon:~/GPT2-Chinese# python generate.py 

Namespace(batch_size=1, device='0', fast_pattern=False, length=512, model_config='model/config.json', 
model_path='model/pytorch_model.bin', n_ctx=1024, no_wordpiece=False, nsamples=10, 
prefix='先帝创业未半而中道崩殂', repetition_penalty=1.0, save_samples=False, save_samples_path='.', 
segment=False, temperature=1, tokenizer_path='model/vocab.txt', topk=8, topp=0)
 57%|███████████████████████▍                 | 293/512 [00:04<00:03, 63.98it/s]
 
[CLS] 先 帝 创 业 未 半 而 中 道 崩 殂 , 天 下 之 人 痛 悼 流 涕 , 故 以 其 所 居 之 宫 而 奉 之 。 及 其 即 
位 , 复 奉 居 于 此 , 其 所 居 宫 , 犹 如 旧 制 。 至 其 子 孙 有 以 其 父 之 丧 而 居 于 此 者 , 则 又 如 
旧 制 矣 。 然 其 居 之 者 又 皆 不 过 如 故 事 。 [SEP] 之 于 宫 , 则 不 能 不 为 之 起 居 于 此 也 ; 之 于 
宫 , 则 亦 不 能 不 为 之 起 居 于 此 也 。 今 日 之 宫 , 则 又 非 所 谓 居 于 宫 者 矣 , 而 况 其 子 孙 乎 ? 
[SEP] 之 于 宫 之 为 言 则 不 可 以 不 正 矣 。 故 不 可 曰 宫 , 亦 不 可 曰 宫 , 而 况 其 子 孙 乎 ? [SEP] 
子 孙 以 为 子 孙 而 居 于 宫 , 则 非 其 子 孙 而 何 也 ? 是 故 其 居 也 , 则 必 使 居 于 其 宫 ; 其 居 也 , 
则 必 使 居 于 其 宫 ; 其 居 也 , 又 必 使 居 于 其 宫 。 不 然 , 则 又 何 为 其 不 正 其 居 之 宫 也 ? 不 
然 , 则 不 正 其 居 之 宫 之 宫 也 ......

中文文本生成典型场景:

  • 文学散文生成 — 130MB 语料 + 10 层 GPT-2 + 10 轮训练,得到高质量中文散文生成模型;
  • 小说续写 — 斗破苍穹、金庸武侠小说等垂类语料训练,得到风格化的小说续写;
  • 古诗词生成 — 律诗、绝句、各类词牌(浣溪沙、江城子、蝶恋花、满江红)生成;
  • 剧本生成 — 都市、爱情、创业等题材的中文剧本创作;
  • CDial-GPT 对话 — 严格清洗的大规模放开域中文对话数据集与对话生成样例。