绿色健康小清新

耐得住寂寞,守得住繁华

李宏毅机器学习-44-GAN-09-Improving Sequence Generation by GAN

Improving Sequence Generation by GAN

outline

这篇文章主要是说Improving Sequence Generation by GAN,讲GAN在sequence generator上的应用。

sequence generator的应用很多,比如机器翻译人机对话,甚至强化学习也算是sequence generator。

使用GAN进行sequence generator主要有两大部分,分别是Conditional Sequence GenerationUnsupervised Conditional Sequence Generation

Conditional Sequence Generation

Conditional Sequence Generation和传统的监督学习很像,往往输入是一个sequence或者scale,输出是一个sequence。

只要是产生Sequence的task都是属于Conditional Sequence Generation的范畴。

如下图所示:语音识别,机器翻译、智能聊天机器人

这节课就是要学习如何用GAN来改进这些seq2seq模型。

传统Sequence-to-sequence

传统的sequence generator是基于类似RNN,LSTM,Transformer等结构实现的,往往同时是一个encoder-decoder模型,它将输入作为时间序列编码,再用另一个decoder解码。

以Chatbot的举例:

输入是How are you,然后对应的输出是I’m good.(这就相当于是label嘛,毕竟是监督学习)

那么我们的模型目标就是要最大化输出句子和标签的likelihood。

但是这是一个seq模型,因此输出的句子不是一起出来的,第一个时间步我们希望输出【I’m】概率越大越好,第二个时间步我们希望输出【good】的概率越大越好。

这样就有问题,我们看一下下面的输出比较:

输出的句子Not badI’m John
从人的角度看这个好
从与标签的相似度看这个好

如果有两句话,分别是Not bad和I’m John,哪一个更好呢?

显然是Not bad更好,但是如果你用极大似然计算的话,I’m John离I’m good更近啊。

同时,即便你的语料库里这两种答案都有,那么传统的模型也会倾向于生成两者的平均,那就不知道是什么鬼玩意了。

这里补充一点,模型的目标是:Maximize likelihood,这个目标和Minimize crossentropy是一样的。

李老师说:Maximize likelihood和Minimize crossentropy就是一样的。如果你说差不多相同,有一点微妙的不同就错了!😄

传统的做法显然是不够好的,其实原因和最开始为什么要用GAN一样,是因为传统的模型都是在用各种既定的损失函数,而只有专们训练的Discriminator可以准确的评价generator的输出。下面来看如何改进这个问题


RL (human feedback)

额,其实用RL解决这个问题从某个角度看起来很有道理,但是从某些角度看起来又怪怪的,因为它没有状态转移概率,也没有所谓的上帝规则,总之感觉怪怪的。。。

好吧,因为它是监督学习,反正本来也要花钱搞数据集,所以看起来还差强人意吧。。。

然后,因为它没有状态转移,样本之间也不满足马尔可夫性,所以也没办法说是蒙特卡洛还是怎样。。。

不够我也差不多能理解老师讲RL的用意啦,因为“打分”这种事情RL和GAN其实还是蛮像的。

我们还是以Chat-bot 为例:

上图表达的意思就是人说一句话,Chat-bot有一个回应,然后得到一个分数,Chat-bot的目标就是要把分数最大化。

把这个事情模型化表达:

Chat-bot就是要调整内部Encoder和DEcoder的参数,使得Reward最大化,这个最大化的过程要用到的方法就是Policy Gradient。

上面模型中,人可以看做是已经训练好的模型,亦可看做是Conditional GAN中的条件。

Policy Gradient

这块内容在ML的课程里面有讲,这里快速过一遍:

先假设参数θ\theta不变,则这个seq2seq模型得到的Reward的期望是:

