将标准GAN应用于文本等离散数据时,主要难题在于采样过程。当生成器从其输出分布中选取一个特定词(一个离散的标记)时,这一选择是不可微分的。因此,判别器的梯度信号无法通过采样步骤反向传播,以使用标准反向传播来更新生成器的参数。这打破了典型的GAN训练机制。强化学习 (RL) 提供了一个强大的框架来解决这个问题。我们可以不依赖通过生成输出的直接梯度流,而是将生成器的任务重新定义为一个RL问题:智能体: 生成器 ($G$) 充当智能体。状态: 状态 ($s_t$) 表示截至目前已生成的序列 $(y_1, ..., y_{t-1})$。动作: 动作 ($a_t$) 是基于当前状态选择下一个标记 ($y_t$)。策略: 生成器的参数化函数 $G_\theta(y_t | s_t)$ 定义了智能体的策略 $\pi_\theta(a_t | s_t)$,这是对所有可能下一个标记的概率分布。奖励: 判别器 ($D$) 提供奖励信号,指示生成器策略生成的序列的质量或真实性。生成器(智能体)的目标是学习一个策略 $\pi_\theta$,该策略能使从判别器获得的预期奖励最大化。很重要的一点是,策略梯度等RL算法允许根据收到的奖励更新智能体的策略参数 $\theta$,即使动作(标记采样)是离散的。序列生成对抗网络 (SeqGAN)SeqGAN 是将这种RL观点应用于基于GAN的文本生成的最早成功应用之一。它直接采用RL中的策略梯度定理来训练生成器。判别器 ($D$) 按照传统方式训练,学习区分来自训练数据的真实文本序列和由 $G$ 生成的序列。其输出 $D(Y)$ 代表一个完整序列 $Y = (y_1, ..., y_T)$ 是真实序列的概率。对于生成器 ($G$),这个判别器输出 $D(Y)$ 作为奖励信号。然而,奖励只有在生成一个完整序列后才能获得。这给训练生成器带来了问题,因为它在序列生成过程中需要反馈,以决定哪些中间动作(标记选择)是好的。SeqGAN 通过使用蒙特卡洛 (MC) 搜索与展开来解决这个问题。当生成器生成了部分序列 $Y_{1:t} = (y_1, ..., y_t)$ 时,它需要评估采取下一个动作 $y_{t+1}$ 的预期未来奖励。为此,当前的生成器策略被用于从 $Y_{1:t+1}$ 开始“展开”或多次完成序列。假设执行了 $N$ 次展开,产生了 $N$ 个完整序列:${Y^1_{1:T}, ..., Y^N_{1:T}}$。判别器评估这些完整序列中的每一个。判别器平均得分提供了动作值 $Q(s_t, a_t = y_{t+1})$ 的一个评估:$$Q_{D}^{G_\theta}(s=Y_{1:t}, a=y_{t+1}) \approx \frac{1}{N} \sum_{n=1}^{N} D(Y^n_{1:T})$$其中 $Y^n_{1:T}$ 是以 $Y_{1:t+1}$ 开头,并使用当前策略 $G_\theta$ 生成的第 $n$ 个完整序列。这个 $Q$ 值表示如果在步骤 $t$ 选择标记 $y_{t+1}$ 并此后遵循当前策略 $G_\theta$ 所能获得的预期奖励。有了这个评估出的动作值,生成器的参数 $\theta$ 可以使用策略梯度进行更新:$$\nabla_\theta J(\theta) \approx \mathbb{E}{Y{1:t} \sim G_\theta} \left[ \sum_{t=1}^T Q_{D}^{G_\theta}(Y_{1:t-1}, y_t) \nabla_\theta \log G_\theta(y_t | Y_{1:t-1}) \right]$$这种更新增加了采取导致更高预期奖励的动作的概率(即判别器认为更真实的序列)。主要的观察是,梯度是针对动作的对数概率 $\nabla_\theta \log G_\theta(y_t | Y_{1:t-1})$ 计算的,并乘以奖励信号 $Q$。这绕过了不可微分的采样步骤。digraph SeqGAN { rankdir=LR; node [shape=box, style=rounded, fontname="Helvetica", fontsize=10]; edge [fontname="Helvetica", fontsize=9]; G [label="生成器 (策略 θ)", peripheries=2, color="#4263eb", fontcolor="#4263eb"]; S [label="生成部分\n序列 (s_t)", shape=ellipse, color="#1c7ed6"]; Sample [label="采样下一个\n标记 (y_t)", shape=diamond, color="#1c7ed6"]; Rollout [label="蒙特卡洛展开\n(完整序列)", shape=cds, color="#1098ad"]; D [label="判别器\n(评估器)", peripheries=2, color="#f03e3e", fontcolor="#f03e3e"]; Reward [label="评估动作值\n(Q值 / 奖励)", shape=ellipse, color="#f76707"]; Update [label="策略梯度\n更新 θ", shape=ellipse, color="#37b24d"]; G -> S [label="当前状态"]; S -> Sample [label="Policy π_θ(y_t | s_t)"]; Sample -> Rollout [label="动作 y_t"]; Rollout -> D [label="已完成序列"]; D -> Reward [label="得分"]; Reward -> Update [label="∇θ log π_θ * Q"]; Update -> G [label="更新生成器"]; Sample -> S [label="附加 y_t -> s_{t+1}", style=dashed, constraint=false]; // 循环回到下一个标记 }SeqGAN 训练循环:生成器作为策略,采样动作(标记)。蒙特卡洛展开评估给定状态(部分序列)下某个动作的未来奖励(Q值),并使用判别器的评估。这个评估出的奖励通过策略梯度方法引导生成器的更新。尽管有效,但SeqGAN可能因蒙特卡洛展开而导致梯度评估的高方差,这可能导致训练不稳定。所学得的生成器质量也很大程度上取决于判别器奖励信号的质量和稳定性。排序生成对抗网络 (RankGAN)RankGAN 提供了一种不同的视角,旨在提供一个可能更稳定的学习信号,通过侧重于相对比较而非绝对分类得分。它重新定义了对抗游戏:即判别器不再试图赋予真实性的绝对概率,而是采用一个排序器或比较器。主要观点是,确定一个序列是否比另一个序列更好(例如,更真实、根据某个指标质量更高)可能更容易且信息量更大,而不是独立地为每个序列分配一个精确的数值分数。在RankGAN中,“判别器”被一个训练用于序列排序的模型所取代。这个排序器可以通过几种方式进行训练:学习型排序器: 训练一个模型(通常使用 Siamese 网络或成对比较网络等架构),使用成对的序列(例如,一个真实序列,一个生成序列)进行训练。目标是让排序器给真实序列分配比生成序列更高的分数。基于度量的排序器: 使用现有序列评估度量(如机器翻译中的BLEU分数,尽管在通用文本生成中较少见)作为排序函数。这在原始RankGAN的构想中不太常见,但表示一个相关的思路。然后,生成器 ($G$) 与这个排序器进行对抗训练。它的目标是生成排序器赋予高排名的序列,理想情况下,这些序列的排名应高于(或至少与)数据集中的真实序列相当。生成器的损失函数通常鼓励它在与真实样本的排名比较中“获胜”。通过侧重于相对排序,RankGAN 可能避免与SeqGAN中绝对奖励信号相关的某些不稳定问题。学习信号可能更平滑,尤其是在训练早期,当生成器产生较差样本,判别器可能饱和或提供嘈杂梯度时。讨论SeqGAN 和 RankGAN 都代表了在使GAN适应文本等离散序列生成任务方面的重要进展。它们采用RL的原则来解决不可微分问题:SeqGAN 使用带MC展开的策略梯度,根据判别器的绝对得分评估动作值。RankGAN 使用相对排序机制,通过将生成样本与真实样本进行比较,可能提供更稳定的信号。这些方法都有各自的考量。SeqGAN中的MC展开引入了计算开销和潜在方差。RankGAN的有效性取决于设计和训练一个好的排序器。这两种方法通常都需要仔细调整,并且比用于连续数据的标准GAN更难实现。尽管如此,它们促成了对抗性文本生成中更先进的技术,并展示了将GAN与RL思想结合的广泛适用性。实现这些模型通常涉及集成来自深度学习框架(用于生成器和判别器/排序器)以及可能的RL库或自定义策略梯度实现的组件。