共计 1528 个字符,预计需要花费 4 分钟才能阅读完成。
背景与痛点
中文诗歌生成任务相比普通文本生成更具挑战性。诗歌不仅需要符合语法规则,还需要保持意境、韵律和美感。Chinese-Poetry 数据集包含了大量古典诗歌,但直接用于 GAN 训练会遇到以下问题:

- 数据稀疏性:每首诗长度有限,且词汇高度凝练
- 结构复杂性:需要同时建模平仄、押韵等规则
- 评估困难:传统 GAN 的判别器难以捕捉诗歌的艺术性
数据预处理
- 数据清洗:
- 去除标点符号和空格
- 统一诗歌格式(如五言、七言)
-
处理生僻字和繁体字转换
-
分词与向量化:
- 使用 jieba 进行分词
- 构建词汇表(建议保留前 5000 高频词)
- 将诗句转换为 one-hot 向量或 word2vec 嵌入
示例代码片段:
import jieba
from collections import Counter
# 分词示例
def tokenize_poem(poem):
return list(jieba.cut(poem.replace('','')))
# 构建词汇表
word_counts = Counter()
for poem in poems:
word_counts.update(tokenize_poem(poem))
vocab = [word for word, count in word_counts.most_common(5000)]
模型架构对比
我们对比了三种主流 GAN 架构在诗歌生成中的表现:
- DCGAN:
- 优点:结构简单,训练速度快
-
缺点:难以捕捉长距离依赖关系
-
SeqGAN:
- 优点:专门为序列数据设计
-
缺点:训练过程复杂,需要预训练
-
Transformer-GAN:
- 优点:强大的上下文建模能力
- 缺点:计算资源消耗大
核心代码实现
以下是基于 PyTorch 的 SeqGAN 关键组件实现:
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)
self.fc = nn.Linear(hidden_dim, vocab_size)
def forward(self, x, hidden=None):
embedded = self.embedding(x)
output, hidden = self.lstm(embedded, hidden)
logits = self.fc(output)
return logits, hidden
训练技巧
- 学习率调整 :
- 初始学习率设为 0.001
-
使用 ReduceLROnPlateau 动态调整
-
模式崩溃预防 :
- 添加随机噪声
- 使用小批量鉴别
-
定期保存检查点
-
技巧组合 :
- Wasserstein 损失 + 梯度惩罚
- 标签平滑
- 教师强制
评估与优化
我们采用以下指标评估生成质量:
- BLEU-4:衡量 n -gram 重叠率
- 韵律得分 :检测押韵和平仄
- 人工评估 :邀请专家打分
优化策略包括:
- 数据增强:
- 随机删除 / 替换词语
-
句子重组
-
模型集成:
- 多生成器投票
- 重排序机制
避坑指南
- 梯度消失 :
- 使用 LSTM/GRU 代替普通 RNN
-
添加残差连接
-
文本重复 :
- 增加温度参数
-
Top- k 采样
-
训练不稳定 :
- 交替更新生成器和判别器
- 使用梯度裁剪
生成效果展示
经过 20 个 epoch 训练后,模型生成的示例:
春风拂面柳丝长,
细雨润物花自香。
闲来独坐小桥上,
静听流水话沧桑。
总结与思考
通过这次实践,我们发现中文诗歌生成仍然存在许多开放性问题:
- 如何量化评估诗歌的艺术性?
- 能否让模型学习特定诗人的风格?
- 现代诗和古诗是否需要不同的处理方式?
期待与大家继续探索这个有趣的领域!
正文完
