投稿/爆料
厂商入驻

【原创】循环神经网络生成矢量格式“新造”汉字

技术干货|论智|2017-11-09 18:30

前天我们介绍了RNN(循环神经网络)和LSTM(长短期记忆网络)的基本原理,今天我们来看一个实际的例子,基于TensorFlow框架,使用LSTM生成“新造”汉字。

fake-chinese-chars

使用LSTM生成笔迹,有Alex Graves的经典论文《Generating Sequences With Recurrent Neural Networks》

otoro工作室在Graves的基础上,基于TensorFlow框架,使用LSTM和MDN(混合密度神经网络),生成矢量格式的“新造”汉字。

动机

作为一个在英语国家长大的小孩,otoro工作室的创始人hardmaru小时候被父母逼着去上教汉语的周六课程,幼小的心灵受到了深深的伤害。直到成年后还会做噩梦,梦到默写测试的场景。

就hardmaru的个人经验而言,写汉字和读汉字很不一样。曾经习惯手写汉字的人,越来越多地使用基于语音的输入法(如日文的片假名输入法和中文的拼音输入法),然后通过选择屏幕上的候选字进行输入。当人们坐下来写张贺卡的时候,就容易出现提笔忘字的情况。人们可以阅读和辨识会写的字,反之则不然。

机器学习某种程度上与此类似。许多问题可以划分到归类问题。这是一个数字吗?这张图上的是一条狗,还是一座房子?这次交易是否存在欺诈?我们应该借钱给这个申请抵押贷款的人吗?这是男性,还是女性?这个人的年纪?

这些任务非常有用。但是hardmaru认为,更有趣的任务是生成数据,在hardmaru看来,生成数据是归类数据的扩展。相比能够阅读某个汉字,能够书写某个汉字表明我们对这个汉字有更多的了解。同理,生成内容也是理解内容的关键。比起单纯预测某位女士大概有22岁,能够生成一个22岁的妙龄女子的图像,要让人印象深刻得多。

生成艺术最近很流行。最近有项目使用生成对抗网络(GAN)之类的技术伪造以假乱真的位图,比如喵星人、人面、卧室、二次元角色。而hardmaru更感兴趣的是,生成矢量内容。其实更多内容更适合以矢量的形式表达,而不是栅格化的位图。例如,数字化的素描、CAD设计、基于地理位置的标签信息、科学实验数据。当然,笔迹也更适合以矢量的形式表达。

stroke-order

比起位图,字体和笔迹更适合用矢量表示。精心设计的TrueType字体,不管大小,显示出来都很美观。

下面我们将介绍hardmaru如何使用循环神经网络生成“新造”的汉字。汉字以矢量保存(SVG格式)。用于训练的数据是真实的汉字,并且包含笔顺数据。因此,神经网络生成的汉字也会有看起来很合理的笔顺。

背景介绍

hardmaru的模型使用和Graves的论文相似的框架。

state_diagram

在文本生成这个例子中,假设我们已经有一个训练好的模型,我们传入一个初始的随机字符以及一个初始的空状态,模型会使用当前的输入以及状态信息来生成下一个字符的概率分布。随机取样该分布,获取下一个字符的预测信息。取样的字符和当前的内部状态一起作为下一个输入。

符合这个框架的一个简单模型是N-GRAM字符建模方法。我们保留前N个字符的频率记录,将历史频率表作为概率分布,从而生成下一个字符。

循环神经网络也可以表示这个模型。状态为循环LSTM节点的隐藏状态,网络的输出值可以通过应用一个softmax层转化为离散概率分布。为了训练神经网络的权重,我们需要找到比较预测分布和训练数据的实际分布的方法。通常,我们使用的是cross-entropy损失函数。

Karpathy的char-rnn项目实现了Graves的论文中提到的上述网络。char-rnn不仅可以用来生成莎士比亚的剧本,还可以用来生成一些奇怪的文本,包括Linux源代码,LaTex文档,维基百科的xml文档,以及音乐评分。

sketch-rnn

hardmaru本来想实现一个生成喵星人素描的RNN,但是发现很难获得大量的喵星人素描的SVG图片。相反,汉字的SVG文件很容易获得,因此最终hardmaru实现的是一个生成“新造”汉字的网络sketch-rnn

sketch-rnn将每一笔建模为类似笔划的数据,每一步包含横、纵方向的位移,以及笔是否落在纸上,如果笔落在纸上,还包含当前步骤和前一步骤的连线。神经网络会输出下一步的概率分布。对于字符生成而言,每一个可能的字符有一个离散的概率。而sketch-rnn则需要用连续的概率分布统计横、纵方向的位移,以及在下一步笔会提起的可能性(笔划完结概率)。sketch-rnn使用混合高斯分布来估算下一笔