文章目录
阿里妈妈AI智能文案
之前解决文本多样性的方法
1. 修改loss
主要代表是李继伟2016a的相关研究,提出了新的目标函数MMI
对 Seq2Seq进行建模。
原始的目标函数采用log-likelihood
建模,
互信息对比与likelihood的区别在于,多了一项
l
o
g
p
(
T
)
log p(T)
logp(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)\}
T^=Targmax{logp(T∣S)−logp(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)\} T^=Targmax{logp(T∣S)−λlogp(T)}
虽然他会降低常用回复的出现,但是这些常用回复是通顺的,所以这样降低之后,会导致一些不符合句法的句子被生成。因此,使用截断式语言模型 U ( T ) U(T) U(T)来代替完整的语言模型 p ( 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)={10 if k≤r if k>r
可以看出,前者比后者多出来一个 g ( k ) 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)
logp(T)=logp(T∣S)+logp(S)−logp(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^=Targmax{logp(T∣S)−λlogp(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}
T^=Targmax{(1−λ)logp(T∣S)+λlogp(S∣T)−λlogp(S)}=Targmax{(1−λ)logp(T∣S)+λlogp(S∣T)}
引入权重之后,目标函数既可以看做是
p
(
S
∣
T
)
p(S|T)
p(S∣T)和
p
(
T
∣
S
)
p(T|S)
p(T∣S)之间的tradeoff
了.
改写之后的函数就是MMI-Direct decodeing
(MMI-bidi)
实际实验中,使用目标函数的第一项 ( 1 − λ ) log p ( T ∣ S ) (1-\lambda) \log p(T | S) (1−λ)logp(T∣S)来生成N个回答,然后使用第二项即 λ log p ( S ∣ T ) \lambda \log p(S | T) λlogp(S∣T)对N个回答重新排序。
这种方法的优点是得到的答案都是语法通顺的,因为是标准的seq2seq模型的答案,但是在排名上只是局部最优的。
不足
这些方法没有优化 encoder-decoder,不适合解决多目标数据,因为受限于准确性和多样性的tradeoff
2. 使用VAE模型
VAE方法引入了一个中间隐变量,并假设每一个隐变量的配置都对应于一个可行的响应。所以可以通过从变量中采样来得到不同的隐变量响应。但是VAE
和CVAE
都会遇到 KL-消逝
的问题,即decoder在生成文本时,根本没有用到隐变量。
AE vs. VAE
对于AE,AE中学习的是 e n c o d e r encoder encoder 和 d e c o d e r decoder decoder ,只能从一个 X X X,得到对应的重构 X X X 。但是无法生成新的样本。而 VAE可以让重构后的 X X X尽量符合某个指定的分布,只需要从这个分布中采样出来就可以恢复输入(比如一张图片)
无监督句子编码
标准的rnn的解码过程是利用当前词和上一个解码结果来生成下一个词的。这种方法虽然有效但是没有学到一个完整句子的词向量表示,都是一个词一个词学的。为了能学到这个全句子的隐向量,首先要找到句子和词向量的映射关系。有三种方法,句子AE
,其中编码器和解码器都是rnn,但是这个模型在提取全局语义方面表现不好。剩下两种方法skip-thought
和paragraph vector
可以很好的对句子进行编码,但是不能用于generating settings
,因为前者是一种无监督学习模型,输出是下一个句子而不是本身;后者是没有rnn的,
标准的AE的包栝编码 φ e n c \varphi_{enc} φenc、解码 p ( x ∣ z ⃗ = φ e n c ) p(x|\vec{z}=\varphi_{enc}) p(x∣z=φenc),给定 z ⃗ \vec{z} z最大化得到 x x x的概率、得到 x x x的编码。
VAE
-
是对标准
AE
做了标准化处理,在ae的架构上引入了随机隐变量。 -
VAE 从 data 学到的是在 latent space 的 region,而不是单个点。换句话说是 encode 学到了一个概率分布 q ( z ⃗ ∣ x ) q(\vec{z}|x) q(z∣x), 其中 z ⃗ \vec{z} 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)) logp(x)≥Eq(z∣x)[logp(x∣z)]−KL(q(z∣x)∥p(z))
其中, q ( z ∣ x ) q(z|x) q(z∣x) 和 p ( z ∣ x ) p(z|x) p(z∣x)的都有参数的。可以看到输入 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} logp(x∣c)≥Eq(z∣x,c)[logp(x∣z,c)]−KL(q(z∣x,c)∥p(z∣c))
KL消失问题
ELBO
会带来kl消失问题,也称为posterior collapse problem
。就是说,从输入拿到的用于后验生成的信息异常,可能是噪声太多,也可能是信息太少,使得decoder没有使用从
q
ϕ
(
z
∣
x
)
q_{\phi}(z|x)
qϕ(z∣x)得到的隐变量
z
z
z.
信息太少了是指
q
ϕ
(
z
∣
x
)
≃
q
ϕ
(
z
)
=
N
(
a
,
b
)
q_{\phi}(z | x) \simeq q_{\phi}(z)=\mathcal{N}(a, b)
qϕ(z∣x)≃qϕ(z)=N(a,b),参数
μ
\mu
μ和
σ
\sigma
σ和输入
x
x
x都没什么关系了,
μ
\mu
μ和
σ
\sigma
σ坍塌(collaspe
)回一个常数,没有办法区分不同的输入。
噪声太强了是指 μ \mu μ和 σ \sigma σ都不稳定,这样产生的 z z z也是不稳定的,decoder没法用,只能从现有的结果中选一个输出。
那z的产生和x无关之后又怎么样呢?会有
q
(
z
∣
x
)
=
p
(
z
)
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)
Ep(z)[logp(x∣z)]≤log∑z[p(x∣z)p(z)]=logp(x)(当且仅当x和z无关时,等号成立。)
那么当x和z无关时,ELBO目标函数回退到原始的
l
o
g
(
p
)
log(p)
log(p),VAE模型也会退到最简单的模型了。
2.3 SelfLabeling CVAE
想要利用不同的z生成不同的x,首先需要每一个z通过解码都可以得到一个不同的x,其次,z需要满足先验分布 p ( 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.