前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >中学生同样也能玩转机器学习

中学生同样也能玩转机器学习

作者头像
WolframChina
发布2018-05-31 10:47:13
9430
发布2018-05-31 10:47:13
举报
文章被收录于专栏:WOLFRAM

█ 本文译自2017年5月11日的 Stephen Wolfram 博文:Machine Learning for Middle Schoolers

一年前我们出版了《Wolfram 语言入门》,其主要目的是培养下一代的计算思维。最近我出版了第二版英文的《Wolfram 语言入门》:主要增加了现代机器学习的内容。

原来期望此书的读者是高中以上学历,但是我们发现很多中学生(11岁到14岁)也在阅读!那问题来了:“我们是否可以为中学生讲授现代机器学习的核心概念呢?” 哈,有趣的是,我们要感谢 Wolfram 语言的整个技术堆栈——答案是 “当然可以!” 以下是《Wolfram 语言入门》中的机器学习那一章:(译者注:由于还没有中文的第二版,以下为中文第一版的贴图。英文第二版增加的机器学习内容在本文中均有阐释。)

该章节之后还有习题、常见问题和技术要点。

背后的故事

机器学习章节的背后是什么呢?首先,它必须适合整本书的风格——只使用已经讲授的概念,并且可能的话,强化它。因此可以讲解图像、现实世界数据、图和文本——但不是函数式编程或外部数据资源。

通过现代机器学习,很容易显示令人喊“哇塞”的范例——比如我们2015年构建的(基于 Wolfram 图像识别函数的)imageidentify.com 网站。但是我在书中的目的还是想介绍一些背景知识,以及机器学习是如何工作的直观概念和在哪里使用机器学习。

我首先解释机器学习不同于传统的“编程”,这是因为它是从范例中学习,而不是明确指定的计算步骤。第一个我要讨论的是那些不需要所有现代神经网络机器学习花招的东西:识别以下文本片段是何种语言:

孩子们可以想象(或在课堂中讨论)这个东东是如何实现的,比如,查字典等。我认为,第一个例子应该是那些看上去不像“纯魔术”的东西。(实际上,LanguageIdentify 是传统的查字典和现代机器学习技术的结合。) 然后,我给出更具有“魔力”的例子——ImageIdentify

我并没有直接解释它是如何工作的,而是尝试不同的例子:情感分析。小孩子非常喜欢尝试情感分析。但是这里真正要展示的是制作“分类器”:有无限个可能的输入,但是这种情况只有3个可能的输出:

看到这里,我们可以再多说明一下这是怎么工作的。我所做的就是显示函数 Classify 分类手写数字0和1。我没有说内部是怎么回事,但是你知道 Classify 给出一堆例子,然后利用它们把特殊的输入分类为0或1:

好了,这个是咋实现的呢?说深了,这是在利用元胞机中的吸引子理论。说通俗了,就是近似,输入接近于0的例子,就是0,输入接近于1的例子,就是1。 一般人们不难理解这个解释,除非他们开始使劲想,可能“最接近”才是该上下文的真正意思。但是我在书中并没有专注于此,我只是谈论数字,这样更容易理解“最接近”的意思:

Nearest 并不是激动人心的函数:你可以把很多东西放进去,只有一个“最接近的东西”出来。然而,Nearest 之所以不错是因为它的功能很容易被理解(而且可以合理地猜测它所使用的算法)。 前面说过用于数字的 Nearest,我们这里显示一下用于色彩的 Nearest。在书中,我已经讲过颜色是如何用红-绿-蓝三位数字表示的,因此,这并不难理解,而且没准可以用于图像上。

在书中,我也讨论了一些“字符串和单词”。我并没有主要讨论“nearness”单词的精确定义,但是,小孩子应该很容易了解这个想法。(在技术要点中,我讨论了 EditDistance,另一个很不错的算法,大家可以考虑并试一试。)

OK,这个又怎么连接上 ImageIdentify 呢?我是通过光学字符读取器(OCR)和 TextRecognize 来联系。这个看上去并没有 ImageIdentify 那么神奇,但是对于了解 ImageIdentify 很有帮助。 把一段文字变成图像,然后又转换回文字,是不是令人印象深刻?但更有趣的是模糊文字(是的,我在书中前几章讨论过模糊图像):

对于模糊的图像,是否仍然可以识别出文本?结果是:

