文章的主要工作
(1)提出了一种新颖的框架,该框架利用带有冻结 LM 的前缀作为可控 GPT2 生成的轻量级替代方案。
(2)提出了一种具有新颖目标的监督方法和无监督方法来进行前缀训练,其中考虑了前缀之间的关系并同时训练多个前缀。
(3)这项工作为单方面控制和多方面控制提供了统一的视角。实验结果表明,我们的方法可以有效地指导单方面控制和多方面控制的生成。
方法
为了独立地训练每一个前缀,我们考虑属性之间的关系并同时训练多个前缀,因此 H θ H_\theta Hθ 的维度是 N × M × D N \times M \times D N×M×D,其中 N N N 是前缀的数量。在单一方面控制中, N N N 等于涉及方面的属性数量。 M M M 是前缀的长度。 D = 2 × L × E D = 2 \times L \times E D=2×L×E 是在GPT-2中激活的维度,其中 L L L 是Transformer层的数量, E E E 是隐藏层的大小,2表示一个键向量和一个值向量。跟随Li和Liang (2021)的工作,我们通过一个较小的参数 H θ ′ [ l , j , : ] H'_\theta[l, j, :] Hθ′[l,j,:] 与一个大矩阵 W l W_l Wl 重参数化 H θ [ l , j , : ] = W l H θ ′ [ l , j , : ] H_\theta[l, j, :] = W_lH'_\theta[l, j, :] Hθ[l,j,:]=WlHθ′[l,j,:]。训练完成后,只有 H θ H_\theta Hθ 需要被保存以用于生成,而 W W W 和 H θ ′ H'_\theta Hθ′ 可以被丢弃。因为GPT-2的参数在训练过程中被冻结了,它们也不需要被保存。图2展示了在训练前缀控制下的生成过程的一个例子。前缀可以通过监督、半监督或无监督的方式来训练。由于半监督方法是监督方法和无监督方法的结合,我们在这一部分介绍了监督和无监督方法。为了清晰起见,我们在单一方面控制设置下介绍这些方法。
监督方法
假设所关注的方面有属性集合 Y Y Y,每个训练样本是一对 ( x , y ) (x, y) (x,y),其中 x x x 是输入文本, y ∈ Y y \in Y y∈Y 是属性标签。注意,属性标签也表示前缀在 H θ H_\theta Hθ 中的地面真值索引,所以 y y y 也指的是下文描述中的前缀索引。我们引入了一个额外的判别损失来同时训练多个前缀。因此,训练损失 L s u p L_{sup} Lsup 是语言模型损失 L L M L_{LM} LLM 和判别损失 L d L_d Ld 的加权和:
- 监督训练损失: L s u p = ω 1 L L M + ω 2 L d L_{sup} = \omega_1L_{LM} + \omega_2L_d Lsup=ω1LLM+ω2Ld
- 语言模型损失: L L M = − ∑ t = 1 T log p ( x t ∣ x < t , y ) L_{LM} = -\sum_{t=1}^{T} \log p(x_t | x_{<t}, y) LLM=−∑t=1Tlogp(xt∣x<t,y)
- 判别损失: L d = − log p ( y ) p ( x ∣ y ) ∑ y ′ ∈ Y p ( y ′ ) p ( x ∣ y ′ ) L_d = -\log \frac{p(y)p(x|y)}{\sum_{y' \in Y} p(y')p(x|y')} Ld=−log∑y′∈Yp(y′)p(x∣y′)p(y)p(x∣y)
计算 log p ( x t ∣ x < t , y ) \log p(x_t | x_{<t}, y) logp(xt∣x<t,y) 通过固定的GPT2参数化为 log p θ , γ ( x t ∣ x < t , H θ [ y , : , : ] ) \log p_{\theta, \gamma}(x_t | x_{<t}, H_\theta[y, :, :]) logpθ,γ(xt∣x<t,Hθ[y,:,:]),其中 γ \gamma γ 是固定的GPT2参数, θ \theta θ 表示可学习的前缀参数。 log p ( x ∣ y ) \log p(x|y) logp(x∣y) 是 log p θ , γ ( x t ∣ x < t , y ) \log p_{\theta, \gamma}(x_t | x_{<t}, y) logpθ,γ(xt∣x<t,y) 在 t t t 上的和,因此参数化 log p ( x ∣ y ) \log p(x|y) logp(x∣y) 是 log p θ , γ ( x t ∣ x < t , H θ [ y , : , : ] ) \log p_{\theta, \gamma}(x_t | x_{<t}, H_\theta[y, :, :]) logpθ,γ(xt∣x<t,Hθ[y,:,:]) 的和。
注意,每个前缀可以单独使用 L L M L_{LM} LLM 进行训练,这将与Li和Liang(2021)的前缀调整方法相同。直观地讲,通过 L L M L_{LM} LLM 训练的前缀被注入了鼓励生成的信息。然而,我们观察到,在可控的自然语言生成(NLG)中,给前缀注入不鼓励生成的信息也是有帮助的。给定一个训练样本 ( x , y ) (x, y) (x,y),前缀 H θ [ y , : , : ] H_\theta[y, :, :] Hθ[y,:,:] 应当被优化以生成 x x x,而其他前缀应当被阻止生成 x x x。为了实现这一目标,所有在 H θ H_\theta Hθ 中的前缀应该同时被训练。因此,判别损失 L d L_d Ld 被引入。优化 L d L_d Ld 可以通过增加 p ( y ∣ x ) p(y|x) p(y∣x) 并减少 p ( x ∣ y ′ ) p(x|y') p(x∣y′),其中 y ′ ∈ Y \ { y } y' \in Y \backslash \{y\} y′∈Y\{y} 来提高属性对齐。我们假设先验分布是均匀的,所以 p ( y ) p(y) p(y) 和 p ( y ′ ) p(y') p(y′) 可以在公式被消去。图3展示了两个前缀的训练过程。
无监督方法
在无监督设定中,我们假定属性集 Y Y Y 中所关心的方面是已知的。训练样本仅由输入文本 x x x 构成。属性标签 y y y 不再可用,因此与 x x x 相关联的前缀索引是未知的。换句话说,前缀索引是一个潜在变量 z z z,其后验分布遵循一个分类分布。受到VQ-VAE(van den Oord等人,2017年)的启发,我们考虑将前缀作为离散潜在表示。我们采用在上述监督方法中的主模型作为解码器,并引入一个编码器来参数化分类分布 q ( z ∣ x ) q(z|x) q(z∣x)。根据 q ( z ∣ x ) q(z|x) q(z∣x),选出一个前缀索引 z z z 并将前缀 H θ [ z , ⋅ ; ] H_{\theta}[z, \cdot;] Hθ[z,⋅;] 送入解码器来重构输入文本 x x x。由于前缀的选择过程是不可微分的,我们使用了Gumbel-Softmax(GS)松弛方法(Jang等人,2017年;Maddison等人,2017年)遵循Sønderby等人(2017年);Ramesh等人(2021年)。形式上, q ( z ∣ x ) q(z|x) q(z∣x) 的计算如下:
q ( z ∣ x ) = GS ( − ∥ Enc ( x ) − H θ ∥ 2 , τ ) q(z|x) = \text{GS}\left(-\left\|\text{Enc}(x) - H_{\theta}\right\|_2, \tau\right) q(z∣x)=GS(−∥Enc(x)−Hθ∥2,τ)
其中, τ \tau τ 是Gumbel-Softmax的温度, Enc \text{Enc} Enc 是编码器函数。我们使用预训练的GPT-2模型后跟一个线性层作为编码器。为了训练前缀,损失函数是三个损失项的加权和:
L
uns
=
ω
1
L
LM
+
ω
2
L
KL
+
ω
3
L
c
\mathcal{L}_{\text{uns}} = \omega_1 \mathcal{L}_{\text{LM}} + \omega_2 \mathcal{L}_{\text{KL}} + \omega_3 \mathcal{L}_{\text{c}}
Luns=ω1LLM+ω2LKL+ω3Lc
其中, L LM \mathcal{L}_{\text{LM}} LLM 是语言模型损失。类似于在监督方法中的计算, log p ( x t ∣ x < t , z ) \log p(x_t | x_{<t}, z) logp(xt∣x<t,z) 是参数化的,作为 log p θ y ( x t ∣ x < t , H θ [ z , ⋅ ; ] ) \log p_{\theta_y}(x_t | x_{<t}, H_{\theta}[z, \cdot;]) logpθy(xt∣x<t,Hθ[z,⋅;])。 L KL \mathcal{L}_{\text{KL}} LKL 是Kullback-Leibler散度,我们假设先验 p ( z ) p(z) p(z) 是均匀的。注意,这两个术语构成了VAE的损失函数。优化这两个损失项可以改善证据的下界 log p ( x ) \log p(x) logp(x)。类似于在监督方法中 L d \mathcal{L}_{\text{d}} Ld 背后的直觉,如果 x x x 的真实前缀是 H θ [ y , ⋅ ; ] H_{\theta}[y, \cdot;] Hθ[y,⋅;],那么其他前缀应当被阻止生成 x x x。然而, L d \mathcal{L}_{\text{d}} Ld 需要计算时有真实标签 y y y。相反,我们引入了一个无监督对比损失 L c \mathcal{L}_{\text{c}} Lc。
L
c
=
max
(
m
−
∥
p
(
z
∣
x
)
−
p
(
z
~
∣
x
)
∥
2
,
0
)
2
\mathcal{L}_{\text{c}} = \max(m - \left\| p(z|x) - p(\tilde{z}|x) \right\|_2, 0)^2
Lc=max(m−∥p(z∣x)−p(z~∣x)∥2,0)2
其中
m
m
m 是预设的边际值,
z
~
\tilde{z}
z~ 是另一个潜在变量,表示相反前缀的索引。
q
(
z
~
∣
x
)
q(\tilde{z}|x)
q(z~∣x) 的计算如下:
q ( z ~ ∣ x ) = GS ( − ∥ Enc ( x ) − H θ ∥ 2 , τ ) q(\tilde{z}|x) = \text{GS}\left( -\left\| \text{Enc}(x) - H_{\theta} \right\|_2, \tau \right) q(z~∣x)=GS(−∥Enc(x)−Hθ∥2,τ)
L c \mathcal{L}_c Lc 旨在通过将 p ( z ∣ x ) p(z|x) p(z∣x) 从 p ( z ~ ∣ x ) p(\tilde{z}|x) p(z~∣x) 推开一个边际值来增加属性对齐。 p ( z ~ ∣ x ) p(\tilde{z}|x) p(z~∣x) 的计算如下:
p ( z ~ ∣ x ) = p ( z ~ ) p ( x ∣ z ~ ) ∑ z ′ ∈ Y p ( z ′ ) p ( x ∣ z ′ ) p(\tilde{z}|x) = \frac{p(\tilde{z})p(x|\tilde{z})}{\sum_{z' \in Y} p(z')p(x|z')} p(z~∣x)=∑z′∈Yp(z′)p(x∣z′)p(z~)p(x∣z~)
我们假设先验是均匀的,所以 p ( z ~ ) p(\tilde{z}) p(z~) 和 p ( z ′ ) p(z') p(z′) 可以被约去。类似于在监督方法中 log p ( x ∣ y ) \log p(x|y) logp(x∣y) 的参数化, log p ( x ∣ z ) \log p(x|z) logp(x∣z) 的参数化是 log p θ y ( x t ∣ x < t , H θ [ z , ⋅ ; ] ) \log p_{\theta_y}(x_t | x_{<t}, H_{\theta}[z, \cdot;]) logpθy(xt∣x<t,Hθ[z,⋅;]) 关于 t t t 的总和。训练过程在图4中说明。