原文链接:https://arxiv.org/pdf/1808.04339.pdf
相关博客
【自然语言处理】【文本风格迁移】基于向量分解的非并行语料文本风格迁移
【自然语言处理】【文本风格迁移】基于风格实例的文本风格迁移
一、简介
- 神经网络生成的向量表示是不可解释的,称这些向量表示存在于隐空间中;
- 论文的目标是对隐空间中的向量表示进行分解,具体来说是分解出文本表示中的内容空间和风格空间;
- 论文假设没有相同内容不同风格的并行语料,只有标注了风格的语句,因此称为 non-parallel text style transfer \text{non-parallel text style transfer} non-parallel text style transfer;
- 论文提出使用多任务损失函数和对抗损失函数来完成这个目标;
- 具体来说,人工将隐向量表示划分为内容表示和风格表示,利用多任务来确保内容和风格表示各自包含相应的信息,再利用对抗损失来去除掉不该包含在该空间的信息;
- 在完成了隐表示分解后,将内容向量表示和期望的风格向量进行拼接,然后输入解码器来生成迁移后的句子;
- 定性和定量实验显示内容和风格确实被分离出来了;
- 在风格迁移的评估中,论文的方法实现了更好的风格迁移、内容保持和语言流畅;
- 消融实验也证明各个损失函数都扮演着该有的角色;
二、自编码器
自编码器的目标是将输入数据编码至隐向量空间,然后再将其从隐向量空间中重构处理。通常,隐向量空间的维度小于输入数据的维度,并且在自编码的过程中能够学习到输入数据的更加显著且紧凑的向量表示。
1. 确定性自编码器
确定性自编码器(
Deterministic Autoencoder
\text{Deterministic Autoencoder}
Deterministic Autoencoder),简称为
DAE
\text{DAE}
DAE。本文选择两个
RNN
\text{RNN}
RNN来分别作为编码器和解码器。令
x
=
(
x
1
,
x
2
,
…
,
x
n
)
x=(x_1,x_2,\dots,x_n)
x=(x1,x2,…,xn)表示具有
n
n
n个token的输入语句,编码器
RNN
\text{RNN}
RNN负责将
x
x
x编码为隐向量表示
h
\textbf{h}
h,解码器
RNN
\text{RNN}
RNN则辅助基于
h
\textbf{h}
h来生成一个句子,并且期望该句子与原始句子相同。具体来说,在时间步
t
t
t,解码器
RNN
\textbf{RNN}
RNN会生成一个概率
p
(
x
t
∣
h
,
x
1
,
…
,
x
t
−
1
)
p(x_t|\textbf{h},x_1,\dots,x_{t-1})
p(xt∣h,x1,…,xt−1)来预测单词
x
t
x_t
xt,然后使用序列聚合的交叉熵损失函数来训练
J
A
E
(
θ
E
,
θ
D
)
=
−
∑
t
=
1
n
l
o
g
p
(
x
t
;
h
,
x
1
,
…
,
x
t
−
1
)
(1)
J_{AE}(\theta_E,\theta_D)=-\sum_{t=1}^n log\;p(x_t;\textbf{h},x_1,\dots,x_{t-1}) \tag{1}
JAE(θE,θD)=−t=1∑nlogp(xt;h,x1,…,xt−1)(1)
其中,
θ
E
\theta_E
θE和
θ
D
\theta_D
θD是编码器和解码器的参数。
2. 变分自编码器
论文除了实现
DAE
\text{DAE}
DAE外,还实现了变分自编码器(
Variational Autoencoder
\text{Variational Autoencoder}
Variational Autoencoder),简称为
VAE
\text{VAE}
VAE。
VAE
\text{VAE}
VAE在隐向量上施加了一个概率分布,然后利用
KL
\text{KL}
KL散度作为正则项来正则隐空间。解码器则基于后验概率分布采样的隐向量来重构原始输入。具体来说,
VAE
\text{VAE}
VAE的损失函数为
J
A
E
(
θ
E
,
θ
D
)
=
−
E
q
E
(
h
∣
x
)
[
l
o
g
p
(
x
∣
h
)
]
+
λ
k
l
KL
(
q
E
(
h
∣
x
)
∣
∣
p
(
h
)
)
(3)
J_{AE}(\theta_E,\theta_D)=-\mathbb{E}_{q_E(\textbf{h}|x)}[log\;p(x|\textbf{h})]+\lambda_{kl}\text{KL}(q_E(\textbf{h}|x)||p(\textbf{h})) \tag{3}
JAE(θE,θD)=−EqE(h∣x)[logp(x∣h)]+λklKL(qE(h∣x)∣∣p(h))(3)
其中
λ
k
1
\lambda_{k1}
λk1是平衡重构损失函数和KL正则项的超参数;
p
(
h
)
p(\textbf{h})
p(h)是先验概率,设置为标准正态分布
N
(
0
,
I
)
\mathcal{N}(0,I)
N(0,I);
q
E
(
h
∣
x
)
q_E(\textbf{h}|x)
qE(h∣x)是形式为
N
(
u
,
diag
σ
)
\mathcal{N}(u,\text{diag}\;\sigma)
N(u,diagσ)的后验概率,其中均值
u
u
u和标准差
σ
\sigma
σ是由编码网络预测得到的。使用
VAE
\text{VAE}
VAE的主要原因是
VAE
\text{VAE}
VAE生成的隐空间更加光滑,这样解码器生成的句子也更加的流程。
3. 其他
论文将会通过后面损失函数的设计将 h \textbf{h} h分解为风格向量 s \textbf{s} s和内容向量 c \textbf{c} c,即 h=[s;c] \textbf{h=[s;c]} h=[s;c],其中 [ ⋅ ; ⋅ ] [\cdot;\cdot] [⋅;⋅]表示拼接。
三、风格导向的损失函数
这里通过一个多任务损失函数来保证 s \textbf{s} s中包含风格信息,然后再利用对抗损失函数来确保 c \textbf{c} c中没有风格信息。
1. 多任务损失函数
由于没有并行语料,因此假设每个句子都有风格标签。特别地,将情感看作是一种风格,这样每个句子有具有一个风格标签了。
论文在风格空间上建立了一个风格预测分类器,通过该分类器来确保风格隐向量
s
\textbf{s}
s包含风格信息。正式来说,使用
softmax
\text{softmax}
softmax分类器进行分类
y
s
=
softmax
(
W
m
u
l
(
s
)
s
+
b
m
u
l
s
)
(3)
\textbf{y}_s=\text{softmax}(W_{mul(s)}s+b_{mul{s}}) \tag{3}
ys=softmax(Wmul(s)s+bmuls)(3)
其中,
θ
m
u
l
s
=
[
W
m
u
l
(
s
)
;
b
m
u
l
(
s
)
]
\theta_{mul{s}}=[W_{mul(s)};b_{mul(s)}]
θmuls=[Wmul(s);bmul(s)]是风格多任务学习的参数,
y
s
\textbf{y}_s
ys是分类器输出的风格概率分布。
该分类器通过交叉熵来训练
J
m
u
l
(
s
)
(
θ
E
;
θ
m
u
l
(
s
)
)
=
−
∑
l
∈
l
a
b
e
l
s
t
s
(
l
)
l
o
g
y
s
(
l
)
(4)
J_{mul(s)}(\theta_E;\theta_{mul(s)})=-\sum_{l\in labels}t_s(l)log\;y_s(l) \tag{4}
Jmul(s)(θE;θmul(s))=−l∈labels∑ts(l)logys(l)(4)
其中,
t
s
(
l
)
t_s(l)
ts(l)是真实分布,
θ
E
\theta_E
θE是编码器参数。
在训练风格分类器的同时也训练自编码器,这样的多任务训练方式不仅仅能够编码句子,也能够使风格向量 s \textbf{s} s中包含情感信息。
2. 对抗损失函数
上面的多任务损失函数能确保风格空间中包含风格信息。但是,内容空间也有可能包含风格信息,这并不符合分解的目标。
论文使用对抗训练来控制内容空间中的风格信息。该方法会引入一个称为
adversary
\text{adversary}
adversary的对抗(判别器)分类器,其主要是基于内容向量
c
\textbf{c}
c来判断真实风格标签。具体来说,该对抗判别器的训练目标与公式
(
3
)
(3)
(3)和
(
4
)
(4)
(4),但是具有不同的输入和参数
y
s
=
softmax
(
W
d
i
s
(
s
)
c
+
b
d
i
s
(
s
)
)
J
d
i
s
(
s
)
(
θ
d
i
s
(
s
)
)
=
−
∑
l
∈
l
a
b
e
l
s
t
c
(
l
)
l
o
g
y
s
(
l
)
\begin{align} \textbf{y}_s=\text{softmax}(W_{dis(s)}\textbf{c}+\textbf{b}_{dis(s)}) \tag{5} \\ J_{dis(s)}(\theta_{dis(s)})=-\sum_{l\in labels}t_c(l)log\;y_s(l) \tag{6} \\ \end{align}
ys=softmax(Wdis(s)c+bdis(s))Jdis(s)(θdis(s))=−l∈labels∑tc(l)logys(l)(5)(6)
其中,
θ
d
i
s
(
s
)
=
[
W
d
i
s
(
s
)
;
b
d
i
s
(
s
)
]
\theta_{dis(s)}=[W_{dis(s)};\textbf{b}_{dis(s)}]
θdis(s)=[Wdis(s);bdis(s)]是对抗判别器的参数。这里的对抗判别器梯度并不会回传给自编码器。因此,
J
d
i
s
(
s
)
J_{dis(s)}
Jdis(s)仅看作是
θ
d
i
s
(
s
)
\theta_{dis(s)}
θdis(s)的函数,而
J
m
u
l
(
s
)
J_{mul(s)}
Jmul(s)则是
θ
E
\theta_{E}
θE和
θ
m
u
l
(
s
)
\theta_{mul(s)}
θmul(s)的函数。
在训练完对抗判别器后,论文通过一种特殊的方式来调整编码器,使得向量
c
\textbf{c}
c对风格预测没有作用。现有的方法中,可以通过最大化对抗判别器的损失函数或者惩罚对抗判别器预测概率的熵。论文采取了后面的方法,因此可以方便的扩展到多类别分类中。正式来说,对抗目标最大化
J
a
d
v
(
s
)
(
θ
E
)
=
H
(
y
s
∣
c
;
θ
d
i
s
(
s
)
)
(7)
J_{adv(s)}(\theta_E)=\mathcal{H}(y_s|c;\theta_{dis(s)}) \tag{7}
Jadv(s)(θE)=H(ys∣c;θdis(s))(7)
其中,
H
(
p
)
=
−
∑
i
∈
l
a
b
e
l
s
p
i
l
o
g
p
i
\mathcal{H}(p)=-\sum_{i\in labels}p_i log\;p_i
H(p)=−∑i∈labelspilogpi,
y
s
\textbf{y}_s
ys是预测风格的概率分布。
J
a
d
v
(
s
)
J_{adv(s)}
Jadv(s)是针对自编码器进行最大化,并且当
y
s
y_s
ys为均匀分布时达到最大值,其被看作是
θ
E
\theta_E
θE的函数,而
θ
d
i
s
(
s
)
\theta_{dis(s)}
θdis(s)固定。
四、内容导向的损失函数
上面的风格导向损失函数使风格信息规范化,但是还没有对内容信息进行规范化。这种情况在先前的研究中也经常出现。因此,这里设计内容导向的辅助损失函数来规范化内容信息。
受上面风格导向损失函数的启发,我们期望将相同想法应该在内容空间上。但是,什么是内容很难定义。为了解决这个问题,论文使用 bag-of-words \text{bag-of-words} bag-of-words特征来作为内容信息的近似。一个句子的 BoW \text{BoW} BoW特征就是一个向量,向量的每个元素表示一个单词在该句子中出现的概率。对于具有 N N N个单词的句子 x x x,单词 w ∗ w_* w∗的 BoW \text{BoW} BoW概率为 t c ( w ∗ ) = ∑ i = 1 N I { w i = w ∗ } N t_c(w_*)=\frac{\sum_{i=1}^N\mathbb{I}\{w_i=w_*\}}{N} tc(w∗)=N∑i=1NI{wi=w∗},其中 t c ( ⋅ ) t_c(\cdot) tc(⋅)是内容的目标分布,并且 I { ⋅ } \mathbb{I}\{\cdot\} I{⋅}是一个指示函数。具体实现时,论文将停用词和风格相关的词以外的词看作是真正的内容。特别地,对于情感风格迁移,会使用情感词典来排除情感词。
1. 多任务损失函数
类似于风格导向损失函数中的多任务损失函数,这里的多任务损失函数的目标是确保内容空间
c
\textbf{c}
c包含内容信息,即包含
BoW
\text{BoW}
BoW特征。这里仍然使用
softmax
\text{softmax}
softmax分类器
y
c
=
softmax
(
W
m
u
l
(
c
)
c
+
b
m
u
l
(
c
)
)
(8)
\textbf{y}_c=\text{softmax}(W_{mul(c)}\textbf{c}+\textbf{b}_{mul(c)}) \tag{8}
yc=softmax(Wmul(c)c+bmul(c))(8)
其中,
θ
m
u
l
(
c
)
=
[
W
m
u
l
(
c
)
;
b
m
u
l
(
c
)
]
\theta_{mul(c)}=[W_{mul(c)};\textbf{b}_{mul(c)}]
θmul(c)=[Wmul(c);bmul(c)]是分类器参数,
y
c
\textbf{y}_c
yc是预测的
BoW
\text{BoW}
BoW分布。
训练目标是针对真实分布
t
c
(
⋅
)
t_c(\cdot)
tc(⋅)的交叉熵,
J
m
u
l
(
c
)
(
θ
E
;
θ
m
u
l
(
c
)
)
=
−
∑
w
∈
v
o
c
a
b
t
c
(
w
)
l
o
g
y
c
(
w
)
(9)
J_{mul(c)}(\theta_E;\theta_{mul(c)})=-\sum_{w\in vocab}t_c(w)log\;y_c(w) \tag{9}
Jmul(c)(θE;θmul(c))=−w∈vocab∑tc(w)logyc(w)(9)
该训练目标会同时对编码器参数
θ
E
\theta_E
θE和多任务分类器
θ
m
u
l
(
c
)
\theta_{mul(c)}
θmul(c)进行优化。
内容的多任务损失函数与自编码器的重构函数主要的不同是,多任务函数仅考虑内容词,而忽略停用词和风格相关的词。
2. 对抗损失函数
为了确保风格向量不包含内容信息,设计了内容对抗损失函数。这里也会构建一个称为
adversary
\text{adversary}
adversary的对抗(判别)分类器。该对抗分类器是在风格空间上预测
BoW
\text{BoW}
BoW特征的
softmax
\text{softmax}
softmax分类器,
y
c
=
softmax
(
W
d
i
s
(
c
)
T
s
+
b
d
i
s
(
c
)
)
J
d
i
s
(
c
)
(
θ
d
i
s
(
c
)
)
=
−
∑
w
∈
v
o
c
a
b
t
c
(
w
)
l
o
g
y
c
(
w
)
\begin{align} \textbf{y}_c=\text{softmax}(W_{dis(c)}^{T}\textbf{s}+\textbf{b}_{dis(c)}) \tag{10} \\ J_{dis(c)}(\theta_{dis(c)})=-\sum_{w\in vocab}t_c(w)log\;y_c(w) \tag{11} \end{align}
yc=softmax(Wdis(c)Ts+bdis(c))Jdis(c)(θdis(c))=−w∈vocab∑tc(w)logyc(w)(10)(11)
其中,
θ
d
i
s
(
c
)
=
[
W
d
i
s
(
c
)
;
b
d
i
s
(
c
)
]
\theta_{dis(c)}=[W_{dis(c)};b_{dis(c)}]
θdis(c)=[Wdis(c);bdis(c)]是用于预测
BoW
\text{BoW}
BoW特征的分类器参数。
对抗损失函数就是最大化判别器的熵
J
a
d
v
(
c
)
(
θ
E
)
=
H
(
y
c
∣
s
;
θ
d
i
s
(
c
)
)
(12)
J_{adv(c)}(\theta_E)=\mathcal{H}(\textbf{y}_c|\textbf{s};\theta_{dis(c)})\tag{12}
Jadv(c)(θE)=H(yc∣s;θdis(c))(12)
需要注意的是,
J
d
i
s
(
c
)
J_{dis(c)}
Jdis(c)是针对判别器参数
θ
d
i
s
(
c
)
\theta_{dis(c)}
θdis(c)进行训练的,而
J
a
d
v
(
c
)
J_{adv(c)}
Jadv(c)则是针对自编码器
θ
E
\theta_E
θE进行训练的。
五、训练过程
自编码器的总体损失函数
J
o
v
r
J_{ovr}
Jovr包含以下几项:重构目标、用于风格和内容的多任务目标、用于风格和内容的对抗目标。
J
o
v
r
=
J
A
E
(
θ
E
,
θ
D
)
+
λ
m
u
l
(
s
)
J
m
u
l
(
s
)
(
θ
E
,
θ
m
u
l
(
s
)
)
−
λ
a
d
v
(
s
)
J
a
d
v
(
s
)
(
θ
E
)
+
λ
m
u
l
(
c
)
J
m
u
l
(
c
)
(
θ
E
,
θ
m
u
l
(
c
)
)
−
λ
a
d
v
(
c
)
J
a
d
v
(
c
)
(
θ
E
)
\begin{align} J_{ovr}&=J_{AE}(\theta_E,\theta_D) \\ &+\lambda_{mul(s)}J_{mul(s)}(\theta_E,\theta_{mul(s)})-\lambda_{adv(s)}J_{adv(s)}(\theta_E) \\ &+\lambda_{mul(c)}J_{mul(c)}(\theta_E,\theta_{mul(c)})-\lambda_{adv(c)}J_{adv(c)}(\theta_E) \tag{13} \end{align}
Jovr=JAE(θE,θD)+λmul(s)Jmul(s)(θE,θmul(s))−λadv(s)Jadv(s)(θE)+λmul(c)Jmul(c)(θE,θmul(c))−λadv(c)Jadv(c)(θE)(13)
其中,
λ
\lambda
λ是平衡自编码损失和其他辅助损失的超参。
整个模型的训练涉及到判别器损失函数 J d i s ( s ) J_{dis(s)} Jdis(s)和 J d i s ( c ) J_{dis(c)} Jdis(c),以及自编码器损失函数 J o v r J_{ovr} Jovr,整个训练过程如下描述:
foreach \textbf{foreach} foreach mini-batch do \textbf{do} do
minimize J d i s ( s ) w . r . t . θ d i s ( s ) J_{dis(s)}\;w.r.t.\;\theta_{dis(s)} Jdis(s)w.r.t.θdis(s)
minimize J d i s ( c ) w . r . t . θ d i s ( c ) J_{dis(c)}\;w.r.t. \theta_{dis(c)} Jdis(c)w.r.t.θdis(c)
minimize J o v r w . r . t . θ E , θ D , θ m u l ( s ) , θ m u l ( c ) J_{ovr}\;w.r.t.\;\theta_E,\theta_D,\theta_{mul(s)},\theta_{mul(c)} Jovrw.r.t.θE,θD,θmul(s),θmul(c)
end \textbf{end} end
六、生成风格迁移的句子
论文分解隐空间的方法可以直接应用在自然语言生成任务中的风格迁移。具体来说,给定一个输入句子
x
∗
x^*
x∗,其具有两个被分解后的风格向量和内容向量
s
∗
\textbf{s}^*
s∗和
c
∗
\textbf{c}^*
c∗。如果我们希望将内容迁移至不同的风格,那么首先计算一个目标风格向量的经验评估
s
^
\hat{\textbf{s}}
s^
s
^
=
∑
i
∈
target style
s
i
# target style samples
\hat{s}=\frac{\sum_{i\in \text{target style}}\textbf{s}_i}{\text{\# target style samples}}
s^=# target style samples∑i∈target stylesi
将推动出的风格向量
s
^
\hat{\textbf{s}}
s^和编码了内容的向量
c
∗
\textbf{c}^*
c∗进行拼接,然后输出解码器来获得风格迁移后的句子。