是的,如果图像不是太模糊,TextRecognize 是可以识别出文本的;但是文字太模糊的话就不行了。我喜欢这个例子,是因为它不仅显示了令人印象深刻的部分,还有没有“魔力”的部分。我认为,展示机器学习成功和失败的案例是有用的。顺便一说,这个例子与书中的不同。因为字体的不同,边缘细节识别在做鬼。(如果在课堂教学,你就可以尝试不同的字体和大小,讨论为什么有些可以识别,有些更加模糊。)

TextRecognize 显示了可以像 ImageIdentify一样有效处理内容,但是只是26个字母形式(事实上,TextRecognize 可以处理很多字形)。在书中,我再次显示了 ImageIdentify,像字母一样进行模糊化:

这个结果很有趣,也很有帮助。因为它给出“猎豹”概念的“吸引子”:相当近的时候可以识别猎豹;离远一点就不可以了。(一个稍微棘手的问题是我们不断地产生新的,更好的 ImageIdentify 的神经网络——从我完成书至今,已经有一些新的神经网络——因此,对于非猎豹的情况会给出不同的结果。想必新的结果会“更好”,但是不清楚它到底意味着什么,对于“模糊的猎豹”分类我们没有官方正确的答案,也就是无法说最模糊的图像是更像欧洲越桔还是人。)

在这里,我不会讨论书中的所有机器学习。在讨论了明确培训的 TextRecognizeImageIdentify 之后,我要开始讨论“无监督学习”和特征空间的聚类。我认为我们新的 FeatureSpacePlot 尤其有帮助。

很清楚排列颜色的意义:

对于字母图像也可以“做同样的事情”。(书中的代码比较长,因为那会儿我还没谈及/@。)

这个加强了对 TextRecognize 是如何找到 “最接近字母”的认知。

这节的最后一个例子是使用相片。FeatureSpacePlot 对不同类型的图像分类做的不错——再次给出 ImageIdentify 是如何工作的理念:

显而易见, 10页是不可能完全解释当代机器学习的理论。但是我很高兴在书中我所涉及的核心概念。

当然,这一切之所以成为可能是因为我们整个 Wolfram 语言技术堆栈。在语言中,我们不仅有机器学习,还紧密集合图像、文本等还有整个 Wolfram Notebook 系统(28年的结晶!),把所有的技术都集中在一起,这样才使得它可以让中学生也来了解现代机器学习。

我真正喜欢的是它不是玩具:人们可以获取我在书中的讨论,并立即应用于真实世界。在某种程度上,这是整个 Wolfram 语言自动化的一个折射:内部有很尖端的东西,但是所有层次都被自动化,因此,你无须是位专家并理解细节才可以用,或者需要直觉去判断什么可以,什么不可以做。

进一步探讨

OK,机器学习还可以教一些什么呢?

一个可以讨论的课题是概率。ImageIdentify 有各种可能的识别选择,但是分给它们的概率都是什么?

这可以引向有用的先前概率讨论,以及必然性的特殊性的权衡。

但是最重要的是训练。(毕竟,“机器学习培训师”将成为今天中学生的一大未来职业……)好消息是,在 Wolfram 语言环境下,只需要适量数据就可以进行培训工作。

通过搜索网页,我们获取《银河护卫队》里面的人物图像(因为我们使用外部的搜索API,因此在 Open Cloud 上你不可能做同样的事情。)

现在我们可以用这些图像作为培训材料来创建分类器:

当然,它可以识别火箭浣熊:

是的,它也会认为真正的浣熊就是他:

它是怎么实现的呢?让我们看看 FeatureSpacePlot

一些看上去不错,但是有一些看上去让人困惑。因为排列图像不是按照它们是谁,而只是按照它们的背景色。现在,我们看到机器学习的一些微妙之处。我们构建的实际分类器之所以工作是因为在每个人物的培训范例中,有一个具有不同的背景,因此它可以判断背景不是唯一的区分特征。 事实上,还有另一个关键的事情是 Classify 在分类图像时不是从零基础开始的。因为已经经过预培训并提取出“好的特征”帮助区别真实世界的图像。实际上,它使用从创建 ImageIdentify 中学到的所有内容——数千万张扫描过的图像——了解什么特征应该被关注。

看上去有点怪怪的,但是 Classify 内部把每幅图像都表征为数字列表,每个与不同的“特征”相关联:

你也可以做个极端的版本,把每幅图像减少为两个数字——这也是 FeatureSpacePlot 用来决定图像定位的:

底层探秘

OK,那么它的底层究竟在做什么?Well,很复杂。但是在 Wolfram 语言中很容易看到,然后你就会有直觉神经网络真正是如何工作的。比如,下面是驱动 ImageIdentify 的神经网络底层的 Wolfram 语言符号表示:

事实上,还有很多嵌入的内容,只需要不断地点击:

是的,这确实很难理解——尤其是中学生,甚至专家们。但是,如果我们把整个神经网络对象应用到老虎的照片上,它会像 ImageIdentify 一样,告诉我们它是只老虎:

但是这里最奇妙的是,这些得归功于 Wolfram 语言的整个堆栈功能:我们可以进入神经网络内部,看看发生了什么。比如,我们只拿网络的前3层,并应用于老虎,可视化一下:

这里所发生的是,神经网络制作了很多幅原始图像的拷贝,然后对每个进行处理,选出图像的不同方面。(实际上这看上去有点像大脑中可视化处理的前几层。) 如果我们再深入了解一下神经网络呢?以下是在第10层。图像更加抽象,假设选出了更高一层的特征:

到了第20层,神经网络就在“思考”更多的小图像:

但是到了第28层,它就开始“得出结论”,只有少数几个通道有“亮点”:

最后,到第31层,所有剩下的只是数字数组,只见少数几个尖峰:

应用网络的最后一层(“softmax”层)只剩下几个尖峰了:

最高的确实对应于“老虎”的概念:

我并没有指望中学生可以完全理解这些细节(当然,没有人应该像学习水循环一样来学习神经网络层类型)。但是,我认为了解 ImageIdentify 的内部会非常有帮助,会有个大致的概念了解它是怎么工作的。而且,现在我们最新的 Wolfram 语言这个工具可以帮助你看到内部细节,直观地感受到究竟是怎么回事。

训练过程

Wolfram 语言 Classify 功能的概念是尽可能自动地在最高级别进行机器学习,并尽可能多地进行预培训。但是如果想要获得更完整的机器学习的感觉,那么尝试从头开始训练一个神经网络,看看都发生了什么,会非常有用。

尽管如此,有一个直接要面对的实际问题是:从头开始创建一个能做些事情的神经网络,通常需要大量的训练数据,很难收集,也很麻烦。好消息是在最近发布的 Wolfram 数据存储库中,我们囊括了持续增长的即时可用的训练集,可直接用在 Wolfram 语言中。

比如,下面就是经典的 MNIST 手写数字训练集,有6万个训练实例:

我们可以用这样的训练集为 Classify 提供随机抽样。而且确实给出了一个分类器函数,本质上就是一个简化版的手写数字的 TextRecognize

在仅仅使用了1000个训练实例的情况下,也表现的很好:

我们可以利用 FeatureSpacePlot 来查看不同的数字在特征空间中怎样分离的:

但是如果我们想要真正从头开始训练一个神经网络,而不是利用 Classify 的高级自动化功能呢?那么,首先我们要建立一个原始的神经网络。方便的是,Wolfram 语言有一堆内置的经典神经网络,这里是叫做 LeNet 的网络:

它比 ImageIdentify 网络简单得多,但仍然相当复杂。但是我们不需要明白它的内部结构,就可以开始训练它。在 Wolfram 语言中,我们可以使用 NetTrain(它会自动应用所有最新的 GPU 技术等等):

观看训练进程,同时看到表示神经网络与实例拟合的错误率的橙色曲线不断下降,很是令人愉悦。大约20秒后,NetTrain 觉得已经完成了足够的训练,给出了一个运作良好的训练好的网络:

如果你过早地中断训练,效果就没有这么好了:

在机器学习的专业领域,有许多找出最佳训练参数的技巧和窍门。但是对于中学生来讲,利用 Wolfram 语言现有的功能,已足够开始进行自己的实践、可视化并分析结果、拥有和大家一样好的直觉。

神经网络由什么组成?

如果真的想从最基本的开始,我们就要了解神经网络是由什么组成的。我不是很清楚有多少属于中学的范畴,但只要对函数的图形有所了解,就可以做出一些解释了。因为神经网络中的“层”实际上就是函数,接受一些数字,输出一些数字。

就拿 LeNet 的第二层来说,本质上就是一个简单的 Ramp 函数,我们可以立刻绘制出来(看起来像一个斜坡):

神经网络一般不仅仅是处理个别数字。它们处理的是数字数组(或“张量”),在 Wolfram语言 中表示为嵌套列表。每层接受一个数字数组,输出一个数字数组。这里是一个常见的网络层:

这个层被设置为接受2个数字作为输入,输出4个数字:

看起来像是很“随便”地在进行处理,实际上就是这样。因为该层实现的函数是由另一个数字数组决定,也可以称其为“权重”,由 NetInitialize 随机设定。在这个具体的例子中设定的值为:

这样做有什么用?要点就是 NetTrain 的工作是逐步调整神经网络每一层的权重,试图让网络的整体行为与你给出的训练实例相匹配。

这样就带来了两个问题。第一个,网络的结构必须能够使得通过使用合适的权重达到你想要的行为这一点成为可能。第二个,必须有一些方法可以逐步把权重调整到合适的值。

而如上所示的单独的 LinearLayer 是不可能完成什么事情的。下面是作为两个输入的函数的输出的(第一个元素的)等高线图。就像 LinearLayer 这个名字所表示的那样,我们得到的是平直和线性的输出:

使得神经网络有用的重大发现是:如果我们把几个层连接在一起,就很容易得到更复杂的输出。(在 Wolfram语言 中,一个层次的输出以一种简洁的自动方式编入下一层的输入。)这里是一个4层网络的例子——两个线性层和两个斜坡:

当我们再绘制函数时,它变得更加复杂了:

我们还可以看一下更简单的例子,3层的神经网络,最终输出只有一个数字。(出于技术原因,最好有2个输入,我们可以把其中之一设为常数1。)

下面是该网络作为输入的函数完成的功能:

在网络内会产生3个数字的数组,给出“3”个的原因是函数最多有3(+1)个不同的线性参数部分。从3增加到100,事情变得更加复杂了:

关键是这实际上是一个“随机函数”,由 NetInitialize 选择的特殊随机权重所决定。如果多次运行 NetInitialize,就会得到多个不同的结果:

但是问题是:我们是否能够找到“随机函数”的一个对我们要完成的事情有用的实例?或者,更具体一些,是否能找到一个可以再现特殊训练实例的随机函数?

假设我们的训练实例给出了该图中所示的点的函数值(顺便说一句,这里的设置更像是 Predict 式的机器学习而不是 Classify):

这里再次给出了一个网络实例:

下图显示的是开始时在训练实例上所做的事情(是的,很显然完全是错的):

让我们接着在训练数据上使用 NetTrain 训练网络:

在我的计算机上训练了大约20秒后,有一些模糊的迹象显示至少我们已经开始重现原始训练数据的一些方面。但最好还是慢一点,还不清楚最后会发生什么。

对于具体的项目,“什么样的网络结构是最好的”在神经网络研究中是一个前沿问题(我们还在研究这个问题)。在这里我们来尝试一个稍稍更复杂的网络:

这个网络的随机实例没有给出和上一个网络非常不同的结果(尽管 Tanh 层使得函数更加平滑):

现在来做一些训练(数据定义如上):

这里是结果,出人意料,相当不错:

事实上,如果和原始训练数据相比较,我们看到训练值正好位于神经网络产生的函数上:

下面演示的是训练过程。神经网络以有效的方式“尝试”了许多不同的可能性,最终停在了下面的结果上:

结果在什么意义上是“正确的”?要符合训练实例,这就是我们要求的。因为这就是我们给出的所有输入。怎样在训练实例中进行"插值"是它的工作。我们希望它学习根据给出的数据进行“推广”,但实际上它并不能从给定的几个点推演出多少数据的整体分布情况,所以它给出的平滑插值已经足够好了。

在训练值范围之外,神经网络所做的事情很随意,但是,不存在“正确答案”,所以没人能说它错了:

但是考虑到原始神经网络的随意性和混乱程度,我们能成功地把它训练好已经很了不起了。我们在这里谈论的类型的神经网络实际上已经被研究了60多年了,但直到现代的“深度学习革命”,才有人意识到针对实际问题进行训练是可行的。

但是现在,尤其是拥有了 Wolfram 语言现有的资源,训练神经网络对每个人来讲都是很容易的。

太多需要挖掘的

现代机器学习还是一个全新的领域,有很多显而易见的实验还没有尝试。但是,利用整个 Wolfram 语言的设置,有许多东西中学生都可以开始去做。比如(在写这个帖子时,我得承认我自己都很好奇):我们正在研究的微型神经网络能学到多少东西。

下面的图显示的是前60个罗马数字的长度:

经过少量的训练,网络给出了如下结果:

有人可能认为这是神经网络能给出的最好结果。但我很好奇它是否能做得更好,于是,我继续在计算机上训练了2分钟,得到的结果要好的多:

我想我明白了为什么神经网络要以这样的方式来工作,但这又带来了新的要解决的问题。对于我来说,最令人兴奋的一点是,这个领域这么广泛——现在探索它却是这么容易。

有许多技术细节可研究,有些很基本,有些很浅显。但超越这些的是要培养直觉。而这正是适合中学生开始做的……

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WOLFRAM 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档