这太令人印象深刻了。但对于实际问题呢?神经网络可以在你需要的时候帮你找到你需要的任何表情符号吗?
哎呀,是的。它们可以。
这篇文章将概述Dango背后的一些工程原理,它可以让我们从数以亿计的现实世界的符号表情使用情况中自动学习,从而产生了一款轻量快捷的工具,用来在手机上实时为你预测表情符号。
Dango是什么?
Dango是一款运行在手机上的浮动助理,它会根据你与你朋友在任何应用中所写的东西来预测表情符号,贴图和GIF图片。这使得你在任何应用中都有同样丰富的对话:Messenger,Kik,Whatsapp,Snapchat等。(单单在所有应用中都实现这样的功能就是一大挑战了,不过这不属于这里要讨论的)。
推荐表情符号很困难:Dango必须理解你正在写的语句的意思,然后才能为你推荐你想使用的表情。在核心部分,Dango的预测由神经网络来实现。神经网络是一种计算结构,有上百万的可调参数,以类似人脑神经元的连接方式相互连接。
随机对这些参数初始化来训练神经网络,然后输入从互联网上抓取的数以百万的现实世界表情符号使用案例,比如:
最开始,网络只是随意猜测,但是随着新的训练样例的输入,它轻微调整那百万个参数,因此它会在那个样例上表现更好。在顶级GPU上训练了几天之后,网络开始输出更具意义的推荐了:
我们从表情符号中学到的东西
这种由数据驱动的表情符号预测方法意味着Dango比我们更了解表情符号。Dango教我们使用新的俚语,以及世界各地人们使用表情符号讲述故事的新方式。
例如:如果你写“Kanye is the”,Dango将会预测一个山羊表情。这只山羊当然表示Greatest of All Time(G.O.A.T),这是Kanye在今年早些时候的自称:
在他意识到他是当代以及所有时代最伟大的艺术家时说的。
— KANYE WEST (@kanyewest)2016-02-14
Dango可以通过多表情符号来表示事物。例如,如果你居住在不列颠哥伦比亚或科罗拉多,并享受生活,Dango就会这么推荐表情。
如果你对某人生气,希望他们滚出去。Dango会很乐意让它们出去:
Dango同样从网络文化中学习到了丰富的知识。它了解模因和趋势。例如,如果你看过在喝茶的Kermit青蛙的图片“但这不关我事(but that’s none of my business)”那就知道了。
Dango还了解许多其他的细微引用和笑话,而且它总是在学习,以跟上潮流
当然还有许多我们没发现的。
不仅仅是表情符号
由于Dango在表情符号上训练,可能一开始会意识到它可以理解和表示的概念数目很小——在写这篇文章的时候,Unicode协会拥有1624个标准化表情符号,尽管对字体设计师来说这个数目是个头疼问题,但仍然数目相对较少。
然而,这并不意味着只有1624种含义。你在使用表情符号的时候,它们的意义是根据它们的外形以及使用的上下文来定义的——这些意义会高度多样化。
可能表示“举手击掌”或者“谢谢”或者“拜托了”。
可能专门表示茄子。
此外,表情符号可以结合使用来表达新的概念。例如:
表示亲吻脸颊,但是
表示吹口哨,
表示吐烟雾。
这些表情符号的组合可能变的非常复杂:
这意味着Dango可以表示的语义概念的数量比单个表情符号可以表示的数量多得多。这是一个强有力的概念,因为它赋予了Dango理解各种各样的一般概念的方法,不管Unicode协会是否认可。
Dango因此同样可以推荐贴图和GIF。上面已经提到,Dango能够理解滚出去:
它同样可以为你推荐GIF:
深入了解
让我们深入了解下它的工作原理。
一种朴素的推荐表情符号的方法(我们在Dango中首次尝试的方法)可以直接将一些词汇映射成类似如下的表情符号:
但是这种方法具有局限性,它并没有反映表情符号(和语言)的实际使用情况。许多由词汇组成的微妙组合不可能用简单的映射来描述。
为了处理这些情况,Dango使用了递归神经网络(RNN)。RNN是一种特别的神经网络架构,非常适用于连续输入,因此常常用于自然语言处理,语音处理和金融时间序列分析等领域。在这里我将快速过一遍什么是RNN,想更深入了解的话可以看看Andrej KarPathy的一篇很棒的概述。
RNN通过维护一个内部状态来处理顺序输入,一种记忆机制,使他们能够跟踪之前看到的数据。这对于区分我很开心的表情以及我不开心的表情很重要。
多个RNN也可以彼此堆叠:每层RNN接收输入序列,然后将它转换成一个新的,更抽象的表示,然后将它输入给下一层的RNN,以此类推。这些网络堆叠的越深,它们可以表示的功能种类越复杂。顺便说一句,这就是现在流行的“深度学习”由来。一些难题的重大突破部分是因为单纯地使用了更深层的网络层堆叠。
Dango的神经网络最终输出一个有上百个数字的列表。这个列表可以表示成高维度空间中的点,就像三个数字可以表示点在三维空间中的x,y,z坐标值。
我们可以称这种高维空间为语义空间,把它想象成一个多维的网格,不同的点表示不同的思想。在这个空间中,相似的思想靠的更近。深度学习先驱Geoff Hinton将这种空间称为“思想向量”。Dango在训练过程中学习到的是,如何将自然语言语句和表情符号转换为这种空间中单独的向量。
所以,当Dango接收到某一文本时,它将这个文本映射到这个语义空间中。为决定推荐哪些表情符号,它将每个表情符号的向量投射到这个语义向量上。投射是一项简单的操作,它会给出两个向量相似度的度量。然后Dango推荐有最长投影的那个表情符号——这些是与输入文本意义最接近的表情符号。
可视化语义空间
对于那些通过视觉来思考的人来说,这种空间隐喻是一个强大的工具,可以帮助我们通过直觉来了解和谈论神经网络。(在Whirlscape,我们非常沉迷于空间隐喻;看看我们早期的一篇关于Minuum键盘算法的文章)。
为帮助我们想象Dango的语义空间,我们可以使用一项可视化高维度空间的流行技术,叫做T分布随机邻近嵌入,简称t-SNE。这种技术试图将每个高维度点放置到二维空间中,并确保在原来空间中邻近的点在二维空间中仍保持邻近。虽然这个映射不完美,但是它仍然可以告诉我们很多信息。我们现在使用t-SNE来将表情符号在语义空间中可视化出来:
打开交互式地图并探索
注意语义相似的表情符号是如何在这个空间中自动聚集在一起的。例如,大多数脸部表情聚集在“脸部半岛”区域。
高兴的表情在一个区域:
愤怒的表情在另一个区域。
所有的心形表情都聚集在山峰右边附近,我们称之为“爱之顶点(Point Love)”。
再随着尾巴往后看,你可以发现一些其他有趣的分组:篮球、橄榄球、排球、足球表情都相互靠近,带有头发的脸部表情符号与没有头发的脸部表情相互分离(这与他们是否想出门有关)。在右边的尽头处,你可以看到一些旗帜表情和一些冷门的表情,比如文件柜和快进。
此外,Dango从来没有明确的被告知脸部与心形,或啤酒,或农村动物有不同之处。Dango从互联网上使用数以亿计的现实世界表情使用样例来训练模型,之后生成这种语义映射。那么我们这里说的训练是什么意思呢?
在训练前,初始化一个神经网络;输入一些或多或少的随机值;本质上是从清洁状态开始。句子被随机映射到语义空间,其中,表情符号是随机分散的。
要训练一个神经网络,我们定义一个目标函数;这基本上是评估网络对给定样例性能的方式。目标函数输出一个分数值,告诉我们Dango对样例预测情况的好坏。分数越小越好。然后我们使用一个非常简单的算法,叫做梯度下降。对于每个训练样例,梯度下降在最能减小目标函数的方向上,轻微地调节神经网络中百万个参数的值。
在GPU上训练了几天之后,目标函数不能进一步优化了——Dango已经训练完成,能够派上用场了!
语言的未来
语言正在变得可视化。表情符号、贴图以及GIF大受欢迎,尽管以高级的方式使用它们仍需要大量劳动。表情爱好者为每一种情况创建了个人收藏图像,并记住了表情符号键盘的每一页,但我们其余的人依靠“最常用”菜单来立即使用表情符号,有时候是GIF。
这种可视化语言已经与技术一起成熟了,并且这种共生关系还将继续,新技术引发新语言,反过来,新语言催生新技术。未来的通信将会使用到人工智能工具,帮助你无缝对接图像和文字,Dango为处在这方面的前沿而感到自豪。
希望你能从中获得灵感,并和我们一样,将你的语句投射在语义空间的某处,被上百个表情符号包围。也许你开始玩转自己的神经网络。请让我们知晓!
最后,请试试我们的Dango并给予反馈。每当你琢磨着:我应该使用什么表情?Dango将会给你答案。