阅读笔记-阿里妈妈AI智能文案


阿里妈妈AI智能文案

之前解决文本多样性的方法

1. 李继伟2016a

提出了新的目标函数MMI对 Seq2Seq进行建模。

原始的目标函数采用log-likelihood建模,

这个loss的问题是,如果一个回复在在训练集中出现得越多(越平常),在测试生成的时候生成这些回复的概率就会越高。所以基于**熵**对loss进行改进,使用互信息来衡量生成句子的优劣。

互信息对比与likelihood的区别在于,多了一项 l o g p ( T ) log p(T) 的惩罚项, 这样对于在训练集中经常出现的回复T, 其语言模型 p(T)越大,最终得分越小。
最终目标函数可以写作:
T ^ = arg max T { log p ( T S ) log p ( T ) } \hat{T}=\underset{T}{\arg \max }\{\log p(T | S)-\log p(T)\}

1.1 MMI-antiLM

将上述惩罚项乘以一个控制因子$\lambda$,得到 anti-language model(antiLM),

T ^ = arg max T { log p ( T S ) λ log p ( T ) } \hat{T}=\underset{T}{\arg \max }\{\log p(T | S)-\lambda \log p(T)\}

虽然他会降低常用回复的出现,但是这些常用回复是通顺的,所以这样降低之后,会导致一些不符合句法的句子被生成。因此,使用截断式语言模型 U ( T ) U(T) 来代替完整的语言模型 p ( T ) p(T)

