人工智能(英语:Artificial Intelligence,缩写为AI),就是研究如何使计算机去做过去只有人才能做的智能工作,模仿人的感知、认知、学习、决策的过程。感知是通过机器的信息输入设备或传感器获取外部的信息,例如摄像头获取图像信息,认知是根据过去积累的经验(数据),识别所感知的信息,学习是对认知的信息分析、补充完善并得出结论,就像人的大脑,决策是根据得到结论指导机器的行为,例如指导机器的动作,展示决策信息等。
人工智能的研究方向和应用领域主要有机器学习、概率推理、机器人技术、计算机视觉和自然语言处理,实现让机器具有“自我学习”和“解决问题”能力,变得越来越‘聪明’。
1机器学习
机器学习人工智能的重点,也是让机器变聪明的关键。机器学习的实现技术是用一系列数学算法模型识别、发现并提取外部事物的特征数据并归纳存储,为机器日后识别该外部事物并做出决策所用。这个过程的第一步是利用实验数据供预设的算法模型收集、分析、评估和标注,提炼成更加符合预期的数据,供机器使用,即所谓的‘数据训练’。基本处理流程如下:
训练数据的过程就是机器学习的过程,可能是一个比较长期的过程。数据训练好之后,机器就可以使用这些数据预测结果了,如图:
预测结果可以是精准结果,也可以是统计结果,这要看使用哪一种学习方法和任务要求。为进一步说明,我们先准备一组水果的实验数据来举例说明机器学习的3种主要方法:
1.1监督学习
监督学习(supervised learning)是一种目的明确的数据训练方式,你知道得到的是什么。方法是模型对实验数据打上‘标签’,并设定一个期望值(也称‘监督信号’),让机器识别标签尽量准确。例如对于苹果这个标签,如果期望值设置为100%,那么就要求新产生的训练数据可能不止只有果皮-球形-大小的特征信息,更多的特征信息最终描述苹果的准确率要达到100%。
1.2无监督学习
无监督学习(unsupervised learning)则是没有明确目标值(标签)的训练方式,无法提前知道结果是什么。方法是分析所获取的数据特征,发现数据间的内在联系和相似性,从而对数据分类并识别。无监督学习使用的是无标签数据,例如上述的实验数据就没有‘苹果’的目标值,无监督学习方法是发现苹果所具备的特征值并产生一个相应的数据分类,当下次再看到满足苹果特征值的事物后,机器便进行自我学习和归纳,找到其所属的分类,以达到同类事物特征非常接近,不同类事物特征相距很远的结果。一句话概括就是:给定数据,寻找隐藏的结构。
1.3强化学习
也称增强学习aireinforcement learning),最典型的应用就是‘走迷宫’。基本的增强学习由行动模块和评估模块组成,行动模块获得环境数据并反馈给评估模块,让它分析历史数据(使用‘奖惩函数’)产生一个‘强化信号’告诉行动模块下一步的行动。例如当一个机器人获取到它所处的环境信息后,评估模块通过数据分析后让机器人前进,结果撞墙了,评估模块就会提取‘墙’的数据特征并记录,然后让机器人向右行走,这样循化反复,直到机器人走出迷宫。训练完成后,机器人再进入这个迷宫,就可以毫不费力一次走出。强化学习使用的也是无标签数据。不难看出,人工智能的核心是机器学习,机器学习的关键是‘训练数据’。
1.4深度学习
上述的监督学习、无监督学习、增强学习是实现机器学习的方法,而深度学习就是实现机器学习的技术,之间的关系如下图:
深度学习的动机在于建立、模拟人脑进行分析学习的人工神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。
2人工神经网络
模仿人脑学习的人工神经网络按分类有三种:前馈神经网络、反馈神经网络、图网络,结构分别如下:
2.1前馈神经网络(图(a)):
图中园点是网络中的‘神经元’,每一个‘神经元’都能接收不同的数据加以处理和记忆,并将加工后的数据结果输出。神经元之间也有相互连接,这种连接的强度或幅度,称为神经元权重’。
把每个神经元按接收信息的先后分为不同的组,称为‘神经层’,如图中的一列神经元就是一层。由多个神经元组成的神经层可以同时接受上一层的数据的信息,经过数据处理后过滤掉异常值,辨认出熟悉的实体,并输出到下一层神经元。
当初始数据穿过全部神经层后,数据被优化为最终的结果输出。
2.2反馈神经网络(图(b)):
反馈神经网络中神经元不但可以接收其他神经元的信号,而且可以接收自己的反馈信号。和前馈神经网络相比,反馈神经网络中的神经元具有记忆功能,在不同时刻具有不同的状态。反馈神经网络中的数据传播可以是单向也可以是双向传播。
上述两种分层的神经网络也统称为卷积神经网络(CNN)。
CNN是通过每个神经层来优化性能和训练数据的,所产生的细胞层的数量称为‘梯度’,原理上数据经过的层数越多就越准确,但层数多了就可能出现下面的问题:
梯度消失:当数据经过细胞层处理后,输出的数据不是向预期结果靠近(收敛),导致下一个细胞层无法获取正确的数据而停止工作,这种现象的术语称为‘梯度消失’。
梯度爆炸:与‘梯度消失’情况刚好相反,细胞层收到的数据和处理后的数据没有太大的不同,导致所产生的下一个细胞层继续同样的工作,循环往复,没完没了,这种现象的术语称为‘梯度爆炸’。
网络退化:还有一种可能,CNN经过反复训练达到了最优,但随着细胞层数的增加,网络性能反而下降,这就是‘网络退化’现象。
2.3图网络(图(c))
前两种神经网络的数据流动是有方向的,但实际应用中很多数据都是图结构的数据,比如知识图谱、社交网络和分子网络等。图网络是定义在图结构数据上的神经网络,图中每个结点都由一个或者一组神经元组成。结点之前的连接可以是有向的,也可以是无向的。每个结点可以收到来自相邻结点或自身的信息。
神经网络实际上是一个采用多个神经元分步筛选、优化数据,求得预期结果数据的过程,适用于有监督和无监督的数据训练,可以广泛适用各种应用场景。与传统的机器学习相比,有如下优点:
(1)可以充分逼近任意复杂的非线性关系;
(2)所有定量或定性的信息都等势分布贮存于网络内的各神经元,故有很强的生存能力和容错性;
(3)具有高速寻找优化解的能力。采用并行分布处理方法,使得快速进行大量运算成为可能;
(4)具有联想存储功能,可学习和自适应不知道或不确定的系统;能够同时处理定量、定性知识。
机器学习所产生的训练数据有些也需要人工标注,特别对卷积神经网络(CNN),以求数据训练更加准确有效。
3深度学习的程序框架
深度学习在计算机实现上,有许多程序框架,最常用的是Google的Tensor Flow(2015年发布)和Facebook的PyTorch,后者2017年面世,是一种新的深度学习编程框架。两种都能使用人工神经网络训练数据,实现人工智能程序的编写,但Tensor Flow在大数据运算方面性能更出色一些,特别是在Android系统环境下;Pytorch则更简单易学一些,用在学术科研方面多一点。下图是深度学习框架的市场占有情况和2019年增长速度情况:
4训练模型
4.1EfficientNet系列模型
深度学习根据目标任务的不同,要使用各种训练模型来训练数据,比较著名的是谷歌的EfficientNet系列模型,训练后的数据准确率最高。这个模型谷歌的TensorFlow框架当然能用,最近也开放给Pytorch使用了。
4.2ResNet网络(Residual Neural Network)
这是一个著名的基于卷积神经网络(CNN)的训练模型,具有消除CNN存在的梯度消失、梯度爆炸和网络退化的能力,其基本原理是评估神经层输入值和数据处理结果的差别(残差项),如果发现变化不大或是与预期相反,那这个神经层就被认定为多余的层(weightlayer‘冗余层’),以后就跳过不用(不激活‘relu’)。
简单的数学表达就是:h(x)=F(x)+x
h(x)是输入数据x的表达函数,F(x)是计算后残差项。
当F(x)=0时,h(x)=x,表明这个神经层没干什么好事,是冗余层。
下图就是基本工作原理,数据x发现冗余层后不去激活(relu),而直接跳去有使用
价值的层激活。
5目标检测
就是机器‘感知’部分的实现,作用是对目标物体认识,提取它的特征信息。内容包括物体信息的分割、识别、检测和跟踪。对于卷积神经网络(CNN),常用的是目标检测技术anchor free。
5.1图像分割
主要目的是将获取到的图像信息(像素)按不同的方法分割成机器可以识别的标签信息,例如人、车、马路等。与深度学习框架Tensor Flow结合较好的是谷歌的图像分割模型DeepLab-v3+。
6Python语言
谈了那么多人工智能的概念,在计算机上实现,就要靠计算机语言来组织这些功能实现预期的目的了,这就是软件编程。计算机语言是一种编程工具,每一种语言都有它的应用目的和使用场景,例如JAVA,它的诞生和应用是基于互联网应用软件开发的。而目前在人工智能软件开发领域,最适合的软件开发工具是C++和Python语言。C++面向计算机硬件设备的编译语言,比较靠近机器语言,但太难学了,现在主要用于与计算机硬件设备打交道或是复杂计算的功能模块的实现,例如人工智能领域中很多功能模块(库函数)就是用C++编写的。C++具有运行速度快的特点,但用它完成大规模的应用对程序员的要求太高,开发效率不高,程序的修改和维护都不容易。
Python由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。Python是一种面向对象的解释型计算机程序设计语言,也称脚本语言,写好了就可以直接运行,省去了编译链接的麻烦。
Python具有如下的特点:
简单明确,学习容易。Python是一种相当高级的语言,对于初学者学,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。比如,完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。
资源丰富,使用方便。除本身非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,还有大量的第三方代码库,比如人工智能深度学习所需要的程序框架和功能模块,Python能够很轻松的将这些用其他语言开发(尤其是C/C++)的各种模块轻松的组合起来,完成任务的需要,故此被昵称为胶水语言。
跨平台运行。Python所编写的程序可以不加修改的跨平台使用,例如在Windows系统上开发的Python程序,可以直接在Linux或是Android系统的设备上运行。
坚固可靠,可扩展,开源。很明显这些对于人工智能应用来说都是非常重要的因素。
Python借助AI和数据科学,目前已经攀爬到了编程语言生态链的顶级位置,可以说,Python基本上与AI已经紧密捆绑在了一起了。除此之外,Python也在数学计算、图像处理、语音文字识别、多媒体应用、甚至网络编程领域发挥着越来越重要的作用,2019年开始,Python已超越JAVA成为全球排名第一的最流行的计算机语言,而Python的开发人员目前也成为薪资最高的软件开发人员,尤其在数据科学,机器学习和Web开发领域。
如何学习Python语言
掌握Python语言不难,但精通、特别是解决人工智能方面的问题也不容易。因为围绕人工智能而开发的程序太多,新的概念和方法不断涌现,这就需要不断的学习和实践才能掌握。如果想成为一个从事人工智能领域的Python开发人员,建议分三步学习:
(1)Python语言基础
学习目标是掌握Python语言的语法结构、人机交互、数据处理方法和库函数的使用方法,至少能掌握数据获取、数据图表设计、图像处理分类和简单的图片识别技术,可以完整的编写应用程序,应用在人脸识别和数据计算、分析统计等工作中。
(2)Python语言精通
学习内容是Python语言在人工智能领域的开发技术,需要掌握人工智能的机器学习、深度学习的原理和应用方法、包括机器学习的一些基本模型和使用方法,如基础数学、图像处理等;先选择一个稍微简单些的深度学习框架(例如PyTouch),了解工作原理及应用范围,掌握程序架构及模型部署的编程技术,可以使用卷积神经网络的优化算法和数据增强方法训练数据,目标是可以编写目标检测、图像分割和模型识别方面的人工智能应用程序。
(3)人工智能核心技术及实践
学习内容包括深度学习框架TensorFlow,残差卷积神经网络ResNet,目标检测技术anchor free,图像分割技术DeepLab-v3+等,基本覆盖了一个完整的人工智能项目所需要的核心技术。参照实际应用的案例(比方说自动驾驶),了解实际的程序架构,编写关键程序模块并检测效果。学习目的是深入学习人工智能的核心技术,结合人工智能应用的高级项目进行实践,形成开发经验,达到人工智能专业软件开发工程师的水平,可以独立的胜任与人工智能相关的开发工作。