1. 项目背景与核心价值
去年帮学弟调试GRU诗歌生成模型时,发现现有开源项目普遍存在两个痛点:一是生成的诗歌缺乏韵律结构,二是上下文连贯性差。这个毕设项目通过改进训练策略和引入诗歌特有约束,在保持GRU轻量级优势的同时,使生成结果更符合英文诗歌的审美要求。
诗歌生成属于序列生成任务中的hard模式——不仅需要保证语法正确,还要兼顾韵律节奏、意象连贯和情感表达。相比传统RNN,GRU(Gated Recurrent Unit)因其更简单的门控结构和更少的参数,在短文本生成场景下往往能更快收敛。实测在GTX 1660显卡上,单卡训练200个epoch仅需3小时。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 数据处理管道
采用Gutenberg诗歌数据集时,需要特别注意原始文本的清洗:
python复制def clean_poem(text):
# 移除版权声明等元信息
text = re.sub(r'\([^)]*\)', '', text)
# 保留连字符但标准化引号
text = text.replace("‘", "'").replace("’", "'")
# 处理跨行连字符
return '\n'.join([line.strip('- ') for line in text.split('\n')])
2.2 模型核心结构
在标准GRU基础上增加了两个关键改进:
- 韵律感知损失函数:在输出层计算音节计数损失
- 主题一致性模块:通过关键词注意力机制维持意象连贯
python复制class PoetryGRU(nn.Module):
def __init__(self, vocab_size, embed_dim=128, hidden_dim=512):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.gru = nn.GRU(embed_dim, hidden_dim, batch_first=True)
self.attention = nn.Linear(hidden_dim, 1)
self.fc = nn.Linear(hidden_dim, vocab_size)
def forward(self, x, hidden=None):
embedded = self.embedding(x)
output, hidden = self.gru(embedded, hidden)
# 主题注意力计算
weights = F.softmax(self.attention(output), dim=1)
context = torch.sum(weights * output, dim=1)
return self.fc(context), hidden
3. 训练策略优化
3.1 课程学习(Curricular Learning)
分三个阶段调整训练难度:
- 先训练短诗句生成(<8词)
- 然后训练完整诗节(4-6行)
- 最后训练多节诗歌
3.2 对抗训练技巧
在损失函数中加入判别器反馈:
python复制def adversarial_loss(real_scores, fake_scores):
real_loss = F.binary_cross_entropy(real_scores, torch.ones_like(real_scores))
fake_loss = F.binary_cross_entropy(fake_scores, torch.zeros_like(fake_scores))
return (real_loss + fake_loss) / 2
4. 部署与性能调优
4.1 量化部署方案
使用TorchScript导出模型时发现:FP16量化会导致韵律模式紊乱。最终采用混合精度方案:
- 嵌入层保持FP32
- GRU层使用FP16
- 输出层使用INT8量化
4.2 生成温度调节
通过实验找到的温度调度策略:
- 首句温度=0.7(保证多样性)
- 中间行温度=0.5(平衡创意与连贯)
- 末句温度=0.3(确保诗意收束)
5. 效果评估方法论
5.1 自动化评估指标
除了常规的BLEU和Perplexity,设计了诗歌特有指标:
- 韵律得分(Rhyme Density)
- 意象连贯性(通过CLIP计算图文相关性)
- 情感曲线一致性(使用VADER分析情感变化)
5.2 人工评估方案
邀请10位英语系学生从以下维度评分(1-5分):
- 语法正确性
- 韵律美感
- 意象鲜明度
- 情感感染力
6. 典型问题排查实录
6.1 生成重复问题
现象:连续生成相同词句
解决方案:
- 增加n-gram惩罚
- 在beam search中设置禁止重复token
- 调整top-k采样参数
6.2 韵律断裂问题
现象:音节计数不规律
解决方法:
- 在数据预处理阶段标注音节数
- 在损失函数中加入音节正则项
- 使用CMU发音词典验证
关键发现:batch_size超过32会导致韵律模式学习不稳定,建议保持在16-24之间
7. 扩展方向建议
- 多语言支持:引入音素级别处理应对非英语诗歌
- 风格迁移:通过控制向量实现不同诗人风格
- 交互式生成:结合用户实时反馈调整生成方向
这个项目最让我意外的是:简单的GRU结构在充分优化的训练策略下,其诗歌生成质量可以媲美更复杂的Transformer模型。建议后续开发者不要盲目追求模型规模,而应该深耕领域特性的融入方式。
