版权归原作者所有,如有侵权,请联系我们

梦里啥都有VS人间你不行?这个对对联的AI,咋这么不会说话

果壳
科学和技术,是我们和这个世界对话所用的语言。
收藏

你们家贴春联了吗?如果还没有,不妨考虑这一句👇

王斌给您对对联 https://ai.binwang.me/couplet/

这么不像人话的春联,当然是 AI 对出来的。

不过不是 AI 本 I,而是 2017 年 10 月发布的“王斌对对联”。近年来,像这样自动对对联的 AI 不少,例如 AINLP——

AINLP 可以直接在微信公众号对话,微信公众号搜索“AINLP”即可找到

微软对联——

微软亚洲研究院的对联提供多个选项,还可以选择横批,网址https://duilian.msra.cn/app/couplet.aspx

这些 AI,经常会给出惊为天人的结果。不信,我们拿“王斌对对联”来调戏一下。

调戏 AI

先试试今年的新梗——

“谁了哉”这个用法,比把王妃挂在城门上暴晒三天的王爷还要让人迷惑。

这位 AI 也太诗意了……

还有让你怀疑人生的扎心回复——

还是做梦比较快。

三姑六婆问你年终奖了吗?

网络热词,这位 AI 也是可以的——

当阿伟反复死亡的时候,曹永是不是也跟着生了又生?

追星女孩:哪个哥哥都难追啊!

馋……谁的身子?

再试试理工梗——

地铁老爷爷看手机.JPG

你们还记得这句口诀说的是什么吗?

再试试 AI 同事的名字——


我们特地询问了当事人对此的看法。

李小葵:“不要再问小葵有没有男朋友,小葵有老瓜了。”

王劈柴:“可以凑一桌乡村爱情故事。”

最后看看果壳——

本 AI:?????????

当然,这位 AI 也对出过相当漂亮的下联,例如这两个——

AI 怎么对对联

虽然 AI 对对联的水平飘忽不定,但它能做到这样,其实已经很了不起了。我们拿“王斌给您对对联”为例子,简单介绍这个 AI 的原理,希望你能看得懂 :)

1770491 条对联的“练习册”

简单来说,程序的作者先建立了一个模型,然后将一个语料库丢给它。

语料库里含有 770491 条“上联-下联”的对联,供模型作为示例进行训练。一开始,模型也不太熟练;但所谓“熟读唐诗三百首,不会吟诗也会吟”,在不断纠错重来之后,AI 渐渐也能根据上联对出像模像样的下联了。

语料库的最后20个示例,大家可以感受一下画风

2

把文字变成数字

不过,模型是无法直接处理文字的,所以对联中的文字,需要先转化为数值。

“王斌给您对对联”的语料库搭配了一个字典,其中含有 9130 个字。每个字都有自己对应的编号,再通过编码转换成“向量”。具体来说,每个字都会转换成一串共 9130 个只由 1 和 0 组成的数字;例如“春”字,它在字典中的编号是 6,变成向量则为:

所以,“春风得意马蹄疾”这个句子,经过转换,则会变成 7 个长度为 9130 的向量。这 7 个向量组成一个序列,输入到模型当中,才能进行下一步处理。

在这个程序里,文字是通过一种叫做“独热编码”的方式转换为数值。这种方法虽然简洁,却只能对所有文字“一视同仁”,无法表达出字之间的关系。

现在还有一些其他的编码方式,不仅可以将文字转换为向量,而且可以用向量的距离来衡量字词之间的相似性。例如,它们可以计算出:“国王”和“王后”之间的距离,约等于“男人”和“女人”之间的距离。

当然了,这个程序的字典里只有 9130 个字,所以有些字对 AI 来说就超纲了。例如“氢氦锂铍硼”里的铍,它不认识,就只能空着了。

3

上联:逐字计算,总结成一个向量