Rθ=hP(h)xR(h,x)Pθ(xh)\overline {R}_\theta = \sum_hP(h)\sum_xR(h,x)P_{\theta}(x|h)

  • h是输入,P(h)P(h)是h出现的几率,输入的可能性是一个分布,把所有输入出现的几率求和:hP(h)\sum_hP(h)

  • Pθ(xh)P_{\theta}(x|h)是给定参数θ\theta,给定输入h后,Chat-bot输出x的机率(因为同一个输入,输出可能是不同的,输出的可能性是一个分布,我们从这个分布里面sample出x)。

  • R(h,x)R ( h , x ) 是Chat-bot输出x的时候人给出的reward,这里可以看做是一个权重。

总的来说,就是我们有多个输入,每个输入有一定的几率;每个输入对应多个输出(就是一句话可能有多个回答),每个输出也有一定的几率;然后,通过对输入和输出进行打分。

接下来我们要调整参数θ\theta ,使得Reward的期望越大越好:

θ=argmaxθRθ\theta^* = arg \max_{\theta}\overline{R_{\theta} }

要解这个,先把上面的公式进行变形,由于h是从分布P(h)P(h) 来的可以写成EhP(h)E_{h\sim P(h)} ,x是从分布Pθ(xh)P_{\theta}(x|h)来的可以写成ExPθ(xh)E_{x\sim P_{\theta}(x|h)},所以有:

Rθ=hP(h)xR(h,x)Pθ(xh)=EhP(h)[ExPθ(xh)[R(h,x)]]=EhP(h),xPθ(xh)[R(h,x)]\begin{aligned} \overline {R}_\theta = & \sum_hP(h)\sum_xR(h,x)P_{\theta}(x|h) \\ = & E_{h\sim P(h)}\left[E_{x\sim P_{\theta}(x|h)}[R(h,x)]\right] \\ = & E_{h\sim P(h),x\sim P_{\theta}(x|h)}[R(h,x)] \end{aligned}

这里要求期望E,理论上是要对所有样本进行求和,是无法完成的,因为我们没有办法穷举所有的可能样本。

实作上这里的做法和我们做GAN的时候是一样的,做sample,输入h我们可以从数据库里面做sample,输出x我们可以把输入丢到模型算出来,这样我们就可以sample到N个样本:

(h1,x1),(h2,x2),...,(hN,xN)(h^1,x^1),(h^2,x^2),...,(h^N,x^N)

那么上述的公式可以写为:

Rθ=EhP(h),xPθ(xh)[R(h,x)]1Ni=1NR(hi,xi)\begin{aligned} \overline {R}_\theta = & E_{h\sim P(h),x\sim P_{\theta}(x|h)}[R(h,x)] ≈ \frac{1}{N}\sum^N_{i=1}R(h^i,x^i) \end{aligned}

发现算到最后,Rθ\overline{R}_{\theta}中并没有包含参数θ\theta 呀!这样就没办法用梯度下降法进行求解,因此这里我们要在的约等于之前先做微分才行,那个时候还θ\theta 在。

下面给出数学的推导:

对原始公式左右同时求θ\theta 的导数

Rθ=hP(h)xR(h,x)Pθ(xh)Rθ=hP(h)xR(h,x)Pθ(xh)\overline {R}_\theta = \sum_hP(h)\sum_xR(h,x)P_{\theta}(x|h) \\ ▽\overline {R}_\theta = \sum_hP(h)\sum_xR(h,x)P_{\theta}(x|h)

Pθ(xh)▽P_{\theta}(x|h)分子分母同时乘以Pθ(xh)P_{\theta}(x|h)

Rθ=hP(h)xR(h,x)Pθ(xh)Pθ(xh)Pθ(xh)▽\overline {R}_\theta = \sum_hP(h)\sum_xR(h,x)P_{\theta}(x|h)\frac{▽P_{\theta}(x|h)}{P_{\theta}(x|h)}

根据以下公式:

logf(x)=dlog(f(x))dx=1f(x)df(x)dx=f(x)f(x)▽logf(x) = \frac{dlog(f(x))}{dx} = \frac{1}{f(x)} \frac{df(x)}{dx} = \frac{▽f(x)}{f(x)}

