专栏名称: 人工智能与大数据技术
分享大数据、云计算、人工智能等高科技先进技术
目录
相关文章推荐
数据派THU  ·  【NeurIPS2024】用于缺失值数据集的 ... ·  昨天  
数据法盟  ·  我国将健全企业数据收益分配机制 ·  16 小时前  
数据法盟  ·  我国将健全企业数据收益分配机制 ·  16 小时前  
IDC咨询  ·  发展不及预期,GenAI+Data市场趋势分 ... ·  3 天前  
IDC咨询  ·  发展不及预期,GenAI+Data市场趋势分 ... ·  3 天前  
51好读  ›  专栏  ›  人工智能与大数据技术

它将AlphaGo带到世界,走上机器学习框架主流之路

人工智能与大数据技术  · 公众号  · 大数据  · 2017-05-22 11:41

正文

来自:异步图书(微信号:ptpressitbooks)

本文节选自李嘉璇作品《TensorFlow技术解析与实战》


有人说,人工智能在世界范围的流行,是因为那盘围棋。2016 年 3 月,谷歌公司的AlphaGo向韩国棋院围棋九段大师李世石发起挑战,而这棋局走法的可能性有 361!种,最终AlphaGo战胜了这场“棋局数比可见宇宙中的原子数还多”的智力游戏。2015 年 11 月 9 日(在距这场比赛前 4 个月),谷歌公司开源了它的第二代深度学习系统TensorFlow,也就是AlphaGo的基础程序。人工智能相信大家早就耳熟能详了,那今天我们就从深度学习开始了解TensorFlow究竟是何物。


什么是深度学习


深度学习,顾名思义,需要从“深度”和“学习”两方面来谈。

01

深度

深度学习的前身是人工神经网络(artificial neural network,ANN),它的基本特点就是试图模仿人脑的神经元之间传递和处理信息的模式。神经网络这个词本身可以指生物神经网络和人工神经网络。在机器学习中,我们说的神经网络一般就是指人工神经网络。


图 1 给出的是一个最基本的人工神经网络的 3 层模型。


图1


人工神经网络由各个层组成,输入层(input layer)输入训练数据,在输出层(output layer)输出计算结果,中间有1个或多个隐藏层(hidden layer),使输入数据向前传播到输出层。“深度”一词没有具体的特指,一般就是要求隐藏层很多(一般指 5 层、 10 层、几百层甚至几千层)。


人工神经网络的构想源自对人类大脑的理解——神经元的彼此联系。二者也有不同之处,人类大脑的神经元是按照特定的物理距离连接的,而人工神经网络有独立的层和连接,还有数据传播方向。


例如,我们拿一张图片,对它做一些预处理,如图像居中、灰度调整、梯度锐化、去除噪声、倾斜度调整等,就可以输入到神经网络的第一层。然后,第一层会自己提取这个图像的特征,把有用的特征向下传递,直到最后一层,然后输出结果。这就是一次前向传播(forword propagation)。


最后一层的输出要给出一个结论,例如,在分类问题中,要告诉我们到底输入的图像是哪个类别,一般它会给出一个“概率向量”。如图 2 所示,列出了这只猫所属品种的前 5 个概率值。


图2


人工神经网络的每一层由大量的节点(神经元)组成,层与层之间有大量连接,但是层内部的神经元一般相互独立。深度学习的目的就是要利用已知的数据学习一套模型,使系统在遇见未知的数据时也能够做出预测。这个过程需要神经元具备以下两个特性。


(1)激活函数(activation function):这个函数一般是非线性函数,也就是每个神经元通过这个函数将原有的来自其他神经元的输入做一个非线性变化,输出给下一层神经元。激活函数实现的非线性能力是前向传播(forword propagation)很重要的一部分。


(2)成本函数(cost function):用来定量评估在特定输入值下,计算出来的输出结果距离这个输入值的真实值有多远,然后不断调整每一层的权重参数,使最后的损失值最小。这就是完成了一次反向传播(backword propagation)。损失值越小,结果就越可靠。


神经网络算法的核心就是计算、连接、评估、纠错和训练,而深度学习的深度就在于通过不断增加中间隐藏层数和神经元数量,让神经网络变得又深又宽,让系统运行大量数据,训练它。

02

学习

什么是“学习”?有一些成语可以概括:举一反三、闻一知十、触类旁通、问牛知马、融会贯通等。计算机的学习和人类的学习类似,我们平时大量做题(训练数据),不断地经过阶段性考试(验证数据)的检验,用这些知识和解题方法(模型)最终走向最终(测试数据)的考场。


