LeakGAN
通过层级 Manager-Worker 结构破解长文本 GAN 生成难题,AAAI-18 学术论文官方代码
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
通过层级 Manager-Worker 结构破解长文本 GAN 生成难题,AAAI-18 学术论文官方代码
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:一位作家正在创作一篇数千字的长篇小说,但他只能等到文章全部写完才能得到编辑的反馈。更糟糕的是,编辑的反馈只有一个字——好或不好。面对这样的反馈,这位作家如何知道自己究竟在哪里出了问题?又该如何改进?
这正是传统文本生成对抗网络(GAN)在长文本任务中面临的困境。2017年,清华大学郭佳欣等人发表论文《Long Text Generation via Adversarial Training with Leaked Information》,提出了 LeakGAN 框架,一举破解了这一难题,并在 AAAI 2018 大会上发表。GitHub 上的开源实现 CR-Gjx/LeakGAN 目前已获得 575 颗星、183 个 Fork。

图1:LeakGAN 整体架构。判别器D的高层特征通过Manager模块「泄露」给Worker,驱动生成器逐步优化。
在图像生成领域,GAN早已大放异彩。但在文本生成中,GAN的应用长期受到限制。根本原因在于两者生成的媒介截然不同:图像是连续空间,梯度可以从像素层面逐层回传;文本是离散符号序列,每一步生成都是一次抽样操作,无法直接计算梯度。
为此,SeqGAN等方法引入了强化学习(RL)框架——用判别器D给出奖励信号来指导生成器G的训练。但这种机制存在一个致命缺陷:奖励信号只能在整段文本生成完毕后才能获得,且只是一个标量。生成器只知道这篇文章整体质量如何,却不知道问题出在第几句话或第几个词选错了。当文本长度超过20个词时,这种粗糙的端到端反馈几乎无法指导生成器有效改进。
研究者将此称为「信用分配问题」:生成器收到了来自远端的整体评价,却无法将这份评价精确分配到每一步生成决策上。
LeakGAN的核心思路极为巧妙:既然判别器D在训练过程中已经学会了提取文本的高层语义特征(CNN提取的特征图),为什么不把这些特征「泄露」给生成器G呢? 论文在生成器端引入了一个层级化的Manager-Worker结构: Manager(管理者):一个LSTM网络,接收来自判别器D的CNN层高层特征表示。每一生成步骤中,Manager分析当前已生成词对应的D特征,将其转化为一个目标向量(Goal Embedding),指导Worker接下来应该朝哪个方向生成。 Worker(工作者):另一个LSTM网络,接收两个输入:当前已生成词的编码 + Manager传来的目标向量。通过融合这两个信息,Worker在当前状态下做出下一步词的选择。 这相当于在生成器内部建立了一个双向通信机制:Manager充当翻译官,把D的抽象语义反馈翻译成可操作的具体目标,传递给Worker执行。相比传统RL只给出一个最终分数,LeakGAN相当于给生成器配备了一位实时战略顾问,每一步都给出方向性指引。
LeakGAN的训练分为三个阶段: 第一阶段:生成器预训练(MLE)。使用最大似然估计让Worker在无D的情况下学习基本的语言模型能力。Worker学会根据目标向量生成连贯的词序列,Manager则学习从D特征中提取有用的目标信息。 第二阶段:判别器预训练。在真实文本和生成文本上训练CNN判别器,使其具备区分真假文本的能力。判别器的CNN特征图在此阶段被冻结,作为后续Manager的输入来源。 第三阶段:对抗训练(交替更新)。固定D,采样生成文本,计算D的CNN特征,Manager据此更新目标向量,Worker在目标向量引导下生成下一词;同时更新D以提升判别能力。这一过程通过Policy Gradient优化策略梯度。 代码中实现的超参数涵盖了合成数据和真实数据两类实验。以合成数据实验为例:词表大小5000、嵌入维度32、隐藏层维度32、序列长度20/40、批大小64、总共800个训练批次。学习率采用指数衰减策略(每200步衰减96%)。
判别器D采用多尺度CNN提取文本特征,使用的滤波器尺寸为[1,2,3,4,5,6,7,8,9,10,15,20],每种尺寸对应[100,200,200,200,200,100,100,100,100,100,160,160]个滤波器。CNN的输出特征被拼接后,通过Highway Network进行信息处理。 这些特征同时用于两个目的:①作为分类输入判断文本真假;②抽取部分特征传入Manager模块。Manager通过一个LSTM将D特征映射为目标向量(goal_out_size=1460,即所有CNN滤波器输出之和),Worker再将目标向量与自身LSTM状态融合生成下一词。 整个框架使用了TensorFlow的tensor_array_ops实现动态序列生成,通过control_flow_ops.while_loop展开生成过程,这在当时的TensorFlow r1.2.1中是实现变长序列输出的标准方式。
论文在两类数据上验证了LeakGAN的有效性: 合成数据实验:控制数据生成遵循特定马尔可夫模型,目标是在没有任何监督的情况下让生成器学会模型背后的隐含规则。LeakGAN在不同序列长度(20、40词)下均显著优于基线SeqGAN,尤其在长序列上优势更为明显。 真实数据实验:在Image COCO图片描述数据集上,LeakGAN生成的描述在BLEU和Turing Test(人类评判)两项指标上均取得了最优结果。实验表明,即使没有显式的语言学监督,LeakGAN也能隐式地从Manager-Worker的交互中学习到句子结构规律。
LeakGAN是一个纯研究代码库,未提供Docker化或Web UI。部署需要以下条件:
LeakGAN的核心贡献不仅是提升了长文本生成质量,更在于开创了层级化生成器引导的研究方向。通过让判别器「泄露」中间表示给生成器,LeakGAN将原本粗粒度的RL信号细化为每步可操作的方向性指导。
这一思路影响了后续大量研究,包括SeqGAN的后续改进、MaskGAN等。特别是在需要生成长序列的任务(如故事续写、对话生成、代码生成)中,如何在生成过程中提供中间反馈而非仅在末端给出一个分数,至今仍是活跃的研究课题。
GitHub仓库CR-Gjx/LeakGAN作为AAAI-18论文的官方代码实现,结构清晰、注释详尽,适合作为GAN文本生成领域的入门级研究代码阅读,也是理解层级强化学习在NLP中应用的良好教材。