对联广告代码 自动适应 BERT大火却不懂Transformer?读这一篇就够了

对联来自对联和并列句。它注重整齐的对抗,充分展示了中国人独特而细腻的艺术美。

古人常用“背诗交友”,但今天,为了让对联“出人意料”,Digest Bacteria 决定使用最近在 NLP 领域流行的 Transformer 模型来训练一个智能 AI。关节,是第二关节,“过肠”的任务就交给它了。

型号介绍

至于对联春联的任务,可以很明显的看出是一个sequence-to-sequence的任务。所以我们不得不牺牲自然语言处理中出现的大杀手,Seq2Seq + Attention!

因此,Digest 细菌采用了 Transformer 序列到序列模型。 Transformer 由论文《Attention is All You Need》提出,并逐渐取代 RNN 成为 NLP 中的主流模型。现在是 Google Cloud TPU 推荐的参考模型,包括 Google 为自己的 TPU 宣传的 Transformer 模型。

Transformer 架构完全摒弃了深度学习中经典的 RNN 和 CNN 结构,只使用了注意力机制来构建它。最早在机器翻译任务上的测试超过了RNN,达到了当时SOTA的效果。 Transformer 不仅克服了像 CNN 一样最受诟病的 RNN 训练慢的问题,而且利用自注意力机制实现了快速并行。层数也可以向更深层次增加,充分发挥DNN模型的特点,提高模型的准确率。同时,在 NLP 任务上,性能普遍优于 CNN 和 RNN。不是国王,而是谁是国王。

大数据文摘和百度NLP之前联合出过一篇文章:BERT火了却不懂Transformer?读完这一篇就够了。对Transformer不熟悉的同学可以点击超链接阅读文章,确保理解透彻。

这里我们使用了一个6层的Transformer单元,其中Self-Attention head的数量为8个,隐藏单元的数量为512个。模型使用tensorflow框架,GPU使用Tesla K80标准进行深度学习.

好,我们先介绍一下数据集。

数据集

Digest Bacteria 使用的数据集来自博主冯崇璞_李微斋三叶的新浪博客,总共包含超过 700,000 对联。

但是,由于未知原因,无法再访问此博主的博客…

然而,这个珍贵的数据集却在 GitHub 上广为流传。

github地址(脚本已经没有了,可以用我们上传的对联,google drive需要科学翻车):

谷歌驱动器:

整个数据集解压后一共56.9兆,其中训练数据56.4兆,测试数据400多KB。此外,数据以 TXT 格式存储。全文无标点符号15153840字。如果你每天阅读100篇文章,你将无法阅读超过20年。消化菌使用Tesla K80,2小时可产生一个Epoch。

数据预处理

首先进行数据预处理,因为得到的数据比较干净,所以这个任务主要是创建一个词汇表。值得一提的是,数据集的压缩文件中有一个创建的词汇表。您还可以使用数据集给出的词汇表。因为对联任务不难,我们直接用词粒度作为输入,也就是像“我们”这样的词,我们输入为两个单位而不是一个单位。

关键代码如下:

defmake_vocab(fpaths, out):
 '''Constructs vocabulary.
 Args:
 fpaths: Astring. Input file path.
 fname: Astring. Output file name.
 ''' 
 char2cnt = Counter()
 for path in fpaths:
 for line inopen(path, 'r'):
 line = line.strip()
 ifnot line: *# detect the empty line*
 continue
 chars = line.split()
 char2cnt.update(chars)
 withopen(out, 'w') as fout:
 fout.write("{}\t1000000000\n{}\t1000000000\n{}\t1000000000\n{}\t1000000000\n".format("", "", "", "")) # special tokens
 for word, cnt in char2cnt.most_common(len(char2cnt)):
 fout.write(u"{}\t{}\n".format(word, cnt))
 print("%d chars written!"% (len(char2cnt)))

词汇表建立后,全部为单个汉字加上一些特殊字符,共9126个字符。事实上,如果我们看频率为 1 的字符,我们会发现我们似乎并不认识。一般来说,在序列到序列的任务中,我们会忽略词汇表中不经常出现的单词。但是因为我们这里的词汇表不大,所以都用到了。

之后,我们统计训练数据的词长,以确定训练期间句子的最大长度。经过统计发现,对联数据中单句的长度大部分在5-10个词之间,最长的在30个左右,所以训练的最大长度也是30个。这个长度不长,所以之后整个Transformer的尺寸不会很大。

模型编写和训练

这里我们先建立模型,然后用数据把模型中的参数训练成我们想要的,然后存储。这是一个 epoch 存储模型的地方。测试时,可以直接读取参数得到训练好的模型来使用。

此外,我们还可以将保存的模型分享给其他人,让其他人也可以直接使用我们的训练结果。

模型和训练代码太多,这里就不放了。有兴趣的读者可以去github下载完整代码,也可以在大数据微信公众号后台回复“对联”下载完整代码和数据集。

github地址:

整个模型训练过程主要分为四个步骤:

第一步下载对联数据,然后解压成数据文件

第二步,调整超参数

第三步,运行prepro.py对数据进行预处理生成词汇表,也可以使用提供的词汇表

第四步对联广告代码 自动适应,运行train.py训练模型

评估

训练完成后,保存模型,评估脚本会自动读取最新的模型进行评估。

评估的主要步骤包括:

主要代码应该是解码这个块:

### Autoregressive inference
 preds = np.zeros((hp.batch_size, hp.maxlen), np.int32)
 for j in range(hp.maxlen):
 _preds = sess.run(g.preds, {g.x: x, g.y: preds})
 preds[:, j] = _preds[:, j]

