因为想做一个根据不同年龄段的人生成不同故事内容的demo,所以阅读了这篇文本风格转换的论文。
参考:
https://arxiv.org/abs/1709.08878
https://github.com/kelvinguu/neural-editor
Introduction
主要贡献
- 通过从训练集中挑选一个prototype sentence,产生一个能捕捉到句子相似度等句子级别信息的latent edit vector,并通过这个向量生成句子
- 模型的整体框架如下图,这个模型的由来是基于人们的一个经验,通常人们写一个复杂的句子时,都是根据一个简单的句子,逐步修改而来的
- 目标函数:最大化生成模型的log likelihood
- 使用locality sensitive hashing寻找相似的句子
Problem Statement
解决问题分两步
- 从语料库里选择一句话
- prototype distribution: p(x’) (uniform over X)
- 以p(x’)的概率从语料库中随机选择一个prototype sentence
- 把这句话进行修改
- 以edit prior: p(z)的概率sample出一个edit vector: z (实际是对edit type进行编码)
- 将z和x’送入到$p_{\text {edit }}\left(x | x^{\prime}, z\right)$的神经网络中,产生新的句子x
整体公式如下:
$p(x)=\sum_{x^{\prime} \in \mathcal{X}} p\left(x | x^{\prime}\right) p\left(x^{\prime}\right)$
$p\left(x | x^{\prime}\right)=\mathbb{E}_{z \sim p(z)}\left[p_{\mathrm{edit}}\left(x | x^{\prime}, z\right)\right]$
模型满足两个条件
- Semantic smoothness:一次edit只能对文本进行小改动;多次edit可以产生大的改动
- Consistent edit behavior:对edit有类型的控制,对不同句子同一类型的edit应该产生相似的效果
Approach
对p(x)进行近似
- 大多数的prototype x都是不相关的,即p(x|x’)非常小;因此我们只考虑和x有非常高的lexical overlap的prototype x’
- 定义一个lexical similarity neighborhor $\mathcal{N}(x) \stackrel{\text { def }}{=}\left\{x^{\prime} \in \mathcal{X}: d_{J}\left(x, x^{\prime}\right)<0.5\right\}$,其中dj是x和x’的Jaccard距离
- 利用neighborhood prototypes和Jensen不等式求解
$\begin{aligned} \log p(x) &=\log \left[\sum_{x^{\prime} \in \mathcal{X}} p\left(x | x^{\prime}\right) p\left(x^{\prime}\right)\right] \ & \geq \log \left[\sum_{x^{\prime} \in \mathcal{N}(x)} p\left(x | x^{\prime}\right) p\left(x^{\prime}\right)\right] \end{aligned}$
$\begin{array}{l}{=\log \left[|\mathcal{N}(x)|^{-1} \sum_{x^{\prime} \in \mathcal{N}(x)} p\left(x | x^{\prime}\right)\right]+R(x)} \ {\geq|\mathcal{N}(x)|^{-1} \sum_{x^{\prime} \in \mathcal{N}(x)} \log p\left(x | x^{\prime}\right)+R(x)} \ {\underbrace{x^{\prime} \in \mathcal{N}(x)}_{\text {def }_{\mathrm{LEX}}(x)}+R(x)}\end{array}$
- $\begin{array}{l}{p\left(x^{\prime}\right)=1 /|\mathcal{X}|} \ {\mathrm{R}(\mathrm{x})=\log (|\mathcal{N}(x)| /|\mathcal{X}|)}\end{array}$
- $|\mathcal{N}(x)|$是跟x相关的常数,x的邻居使用locality sensitive hashing (LSH) and minhashing进行预先的计算
对log p(x|x’)进行近似
使用蒙特卡洛对$z \sim p(z)$进行采样时可能会产生比较高的方差,因为$p_{\text {edit }}\left(x | x^{\prime}, z\right)$对于大部分从p(z) sample出来的z来说都输出0,只对一部分不常见的值输出较大的值
使用inverse neural editor:$q\left(z | x^{\prime}, x\right)$
- 对prototype x’和修正后的句子x,生成一个x’到x的转换的edit vector z,这个z在重要的值上会有较大的概率
使用evidence lower bound(ELBO)来计算log p(x|x’)
$\begin{aligned} \log p\left(x | x^{\prime}\right) \geq & \underbrace{\mathbb{E}_{z \sim q\left(z | x^{\prime}, x\right)}\left[\log p_{\text {edit }}\left(x | x^{\prime}, z\right)\right]}_{\mathcal{L}_{\text {gen }}} \ &-\underbrace{\operatorname{KL}\left(q\left(z | x^{\prime}, x\right) | p(z)\right)}_{\mathcal{E}_{\mathrm{KL}}^{L}} \ \stackrel{\text { def }}{=} \operatorname{ELBO}\left(x, x^{\prime}\right) \end{aligned}$
q(z|x’,x)可以看成是VAE的encoder,pedit(x|x’,z)可以看成是VAE的decoder
目标函数 $\sum_{x^{\prime} \in \mathcal{N}(x)} \operatorname{ELBO}\left(x, x^{\prime}\right)$
- 参数:$\Theta=\left(\Theta_{p}, \Theta_{q}\right)$,包含neural editor的参数和inverse neural editor的参数
Model Architecture
Neural editor $p_{\text {edit }}\left(x | x^{\prime}, z\right)$
- input: prototype x’
- output: revised sentence x
- seq2seq
- encoder: 3层双向LSTM,使用Glove词向量初始化
- decoder: 3层包含attention的LSTM
- 最上面一层的hidden state用来和encoder输出的hidden state一起算attention
- 将attention向量和z向量concate一起,再送入softmax中
Edit prior $p(z)$
- edit vector z的sample方法
- 先采样其scalar length:$z_{\text {norm }} \sim \operatorname{Unif}(0,10)$
- 再采样其direction: 在uniform distribution中采样一个zdir向量
- $z=z_{\text {norm }} \cdot z_{\text {dir }}$
- 这样做是为了方便计算KL散度
Inverse neural editor $q\left(z | x^{\prime}, x\right)$
- 假设x’和x只差了一个word,那么edit vector z跟word的词向量应该是一样的,那么多个word的插入就相当于多个word的词向量的和,删除同理
- 加入到x’的词的集合:$I=x \backslash x^{\prime}$
- 从x’中删除的词的集合:$D=x^{\prime}\backslash x$
- x’和x的差异:$f\left(x, x^{\prime}\right)=\sum_{w \in I} \Phi(w) \oplus \sum_{w \in D} \Phi(w)$
- $\Phi(w)$表示w的词向量,它同时也是inverse neural editor q的参数,使用300维的Glove向量初始化
- $\oplus$表示concate操作
- 认为q是在f的基础上加入噪声获得的(先旋转,在rescale):
- $\begin{array}{l}{f_{\text {norm }}=|f|} \ {f_{\text {dir }}=f / f_{\text {norm }}}\end{array}$
- $\operatorname{vMF}(v ; \mu, \kappa)$表示点v的unit空间中的vMF分布,参数包含mean vector$\mu$和concentration parameter $ \kappa$
因此可得:$\begin{aligned} q\left(z_{\text {dir }} | x^{\prime}, x\right) &=\operatorname{vMF}\left(z_{\text {dir }} ; f_{\text {dir }}, \kappa\right) \ q\left(z_{\text {norm }} | x^{\prime}, x\right) &=\text { Unif }\left(z_{\text {norn }} ;\left[\tilde{f}_{\text {norn }}, \tilde{f}_{\text {nom }}+\epsilon\right]\right) \end{aligned}$
其中 $\tilde{f}_{\text {norm }}=\min \left(f_{\text {norm }}, 10-\epsilon\right)$
- 最终 $z=z_{\mathrm{dir}} \cdot z_{\mathrm{norm}}$
Details
计算目标函数的梯度$\nabla_{\Theta_{q}} \operatorname{ELBO}\left(x, x^{\prime}\right)=\nabla_{\Theta_{q}} \mathcal{L}_{\mathrm{gen}}-\nabla_{\Theta_{q}} \mathcal{L}_{\mathrm{KL}}$
- 使用重参数计算:$\nabla_{\Theta_{q}} \mathcal{L}_{\mathrm{gen}}$
- 将z~q(z|x’,x)重写为$z=h(\alpha)$
- $\begin{aligned} \nabla \Theta_{q} \mathcal{L}_{\mathrm{gen}} &=\nabla \Theta_{q} \mathbb{E}_{z \sim q\left(z | x^{\prime}, x\right)}\left[\log p_{\text {edit }}\left(x | x^{\prime}, z\right)\right] \ &=\mathbb{E}_{\alpha \sim p(\alpha)}\left[\nabla \Theta_{q} \log p_{\text {edit }}\left(x | x^{\prime}, h(\alpha)\right)\right] \end{aligned}$
- 计算$\nabla_{\Theta_{q}} \mathcal{L}_{\mathrm{KL}}$
- $\begin{aligned} \mathcal{L}_{\mathrm{KL}} &=\mathrm{KL}\left(q\left(z_{\text {norm }} | x^{\prime}, x\right) | p\left(z_{\text {norm }}\right)\right) \ &+\mathrm{KL}\left(q\left(z_{\text {dir }} | x^{\prime}, x\right) | p\left(z_{\text {dir }}\right)\right) \end{aligned}$
- $\begin{array}{l}{\operatorname{KL}(\operatorname{vMF}(\mu, \kappa) | \operatorname{vMF}(\mu, 0))=\kappa \frac{I_{d / 2}(\kappa)+I_{d / 2-1}(\kappa) \frac{d-2}{2 \kappa}}{I_{d / 2-1}(\kappa)-\frac{d-2}{2 \kappa}}} \ {-\log \left(I_{d / 2-1}(\kappa)\right)-\log (\Gamma(d / 2))} \ {+\log (\kappa)(d / 2-1)-(d-2) \log (2) / 2}\end{array}$
Experiment
Datsets
- Yelp
- One BillionWord Language Model Benchmark
- 使用Spacy将NER的词替换成其NER category
- 将出现频次小于10000的词用UNK替换
Generative Modeling
- 对比几个生成模型的效果(KENLM语言模型、自回归语言模型)
- 使用neural editor可以生成跟prototype很不一样的句子
Human Evaluation
- 降低softmax temperture有助于产生更符合语法的句子,但也会产生short and generic sentence
- 从corpus中sample出prototype sentence可以增加生成句子的多样性,因此即便temperature设置为0,也不会影响句子多样子,这是比传统的NLM强的地方
- 从grammaticality 和 plausibility两方面进行评测
Semantics of NeuralEditor
- 跟sentence variational autoencoder (SVAE)模型对比,SVAE将句子映射到semantic空间向量,再从向量还原句子
- semantic smoothness
- smoothness表示每一个小的edit只能对句子有一点点改变
- 我们先从corpus中选择一个prototype sentence,然后不断对它使用neural editor,并让人工对semantic的变化进行打分。
- 对比实验有两个,一个是SVAE,一个是从corpus中根据cosine相似度选择出的句子
- consistent edit behavior