处理这些文字的模型包含两个部分——“编码器”(Encoder)和“解码器”(Decoder)。在这类模型当中,向编码器输入一个序列(例如“春风得意马蹄疾”所转换成的一组向量)之后,通过编码与解码,解码器就会输出另一个序列。

这样的模型叫做“序列到序列”(seq2seq)

当编码器接收到“春风得意马蹄疾”的序列时,它会逐字读入,然后从左往右进行计算,最后产生一个用向量表示的语义编码——简单来说,就是把上联的七个向量总结成一个向量。我们试了一下,“春风得意马蹄疾”算出来是一个长度为 1024 的向量——这对人类来说,是一串无法解读的乱码,不过 AI 能读懂就行。

编码器的运作,蓝色箭头为各单元输出的状态信息

具体来说,一个字的处理,对应的是编码器中的一个单元。在“春风得意马蹄疾”这句里,第一个单元输入“春”字,经过计算,会得到用一个向量表示的状态,送到第二个单元;第二个单元获取了这个状态,同时读入“风”字,然后计算出新的状态信息,送到第三个单元。以此类推,最后一个单元输出的就是语义编码了。

4

下联:整合上联,衔接前字,考虑对仗

模型“对”出下联的原理也类似:解码器中的每一个单元,既需要读入前一个字,又需要获取之前的状态信息,进行计算之后才能输出一个向量。以此类推,最后所有的向量都转成编号,再换回文字,拼起来就是人类能看懂的下联了。

解码器的运作

下联的“花气袭人鸟语香”,最初也是七个向量的序列

为了对仗工整,下联还会着重考虑上联中对应的字——这就涉及所谓的“注意力机制”(Attention Mechanism)。简单来说,解码器中的单元,会对编码器的各个单元分配不同的注意力。下联在给出第二个字“气”的时候,除了要衔接上一个字“花”,要考虑整个上联的信息,还会着重关注上联中的第二个字“风”。

注意力机制示意

5

机器学习:反复训练,减少错误

上面说的都是模型怎么预测下联,但它究竟怎么学会这个技能的呢?

这要从参数说起——编码器和解码器中的单元,都含有一系列参数。

什么是参数呢?举个例子,在公式 y=ax+b 中,a 和 b 就是参数。正确的参数,能够使模型掌握一定的规则,根据 x 算出正确的 y。

AI 对对联模型中的参数,则是 a 和 b 的复杂版本,蕴含了一系列规则,能够帮助程序对各个字的向量进行计算。AI 学习对对联的过程,就是不断更新这些参数,学习正确的规则,减小预测的错误——这也就是传说中的“机器学习”。

一开始,模型只能按照初始的参数,将上联进行一系列近乎随机的变换,输出一些无意义的字的组合;

这些组合会和语料库里正确的下联做比较,得到一个差异值;

根据这些差异值,模型可以逐渐更新参数,让预测值和正确答案之间的差异越来越小;

经过漫长的迭代训练,模型就拥有从上联变换出像样下联的能力啦。

AI 对对联,其实是“自然语言处理”(Natural Language Processing,NLP)的一种应用。当然,它实际的设计和计算,远远要比这里写的复杂得多[1]。

近年来,自然语言处理蓬勃发展,翻译软件、聊天机器人、情感分析等程序,都仰赖于它。只不过,这个领域尚在发展,AI 难免“语出惊人”——至于它还会给出什么意料不到的下联,你不妨也去试试看。

参考资料

[1] Bahdanau, D., Cho, K., & Bengio, Y. (2014). Neural machine translation by jointly learning to align and translate. arXiv preprint arXiv:1409.0473.

[2] 王斌给您对对联 https://ai.binwang.me/couplet/

语料库 https://github.com/wb14123/couplet-dataset

源代码 https://github.com/wb14123/seq2seq-couplet

[3] 微信公众号 AINLP

[4] 微软对联 https://duilian.msra.cn/app/couplet.aspx

作者:Charles

编辑:麦麦