将公式转换为:

Rθ=hP(h)xR(h,x)Pθ(xh)Pθ(xh)Pθ(xh)=hP(h)xR(h,x)Pθ(xh)logPθ(xh)=EhP(h),xPθ(xh)[R(h,x)logPθ(xh)]1Ni=1NR(hi,xi)logPθ(xihi)\begin{aligned} ▽\overline {R}_\theta = & \sum_hP(h)\sum_xR(h,x)P_{\theta}(x|h)\frac{▽P_{\theta}(x|h)}{P_{\theta}(x|h)} \\ = & \sum_hP(h)\sum_xR(h,x)P_{\theta}(x|h)▽logP_{\theta}(x|h) \\ = & E_{h\sim P(h),x\sim P_{\theta}(x|h)}[R(h,x)▽logP_{\theta}(x|h)] \\ ≈ & \frac{1}{N}\sum^N_{i=1}R(h^i,x^i)▽logP_{\theta}(x^i|h^i) \end{aligned}

推导结束,如果没看懂。。。没关系,结论如下:

Policy Gradient Ascent

参数θ\theta 更新的方法:

θnewθold+ηRθold\theta^{new} \leftarrow \theta^{old}+\eta▽\overline{R}_{ {\theta}^{old} }

计算梯度的公式为:

Rθ1Ni=1NR(hi,xi)logPθ(xihi)\begin{aligned} ▽\overline {R}_\theta ≈ & \frac{1}{N}\sum^N_{i=1}R(h^i,x^i)▽logP_{\theta}(x^i|h^i) \end{aligned}

解释一下公式4:去sample N个hi,xih^i,x^i出来,然后计算(hi,xi)(h^i,x^i),最后乘上logPθ(xihi)▽logP_{\theta}(x^i|h^i)

也就是说:

  • 如果输入hih^i ,Chatbot回答xix^i,人觉得这个回答不错,给出的Reward:R(hi,xi)R(h^i,x^i) 是正的(positive),那么就要更新参数θ\theta,使得Pθ(xihi)P_{\theta}(x^i|h^i)增加,也就是增加输入hih^i ,Chatbot回答的xix^i 几率;

  • 反之,如果输入hih^i,Chatbot回答xix^i ,人觉得这个回答很烂错,给出的Reward:R(hi,xi)R(h^i,x^i) 是负的(negative),那么就要更新参数θ\theta ,使得Pθ(xihi)P_{\theta}(x^i|h^i)减少,也就是减少输入hih^i,Chatbot回答xix^i 的几率。


Policy Gradient Implemenation

上图显示了Policy Gradient实作过程:

第一步是左边的红框,先输入N个句子给Chatbot,得到N个回答(相当于采样),然后人对这N个问答进行评分

第二步是更新参数θ\theta ,其中蓝色部分是计算Rˉθt\triangledown\bar R_{\theta^t}的公式

这里要注意,在更新完参数θ\theta 后,需要重新回到第一步,重新做采样,重新做采样,重新做采样。

因为是根Rˉθt\triangledown\bar R_{\theta^t}据参数计θ\theta 算出来的,如果θ\theta 变化了,需要重新采样,这在RL中看起来是显然的,因为分布改变了嘛。这里是和普通的GD不一样的地方,普通GD不需要重新采样。因此Policy Gradient中更新参数这个步骤是非常难得的,每次的更新都是N次互动后的结果,这nm的,让人类去一次次重新构造数据集真的是。。。

挖坑:后面会有trick来改进这个步骤。


原始模型 vs RL模型

表格不好写公式,上图中的notation和之前有点不一样,这里的输入是用c表示,而前面用的h,这里说明一下。

原始模型中用的训练数据是用的标签数据(c,x^)(c,\hat{x})

比较二者的Gradient可以发现,二者非常相似,只不过RL模型每个Gradient多了一个R(ci,xi)R(c^i,x^i),可以看为是权重。

