画得这么烂还能猜出来!猜画小歌背后的秘密是什么

这几天你的微信有没有被一个叫“猜画小歌”的小程序刷屏了?没有的话你该怀疑一下是不是被大家拉黑了。

“猜画小歌”是一个由谷歌开发出的游戏,你需要在20秒内画出要求的图形,人工智能会根据形状猜出你画的是什么。

你还可以看到别人画的作品,比如下面这个图,是小程序猜对的各种龙的画作,学堂君忍不住要咆哮:你!们!都!是!灵!魂!画!手!

玩这个游戏的时候你会感觉到,为什么我画的这么好小程序还猜不出是什么!为什么别人画得乱七八糟程序还能猜出是什么东西!

这个嘛,我们要从“猜画小歌”的图像识别原理说起。“猜画小歌”是通过“神经网络”的方法识别图像的,什么是“神经网络”呢?我们就从“识别手写数字0到”这个案例开始说起。

尽管这个案例算是神经网络版的“hello world”,但对于从未接触过人工智能的大多数人来说已经是非常复杂了。不用担心,这里我们不使用术语,即使你是中学生,你也能看懂它是怎么工作的。

想想你是怎么认识数字的(你肯定记不得了),或者看看周围的儿童是怎样认识数字的,你会发现这是多么神奇的过程。识字卡片上印着标准的印刷体数字,孩子们一遍遍地摹写它们,用不了多久,孩子们就能够写出歪歪扭扭的数字,还能够辨认出其他孩子写的歪歪扭扭的数字。

也许你不觉得这个过程没什么了不起的,但这个问题放在几十年前电脑还无法解决。尽管那时候的电脑已经能够计算出人类几百年都未解决的数学问题,但却连简单的手写数字都认不出来。而这种问题对于孩子来说却是轻而易举,甚至我们还认为这种事是理所当然的。

看看下面这个图,不同人写出来的数字是多么的千奇百怪,但我们却能够一眼认出它们是什么。

现在我们要设计一个程序,让计算机能够识别出上面手写的字,想一想,你会怎么做呢?必须承认,学堂君看到这个问题也不知道怎么做。冷静冷静,梳理一下思路,这个程序的输入必然就是这些歪歪扭扭的字体,经过一坨乱七八糟看不懂的程序,输出的结果是0到9这10个数字。写成流程图是这样的:

现在这个问题还是非常复杂,但我们可以做一些力所能及的事,让它变得稍微简单一点。这个过程就像玩拼图,我们总是从比较简单的四个角落开始拼起,然后延伸到它的四个边,拼出一个框架,最后才把中间的拼图填上。

同样的,知道了输入和结果,我们就可以从两个方向反推,探索中间的过程来。

在输入的方向,我们可以更进一步,把这一堆数字切成一个个数字图片,每一张图片切割成若干个小方块。比如前面几个数字,我们用28×28的网格,把它们切成784个小方块。现在它们看起来是这样子:

我们发现,每一个方块都有特定的颜色。没有墨迹的方块是白色的,有墨迹的方块是黑色的,如果你把数字放得足够大,你会发现墨迹和空白之间的一些地方是灰色的。我们需要为这些颜色赋值,转换成计算机能够理解的数据。白色的方块我们赋予一个值0,黑色的方块赋予一个值1,灰色的方块可以为它们赋予一个0到1之间的值,这样计算机就能读取图片了。

到这里,我们已经迈开了人工智能识别数字的第一步,下一步该做什么呢?我也不知道。既然输入这个方向推进不下去了,我们就从输出反推回来。

从输出反推的过程,其实跟我们学习数字是很相似。如果你观察孩子学习数字的过程,有时候你会听到爸爸妈妈教给孩子的一些记忆口诀。例如“1字像粉笔,2字像鸭子,3字像耳朵……”等等,这些口诀能够帮助孩子记住每一个数字的形状,我们要是教会电脑这些“口诀”,它是不是也能学会认识数字呢?

当然,我们不是教会电脑粉笔、小鸭、耳朵等比喻。我们可以将数字拆解成直线、横线、弧线、圆形四种基本的形状,不同的形状组合成不同的数字,然后再告诉电脑记忆口诀。例如:

0=1圆形;1=1竖线;3=2弧线;4=2竖线+1横线;5=1横线+1竖线+1弧线;6=1竖线+1圆形;7=1横线+1竖线;8=2圆;9=1竖线+1圆形;

我们用不同的颜色来区分它们,红色是横线、蓝色是直线、黄色是弧线、绿色是圆形。

当然我们还需要注意他们的位置关系,例如6是直线在圆形上方,9是直线在圆形下方,如果没有这个限制的话,可能人工智能就无法分辨6和9了。

换句话说,计算机要是识别到特定的形状组合,就可以判断出画面的数字了。这样我们又迈出了人工智能识别数字的第二步(或者说是倒数第二步)。

计算思维的一个方法,就是把复杂问题分解成若干简单的问题。但让计算机识别出这四个形状也不是什么容易的事。没关系,我们可以进一步分解问题,把各个形状分解成更加细微的组成部分。

例如,我们可以把圆形分解成一个左弧线和一个右弧线,长的直线分解成两根短的直线,用这种方法一步步推进,我们发现这个拼图可拼合的地方越来越多了。

那么,我们要推进到哪一步呢?当然是让它能够和输入值相结合的一步,这意味着我们需要找到一个函数,让它判断最基础的图形是怎么样的。

这样我们就能够找到解决问题的一个思路。来看看这个思路的全过程吧,如果我们这个过程画成图像,它大概是这样子的。

我们对这个图稍加分析一下,你就大概能看懂了。

图片最左边的inputs代表的是我们将手写数字转换成784个小方块,并为每一个小方块的颜色赋予一个值;

第二排的圆圈,代表我们用函数判断它的基本组成形状,猜测它最可能属于哪一类基本形状(直线、横线、弧线),并赋予一个值;

第三排的圆圈,代表我们根据上一步猜测的形状的组合,猜测这个图形有几根横线、直线、弧线或圆,并为不同的组合赋予一个值。

最右边的output,代表计算机根据上一层组合的图形和位置判断结果,并判断出最有可能的一个结果。

举个例子来说明一下,加入我输入的是手写的4,通过函数激发了第一层的不同位置的短竖和横线,第一层的结果激发第二层的短竖、横线和长竖,并根据“4=2竖线+1横线”的口诀识别出手写的数字是4。

其实,我们在看到数字也经历了类似的过程。光线到达我们的眼睛中,视锥细胞把光线转化为电信号,经过一层层的神经传导到我们的大脑,大脑判断形状我们就能认识到它是什么数字。所以,我们把这个过程称之为神经网络。

到这里,我们已经完成了半个人工智能,但它还不能认全认识所有的数字。例如,我们教会电脑的是识字口诀是1弧线+1横线=2,但是我们手写的却是1弧线(黄色)+1横线(红色)+1圆圈(绿色),这样,人工智能就不能识别出来了。

怎样让人工智能上面这个写法也是2呢?我们可以给人工智能安排一个“老师”,一旦它认不出或者认错这个字,我们就告诉他正确答案是2。这种反馈过程,让人工智能学会1弧线+1横线+1原型同样也可能是2,并将结果反馈到前面的过程中。这样我们就构建出能够完整识别数字的人工智能。

这是“猜画小歌”猜出帽子的形状。你可以看到大家画的帽子有棒球帽,有礼帽,有鸭舌帽,也许某类型的帽子就是被“老师”指正之后才学会的。而这个“老师”可能就是广大玩家,也包括你。

我们上面说的是一个为了让大家更好理解的极端简化过程,真正的神经网络比这个还要复杂得多。如果你已经坚持看到这里,还意犹未尽的话,记得关注点赞分享,学堂君为你推荐一本面向中学生的人工智能书籍《人工智能基础(高中版)》。

这是一本面向中学生的人工智能教材,这本书的第三章将进一步介绍用人工智能识别图片的方法,帮助你更深层次地认识和理解“猜画小歌”背后的工作原理。

科技学堂

科技辅导员在线学习平台

微信号:sciclass

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180720A1QJTE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动