一开始喂x,有一个空的preds,然后得到一个预测词,把这个词放在preds对应的位置,然后循环,不断填充preds。最终得到完整的预测结果。

这里每次预测的词都是预测概率最大的词,称为贪心解码(greedy search decoder),因为每次都选择最大的一个。虽然这样很快,但也会导致陷入局部最优解的情况。为了获得更好的解码方法,可以使用 Beam search。

培训结果

最后我们来看看Digest Bacteria的训练结果。

皮肤优先!

说起改革开放40周年,当然首先要回应我们的改革开放。来端巴List B站几个月,诗王的作品。

接听电话,我去第一个链接:

上联:改革的春风吹遍大地,中国人民真的在苦苦挣扎

人工智能对:

下一个环节:和谐雨过千山,小康社会,美好生活

很湿很湿,充分说明了改革开放给我们带来的美好生活。看起来还不错,我们系统的意识很高。

我们再测试一下,来个博大精深的六学知识吧:

对联:两花式

下一个链接:武林的一代

emmm,更微妙的,好吧。

看到武林一代,消化菌突然想到了金庸先生。先生为我们创造了一个巨大的武侠世界。为了纪念先生,我们用下面两句作为对联:

对联:飞雪射白鹿

二联:花与黄蜂

嗯,确实有点天堂桃花岛的味道。

对联:笑书男主倚白桦

下对联:看红尘下的仙子

这点有意思,金庸武侠界的女人,确实是洒脱的人物,尤其是小龙女和她的后辈黄衫女子,一尘不染。

上联:潘他

图片[1]-对联广告代码 自动适应 BERT大火却不懂Transformer?读这一篇就够了-老王博客

下一个链接:还给我

好像不对。

让我们在 2018 年再次测试我们的机器人热点。

第 1 部分:粉红猪小妹社交人

下一个链接:大圣传世文明

没错。

再来一次,今年最火的剧。

上联:延禧攻略

第二个环节:迪化之声

人工智能是否有可能暗示我们的下一部热门电视剧?从名字上看,似乎是一个家庭两兄弟的故事,有趣又有趣。

再看,综艺节目:

上行链路:创建 101

下一个链接:和谐与繁荣

嗯,很好,很和谐。

第一个链接:锦鲤

第二个链接:银蛇

普通。

再看看美国的领导人。

上行链路:特朗普

下一个链接:小康庄

第 1 部分:奥巴马

第二个链接:罗汉松

没想到,虽然他们是世界级的领导者,但他们的成果却如此简单。

好吧,我们来看看贸易战:

中美贸易战

第二个环节:大中国风

没错,没错,这是正确的想法。

好了,别玩了。我们再看几对比较严肃的对联。

我们从测试集中挑几个,上下链接都是正确的,模型就是机器人给出的下链接:

上联:翱翔沪铁,锐意改革谋发展,勇当大马

夏联:和谐南供,安全送电,畅通无阻,争做龙头

榜样:锐意进取、激发激情、促进和谐、迈向更高水平

还有:

第一对联:相思岁月

下一个链接:一千杯酒和醉酒

型号:几杯寂寞醉春秋

它看起来很整洁。

当然我们也看到了一些问题。比如模型学习的是一些广义的对应,并且做到了名词和动词的对应,也可以保证流畅,但是在一些需要典故和外在知识的例子中,却无法做出适当的反应。有时会出现“上铁”和“南京”两个典故不为人知,或出现所谓的无情配对。

这是我们训练 6 个 epoch 的时候,这是模型查看数据 6 次的结果。这次我们一共保存了 7 个模型,从 Epoch1 到 Epoch7 模型,其实要说哪个更好只能见仁见智。例如,我认为 6 Epochs 会更好。但可以确认的是,随着 Epoch 的增加,模型可以更多地了解配对数据中的模式。

是不是很好玩,有兴趣的同学,和我们一起训练一个“双穿肠”吧。

其他型号

关于AI写对联,其实之前也有过基于深度学习seq2seq的模型,也是用TensorFlow和博主冯崇璞_李微斋三叶提供的数据集。

目前代码已经开源,可以在以下github找到:

当然,除了模型代码,你也可以打开作者给出的网址,随意配对。

对了,上面的AI创造者叫王斌,英国莱斯特大学计算机硕士,现为软件工程师。

微软对联和百度对联

除了单打独斗的程序员外,也有不少科技巨头尝试了对联AI。消化细菌这里介绍了两个最著名的项目。不想自己训练模型的同学可以直接使用。

早期的对联AI来自微软亚洲研究院,自然语言计算组的研发,沉向洋领导的一个研究项目。

微软的对联AI应该是谨慎而复杂的。如果你用“改革春风”作为顶联,它也会给你很多次联供选择。

最感人的是,如果你不喜欢它,你可以改变它!

为了让对联更整齐,可以选择分词的方式。如果您仍然不满意,您可以点击反馈按钮告诉它“家长”。最后,还可以生成水平批次。

除了微软的老前辈对联广告代码 自动适应,还有一个新秀,那就是今年百度、央视、网易推出的智能春联。据说他可以根据每个人的五官生成你自己的春联。

嗯,就是刷脸写对联。

抽象细菌用李彦宏的大头像试了一下,你可以感受到这个神奇的过程:

微软对联:

百度对联(手机打开):

好的,消化菌要发春联了,就这样吧。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论