所以从全局来看,相当于原始模型中默认的权重都是1,而RL模型权重各不相同(权重是根据Chatbot回答好不好决定的) 。
Tip:

在实作的时候,logPθ(xihi)logP_{\theta}(x^i|h^i)是概率,总是正数,评分R(ci,xi)R(c^i,x^i) 也是正数,这样训练是有问题,我们希望不好的回答是负反馈,是负数,因此可以对评分进行一个平移,使得分数有正有负。


GAN (discriminator feedback)

上面讲的RL太麻烦,理论上虽然可行,但是不可能每次更新参数都去互动N次,于是有人就想了一个办法,用机器来替代人做评分这个环节。

但是这个evaluation function:R(h,x)不好定义,像上面的图片中,左边死循环就差,右边就好?标准是什么?难,所以引入GAN的思想来解决这个问题:用discriminator代替人来给出评分feedback。

模型框架如下:

上图中的Discriminator可以看做是人在给Reward,只不过这个Discriminator是不完美的人,它也需要调整参数,进行训练。

Algorithm(算法)

对于generator G

更新G使得生成器生成数据骗过Discriminator打分越高越好。

Update generator G (chatbot) such that

上图中Discriminator少了一个输入,应该还有一个真实的问答对数据。

整个过程和conditional GAN一样的。

但是这里的问题在于Generator是一个RNN的序列模型。

这里注意红圈内是通过sample出来的结果(蓝色虚线箭头)。然后把Generator得到结果丢到Discriminator里面得到一个scalar(分数),然后根据这个分数来更新Generator的参数,使得下一次的分数更高。

这个过程是没有办法实现的,因为没有办法做梯度下降:

Due to the sampling process, “discriminator+ generator” is not differentiable.

梯度下降里面要求导数,中间那个红框部分是采样,也就是说每一个节点的输出往往都是从隐变量生成的分布的一个采样,然而采样是有随机性的,是不可导的。从求导的本质来看,导数就是:求x变化后,y的变化程度。如果x变化了,y是随机采样出来的,那么就不能保证y的变化程度了。

这里和图像处理的GAN不一样的地方,文字处理生成句子的过程用了采样,无法求导,也就是无法梯度下降,无法反向传播,无法更新参数。如果这一步放到神经网络的最后一步还好,但是放到了中间,这样就没办法计算前面的梯度。而前几层正是我们要训练的几层。

同样的使用TF或者PYTORCH来实现这个模型,会得到一个错误。

这个问题也是有解决方案的,一共三种:

  • Gumbel-softmax
  • Continuous Input for Discriminator
  • “Reinforcement Learning”
方法一:Gumbel-softmax

不展开,思想就是使用一个trick使得不可求导的变成可以求导的。

👉 [1611.04051] GANS for Sequences of Discrete Elements with the Gumbel-softmax Distribution (arxiv.org)

👉 The Gumbel-Softmax Trick for Inference of Discrete Variables | Columbia Advanced Machine Learning Seminar (casmls.github.io)

👉 Reparametrization Trick · Machine Learning (gitbooks.io)


方法二:Continuous Input for Discriminator
  • [Sai Rajeswar, et al., arXiv, 2017]
  • [Ofir Press, et al., ICML workshop, 2017]
  • [Zhen Xu, et al., EMNLP, 2017]
  • [Alex Lamb, et al., NIPS, 2016]
  • [Yizhe Zhang, et al., ICML, 2017]

这个方法就是绕过不可求导的采样步骤,直接将采样前的分布作为Discriminator的输入,注意看下图中红色箭头。

但是将连续的分布表示作为Discriminator的输入是有问题的,因为对于真实数据中的句子,每个词都是用独热编码进行表示的;

而由Generator生成的,生成的中间部分的概率分布是连续表示的,不会也不可能是独热编码。

