人工智能时代的计算机程序设计教学探讨
2018-06-05牟伦田
牟伦田
摘 要 本文介绍了人工智能时代的机器学习与大数据背景,分析了各种人工智能语言的特点,以此为基础,提出了人工智能时代开展计算机程序设计教学工作的几点建议。希望本文对于高校的计算机程序设计教学与时俱进的发展起到抛砖引玉的作用。
关键词 人工智能 人工智能时代 机器学习 大数据 计算机程序设计
中图分类号:G424 文献标识码:A DOI:10.16400/j.cnki.kjdkx.2018.01.048
Computer Program Design Teaching in the Age of Artificial Intelligence
MOU Luntian
(Beijing University of Technology, College of Metropolitan Transportation, Beijing 100124)
Abstract This paper introduces the background of machine learning and big data in the era of artificial intelligence, and analyzes the characteristics of various artificial intelligence languages. Based on this, some suggestions are put forward to carry out computer programming in artificial intelligence. The author hopes this article is helpful to the development of computer programming in universities and advancing with the times.
Keywords artificial intelligence; the Age of Artificial Intelligence; machine learning; big data; computer program design
高性能計算与大数据的高速发展为机器学习尤其是深度学习提供了强大的引擎。自2006年取得突破以来,深度学习一直长驱直入,在图像分类与语音识别领域取得了骄人的成绩,在图像识别上甚至超过了人眼识别的准确率。[1]尤其是2016年Google研发的机器人AlphaGo击败世界围棋冠军李世石,使人工智能在经历了两次寒冬之后再次复苏并以极其强劲的态势进入大众的视野。事实上,人工智能正在全面进入人类生产和生活的方方面面,成为继互联网之后第四次工业革命的推动力量。人类正在进入人工智能时代,人工智能正在成为这个时代的基础设施。人脸识别、自动驾驶、聊天机器人、工业和家居机器人、股票推荐,人工智能的产业应用正在遍地开花。[2]显而易见,无论对计算机专业还是其他专业的大学生,了解人工智能、甚至学习开发人工智能应用都是有必要的。那么,人工智能时代的内涵是什么?有哪些人工智能编程语言?在程序设计教学上应该做哪些调整?希望抛砖引玉,促进计算机程序设计教学改革,培养出更加适应人工智能时代要求的大学生。
1 人工智能时代的计算机程序设计背景
人工智能(Artificial Intelligence,AI),是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,该领域的研究包括机器人、语音识别、图像识别、自然语言处理和专家系统等。[3]当前人工智能的快速发展主要依赖于两大要素:机器学习与大数据。也就是说,在大数据上开展机器学习是实现人工智能的主要方法。而计算机程序设计可视为算法+数据结构。通过简单的将机器学习映射到算法、将大数据映射到数据结构,我们可以理解人工智能与计算机程序设计之间存在一定程度上的对应关系。人工智能离不开计算机程序设计。要弄清人工智能时代对计算机程序设计的新需求,需要首先对机器学习和大数据有一定的认识。
机器学习(Machine Learning, ML)是一门研究计算机怎样模拟或实现人类的学习行为以获取新的知识或技能的多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。机器学习是人工智能的核心,包括了很多方法,比如线性模型(Linear model)、决策树(Decision tree)、神经网络(Neural networks)、支持向量机(Support Vector Machine)、贝叶斯分类器(Bayesian classifier)、集成学习(Ensemble learning)、聚类(clustering)、度量学习(Metric learning)、稀疏学习(Sparse learning)、概率图模型(Probabilistic graph model)和强化学习(Reinforcement learning)等。[4]其中大部分方法都是数据驱动的(data-driven),都是通过学习获得数据不同抽象层次的表达,以利于更好的理解和分析数据、挖掘数据隐藏的结构和关系。
深度学习(Deep Learning)是机器学习的一个分支,由神经网络发展而来,一般特指学习高层数的网络结构。深度学习也包括各种不同的模型,比如深度信念网络(Deep Belief Network,DBN)、自编码器(AutoEncoder)、卷积神经网络(Convolutional Neural Network, CNN)、循环神经网络(Recurrent Neural Network, RNN)等。深度学习是目前主流的机器学习方法,在图像分类与识别、语音识别等领域都比其他方法表现优异。[5]
作为机器学习的原料,大数据(Big data)的“大”通常体现在三个方面,即数据量(Volume)、数据到达的速度(Velocity)和数据类别(Variety)。数据量大既可以体现为数据的维度高,也可以体现为数据的个数多。对于数据高速到达的情况,需要对应的算法或者系统能够有效处理。而多源的、非结构化、多模态等不同类别特点也对大数据的处理方法带来了挑战。可见,大数据不同于海量数据。在大数据上开展机器学习,可以挖掘出隐藏的有价值的数据关联关系。
对于机器学习中涉及的大量具有一定通用性的算法,需要机器学习专业人士将其封装为软件包,以供各应用领域的研发人员直接调用或在其基础上进行扩展。大数据之上的机器学习意味着很大的计算量。以深度学习为例,需要训练的深度神经网络其层次可以达到上千层、节点间的联结权值可以达到上亿个。为了提高训练和测试的效率,使机器学习能够应用于实际场景中,高性能、并行、分布式计算系统是必然的选择。可以采用软件平台如Hadoop MapReduce或Spark,或者采用硬件平台如GPU(Graphics Processing Unit,图形处理器)或FPGA(Field-Programmable Gate Array,即现场可编程门阵列)。
2 人工智能时代的计算机程序设计语言
人工智能时代的编程自然以人工智能研究和开发人工智能应用为主要目的。很多编程语言都可以用于人工智能开发,很难说人工智能必须用哪一种语言来开发,但并不是每种编程语言都能够为开发人员节省时间及精力。Python [6]由于简单易用,是人工智能领域中使用最广泛的编程语言之一,它可以无缝地与数据结构和其他常用的AI算法一起使用。Python之所以适合AI项目,其实也是基于Python的很多有用的庫都可以在AI中使用。一位Python程序员给出了学习Python的7个理由:(1)Python易于学习。作为脚本语言,Python语言语法简单、接近自然语言,因此可读性好,尤其适合作为计算机程序设计的入门语言。(2)Python能够用于快速Web应用开发。(3)Python驱动创业公司成功。支持从创意到实现的快速迭代。(4)Python程序员可获得高薪。高薪反映了市场需求。(5)Python助力网络安全。Python支持快速实验。(6)Python是AI和机器学习的未来。Python提供了数值计算引擎(如NumPy和SciPy)和机器学习功能库(如scikit-learn,Keras和TensorFlow),可以很方便地支持机器学习和数据分析。(7)不做只会一招半式的码农。多会一门语言,机会更多。
Java也是AI项目的一个很好的选择。它是一种面向对象的编程语言,专注于提供AI项目上所需的所有高级功能,它是可移植的,并且提供了内置的垃圾回收。另外Java社区可以帮助开发人员随时随地查询和解决遇到的问题。LISP因其出色的原型设计能力和对符号表达式的支持在AI领域占据一席之地。LISP是专为人工智能符号处理设计的语言,也是第一个声明式系内的函数式程序设计语言。Prolog与LISP在可用性方面旗鼓相当,据《Prolog Programming for Artificial Intelligence》一文介绍,Prolog是一种逻辑编程语言,主要是对一些基本机制进行编程,对于AI编程十分有效,例如它提供模式匹配、自动回溯和基于树的数据结构化机制。结合这些机制可以为AI项目提供一个灵活的框架。C++是速度最快的面向对象编程语言,这对于AI项目是非常有用的,例如,搜索引擎可以广泛使用C++。
其实为AI项目选择编程语言,很大程度上都取决于AI子领域。在这些编程语言中,Python因为适用于大多数AI子领域,所以逐渐成为AI编程语言的首选。Lisp和Prolog因其独特的功能,在部分AI项目中卓有成效,地位暂时难以撼动。而Java和C++的自身优势也将在AI项目中继续保持。
3 人工智能时代的计算机程序设计教学
那么人工智能时代的计算机程序设计教学在高校应该如何开展呢?下面给出一些初步的思考,供大家讨论并批评指正:
3.1 入门语言
入门语言应该容易学习,可以轻松上手,既能传递计算机程序设计的基本思想,也能培养学生对编程的兴趣。C语言是传统的计算机编程入门语言。但学生学得并不轻松,不少同学学完C语言既不会运用,也没有兴趣。有的非计算机专业的本科生甚至因为C语言对计算机编程产生畏惧心理。因此,宜将Python作为入门语言,让同学们轻松入门并快速进入应用开发。有了Python这个基础,再学习面向对象程序设计语言C++或JAVA,应该可以触类旁通。
3.2 数据结构与算法
如前文所述,初略可以认为计算机程序设计=数据结构+算法。因此在学习编程语言的同时或之后,宜选用与入门语言对应的教材。比如入门语言选Python的话,数据结构与算法的教材最好也是Python描述。
3.3 编程环境
首先编程环境要尽量友好,简单易用,所见即所得,无需进行大量繁琐的环境配置工作。对于学生而言,像JAVA那样需要做大量环境配置,不是一件容易的事。其次编程环境要集成度高,一个环境下可以完成整个编程周期的所有工作。再次编程环境要能够提供跨平台和多编程语言支持。最后编程环境应提供大量常用的开发包支持。Anaconda [7]就是这样的一个编程环境,它拥有超过450万用户和超过1000个数据科学的软件开发包。Anaconda以Python为核心,提供了Jupyter Notebook这样功能强大的交互式文档工具,代码及其运行结果、文本注释、公式、绘图都可以包含在一个文档里,而且还可以随时擦写更新。GitHub上有很多有趣的开源Jupyter Notebook项目示例,[8]可供大家学习Python时参考。
3.4 案例教学
传统的计算机程序设计教材和课堂教学过多偏重介绍编程语言的语法,既使课堂陷入枯燥,又让学生找不到感觉。因此,提倡案例教学,即教师在课堂上尽可能结合实际项目来开展教学。教学案例既可以是来自教师自己的研发项目,也可以是来自网络的开源项目。案例教学的好处在于,学生容易理论联系实际,缩短课本与实际研发的距离。
3.5 大作业
实验上机除了常规的基本知识的操作练习外,还应安排至少一个大作业。大作业可以是小组(比如3名同学)共同完成。这样不但可以锻炼学生学习致用的能力、提升学生学习的成就感,还以让学生的团队精神和管理能力得到提高。可谓一举多得。大作业的任务应该尽可能来自各领域的实际问题和需求,如果能拿到实际数据更好。
综上,人工智能时代的新需求要求我们探索计算机程序设计的新的教学内容和教学形式。唯有与时俱进、不断创新,才能使高校的计算机程序设计教学达到更好的教学效果,才能培养出适应各行各业新需求的研发人才。 (下转第134页)(上接第107页)
参考文献
[1] LeCun, Y., Bengio, Y. and Hinton, G. E. Deep Learning, Nature, Vol. 521, pp 436-444, 2015.
[2] 杰瑞·卡普兰.人工智能时代.浙江人民出版社,2016.
[3] 周志华.机器学习.清华大学出版社,2016.
[4] Ian Goodfellow and Yoshua Bengio and Aaron Courville, Deep Learning, MIT Press, 2016.
[5] Python, https://www.python.org/.
[6] Anaconda, https://www.continuum.io/anaconda-overview
[7] Jupyter Notebook, https://github.com/jupyter/jupyter/wiki/A- gallery- of-interesting- Jupyter-Notebooks