最简单也最普遍的一类机器学习算法就是分类(classification)。对于分类,输入的训练数据有特征(feature),有标记(label),在学习中就是找出特征和标记间的映射关系(mapping),通过标记来不断纠正学习中的偏差,使学习的预测率不断提高。这种训练数据都有标记的学习,称为有监督学习(supervised learning)。


无监督学习(unsupervised learning)则看起来非常困难。无监督学习的目的是让计算机自己去学习怎样做一些事情。因此,所有数据只有特征而没有标记。


无监督学习一般有两种思路:一是在训练时不为其指定明确的分类,但是这些数据会呈现出聚群的结构,彼此相似的类型会聚集在一起。计算机通过把这些没有标记的数据分成一个个组合,就是聚类(clustering);二是在成功时采用某种形式的激励制度,即强化学习(reinforcement learning,RL)。对强化学习来说,它虽然没有标记,但有一个延迟奖赏与训练相关,通过学习过程中的激励函数获得某种从状态到行动的映射。强化学习一般用在游戏、下棋(如前面提到的AlphaGo)等需要连续决策的领域。


有人可能会想,难道就只有有监督学习和无监督学习这两种非黑即白的关系吗?二者的中间地带就是半监督学习(semi-supervised learning)。对于半监督学习,其训练数据一部分有标记,另一部分没有标记,而没标记数据的数量常常极大于有标记数据的数量(这也符合现实,大部分数据没有标记,标记数据的成本很大)。它的基本规律是:数据的分布必然不是完全随机的,通过结合有标记数据的局部特征,以及大量没标记数据的整体分布,可以得到比较好的分类结果。


因此,“学习”家族的整体构造如图 3 所示


图3


深度学习的入门方法


要想入门深度学习,需要两个工具,即算法知识和大量的数据,外加一台计算机,如果有GPU就更好了,但是因为许多入门初学者的条件有限,没有GPU也可以,


我把深度学习的入门过程整理成图 4 所示的 7 个步骤。


图4


下面就来详细介绍一下这 7 个步骤。


1、学习或者回忆一些数学知识


因为计算机能做的就只是计算,所以人工智能更多地来说还是数学问题。我们的目标是训练出一个模型,用这个模型去进行一系列的预测。于是,我们将训练过程涉及的过程抽象成数学函数:首先,需要定义一个网络结构,相当于定义一种线性非线性函数;接着,设定一个优化目标,也就是定义一种损失函数(loss function)。


而训练的过程,就是求解最优解及次优解的过程。在这个过程中,我们需要掌握基本的概率统计、高等数学、线性代数等知识,如果学过就最好,没学过也没关系,仅仅知道原理和过程即可,有兴趣的话可以涉猎一些推导证明。


2、掌握经典机器学习理论与基本算法


这些基本算法包括支持向量机、逻辑回归、决策树、朴素贝叶斯分类器、随机森林、聚类算法、协同过滤、关联性分析、人工神经网络和BP算法、PCA、过拟合与正则化等。


3、掌握一种编程工具(语言)


Python语言是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python是很多新入门的程序员的入门编程语言,也是很多老程序员后来必须掌握的编程语言。我们需要重点掌握使用线性代数库和矩阵的操作,尤其是Numpy、Pandas第三方库,也要多试试机器学习的库,如sklearn,做一些SVM及逻辑回归的练习。这对直接上手写TensorFlow程序大有裨益。


有些工业及学术领域的读者还可能擅长MATLAB或R,其实现算法的思想和Python也很类似。


同时考虑到许多人是使用C++、Java、Go语言的,TensorFlow还提供了和Python“平行语料库”的接口。虽然本文是主要是基于Python讲解的,对于其他语言的原理和应用API也都非常类似,大家把基础掌握后,只需要花很短的时间就能使用自己擅长的语言开发。


4、研读经典论文,关注最新动态和研究成果


一些经典论文是必读的。例如,要做手写数字识别,若采用LeNet,要先阅读一下LeNet的学术论文;要做物体目标检测的训练,若选定MSCNN框架,可以先读MSCNN相关的论文。那么,论文从哪里找呢?那么多论文应该读哪篇呢?


下面以GoogleNet的TensorFlow实现为例。在GitHub上,一般在开头的描述中就会说明这个模型所依据的论文,如图 5 所示。


