饺子中的人工智能(上)

如果一个人比别人付出更多的辛劳却收入微薄,是不是社会的不公平?

舌尖上的中国 第二季 脚步

你也许会同情他们甚至感到悲痛,我会。

但不是所有人都会。时代则绝对不会。

所以还等什么?

1. 人工智能再次兴起的理由

非常宽泛地说,所谓人工智能,就是用机械来实现人脑的部分智力活动的话,早在1940年左右Alan Turing提出图灵机构想的时候人工智能就已经诞生。不过最早的有意识地进行的用计算机模仿人类智力的研究,应该是1959年在Dartmouth大学中,一些来自MIT和IBM的科研人员受到国防部的资助进行一些用计算机代替人脑的尝试。当时的程序由研究人员事先进行编写,随后可以根据既定的逻辑法则进行自动的选择,进而实现了一些诸如解图形迷题甚至是下国际象棋的功能(国际象棋的变化相对于围棋来说要少的多,同时当时的程序也没有非常高的胜率)。然而这样的一种智能,仅仅停留在由人类对其进行编纂,然后自动执行的程度,从根本上不能脱离人的编程,所以在应用维度上非常有限;同时受制于当时计算机性能的原因,最终并没有取得在产业界广泛的应用。由于对人工智能研究的投入迟迟不见回报,在随后的十几年中,政府对人工智能的投资也大大削减,这段1970-1980年的时期也被称作“AI Winter”

第二次的人工智能热潮开始于1980年后,Stanford大学的研究人员开发了称为Expert system的人工智能,这种系统首先需要使用者将某些专门(Expert)知识进行整理输入,然后制定一些基本的决策规则(比如:如果A就选择B),随后就可以自动地对新的问题进行分析和决策。这种机器超越之前的所谓人工智能的原因,是因为它一定程度上摆脱了人类,通过基于现有规则对知识库进行探索,有能力自动地发现一些使用者本身并不知道的事实。有数据表明,当时的世界500强企业中有2/3导入了这种专家系统来帮助企业决策。然而,当面对复杂问题的时候,机器就会需要越来越庞大的知识库,并且可能需要一些新的规则来帮助决策。最终,由于整理出一个可以解决真正实际复杂问题所需要的知识库和规则系统的难度,大大超过了这个系统可以探索出的结论本身的价值,这一次的人工智能热潮也在1990年左右再次衰退。