其中,
g ( k ) = { 1  if  k r 0  if  k > r g(k)=\left\{\begin{array}{ll}{1} & {\text { if } k \leq r} \\ {0} & {\text { if } k>r}\end{array}\right.

可以看出,前者比后者多出来一个 g ( k ) g(k) ,这个参数就是减低重复回复的。回顾解码过程,生成一个词时,需要当前词和上一个生成的词,所以位于句子前面的词会涉及到后面所有词的解码,这样就会影响句子的多样性。所以当前词离得太远的词,就丢弃掉。此外,通过实验发现,解码过程越长,语言模型的影响力越大,句子出现不通顺的概率越大,所以通过限制距离,可以减少这种情况的发生。

1.2 MMI-bidi

考虑到贝叶斯公式,可以将MMI目标函数改成
log p ( T ) = log p ( T S ) + log p ( S ) log p ( S T ) \log p(T)=\log p(T | S)+\log p(S)-\log p(S | T)

这样
T ^ = arg max T { log p ( T S ) λ log p ( T ) } \hat{T}=\underset{T}{\arg \max }\{\log p(T | S)-\lambda \log p(T)\}
就可以改写成
T ^ = arg max T { ( 1 λ ) log p ( T S ) + λ log p ( S T ) λ log p ( S ) } = arg max T { ( 1 λ ) log p ( T S ) + λ log p ( S T ) } \begin{aligned} \hat{T}=\underset{T}{\arg \max }\{(1-\lambda) \log p(T | S)& \\+\lambda \log p(S | T)-\lambda \log p(S) \} \\=\underset{T}{\arg \max }\{(1-\lambda) \log p(T | S)+\lambda \log p(S | T)\} \end{aligned}

引入权重之后,目标函数既可以看做是 p ( S T ) p(S|T) p ( T S ) p(T|S) 之间的tradeoff了.

改写之后的函数就是MMI-Direct decodeing(MMI-bidi)

实际实验中,使用目标函数的第一项 ( 1 λ ) log p ( T S ) (1-\lambda) \log p(T | S) 来生成N个回答,然后使用第二项即 λ log p ( S T ) \lambda \log p(S | T) 对N个回答重新排序。

这种方法的优点是得到的答案都是语法通顺的,因为是标准的seq2seq模型的答案,但是在排名上只是局部最优的。

不足
这些方法没有优化 encoder-decoder,不适合解决多目标数据,因为受限于准确性和多样性的tradeoff

2. VAE

这些方法引入了一个中间隐变量,并假设每一个隐变量的配置都对应于一个可行的响应。所以可以通过从变量中采样来得到不同的隐变量响应。但是VAECVAE都会遇到 KL-消逝的问题,即decoder在生成文本时,根本没有用到隐变量。

AE vs. VAE

对于AE,AE中学习的是 e n c o d e r encoder d e c o d e r decoder ,只能从一个 X X ,得到对应的重构 X X 。但是无法生成新的样本。而 VAE可以让重构后的 X X 尽量符合某个指定的分布,只需要从这个分布中采样出来就可以恢复输入(比如一张图片)

无监督句子编码

标准的rnn的解码过程是利用当前词和上一个解码结果来生成下一个词的。这种方法虽然有效但是没有学到一个完整句子的词向量表示,都是一个词一个词学的。为了能学到这个全句子的隐向量,首先要找到句子和词向量的映射关系。有三种方法,句子AE,其中编码器和解码器都是rnn,但是这个模型在提取全局语义方面表现不好。剩下两种方法skip-thoughtparagraph vector可以很好的对句子进行编码,但是不能用于generating settings,因为前者是一种无监督学习模型,输出是下一个句子而不是本身;后者是没有rnn的,

标准的AE的包栝编码 φ e n c \varphi_{enc} 、解码 p ( x z = φ e n c ) p(x|\vec{z}=\varphi_{enc}) ,给定 z \vec{z} 最大化得到 x x 的概率、得到 x x 的编码。

VAE

  • 是对标准 AE做了标准化处理,在ae的架构上引入了随机隐变量。

  • VAE 从 data 学到的是在 latent space 的 region,而不是单个点。换句话说是 encode 学到了一个概率分布 q ( z x ) q(\vec{z}|x) , 其中 z \vec{z} 是一个对角gaosigao’si’fen’bu补。

  • 引入 KL divergence 让后验 q(z|x)接近先验 p(z)。这里的 motivation 在于如果仅用 reconstruction loss,q(z|x)的 variances 还是会很小(又和原有的单个点差不多了)

不管是VAE还是CVAE都会遇到KL消逝的问题。这是由于这类方法目标函数本身造成的。很有方法试图基于此改进,但无非是减弱解码器,或者增强编码器,由此对目标函数进行修改。

相关基础工作

2.1 编解码模型

源于机器翻译的Seq2Seq 模型,给定一个句子输出一个句子。不适合一对多,而且没有多样性。虽然有MMI作为损失函数的改进,把那些常出现的回答过滤了,但是不能解决多目标数据的问题,因为每次只考虑一个target。而在机器翻译中常用的BS方法,更容易将前缀相同的句子返回,所以生成结果看起来还是非常相似的,不能解决多样性。

2.2 VAE和CVAE

在生成时引入了隐变量,目标函数是 ELBO

log p ( x ) E q ( z x ) [ log p ( x z ) ] K L ( q ( z x ) p ( z ) ) \log p(x) \geq \mathbb{E}_{q(z | x)}[\log p(x | z)]-K L(q(z | x) \| p(z))

其中, q ( z x ) q(z|x) p(z|x)的都有参数的。可以看到输入 x x 在编码时引入了概率分布,而不是固定的,不同的概率分布就可以有不同的结果生成。

如果考虑到上下文,那么模型就是基于某种条件的,成为 CVAE,其目标函数也是 ELBO

log p ( x c ) E q ( z x , c ) [ log p ( x z , c ) ] K L ( q ( z x , c ) p ( z c ) ) \begin{array}{c}{\log p(x | c)} \\ { \geq \mathbb{E}_{q(z | x, c)}[\log p(x | z, c)]-K L(q(z | x, c) \| p(z | c))}\end{array}

KL消失问题

ELBO会带来kl消失问题,也称为posterior collapse problem。就是说,从输入拿到的用于后验生成的信息异常,可能是噪声太多,也可能是信息太少,使得decoder没有使用从 q ϕ ( z x ) q_{\phi}(z|x) 得到的隐变量 z z .

信息太少了是指 q ϕ ( z x ) q ϕ ( z ) = N ( a , b ) q_{\phi}(z | x) \simeq q_{\phi}(z)=\mathcal{N}(a, b) ,参数 μ \mu σ \sigma 和输入 x x 都没什么关系了, μ \mu σ \sigma 坍塌(collaspe)回一个常数,没有办法区分不同的输入。

噪声太强了是指 μ \mu σ \sigma 都不稳定,这样产生的 z z 也是不稳定的,decoder没法用,只能从现有的结果中选一个输出。

那z的产生和x无关之后又怎么样呢?会有 q ( z x ) = p ( z ) q(z | x)=p(z) ,这样一来ELBO的第二项就等于0了;又根据琴生不等式, E p ( z ) [ log p ( x z ) ] log z [ p ( x z ) p ( z ) ] = log p ( x ) E_{p(z)}[\log p(x | z)] \leq\log \sum_{z}[p(x | z) p(z)]=\log p(x) (当且仅当x和z无关时,等号成立。)
那么当x和z无关时,ELBO目标函数回退到原始的 l o g ( p ) log(p) ,VAE模型也会退到最简单的模型了。

2.3 SelfLabeling CVAE

想要利用不同的z生成不同的x,首先需要每一个z通过解码都可以得到一个不同的x,其次,z需要满足先验分布 p ( z ) p(z)

再看一下ELBO的目标,是想最大化log概率,就是想让第一项尽可能大,第二项尽可能小。第二项小说明z和x 的分布越来越像,这就会造成kl消逝的问题。

3 数据集

电商语料库,商家和用户评论及推荐。商家描述文本是属性词的堆砌,作为source,来生成像人写的推荐理由。有三百多万的source,平均每一条source有3.8个target。

4 实验

4.1 开放领域的对话生成

使用的是开源数据集 DailyDialog

4.2 推荐理由生成

使用的是自己构建的EGOODS数据集,模型是PyTorch,编码向量长度是128.

发布了120 篇原创文章 · 获赞 35 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/u012328476/article/details/102872416