顺着这篇论文阅读,可以大致了解这个网络的实现原理,对迅速上手应用有很大的作用。


图5


很多做模式识别的工作者之所以厉害,是因为他们有过很多、很深的论文积累,对模型的设计有很独到的见解,而他们可能甚至一行代码也不会写,而工程(写代码)能力在工作中很容易训练。许多工程方向的软件工程师,工作模式常常在实现业务逻辑和设计架构系统上,编码能力很强,但却缺少论文积累。同时具有这两种能力的人,正是硅谷一些企业目前青睐的人才。


大家平时还可以阅读一些博客、笔记,以及微信公众号、微博新媒体资讯等,往往一些很流行的新训练方法和模型会很快在这些媒体上发酵,其训练神经网络采用的一些方法可能有很大的启发性。


5、自己动手训练神经网络


接着,就是要选择一个开源的深度学习框架。选择框架时主要考虑哪种框架用的人多。人气旺后,遇到问题很容易找到答案;GitHub上关于这个框架的项目和演示会非常多;相关的论文也会层出不穷;在各个QQ群和微信群的活跃度会高;杂志、公众号、微博关注的人也会很多;行业交流和技术峰会讨论的话题也多;也能享受到国内外研究信息成果的同步。


目前这个阶段,TensorFlow因为背靠谷歌公司这座靠山,再加上拥有庞大的开发者群体,而且采用了称为“可执行的伪代码”的Python语言,更新和发版速度着实非常快。目前TensorFlow已经升级到1.1版,在性能方面也有大幅度提高,而且新出现的Debugger、Serving、XLA特性也是其他框架所不及的。此外,一些外围的第三方库(如Keras、TFLearn)也基于它实现了很多成果,并且Keras还得到TensorFlow官方的支持。TensorFlow支持的上层语言也在逐渐增多,对于不同工程背景的人转入的门槛正在降低。


在GitHub上有一个关于各种框架的比较,从建模能力、接口、模型部署、性能、架构、生态系统、跨平台等 7 个方面进行比较,TensorFlow也很占综合优势。截至 2017 年 1 月,TensorFlow的star数已经超过了其他所有框架的总和,如图 6 所示。


因此,从目前来看,投身TensorFlow是一个非常好的选择,掌握TensorFlow在找工作时是一个非常大的加分项。


图6


接下来就是找一个深度神经网络,目前的研究方向主要集中在视觉和语音两个领域。初学者最好从计算机视觉入手,因为它不像语音等领域需要那么多的领域知识,结果也比较直观。例如,用各种网络模型来训练手写数字(MNIST)及图像分类(CIFAR)的数据集。


6、深入感兴趣或者工作相关领域


人工智能目前的应用领域很多,主要是计算机视觉和自然语言处理,以及各种预测等。对于计算机视觉,可以做图像分类、目标检测、视频中的目标检测等;对于自然语言处理,可以做语音识别、语音合成、对话系统、机器翻译、文章摘要、情感分析等,还可以结合图像、视频和语音,一起发挥价值。


更可以深入某一个行业领域。例如,深入医学行业领域,做医学影像的识别;深入淘宝的穿衣领域,做衣服搭配或衣服款型的识别;深入保险业、通信业的客服领域,做对话机器人的智能问答系统;深入智能家居领域,做人机的自然语言交互;等等。


7、在工作中遇到问题,重复前六步


在训练中,准确率、坏案例(bad case)、识别速度等都是可能遇到的瓶颈。训练好的模型也不是一成不变的,需要不断优化,也需要结合具体行业领域和业务进行创新,这时候就要结合最新的科研成果,调整模型,更改模型参数,一步步更好地贴近业务需求。


什么是TensorFlow


想想,在机器学习流行之前,我们是如何做与语音和图像相关的识别的?大多数是基于规则的系统。例如,做自然语言处理,需要很多语言学的知识;再如,1997 年的IBM的深蓝计算机对战国际象棋,也需要很多象棋的知识。


当以统计方法为核心的机器学习方法成为主流后,我们需要的领域知识就相对少了。重要的是做特征工程(feature engineering),然后调一些参数,根据一些领域的经验来不断提取特征,特征的好坏往往就直接决定了模型的好坏。这种方法的一大缺点是,对文字等抽象领域,特征还相对容易提取,而对语音这种一维时域信号和图像这种二维空域信号等领域,提取特征就相对困难。