Expert system的概念模型(https://en.wikipedia.org/wiki/Expert_system)

我们现在正在经历的人工智能热潮起源于2000年以后,其中成为重要牵引力量的则是人工智能的一个分支:机械学习。机械学习,指的是让计算机基于一定的数据,自动地认知或者学习,如何完成一项任务。例如图像识别,就是让计算机首先“学习”大量的已知图片,从而使其有能力对没有见过的图片进行分类(识别)。又比如在ios中出现的语音助手Siri,就是对人的声音进行识别,而后对识别出的信息进行处理,反馈给用户进行人机互动。所以从本质来说,第三次人工智能热潮的核心,并不同于之前的两次爆发对于“智能”的追求,而在于赋予计算机“识别”或者说“认知”的能力。

现在这里有两个重要的问题:

1.“识别”或者“认知”听上去并不是什么高大上的“智能”,实现识别功能的意义有多大?

2.为什么直到最近这才再次引发关注?以前没有人做过同样的事吗?

第一个问题的回答需要结合对机械学习的基本认知和行业背景才会更加深刻,所以准备放在本文第二篇中进行,现在先考虑第二个问题。

就像你所想象的一样,利用计算机来识别物理世界的事像这个功能不可能是最近才有人想到,机械学习在最近再次引发关注,是一些背景因素综合影响的结果。排除人为或者非技术问题,其中在技术方面的因素主要包括:

1.后因特网时代的大数据爆炸

2.计算机计算能力的提高

3.机械学习领域本身的技术突破

机械学习的血液,就是大量的数字化数据,唯有基于大量的数字化数据,机械学习才可以进行识别和判断并发挥作用。在智能手机普及以前的2000年左右,整个因特网所涵盖的数据量还比较有限,特别是终端用户的信息,并不足以让机械学习发挥巨大的作用。然而在2010年以后,大量的智能设备进入实用阶段,2015年全世界接入因特网的电子设备总数来到了150亿台(https://www.statista.com/statistics/471264/iot-number-of-connected-devices-worldwide/),这些大量的电子设备开始提供前所未有的基础数据,使得对终端用户的分析和掌握变成了可能。

接入因特网设备的数量(https://www.statista.com/statistics/471264/iot-number-of-connected-devices-worldwide/)

同时,计算机的计算性能也在一刻不停地提高,现在的个人电脑运算能力已经可以轻松超过数十年前超级计算中心。不仅如此,在第三次人工智能热潮中起到重要推动作用的,是GPGPU的诞生和机械学习在GPGPU上的成功实现。GPU原本作为图像运算的组件在计算机中被应用,由于其高速的处理性能,在2000年左右开始有研究者尝试用GPU进行科学运算。但是当时的GPU并没有对浮点运算进行支持,研究者的尝试仅仅停留在了科研的层面。随后GPU厂商ATI和Nvidia关注到这一动向,开始开发专门面向科学计算的GPU单元,称之为GPGPU(General-purpose computing on Graphic Grocessing Unit),使得GPU运算的开发变得更加热门。2012年,Google Brain和Stanford大学的研究团队利用其保有的由1000台高性能电脑组成的计算机对1000万枚图像数据进行长达3天的学习,成功训练出了一套可以由图像识别出物体的系统。之后Stanford大学的Andrew Ng.(吴恩达)成功地将算法移植到GPU上实现,使用12张GPU显卡,获得了和Google Brain具有同等的学习能力的系统。这一突破使得机械学习的效率大大提高而成本大大降低,从而进一步推进了机械学习应用的可能性。

最后,是机械学习领域本身技术上获得了一系列较为重大的突破。其中最为主要的是对神经网络算法的实现和提高。神经网络(Neural network),是机械学习中的手法之一。其主要概念为,通过称为神经元(Neuron)的计算单元,可以对输入的数据进行线性组合计算,然后输出一个结果值。例如,把一张图像的所有像素灰度值,排列成一个一维向量,通过对这些灰度值的线性运算,神经元将输出一个计算机的识别结果。这些神经元可以互相连接,把其他神经元的输出做为输入,进行反复的抽象计算。神经网络算法本身,并不是最近才产生的概念,然而在早期的神经网络计算中,将输入数据进行处理神经元只有一层,这种手法的识别效率较低,或者需要输入巨大的特征向量来进行处理,否则就无法获得高精度的结果。2006年在Toronto大学的Hinton教授提出了一种多层的神经网络结构,在输入和输出层之间建立多层的中间层,并利用Backpropagation的算法成功实现了高精度的学习。借由这种结构,神经网络实现了由较少的运算量实现极高识别精度,使得神经网络的实用程度大大提高。这种多层的神经网络结构,也就是现在深度学习(Deep learning)中“深度”一词的由来。

现在你开始觉得对第三次人工智能热潮有了一定的理解,但是对于上述三点理由,可能还是缺乏切身实际的体会,所以在展望人工智能在产业中的应用之前,有必要先对机械学习和神经网络算法进行概括性的了解。

2. 从线性回归到神经网络

线性回归

假设我们现在手上有一组已知的数据(i代表数据的序号,不是指数),其中代表一个人每周加班的时间,代表此人的年收入。我们希望可以设计一种会“学习”的程序,只要输入这些数据点,就可以掌握此种数据的变化趋势,从而可以基于加班时间x来猜测某个未知者的年薪y。 由于数据点在XY平面上呈现较为典型的线性分布,所以所谓掌握数据的变化趋势,也就是找到一条直线,可以最大程度的贴近所有的数据点。

线性回归

为了找到这样一条直线,任务就是找到一组合理的,首先需要定义一个目标,来判断什么是一个“好”的直线。非常直接的想法就是,现有所有的数据点距离直线越近,那这条直线预测就越好,为了包含所有的数据点,我们需要对所有点进行求和:

这里的称作Cost function,用来衡量一条以为参数的直线距离所有的数据点有多远,称为Hypothesis,也就是对y的预测值。其中为了避免正负抵消所以对所有距离进行了平方,并将总和进行了平均。比如对这个点,预测值为,而实际值为,他们之间的距离就成为了Cost中的一部分。显然,这个Cost的总和越小,也就代表直线和所有点之间的距离越近,作为Hypothesis就越合理。

为了找到一条使得最小的直线,现在需要对的选择进行探索。

线性回归的参数探索

尝试变化,直线将上下移动,且很明显存在一个最佳值,过大或过小都会使直线远离数据点群;同样地,变化发现直线的斜率发生变化,且同样存在最佳值。事实上,如果将绘制成的函数可以发现,是一个凹面,在某个位置存在最小值。

Cost function的图形解释

为了找到这个最小值,可以首先任意选取一组作为出发点,随后计算曲面对参数的导数,也就是找到曲面下降的方向,沿路一直前进即可找到最小值的位置。

整理上述过程的模型,我们通过对一组二维数据进行“学习”(线性回归探索),找到了一组,由此掌握了数据的变化趋势。现在只要对这组参数印加任何一个输入值x,都可以输出一个对应的预测值y。

线性回归的模型

逻辑回归

利用看似只是一个简单拟合的线性回归模型,只要做微小的修改,就可以把“拟合”变成一种“判断”。观察上图中的模型,对于新的输入x,线性回归输出的是一个实数y,现在如果通过修改使得输出不再是连续的实数y,而是一个二元值0或者1,那么就实现了基于一个输入x的“判断”:是或者否。想象一个例子,我们运营一个社交软件的网站,从网站的运行数据中可以得出每个用户的在线时间,且我们拥有部分用户的职业信息,部分用户是学生而部分用户不是学生。假设用户存在某种趋势,即学生比非学生花更多的时间在社交软件上,那么是否可以通过“学习”已有的用户数据,来猜测那些没有提供职业信息的用户是不是学生?

为完成此模型需要修改Hypothesis使得其输出介于0和1之间。线性回归中,对输入x的预测值是遍布实数域的一条直线,现给这个函数穿上一层外套:

原本的输出y就被印射到了新的区间之间,这里的g(x)叫做Sigmoid function。输出的y可以代表一个概率,y越接近1,就代表判断结果越趋向于“真”,而接近0则代表“伪”。

Sigmoid function

现在重复类似线性回归中的步骤,对每一个现有的数据,计算Hypothesis和实际值之间的差距(事实上需要一个和线性回归不同的Cost function,但是这里为保持简洁故省略。可以参考这里)。注意现在我们的数据只可能是0或者1。结果通过和线性回归类似的最小Cost探索,将再次找到一组参数,使得Hypothesis和实际数据的差距最小。此时,Hypothesis就是我们学习获得的模型,它将输出一个介于0到1之间的数,代表对输入x,其是学生或者不是学生的概率有多大。

逻辑回归的模型

总结逻辑回归的过程,即对现有的数据进行“学习”,获得一组参数,利用这组参数,可以对新的输入x进行一个猜测,判断其y是0或者1的可能性有多大。

神经网络

只有一个输入参数的回归是单薄且不切合实际的,我们需要更加复杂更加合理的判断。幸运的是,非常类似的模型和手法就可以做到。想象现在把输入的变量从一个增加到两个,比如在线时间和用户年龄,相应地,Hypothesis也变成一个二元函数。此时,外套g中的函数不再是平面上的一条直线,而变成了三维空间中的一个平面。但是前面所叙述的基本过程和模型依然适用,不同的只是现在学习的数据增加了一个维度,参数也从两个变成了3个。利用相似的Cost function,依然可以计算Hypothesis距离真实数据的距离,而后通过寻找最小值,我们又将获得一组参数

多变量逻辑回归的模型

类似的,我们可以迅速地把输入的数据维度提高到n维,使得模型可以对一个n维数据作出判断。但是这有什么用呢?

妙蛙种子

也许你已经有了想法,但是现在是时候去休息一下吃个鸡了。。。

To be continued …

Written on June 10, 2018