这样的明显的区别Discriminator不用很高智商就能分辨出来了(看是否独热编码),而在训练的过程中,Generator为了骗过Discriminator就会尽可能的生成类似ont-hot状态的分布,但其实这样的分布产生的token其实很可能是毫无语义可言的。

当然可以用WGAN来试试,原因是WGAN中有有一个1-Lipschitz的限制,这样的限制导致discriminator在进行真伪判定的能力不会那么强,就好比WGAN的Discriminator好比带上了毛玻璃眼镜,对于是否独热编码这里是分辨得不是很清楚,这样generator就不见得非得将分布生成0,1。因此,有可能训练出Generator。


方法三:Reinforcement Learning
  • Yu, et al., AAAI, 2017

  • Li, et al., EMNLP, 2017

  • Tong Che, et al, arXiv, 2017

  • Jiaxian Guo, et al., AAAI, 2018

  • Kevin Lin, et al, NIPS, 2017

  • William Fedus, et al., ICLR, 2018]

Reinforcement Learning同样是一个不错的方法,个人感觉这里的RL的应用比开头的那个地道多了。

这里把开头的那个Human换成了Discriminator,并且Discriminator需要训练之外,其余的完全一样。

那么你可能就会好奇了,Discriminator是怎么训练的呢?

实际上,它就是根据Generator生成的数据作为负样本,真实的数据作为正样本生成的。

诶?那和GAN不是一模一样?

不是的,用RL可以训练Generator,尽管数据是sample出来的,因为Generator是直接训练的,而不是接在Discriminator调整参数出来的,虽然我们还需要Discriminator的结果。

θt+1θt+ηRθtRθ1Ni=1ND(ci,xi)logPθt(xici)\begin{aligned} & \theta^{t+1} \leftarrow \theta^{t}+\eta▽\overline{R}_{ {\theta}^{t} } \\ & ▽\overline {R}_\theta ≈ \frac{1}{N}\sum^N_{i=1}D(c^i,x^i)▽logP_{\theta^t}(x^i|c^i) \end{aligned}

但是这样还是会有一些问题,我们下面会说


Reward for Every Generation Step

下面来具体看看RL中的Reward计算的trick,用Discriminator替换人评分后,评分计算梯度的公式就变成了:

θt+1θt+ηRθtRθ1Ni=1ND(ci,xi)logPθt(xici)\begin{aligned} & \theta^{t+1} \leftarrow \theta^{t}+\eta▽\overline{R}_{ {\theta}^{t} } \\ & ▽\overline {R}_\theta ≈ \frac{1}{N}\sum^N_{i=1}D(c^i,x^i)▽logP_{\theta^t}(x^i|c^i) \end{aligned}

假设输入:ci=What is your name?c^i = “What \ is \ your \ name?”
回答为:xi=I dont knowx^i = “I \ don’t \ know”

那么Discriminator会判断这个回答不好(negative),那么模型就会更新参数θ\theta 使得回答出现概率Pθ(xici)P_{\theta}(x^i|c^i)降低。

根据语言模型,这句话出现的概率为:

Pθ(xici)=P(x1ici)P(x2ici,x1i)P(x3ici,x1:2i)P_{\theta}(x^i|c^i) = P(x_1^i|c^i)*P(x^i_2|c^i,x_1^i)*P(x^i_3|c^i,x_{1:2}^i)

取对数后乘法变加法:

logPθ(xici)=logP(x1ici)+logP(x2ici,x1i)+logP(x3ici,x1:2i)logP_{\theta}(x^i|c^i) = logP(x_1^i|c^i)+logP(x^i_2|c^i,x_1^i)+logP(x^i_3|c^i,x_{1:2}^i)

要降低Pθ(xici)P_{\theta}(x^i|c^i) ,就是降低logPθ(xici)logP_{\theta}(x^i|c^i),就是降低右边三项,使得右边三项分别都降低。
如果我们看第一项:

P(Ic)P(“I”∣c)

第一个单词出现【I】这个没错呀,因为回答可能是【I am Hanmeimei】。也就是说训练的时候因为把"I do not know"作为负样本,把【I】作为第一个节点的输出的概率降低了。

