作者丨苏剑林
单位丨追一科技
研究方向丨NLP,神经网络
个人主页丨kexue.fm
从文章从语言模型到Seq2Seq:Transformer如戏,全靠Mask中我们可以知道,只要配合适当的 Attention Mask,Bert(或者其他 Transformer 模型)就可以用来做无条件生成(Language Model)和序列翻译(Seq2Seq)任务。
可如果是有条件生成呢?比如控制文本的类别,按类别随机生成文本,也就是 Conditional Language Model;又比如传入一副图像,来生成一段相关的文本描述,也就是 Image Caption。
八月份的论文 Encoder-Agnostic Adaptation for Conditional Language Generation [1] 比较系统地分析了利用预训练模型做条件生成的几种方案;九月份有一篇论文 CTRL: A Conditional Transformer Language Model for Controllable Generation [2] 提供了一个基于条件生成来预训练的模型,不过这本质还是跟 GPT 一样的语言模型,只能以文字输入为条件;而最近的论文 Plug and Play Language Models: a Simple Approach to Controlled Text Generation [3] 将 p(x|y) 转化为 p(x)p(y|x) 来探究基于预训练模型的条件生成。
不过这些经典工作都不是本文要介绍的。本文关注的是以一个固定长度的向量作为条件的文本生成的场景,而方法是 Conditional Layer Normalization——把条件融合到 Layer Normalization 的 β 和 γ 中去。
Conditional Layer Normalization 的想法来源于图像中流行的条件 GAN 的思路——条件 BN(Conditional Batch Normalization),相关内容可以参考从DCGAN到SELF-MOD:GAN的模型架构发展一览。条件 BN 还有一个变种,称之为 AdaIN(Adaptive Instance Normalization)。条件 BN、AdaIN 都是将已有的 Normalization 方法中的 β 和 γ 变成输入条件的函数,从而可以通过条件来控制生成的行为。
在 Bert 等 Transformer 模型中,主要的 Normalization 方法是 Layer Normalization,所以很自然就能想到将对应的 β 和 γ 变成输入条件的函数,来控制 Transformer 模型的生成行为,这就是 Conditional Layer Normalization 的线索思路。
▲ 条件Normalization示意图
对于已经预训练好的模型来说,已经有现成的、无条件的 β 和 γ 了,它们都是长度固定的向量。我们可以通过两个不同的变换矩阵,将输入条件变换到跟 β,γ 一样的维度,然后将两个变换结果分别加到 β 和 γ 上去。为了防止扰乱原来的预训练权重,两个变换矩阵可以全零初始化(单层神经网络可以用全零初始化,连续的多层神经网络才不应当用全零初始化),这样在初始状态,模型依然保持跟原来的预训练模型一致。
直觉上,这种以文本生成为目的的 finetune 应该要用 GPT 等自回归预训练模型才能提升效果,但事实上,之前的文章从语言模型到Seq2Seq:Transformer如戏,全靠Mask已经表明,哪怕你加载 Bert 的预训练权重来做生成任务,表现依然良好。所以不管哪种 Transformer-based 的预训练模型,都可以考虑用来 finetune 做文本生成模型来。而本文还是以预训练 Bert 为基础模型进行实验。
至于代码,本文所描述的 Conditional Layer Normalization 技巧,也已经被集成到笔者所开发的 bert4keras [4] 中了,现在基础函数 build_bert_model 新增了如下参数:
1. layer_norm_cond:如果该参数非 None,则意味着它是一个张量,shape=[batch_size, cond_size],用来作为 Layer Normalization 的条件;
2. layer_norm_cond_size:如果该参数非 None 且 layer_norm_cond 为 None,则意味着它是一个整数,自行构建一个 shape=[batch_size, layer_norm_cond_size] 的输入层作为 Layer Normalization 的条件;
3. layer_norm_cond_hidden_size:如果该参数为 None,则意味着它是一个整数,用于先将输入条件投影到更低维空间,这是因为输入的条件可能维度很高,直接投影到 hidden_size(比如 768)的话,参数可能过多,所以可以先投影到更低维空间,然后升维;
4. layer_norm_cond_hidden_act:投影到更低维空间时的激活函数,如果为 None,则不加激活函数(线性激活);
5. additional_input_layers:额外的输入层,如果外部传入了张量作为条件,则需要把条件张量所依赖的所有输入层都添加进来,作为输入层,才能构建最终的模型。
介绍再多,其实还不如看例子来得实际。笔者做了两个实验来验证 Conditional Layer Normalization 的效果。一个是通过情感极性来控制文本生成,也就是情感分类的反问题,这直接通过类的 Embedding 来作为 Layer Normalization 的条件;另一个是图像描述生成(Image Caption),通过预训练的 imagenet 模型将图片编码为一个固定长度的向量作为 Layer Normalization 的条件。
这两个代码分别放在 task_conditional_language_model.py [5] 和 task_image_caption.py [6] 中。
情感文本生成
情感文本生成就是用的训练集是笔者之前收集整理的情感分类语料 [7],将输入文本和标签反过来用即可。最后生成的时候按概率随机采样,从而能生成不同的文本。
部分输出:
正面采样:[u'外观时尚、漂亮、性价比高。', u'外观漂亮,配置均衡,比较满意,性价比高,外观漂亮,性能较高。', u'我是在大学的时候看到这本书的,所以一直在买。书中的作者是林静蕾,她用自己的口吻写出了一个孩子成长中的心路历程,让我看到了她们成长中的不同之处,以及她们成长过程中的不同境界。让我很欣赏!', u'我想这是一本能够告诉读者什么是坏的,而不是教你怎样说话,告诉我什么是错。这里我推荐了《我要讲故事》,这本书是我很喜欢的一本书,我认为它的理由很多,但是,我相信我。如果你从中得到一些改进,或者你已经有了一个明智的决定。', u'我们一家五口住的是标间,大床房,大床的床很舒服;而我们在携程网上订了两套大床房,这个酒店的价格还是比较合理的;但是房间的隔音效果不太理想,有点响的声音;酒店门口的地铁在施工中,不方便;但是酒店的门口的出租车不知道是哪个车的,打车不是很方便;酒店外面的停']
负面采样:[u'不知道是不是因为电池不太好,不是我不喜欢。', u'看了评论才买的. 结果发现不是那么便宜, 价格也不便宜.', u'1、外壳不容易沾手印,不容易洗洗2、屏幕有点旧,不能下载铃声', u'我是7月6日订购了《杜拉拉升职记》并已通过银行付款,为什么订单下了两周多至今还未到货?是收货时间太快了,可能就这么过去了吧?', u'这本书我是在网上先看了一遍,后来我再看了一遍。感觉作者的文笔实在太烂了,特别是在写他的博客时特别别扭,写得很不专业,特别是他写股票时那个情绪调节的小男孩,简直就是自作聪明的样子,简直就是自作聪明的一种表现!']
Image Caption
Image Caption 以 COCO 数据集 [8] 为例,这个数据集的图片场景比较丰富一些。另外 2017 年的 challenger.ai 也举办过一个图像中文描述生成竞赛 [9],里边也包含了一个不错的数据集(读者自己自行想办法收集),不过图片的场景相对来说单调一些。部分输出:
▲ 模型预测: a baseball game in progress with the batter up to plate.
▲ 模型预测: a train that is sitting on the tracks.
image_id: COCO_val2014_000000524611.jpg
url: http://images.cocodataset.org/val2014/COCO_val2014_000000524611.jpg
predict: a train that is sitting on the tracks.
references: [u'A train carrying chemical tanks traveling past a water tower.', u'Dual train tracks with a train on one of them and a water tower in the background.', u'a train some trees and a water tower ', u'Train on tracks with water tower for Davis Junction in the rear.', u'A train on a train track going through a bunch of trees.']
image_id: COCO_val2014_000000202923.jpg
url: http://images.cocodataset.org/val2014/COCO_val2014_000000202923.jpg
predict: a baseball game in progress with the batter up to plate.
references: [u'Batter, catcher, and umpire anticipating the next pitch.', u'A baseball player holding a baseball bat in the game.', u'A baseball player stands ready at the plate.', u'Baseball players on the field ready for the pitch.', u'A view from behind a mesh fence of a baseball game.']
本文提出了利用 Conditional Layer Normalization 来将外部条件融入到预训练模型中的思路,其直接应用就是条件文本生成,但其实也不单单可以用于生成模型,也可以用于分类模型等场景(外部条件可能是其他模态的信息,来辅助分类)。最后基于 bert4keras 给出了代码实现以及两个例子。
[1] https://arxiv.org/abs/1908.06938
[2] https://arxiv.org/abs/1909.05858
[3] https://arxiv.org/abs/1912.02164
[4] https://github.com/bojone/bert4keras
[5] https://github.com/bojone/bert4keras/blob/master/examples/task_conditional_language_model.py
[6] https://github.com/bojone/bert4keras/blob/master/examples/task_image_caption.py
[7] https://github.com/bojone/bert4keras/blob/master/examples/datasets/sentiment.zip
[8] http://cocodataset.org/#download
点击以下标题查看作者其他文章:
#投 稿 通 道#
让你的论文被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得或技术干货。我们的目的只有一个,让知识真正流动起来。
📝 来稿标准:
• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)
• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接
• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志
📬 投稿邮箱:
• 投稿邮箱:hr@paperweekly.site
• 所有文章配图,请单独在附件中发送
• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。
▽ 点击 | 阅读原文 | 查看作者博客