深度学习的革命性在于,它不需要我们过多地提取特征,在神经网络的每一层中,计算机都可以自动学习出特征。为了实现深度学习中运用的神经网络,TensorFlow这样的深度学习开源工具就应运而生。我们可以使用它来搭建自己的神经网络。这就有点儿类似于PHP开发当中的CodeIgniter框架,Java开发当中的SSH三大框架,Python开发当中的Tornado、Django框架,C++当中的MFC、ACE框架。框架的主要目的就是提供一个工具箱,使开发时能够简化代码,呈现出来的模型尽可能简洁易懂。


为什么要学TensorFlow


首先,TensorFlow的一大亮点是支持异构设备分布式计算(heterogeneous distributed computing)。


何为异构?信息技术当中的异构是指包含不同的成分,有异构网络(如互联网,不同厂家的硬件软件产品组成统一网络且互相通信)、异构数据库(多个数据库系统的集合,可以实现数据的共享和透明访问)。这里的异构设备是指使用CPU、GPU等核心进行有效地协同合作;与只依靠CPU相比,性能更高,功耗更低。


那何为分布式?分布式架构目的在于帮助我们调度和分配计算资源(甚至容错,如某个计算节点宕机或者太慢),使得上千万、上亿数据量的模型能够有效地利用机器资源进行训练。


图 7 给出的是开源框架TensorFlow的标志。


图7


TensorFlow支持卷积神经网络(convolutional neural network,CNN)和循环神经网络(recurrent neural network,RNN),以及RNN的一个特例长短期记忆网络(long short-term memory,LSTM),这些都是目前在计算机视觉、语音识别、自然语言处理方面最流行的深度神经网络模型。


下面参考《The Unreasonable Effectiveness of Recurrent Neural Networks》这篇文章梳理了一个有效框架应该具有的功能。


  • Tensor库是对CPU/GPU透明的,并且实现了很多操作(如切片、数组或矩阵操作等)。这里的透明是指,在不同设备上如何运行,都是框架帮用户去实现的,用户只需要指定在哪个设备上进行哪种运算即可。


  • 有一个完全独立的代码库,用脚本语言(最理想的是Python)来操作Tensors,并且实现所有深度学习的内容,包括前向传播/反向传播、图形计算等。


  • 可以轻松地共享预训练模型(如Caffe的模型及TensorFlow中的slim模块)。


  • 没有编译过程。深度学习是朝着更大、更复杂的网络发展的,因此在复杂图算法中花费的时间会成倍增加。而且,进行编译的话会丢失可解释性和有效进行日志调试的能力。


在我看来,在目前的深度学习的研究领域主要有以下 3 类人群。


  • 学者。主要做深度学习的理论研究,研究如何设计一个“网络模型”,如何修改参数以及为什么这样修改效果会好。平时的工作主要是关注科研前沿和进行理论研究、模型实验等,对新技术、新理论很敏感。


  • 算法改进者。这些人为了把现有的网络模型能够适配自己的应用,达到更好的效果,会对模型做出一些改进,把一些新算法改进应用到现有模型中。这类人主要是做一些基础的应用服务,如基础的语音识别服务、基础的人脸识别服务,为其他上层应用方提供优良的模型。


  • 工业研究者。这类人群不会涉及太深的算法,主要掌握各种模型的网络结构和一些算法实现。他们更多地是阅读优秀论文,根据论文去复现成果,然后应用到自己所在的工业领域。这个层次的人也是现在深度学习研究的主流人群。


我相信大家也大都是第二类和第三类人群,且以第三类人群居多。


而在工业界,TensorFlow将会比其他框架更具优势。工业界的目标是把模型落实到产品上,而产品的应用领域一般有两个:一是基于服务端的大数据服务,让用户直接体验到服务端强大的计算能力(谷歌云平台及谷歌搜索功能);二是直接面向终端用户的移动端(Android系统)以及一些智能产品的嵌入式。


坐拥Android的市场份额和影响力的谷歌公司,在这两个方向都很强大。此外,谷歌力推的模型压缩和 8 位低精度数据存储不仅对训练系统本身有优化作用,在某种程度上也能使算法在移动设备上的部署获益,这些优化举措将会使存储需求和内存带宽要求降低,并且使性能得到提升,对移动设备的性能和功耗非常有利。


如果一个框架的用户生态好,用的人就会很多,而用的人多会让用户生态更繁荣,用的人也就会更多。这庞大的用户数就是TensorFlow框架的生命力。