当然理论上这个问题是不应该存在的,因为在训练正样本的时候又回把【I】作为第一个输出的概率提升回去,但是现实训练中好像不怎么管用。我们看另外一个例子:

假设假设输入ci=What is your name?c^i = “What \ is \ your \ name?”
回答为:xi=I am Johnx^i = ““I \ am \ John”

那么Discriminator会判断这个回答不错(positive),那么模型就会更新参数θ\theta 使得回答出现概率Pθ(xici)P_{\theta}(x^i|c^i) 增加。

根据公式,要增加,就是增Pθ(xici)P_{\theta}(x^i|c^i)logPθ(xici)logP_{\theta}(x^i|c^i),就是增加右边三项,使得右边三项分别都增加。

通过以上两个小例子,我们看到,如果positive和negative样本对个数相当的话,那么【I】出现的概率可能不变,但是如果negative样本比较多,那么【I】出现的概率会变小,不科学!

解决这个问题的方法就很RL了,他们考虑了“Reward for Every Generation Step”,用蒙特卡洛采样出每一小部分的概率。

正确的做法是:

假设输入ci=What is your name?c^i = “What \ is \ your \ name?”
回答为:xi=I dont knowx^i = “I \ don’t \ know”

那么Discriminator会判断这个回答不好(negative),那么模型就会更新参数θ\theta 使得回答出现概率Pθ(xihi)P_{\theta}(x^i|h^i) 降低。根据语言模型,这句话出现的概率为:

Pθ(xihi)=P(x1ici)P(X2ici,x1i)P(X3ici,x1:2i)P_{\theta}(x^i|h^i) = P(x_1^i|c^i)*P(X_2^i|c^i,x^i_1)*P(X_3^i|c^i,x^i_{1:2})

两边取对数后:

logPθ(xihi)=logP(x1ici)+logP(X2ici,x1i)+logP(X3ici,x1:2i)logP_{\theta}(x^i|h^i) = logP(x_1^i|c^i)+logP(X_2^i|c^i,x^i_1)+logP(X_3^i|c^i,x^i_{1:2})

对于这句话来说,就是:

logPθ(xihi)=logP("I"ci)+logP("dontt"ci,"I")+logP("know"ci,"I dontt")logP_{\theta}(x^i|h^i) = logP("I"|c^i)+logP("dont't"|c^i,"I")+logP("know"|c^i,"I \ dont't")

模型找出这个回答不好的是后面两项:logP("dontt"ci,"I")logP("know"ci,"I dontt")logP("dont't"|c^i,"I"),logP("know"|c^i,"I \ dont't")要减少,即这两项的概率要减少,第一项概率是要增加的。

要做到这个事情要把

Rθ1Ni=1ND(ci,xi)logPθ(xici)▽\overline {R}_\theta ≈ \frac{1}{N}\sum^N_{i=1}D(c^i,x^i)▽logP_{\theta}(x^i|c^i)

改写为:

Rθ1Ni=1t=1(Q((ci,x1:ti)b)logPθ(xtici,x1:t1i))▽\overline{R}_{\theta} ≈ \frac{1}{N}\sum_{i=1}\sum_{t=1}\left(Q((c^i,x^i_{1:t})-b)▽logP_{\theta}(x_t^i|c^i,x^i_{1:t-1})\right)

不是对整个句子给分数了,而是给每个生成的step都要有分数,这里换了新的评价函数,所以取名叫Q。

这个评价函数还没有正规很好的解决方法,目前有两种方法解决:

  • Monte Carlo(MC) Search [ Yu, et al, AAAl,2017] 运算量大,类似alphaGo

  • Discriminator For Partially Decoded Sequences [ Li, et al., EMNLP2017] 运算量小,效果不如法1

当然还有另外一种解决方案:RankGAN,老师又挖坑,不展开。

RankGAN

