中学生机器学习

浅谈沃尔夫拉姆语言 可在打印,作为一个电子书,和网上免费-以及Wolfram编程实验室Wolfram开放云.现在还有一个免费在线实践课程在此基础上)。

浅谈沃尔夫拉姆语言一年前我出版了一本题为浅谈沃尔夫拉姆语言-作为我努力的一部分教授计算思维金宝博188投注到下一代。我刚刚出版了第二版在这本书中(除其他外)有一个相当大的扩展部分现代机器学习.

我原本以为我的书的读者会是高中生或更高。但事实上,它也在中学生(11至14岁)中找到了大量的听众。所以现在的问题是:一个人能把现代机器学习的核心概念教给中学生吗?好,有趣的是,多亏了技术堆栈我们现在进入了沃尔夫拉姆语-答案似乎是“是”!

我就是这么做的在书中:


在主文本之后,这本书有练习问答科技笔记.

练习,问答科技笔记

幕后故事

我在这个机器学习区的想法是什么?好,第一,它必须与书的流程相适应,只使用已经引入的概念,而且,如果可能的话,加强它们。所以它可以说图像,和真实世界数据,和,和文本-但不是函数式编程外部数据资源.

章节列表

随着现代机器学习,很容易显示“哇”例如我们的图片标识.com2015年起的网站(基于Wolfram语言)图像识别函数)。但我在书中的目标也是要传达一点机器学习的背景和直觉,以及在哪里可以使用。

我首先解释了机器学习不同于传统的“编程”,因为它是基于实例学习的,而不是显式指定计算步骤。金宝博188投注我所讨论的第一件事不是真正需要现代神经网络机器学习的所有缺点:它识别什么语言文本片段来自:

语言识别[{

孩子们(和其他人)可以想象(或在教室里讨论)这样的事情是如何工作的。-在字典中查找单词,等。我认为给出一个看起来不像“纯魔法”的第一个例子是很有用的。(实际上,语言识别使用传统查找的组合,以及现代机器学习技术。)

但是我给了你更多的“魔力”实例图像识别

图像识别[]

我不会马上解释它是如何工作的,但相反,继续做一些不同的事情:情绪分析。孩子们在尝试情绪分析时很有趣。但这里真正的意义在于,它显示了制作分类器“:可能的输入数量是无限的,但只有(在这种情况下)3种可能的输出:

分类[分类]

看到这个,我们已经准备好对类似的事情的工作方式给出更多的指示。我要做的就是展示它的功能分类将手写数字分为0和1。我不是说里面发生了什么,但人们可以理解分类给出了一系列例子,然后它使用这些来将一个特定的输入分类为0或1:

分类[ ]

好啊,但它是怎么做到的呢?实际上,一个人正在处理关于吸引子的想法-以及位于吸引特定输出的盆地中的输入。但在第一个近似值中,可以说输入“更接近”,说,这0个例子被认为是0,更接近于1个实例的输入被取为1s。

人们通常不会有太多的困难来解释,除非他们开始对“最近”的东西想得太多。在这种情况下可能是真的。但与其集中精力,我在书中所做的只是谈论数字的情况,在那里很容易看到“最近的”手段:

最近[ { 10,20,30,40,50,60,70,80 },22

最近的不是最令人兴奋的功能:一个人可能会把很多东西放进去,然后只有一个“最近的东西”出来。仍然,最近的很好,因为它的功能很容易理解(而且人们可以对它可以使用的算法有合理的猜测)。

见过最近的对于数字,我展示最近的为了颜色。在书中,我已经说过了颜色由红、绿、蓝三个数字表示。,所以这不是一个延伸,而是看到最近的对颜色的操作开始使它变得更加合理,它也可以对图像这样的东西进行操作。

最近[ ]

接下来我将展示单词的情况。在书中,我已经做了不少字符串和单词.在正文中,我不讨论“接近”的精确定义。为了语言,但是,再一次,孩子们很容易得到基本的想法。(在技术说明中,我说的是编辑距离,另一个很好的算法操作,人们可以考虑并尝试。)

最近的[单词表],

好啊,那么,如何从这里得到类似的东西?图像识别?我使用的方法是接下来讨论OCR和文本识别.这看起来不像是“魔法”作为图像识别(很多人都知道“OCR'ing文档”),但这是一个好地方,可以进一步了解图像识别正在做。

把一段文字变成图像,然后又回到同一个文本中,似乎没有那么令人印象深刻或有用。但是,如果你把文字弄模糊了,那就更有趣了(而且,对,模糊图像是我说的吗在书的前面):

表格[模糊[光栅化[样式][

考虑到模糊的图像,问题是:人们还能识别文本吗?在这本书的这个阶段,我还没有谈到@地图%(最后一次输出)然而,所以我必须更详细地写出代码。但结果是:

文本识别/@%

而且,对,当图像不太模糊时,文本识别可以识别文本,但当文字变得太模糊时,它不再能够。我喜欢这个例子,因为它显示了一些令人印象深刻但不是“魔法”发生的事情。我认为展示基于机器学习的功能在哪里成功是很有用的,以及他们失败的地方。顺便说一句,这里的结果不同于书中的结果,因为文本字体不同,当一个人处于可以识别的边缘时,这些细节就很重要了。(如果有人在课堂上这样做,例如,你可以尝试一些不同的字体和尺寸,讨论为什么有些人比其他人更模糊。)

文本识别展示一个人如何有效地做类似的事情图像识别,但只有26个信笺(嗯,事实上,文本识别处理比它更多的字形。但现在在我展示的书中图像识别再一次,像字母一样模糊:

表[模糊]R.{0,22,2 }

图像识别/@%

看它做什么很有趣,但这也很有帮助。因为它给人一种“吸引力”的感觉围绕着“猎豹”概念:保持相当近的距离,猎豹仍然可以被识别;走得太远了,就不行了。(一个稍微棘手的问题是,我们不断地生产新产品,更好的神经网络图像识别-所以,即使在这本书写完和今天之间,也有一些新的网,所以它们对非猎豹的情况给出了不同的结果。可能新的结果“更好”,虽然还不清楚这意味着什么,鉴于我们没有一个正式的正确答案“模糊的猎豹”类别,谁能说最模糊的图像更像是一个妓女还是一个人。)

我不会从这本书中讨论机器学习。在讨论了像文本识别图像识别,我开始讨论“无监督学习”,像特征空间中的集群。我想我们的新特征空间图特别有用。

很清楚安排颜色意味着什么:

功能空间图[RandomColor[100]

但是你可以“做同样的事情”有字母的图像。(在这本书里,密码有点长,因为我没有谈论@然而

特征空间图[光栅化/@字母表[]

这件事的好处在于,它不仅能发挥自身的作用,而且还能强化人们对文本识别可能会找到“最近的信”对它给出的任何输入。

本节最后一个示例使用照片。特征空间图再次很好地分离不同种类的事物的图像,给出如何图像识别可能工作:

特征空间图

很明显,在一本初级读物的10页里,我无法对现代机器学习进行全面的阐述。但我很高兴看到我能接触到多少核心概念。

当然,事实上,这完全是可能的,这完全取决于我们的整体Wolfram语言技术栈.不管是不是我们机器学习在语言上,或者我们可以无缝地处理图像、文本或其他东西,或整个(28岁!)Wolfram笔记本让我们把所有这些部件组合在一起的系统对于使现代机器学习能够带给像中学生这样的人是至关重要的。

我真正喜欢的是一个人要做的不是玩具:一个人可以接受我在书中讨论的东西,并立即应用于现实世界。在某种程度上,这项工作是整体的反映自动化重点沃尔夫拉姆语里面有非常复杂的东西,但它在各个层面都是自动化的,所以一个人不需要成为一个专家,了解细节,就能使用它,或者对什么可以工作,什么不能工作有一个很好的直觉。

走得更远

好啊,那么,在机器学习的教学中,如何进一步呢?

一个早期的事情可能是开始谈论概率。图像识别有多种可能的选择,但它给它们分配了什么概率呢?
图像识别所有的,10,

这可以导致对先验概率的有益讨论,以及一些问题,比如交易确定性的特殊性。

但最重要的是训练。(毕竟,“机器学习培训师”对当今的一些中学生来说,这肯定是一个伟大的未来职业……而好消息是,在WOLFRAM语言环境中,只有少量的数据才能使培训有效。

让我们从银河护卫队通过搜索网络(我们正在使用外部搜索API,所以你很不幸不能在开放云):

数据=关联地图[WebImageSearch[,

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

分类器=分类[数据]

而且,果然,它可以识别火箭:

分类器[]

而且,对,它认为真正的浣熊也是它:

分类器[]

它是怎么做到的呢?好,让我们来看一看特征空间图

特征空间图[展平[值[数据]]

有些看起来不错,但有些看起来很困惑。因为它安排了一些图像,而不是根据他们的身份,但只是根据他们的背景色。在这里,我们开始看到机器学习的一些微妙之处。我们构建的实际分类器之所以有效,是因为在每个字符的训练示例中,都有一个背景不同的字符,因此它可以发现背景不是唯一的区别特征。

事实上,还有另一个关键问题:分类在图像分类上不是白手起家。因为它已经接受过挑选“好特性”的预先培训这有助于区分真实世界的图像。事实上,它实际上利用了从创造图像识别-它所看到的数以千万计的图像与此相关,是为了提前知道它应该注意哪些功能。

这有点奇怪,但内部分类把每个图像描述成一个数字列表,每个都与不同的“功能”相关:

特征提取

我们可以做一个极端的版本,其中一个坚持认为每个图像被缩减为两个数字,这基本上是怎样的。特征空间图确定图像的位置:

尺寸减小[]

罩下

好啊,但是引擎盖下面发生了什么?好,这很复杂。但是在Wolfram语言中,很容易看到并看到它有助于获得关于神经网络如何真正工作的直觉。所以,例如,这是低级的Wolfram语言符号表示为神经网络提供动力图像识别

NET=网络模型

实际上还有更多:只需点击并继续向下钻取:

NET=网络模型

是的,这对中学生来说很难理解,甚至是专业人士。但是如果我们把整个神经网络对象,把它应用到老虎的照片上,它会做什么图像识别做,告诉我们这是一只老虎:

网[ ]

但这里有一件整洁的事情,通过Wolfram语言中的一整套功能实现:我们实际上可以进入“内部”神经网络,了解正在发生的事情。作为一个例子,我们来看看前三个“层”在网络中,把它们应用到老虎身上,想象一下会发生什么:

图片/@take[net,3〕

基本上,网络已经复制了大量的原始图像,然后对每个图像进行处理,选出图像的不同方面。(实际情况似乎与大脑的视觉处理

如果我们深入网络会怎么样?下面是第10层的情况。图像更抽象,并可能选择更高级的功能:

图片/@take[take[net,10〕[],20 ]

转到20级,网络正在“思考”大量的小图片:

图像拼接[分区]20〕[],30 ]

但是到了第28层,它开始“得出一些结论”,只有几个可能的活动渠道“点亮”了:

imageadjust[imageassembly[分区[image/@take[net,28〕[],50 ] ]

最后,按等级31,只剩下一组数字,有几个峰可见:

列表线图31〕

应用网络的最后一层“SoftMax”层)只剩下几个峰:

listlineplot[net[,none],绘图->全部]

最高的一个正是对应“老虎”概念的那个:

NET

我不认为中学生会遵循这些细节(不,没有人应该学习神经网络层类型就像他们学习水循环的某些部分一样。但我认为看到“内部”是非常有用的图像识别,甚至可以大致了解它的工作原理。对于像我这样的人来说,所有的一切都能像这样结合,这仍然有点像魔术。但最棒的是,现在有了我们最新的Wolfram语言工具,您可以轻松地查看内部,开始对发生的事情有直觉。

培训的过程

沃尔夫拉姆语的思想分类功能是在尽可能高的水平上自动进行机器学习,在尽可能多的预培训的基础上。但是如果你想对机器学习有一个更完整的感觉,如果一个人试图从头开始训练一个神经网络,那么看看会发生什么是很有用的。

不过,现在有一个现实问题:要得到一个神经网络,从头开始,做任何有用的事,人们通常必须给它提供大量的训练数据,这很难收集和争论。但好消息是最近发布的Wolfram数据存储库我们有越来越多的现成的培训集,可立即用于Wolfram语言。

就像这里的经典mnist手写数字训练集,通过60000个培训实例:

资源资源

对于这样的训练集,我们可以做的一件事就是将它的随机样本输入分类.当然,这给了我们一个分类器函数,它本质上是文本识别手写数字:

C=分类[随机样本[资源数据][

即使只有1000个培训案例,它做得很好:

C[{}]

而且,对,我们可以使用特征空间图要查看不同数字在功能空间中的分隔方式,请执行以下操作:

特征空间图[第一个/@randomsample[资源数据[

但是,好啊,如果我们真的想从头开始训练神经网络,没有任何幻想的自动化分类?好,首先,我们必须建立一个原始的神经网络。而且很方便,Wolfram语言内置了一系列经典的神经网络。这里有个电话小精灵

Lenet=网络模型[

这比简单得多图像识别网但这仍然相当复杂。但我们不需要了解其中的内容就可以开始训练。相反,在Wolfram语言中,我们可以使用网络列车(其中,不用说,自动应用所有最新的GPU技巧等):

NET= NETSCORE随机样本[资源数据[

看着训练的进行真是太棒了,并且为了看到神经网络的误差率橙色线的拟合实例不断下降。大约20秒后,网络列车决定做得够远了,并生成一个最终训练好的网络:

网[{}]

如果你早点停止训练,它做得不太好:

1src=“//m.trev-bjj.com/data/uploads/2017/05/inoutimg39-3.png”alt=“net=nettrain[列奈,随机样本[资源数据[“mnist”],1000,maxtrainingrounds->1]“宽度=“419”身高=“305”>

网[{}]

在机器学习的专业世界里,有一个整体艺术与科学找出最佳的训练参数。但我们现在用的是沃尔夫拉姆语,没有什么能阻止一个中学生做他们自己的实验,可视化和分析结果,和任何人一样有良好的直觉。

神经网络是由什么组成的?

好啊,所以如果我们真的想降到最低水平,我们得谈谈神经网络是由什么构成的。我不知道这其中有多少是中学的东西,但一旦人们了解了函数图,我们已经可以解释很多了。因为,你看,“层”在神经网络中实际上只是函数,接受数字,把数字放出来。

取透镜第二层。它本质上只是一个简单的斜坡函数,我们可以立即绘制(和,对,它看起来像一个斜坡):

情节[斜坡],{x,- 1,1 }

神经网络通常不只是处理单个数字,不过。它们处理在Wolfram语言中表示为嵌套列表的数字数组(或“张量”)。每层都有一组数字,把一组数字放出来。这里有一个典型的单层:

“2”]src=“//m.trev-bjj.com/data/uploads/2017/05/inoutimg421.png”alt=“layer=netInitialize[线性层[4,“输入”->2〕宽度=“309”身高=“72”>

该特定层设置为以2个数字作为输入,把4个数字放出来:

层[ { 2,3 }

它似乎是在做一件相当“随意”的事情,实际上是这样。因为层实现的实际函数是由另一个数字数组决定的,或“重量”—即网络初始化这里只是随机设置。以下是在这种特殊情况下设置它们的条件:

netextract[层,

为什么这些有用?好,关键是什么网络列车做的是逐步调整神经网络每一层的权重,以尝试获得网络的整体行为,以匹配您给出的训练示例。

目前有两个问题,不过。第一,网络的结构必须能够通过使用适当的权重集获得所需的行为。第二,必须有某种方法来逐步调整权重,以便获得适当的值。

好,原来是单人间线性层就像上面的那个一样,不能做任何有趣的事情。这是它输出的(第一个元素)的轮廓图,作为其两个输入的函数。作为名字线性层可能会建议,我们总是得到一些平的和线性的东西:

轮廓图[第一[层[X,Y}[]{x,- 1,1 },{- 1,1 }

但这是一个让神经网络有用的重大发现:如果我们把几层连接在一起,很容易得到更复杂的东西。(并且,对,在Wolfram语言中,一层的输出被编织成一个nice中下一层的输入,自动方式。)下面是一个具有4层、两个线性层和两个斜面的示例:

“2”]src=“//m.trev-bjj.com/data/uploads/2017/05/inoutimg461.png”alt=“net=netinitialize[netchain[linearlayer[10],斜坡,线性层〔1〕,坡道}“输入”->2〕宽度=“527”身高=“135”>

现在,当我们绘制函数时,更复杂的是:

轮廓图[net[x,Y},{x,- 1,1 },{- 1,1 }

实际上,我们也可以看到一个更简单的三层神经网络的例子,只有一个数字作为最终输出。(出于技术原因,很高兴仍然有两个输入,尽管我们总是将这些输入中的一个设置为常量1。)

“2”]src=“//m.trev-bjj.com/data/uploads/2017/05/inoutimg48.png”alt=“net=netinitialize[netchain[linearlayer[3],斜坡,线性层[1],“输入”->2〕宽度=“479”身高=“120”>

以下是这个特定网络作为其输入函数所做的操作:

图[网] {1 },{x,- 2,2 }

在网络内部,有一个由3个数字组成的数组,结果是“3”导致函数中最多有3(+1)个不同的线性部分。将3增加到100,事情会变得更复杂:

“2”]src=“//m.trev-bjj.com/data/uploads/2017/05/inoutimg50.png”alt=“net=netinitialize[netchain[linearlayer[100],斜坡,线性层[1],“输入”->2〕宽度=“492”身高=“120”>
图[网] {1 },{x,- 2,2 }

现在,重点是这在某种意义上是一个“随机函数”,由特定随机权重决定网络初始化.如果我们运行网络初始化很多次,我们将得到一系列不同的结果:

2)]图[网] {1 },{x,- 2,2 } ]8src=“//m.trev-bjj.com/data/uploads/2017/05/inoutimg52.png”alt=“table[with[net=netinitialize[netchain[linearlayer[100],斜坡,线性层[1],“输入”->2〕}图[网] {1 },{x,- 2,2 } ]8宽度=“489”身高=“360”>

但最大的问题是:我们能找到这个“随机函数”的一个实例吗?这对我们想做的事有用吗?或者,尤其是,我们能找到一个随机函数来复制特定的训练例子吗?

让我们想象一下,我们的训练示例给出了图中点的函数值(顺便说一下,这里的设置更像是以预测分类):

listlineplot[表[mod[n^2,5,{n,15 },网格->所有

下面是我们网络的一个实例:

“2”]SRC=“HTTPS://BuL.StngWordFrAM.COM/DATA/XOPADS/2017/05/PAR2-IUUTIMG1.PNG”alt=“net=netinitialize[netchain[linearlayer[100],斜坡,线性层[1],“输入”->2〕宽度=“492”身高=“120”>

下面是它最初在培训示例范围内所做的工作(以及,对,这显然是完全错误的):

图[网] {1 },{n,1,15 }

好,让我们尝试使用网络列车

网=网[网,数据=表[n,1 }-> {mod[n^ 2,5 ] },{n,15 } ]

在我的电脑上训练了20秒之后,有一些模糊的迹象表明,我们开始至少复制原始培训数据的某些方面。但最好是慢慢来,不清楚最终会发生什么。

图[网] {1 },{n,1,15 }

这是神经网络研究中的一个前沿问题,即在任何特定情况下,什么样的网络结构最有效(是的,我们正在研究这个问题。但这里让我们尝试一个稍微复杂一点的网络:

“2”]src=“//m.trev-bjj.com/data/uploads/2017/05/part2-inoutimg5.png”alt=“net=netinitialize[netchain[linearlayer[100],Tanh线性层[10],斜坡,线性层[1],“输入”->2〕宽度=“369”身高=“38”>

这个网络的随机实例与我们上一个网络的结果并不完全不同(尽管存在坦赫层使函数更平滑):

TANH层

但是现在让我们做一些培训(上面定义了数据):

网=网[网,数据]

这是一个令人惊讶的好结果:

图[网] {1 },{n,1,15 }

事实上,如果我们将它与我们原始的训练数据进行比较,我们就会发现训练值正好取决于神经网络产生的功能:

显示[Plot[net[n,1 },{n,1,15 },列表图[表[mod[n^2,5,{n,1,15 },绘图样式->红色]]

以下是培训过程中发生的情况。神经网络有效地“试用”各种各样的可能性,最后确定结果如下:

机器学习动画

结果在什么意义上“正确”?好,它符合培训示例,这就是我们所能要求的。因为这就是我们输入的全部信息。如何“插入”在培训的例子中,真正的是它自己的事情。我们希望它学会“概括”从它给出的数据中,但它不能从这里给出的几个点中,推断出数据的整体分布,所以它所做的平滑插值和任何事情都一样好。

在培训价值范围之外,神经网络做的似乎是相当随机的事情,但再一次,没有“正确答案”所以我们不能真的责怪它:

图[网] {1 },{n,- 5,25 }

但事实上,由于原始神经网络的任意性和混乱性,我们能够成功地训练它是相当了不起的。实际上,我们所说的神经网络已经研究了60多年,但直到现代的“深度学习革命”为止。没有人知道培训他们解决实际问题是可行的。

但现在,尤其是我们现在在WordFrm语言中所做的一切,任何人都很容易做到。

有那么多要探索的

现代机器学习是一种全新的学习方式,所以很多显而易见的实验都还没有尝试过。但是有了我们整个Wolfram语言设置,即使是中学生也能做很多事情。例如(我承认我在写这篇文章的时候对此很好奇):人们可以问我们正在研究的微型神经网络能学到多少东西。

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

listlineplot[表[字符串长度[罗马数字]{n,60 } ]

经过少量的训练,以下是网络成功复制的内容:

网络列车表[{n,1->字符串长度[罗马数字[N]],{n,60 } ];
图[%] {n,1 },{n,1,60 }

也许有人会认为这是最好的选择。但我很好奇它是否最终能做得更好,所以我让它在我的电脑上运行了2分钟。这是一个相当好的结果:

网络列车表[{n,1->字符串长度[罗马数字[N]],{n,60 },最大培训轮数->数量[2,

图[%] {n,1 },{n,1,60 }

我想我能理解为什么这个特殊的东西是这样工作的。但对我来说,最令人兴奋的一点是,这一领域的总体开放程度,以及现在探索这一领域是多么容易。

对,有很多技术细节,一些基本的,有些肤浅。但超越所有这些,有直觉需要培养。这是一个可以很好地从中学生开始的事情…

评论.显示全部

  1. 我比一个普通的中学生大很多,但我非常喜欢这个职位,的确!这是我深入研究机器学习问题的一个很好的开始。继续,史蒂芬!

    帕维尔德沃夏克
隐藏注释»金宝博188

史蒂金宝博188正网芬·沃尔弗拉姆有限责任公司 条款γ RSS