共计 2252 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
Chinese-poetry 数据集是一个收录了大量中国古典诗歌的开源数据集,包含了从先秦到清代的数万首诗歌。这些诗歌的特点是结构严谨(如五言、七言)、韵律规则明确,非常适合用于文本生成任务的研究。

生成对抗网络 (GAN) 在文本生成领域展现出了巨大潜力,通过对抗训练的方式,可以生成更加自然、多样的文本。将 GAN 应用于古诗生成,不仅能保留传统诗歌的韵律美,还能创造出新颖的诗歌风格。
数据预处理
1. 数据清洗
首先需要从原始数据中提取出有效的诗歌文本,并去除注释、标题等无关信息。以下是使用 Python 进行数据清洗的示例代码:
import json
def load_and_clean_data(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
cleaned_poems = []
for poem in data:
# 提取诗歌正文,去除空格和标点
content = ''.join([c for c in poem['content'] if c not in [',','。',' ']])
cleaned_poems.append(content)
return cleaned_poems
2. 分词与向量化
古诗的分词与传统中文分词有所不同,我们需要按照诗歌的字为单位进行处理:
from sklearn.feature_extraction.text import CountVectorizer
# 将诗歌转换为字序列
vectorizer = CountVectorizer(analyzer='char', max_features=5000)
X = vectorizer.fit_transform(cleaned_poems)
vocab = vectorizer.get_feature_names_out()
word_to_idx = {word: idx for idx, word in enumerate(vocab)}
模型架构选择
在文本生成任务中,常见的 GAN 变体有:
- SeqGAN:适合生成长序列文本
- TextGAN:针对短文本优化
- LeakGAN:通过信息泄漏机制提高生成质量
对于古诗生成任务,推荐使用 SeqGAN,因为它能更好地处理诗歌的序列特性。
核心实现(PyTorch 示例)
import torch
import torch.nn as nn
class Generator(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, vocab_size)
def forward(self, x):
embedded = self.embedding(x)
output, _ = self.lstm(embedded)
logits = self.fc(output)
return logits
class Discriminator(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, 1)
def forward(self, x):
embedded = self.embedding(x)
_, (hidden, _) = self.lstm(embedded)
validity = torch.sigmoid(self.fc(hidden[-1]))
return validity
关键超参数设置建议:
- Batch size: 64-128
- 学习率: 0.0001(生成器), 0.0002(判别器)
- 隐藏层维度: 256-512
- Dropout: 0.3-0.5
评估指标
- BLEU 分数:衡量生成诗歌与参考诗歌的相似度
- 困惑度(Perplexity):评估语言模型的预测能力
- 人工评估:诗歌的韵律、意境等主观指标
常见问题与解决方案
1. 模式崩溃
表现:生成器总是输出相同或极相似的诗歌
解决方案:
– 增加判别器的容量
– 使用 mini-batch 判别
– 添加多样性正则化项
2. 梯度消失
表现:生成器无法从判别器的反馈中学习
解决方案:
– 使用 Wasserstein GAN(WGAN)及其改进版本
– 调整学习率比例
– 使用梯度惩罚
性能优化
- Batch size 影响:
- 太小会导致训练不稳定
-
太大会降低模型泛化能力
-
学习率策略:
- 初始阶段使用较大学习率
-
后期逐步衰减
-
正则化技巧:
- 使用 dropout 防止过拟合
- 添加 L2 正则化项
总结与思考
通过本指南,我们完成了一个基于 chinese-poetry 数据集的 GAN 古诗生成系统。然而,仍有几个开放性问题值得探讨:
- 如何更好地评估生成诗歌的文学价值?
- 能否引入注意力机制来提升长诗的生成质量?
- 如何让模型学习到不同朝代、不同诗人的风格特点?
期待读者能在这些方向上做出更多探索和创新。
正文完
发表至: 未分类
近两天内