👉 Kevin Lin, Dianqi Li, Xiaodong He, Zhengyou Zhang, Ming-Ting Sun, “Adversarial Ranking for Language Generation”, NIPS 2017


Experimental Results

InputWe’ve got to look for another route.
MLEI’m sorry.
GANN You’re not going to be here for a while.
InputYou can save him by talking.
MLEI don’t know.
GANYou know what’s going on in there, you know what I mean?

通过实作后观察MLE模型的输出会发现,MLE(Maximum Likelihood Estimate)模型通常(十分之一)都是倾向短句,且回答比较一般化,例如:我不知道。

GAN会产生比较长和更加复杂的句子

Find more comparison in the survey papers.

  • [Lu, et al., arXiv, 2018]
  • [Zhu, et al., arXiv, 2018]

More Applications

  • Supervised machine translation [Wu, et al., arXiv 2017] [Yang, et al., arXiv 2017]
  • Supervised abstractive summarization [Liu, et al., AAAI 2018]
  • Image/video caption generation [Rakshith Shetty, et al., ICCV 2017] [Liang, et al., arXiv 2017]

最后建议:If you are using seq2seq models, consider to improve them by GAN.


Unsupervised Conditional Sequence Generation

实际上它往往可以在训练集特别小的情况下训练出超过Supervised Conditional Sequence Generation的效果,但是如果数据集足够大,最后的结果往往不理想。

其实方法和讲Unsupervised Conditional Generation时用到的方法类似,然后在Sequence Generation中遇到的坑前面也都解决了。

可以回顾一下之前说的Unsupervised Conditional Generation:👉 机器学习-37-Unsupervised Condition GAN(无监督的有条件GAN:Direct Transformation,Projection to Common Space)

Text Style Transfer

上面是分别用在图片,语音,和文字上风格的转换。

  • 将一种图片转换为另一种图片风格
  • 类似变声器,将男性和女性的声音风格进行转换
  • 将正面的文字(“It is good”)和负面文字(“It is bad”)进行转换

当然一样会遇到上面离散分布导致不可微分的情况,处理的办法也就如同上述介绍,这里不多赘述。

Direct Transformation

这个是借鉴Cycle GAN的做法,我们先稍微回顾一下:用两个Generator,第二个(橙色的)Generator要把第一个Generator生成对象重新还原回原输入的照片。两个Generator接在一起,被称为:Cycle GAN:

把图像换为文字就可以应用的文本处理上,具体模型如下图所示:

其中可以把Positive的语料可以看做一个domain,Negative的语料可以看做另外一个domain。

但是上面的模型Generator在生成语句的过程中也是用到了采样,因此也是不能求导和反向传播的,解决方案在上一小节已经说了有三种。这里用的是第二种,用Word Embedding来表示词,Word Embedding是Continuious的表示,这样就解决了求导和反向传播的问题,模型就变成:

下面是做的结果:

前面几句的结果都还不错,特别是倒数第三句。但是后面两句的结果却并不是太好。

Projection to Common Space

这个方法前面也讲过,就是把两个domain的特征都抽取到同一个公共向量上。

把图片换成不同domain的文本,当然也可以用上面的模型,对于模型Decoder/Generator在生成语句的过程中也是用到了采样,不能反向传播,这里可以将Decoder的隐藏层作为Discriminator 的输入(下图红色箭头部分)。

当然对于把两个domain的文本投影到公共向量这个事情上,在图像上已经有很多很好的constraint trick来提升效果,在文本上这块研究做得还比较少,可以深入一下,目前对于这里的constraint只有一种,就是在公共变量上接一个Discriminator分类器,要分辨这个公共变量是由哪个Domain的Encoder得来的。而两个Domain的Encoder则是要骗过Discriminator。整个结构如下:


Unsupervised Abstractive Summarization

Unsupervised Abstractive Summarization

以前机器做摘要都是Extract方式的,就是判断文章中那些句子比较重要(可以用二分类来判断是否重要),然后拿出来拼在一起就完事。这样的摘要都是原文。

