论文粗读:《Generating Sentences by Editing Prototypes》

因为想做一个根据不同年龄段的人生成不同故事内容的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