截至 2017 年 1 月,与Caffe、Theano、Torch、MXNet等框架相比,TensorFlow在GitHub上Fork数和Star数都是最多的,如图 2 所示。


图8


图 9 展示了截至 2017 年 2 月,近些年几大机器学习框架的流行程度。


图9


TensorFlow的特性


在TensorFlow官方网站上,着重介绍了TensorFlow的 6 大优势特性。


  • 高度的灵活性(deep flexibility)。TensorFlow是一个采用数据流图(data flow graph),用于数值计算的开源软件库。只要计算可以表示为一个数据流图,就可以使用TensorFlow,只需要构建图,书写计算的内部循环即可。因此,它并不是一个严格的“神经网络库”。用户也可以在TensorFlow上封装自己的“上层库”,如果发现没有自己想要的底层操作,用户也可以自己写C++代码来丰富。关于封装的“上层库”,TensorFlow现在有很多开源的上层库工具,极大地减少了重复代码量。


  • 真正的可移植性(true portability)。TensorFlow可以在CPU和GPU上运行,以及在台式机、服务器、移动端、云端服务器、Docker容器等各个终端运行。因此,当用户有一个新点子,就可以立即在笔记本上进行尝试。


  • 将科研和产品结合在一起(connect research and production)。过去如果将一个科研的机器学习想法应用到商业化的产品中,需要很多的代码重写工作。现在TensorFlow提供了一个快速试验的框架,可以尝试新算法,并训练出模型,大大提高了科研产出率。


  • 自动求微分(auto-differentiation)。求微分是基于梯度的机器学习算法的重要一步。使用TensorFlow后,只需要定义预测模型的结构和目标函数,将两者结合在一起后,添加相应的数据,TensorFlow就会自动完成计算微分操作。


  • 多语言支持(language options)。TensorFlow提供了Python、C++、Java接口来构建用户的程序,而核心部分是用C++实现的,如图 10 所示。用户也可以使用Jupyter Notebook来书写笔记、代码,以及可视化每一步的特征映射(feature map)。用户也可以开发更多其他语言(如Go、Lua、R等)的接口。


图10


  • 最优化性能(maximize performance)。假如用户有一台 32 个CPU内核、4 个GPU显卡的机器,如何将计算机的所有硬件计算资源全部发挥出来呢?TensorFlow给予线程、队列、分布式计算等支持,可以让用户将TensorFlow的数据流图上的不同计算元素分配到不同的设备上,最大化地利用硬件资源。


使用TensorFlow的公司


除了谷歌在自己的产品线上使用TensorFlow外,国内的京东、小米等公司,以及国外的Uber、eBay、Dropbox、Airbnb等公司,都在尝试使用TensorFlow。图 11 是摘自TensorFlow官方网站的日益壮大的公司墙。


图11


TensorFlow的发展


2016 年 4 月,TensorFlow的 0.8 版本就支持了分布式、支持多GPU运算。2016 年 6 月,TensorFlow的 0.9 版本改进了对移动设备的支持。2017 年 2 月,TensorFlow的 1.0 正式版本中,增加了Java和Go的实验性API,以及专用编译器XLA和调试工具Debugger,还发布了tf.transform,专门用来数据预处理。并且还推出了“动态图计算”TensorFlow Fold,这是被评价为“第一次清晰地在设计理念上领先”。


用户还可以使用谷歌公司的PaaS TensorFlow产品Cloud Machine Learning来做分布式训练。现在也已经有了完整的TensorFlow Model Zoo。


另外,TensorFlow出色的版本管理和细致的官方文档手册,以及很容易找到解答的繁荣的社区,应该能让用户用起来相当顺手。


截至 2017 年 3 月,用TensorFlow作为生产平台和科研基础研发已经越来越坚实可靠。


(本文节选自李嘉璇TensorFlow技术解析与实战》)



(样章阅读:http://www.epubit.com.cn/book/details/4862

作者:李嘉璇 

领导“谷歌大脑”的工程师Jeff Dean发来寄语,李航、余凯等人工智能领域专家倾力推荐。


包揽TensorFlow 1.1的新特性,技术内容全面,实战案例丰富,视野广阔,人脸识别、语音识别、图像和语音相结合等热点一应俱全



●本文编号322,以后想阅读这篇文章直接输入322即可。

●输入m获取文章目录

推荐↓↓↓
 

Python编程

更多推荐:《15个技术类公众微信

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。