现在要用seq2seq模型来做这个事情:write summaries in its own words。思想如下图,就是给很多语料,并且带有这些语料对应的摘要,丢到seq2seq模型训练,这样的问题就是在于需要大量的标记数据,这个很难。。。根据老师的经验,要训练这样的seq2seq模型,至少要100w的数据才行。

为了解决数据收集困难的问题,提出一种新的无监督的方法(其实就是借鉴Unsupervised Conditional Generation)。把文章看做一个Domain,把摘要看做是另外一种Domain,这样一来,数据就只要两堆,一堆是文章,一堆是摘要,二者不需要对应。

模型构架如下图:

跟Cycle GAN一样,这里D是用来分辨G生成的摘要是否和人类相近,R则用来保证生成的摘要和原文相关。

例子

在这两个例子中,第一个例子总结的还算可以,但13个国家等关键字没有体现出来。第二个例子中,机器自动的将中华民国奥林匹克委员会总结成了奥委会,可能它以前训练的时候看过类似的奥林匹克委员会,知道直接简写成奥委会。

上面这两个例子就不算好了,看到印度尼西亚苏门答腊岛的印度尼西亚苏门直接简写成了印尼门,什么鬼?下面那个例子更离谱,总结出来的根本读都读不通!

Semi-supervised Learning

补充:

  1. 具体实作的时候Unsupervised Learning的方法用的数据只需要supervised 的1/5左右就可以达到相同或者相近的效果
  2. 训练完Unsupervised 模型后,可以用一些带有标签的数据对模型进行fine-tune,效果可以进一步提升。

看下面这个例子:

图中,一条横线是使用了3.8M pairs的数据进行的Supervised Learning。看WGAN和Reinforce的结果,如果仅仅是进行Unsupervised Learning,发现结果并不是太好,但是我们在Unsupervised Learning的基础上,用一些带标签的数据进行训练,就能达到很好的效果,如图上所示,仅仅使用了500k pairs的数据就达到了和Supervised Learning几乎同样的效果。


Unsupervised Translation

同样的,在翻译上,可以把两种语言看做是两个不同的Domain,然后进行训练,就可以得到一个翻译模型。

  • [Alexis Conneau, et al., ICLR, 2018]
  • [Guillaume Lample, et al., ICLR, 2018]

以上两篇都是非死不可发的论文。

下图是论文结果截图,横轴是数据量,纵轴是翻译效果。从图中可以看到,数据量越大,效果当然是越好,但是

Unsupervised learning with 10M sentences = Supervised learning with 100K sentence pairs


Unsupervised Speech Recognition

如果把语音和文字各自看成两个Domain,然后用Cycle GAN训练,这个是有可能实现的,注意看下面的图:

  • [Liu, et al., arXiv, 2018]

  • [Chen, et al., arXiv, 2018]

语音中的发音都是p1p_1,然后再看文章都是单词【The】开头,所以模型可以推理:

当然效果没有比监督学习好,但是比没有强。。。

这里的语音和文字的语料都是不相干的:

  • Audio: TIMIT(The DARPA TIMIT Acoustic-Phonetic Continuous Speech Corpus)

    是由德州仪器麻省理工学院SRI International合作构建的声学-音素连续语音语料库。

    TIMIT数据集的语音采样频率为16kHz,一共包含6300个句子,由来自美国八个主要方言地区的630个人每人说出给定的10个句子,所有的句子都在音素级别(phone level)上进行了手动分割,标记。70%的说话人是男性;大多数说话者是成年白人。

  • Text: WMT(Workshop on Machine Translation)

    WMT 是机器翻译领域最重要的公开数据集。数据规模较大,取决于不同的语言,通常在百万句到千万句不等。

👉 知名数据集介绍

-------------本文结束感谢您的阅读-------------
六经蕴籍胸中久,一剑十年磨在手

欢迎关注我的其它发布渠道