程序员学习深度学习TensorFlow

2019-04-09 16:59发布

什么是TensorFlow?

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

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

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

为什么要学TensorFlow?

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

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

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

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


图1-1


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

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

  • Tensor库是对CPU/GPU透明的,并且实现了很多操作(如切片、数组或矩阵操作等)。这里的透明是指,在不同设备上如何运行,都是框架帮用户去实现的,用户只需要指定在哪个设备上进行哪种运算即可。
  • 有一个完全独立的代码库,用脚本语言(最理想的是Python)来操作Tensors,并且实现所有深度学习的内容,包括前向传播/反向传播、图形计算等。
  • 可以轻松地共享预训练模型(如Caffe的模型及TensorFlow中的slim模块)。
  • 没有编译过程。深度学习是朝着更大、更复杂的网络发展的,因此在复杂图算法中花费的时间会成倍增加。而且,进行编译的话会丢失可解释性和有效进行日志调试的能力。

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

  • 学者。主要做深度学习的理论研究,研究如何设计一个“网络模型”,如何修改参数以及为什么这样修改效果会好。平时的工作主要是关注科研前沿和进行理论研究、模型实验等,对新技术、新理论很敏感。
  • 算法改进者。这些人为了把现有的网络模型能够适配自己的应用,达到更好的效果,会对模型做出一些改进,把一些新算法改进应用到现有模型中。这类人主要是做一些基础的应用服务,如基础的语音识别服务、基础的人脸识别服务,为其他上层应用方提供优良的模型。
  • 工业研究者。这类人群不会涉及太深的算法,主要掌握各种模型的网络结构和一些算法实现。他们更多地是阅读优秀论文,根据论文去复现成果,然后应用到自己所在的工业领域。这个层次的人也是现在深度学习研究的主流人群。

我相信本文的读者也大都是第二类和第三类人群,且以第三类人群居多。

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

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

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

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





图1-2



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


1-3


1.2.1 TensorFlow的特性

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

  • 高度的灵活性(deep flexibility)。TensorFlow是一个采用数据流图(data flow graph),用于数值计算的开源软件库。只要计算可以表示为一个数据流图,就可以使用TensorFlow,只需要构建图,书写计算的内部循环即可。因此,它并不是一个严格的“神经网络库”。用户也可以在TensorFlow上封装自己的“上层库”,如果发现没有自己想要的底层操作,用户也可以自己写C++代码来丰富。关于封装的“上层库”,TensorFlow现在有很多开源的上层库工具,极大地减少了重复代码量,在第7章中会详细介绍。
  • 真正的可移植性(true portability)。TensorFlow可以在CPU和GPU上运行,以及在台式机、服务器、移动端、云端服务器、Docker容器等各个终端运行。因此,当用户有一个新点子,就可以立即在笔记本上进行尝试。
  • 将科研和产品结合在一起(connect research and production)。过去如果将一个科研的机器学习想法应用到商业化的产品中,需要很多的代码重写工作。现在TensorFlow提供了一个快速试验的框架,可以尝试新算法,并训练出模型,大大提高了科研产出率。
  • 自动求微分(auto-differentiation)。求微分是基于梯度的机器学习算法的重要一步。使用TensorFlow后,只需要定义预测模型的结构和目标函数,将两者结合在一起后,添加相应的数据,TensorFlow就会自动完成计算微分操作。
  • 多语言支持(language options)。TensorFlow提供了Python、C++、Java接口来构建用户的程序,而核心部分是用C++实现的,如图1-12所示。第4章中会着重讲解TensorFlow的架构。用户也可以使用Jupyter Notebook[11]来书写笔记、代码,以及可视化每一步的特征映射(feature map)。用户也可以开发更多其他语言(如Go、Lua、R等)的接口。


图1-4


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

1.2.2 使用TensorFlow的公司

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


图1-5


1.2.3 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,这是被评价为“第一次清晰地在设计理念上领先”[12]。

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

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

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

1.3 机器学习的相关赛事

说到机器学习,不得不提到每年的一些挑战赛。近年来取得好成绩的队伍,常常是使用深度学习的方法的。正是这些赛事激励着全世界科学家不断采用更优化的方法提高算法结果的准确率,也引领着年度的深度学习探索方向。

1.3.1 ImageNet的ILSVRC

ILSVRC(ImageNet Large Scale Visual Recognition Challenge,大规模视觉识别挑战赛)是用来大规模评估对象检测和图像识别的算法的挑战赛。从2010年开始,至2016年已举办7届。ImageNet是目前世界上最大的图像识别数据库,拥有超过1500万张有标记的高分辨率图像的数据集,这些图像分属于大概22 000个类别。ILSVRC使用ImageNet的一个子集,分为1 000种类别,每种类别中都有大约1 000张图像。总之,大约有120万张训练图像,5万张验证图像和15万张测试图像。[6]图1-6所示为ImageNet的官方网站。


图1-6



ILSVRC每年邀请谷歌、微软、百度等IT企业使用ImageNet,测试他们图片分类系统运行情况。过去几年中,该系统的图像识别功能大大提高,出错率仅为约5%(比人眼还低,人眼的识别错误率大概在5.1%)。在2015年,ILSVRC的错误率已经降低到了3.57%,采用152层的ResNet获得了2015年分类任务的第一名。ILSVRC历年的Top-5错误率如图1-7所示。

在ImageNet上,习惯性地报告两个错误率:Top-1和Top-5。Top-1错误率是指,预测输出的概率最高的类别,是否和人工标记的类别一致,如果不一致,此时的概率。Top-5错误率是指,预测输出的概率最高的前5个类别当中,有没有和人工标记的类别一致,当5个都不一致时的概率。例如在图片分类任务下,对一张图片进行预测,输出这张图片分类概率最高的5个类别,只要有一个预测的类别和人工标注的类别标记一致,就是认为正确。当5个都不一致发生的概率就是Top-5错误率。


图1-7


值得自豪的是,在刚刚过去的ILSVRC 2016上,中国学术界和工业界科研团队包揽了多项冠军。

  • CUImage(商汤科技联合港中文):目标检测第一。
  • Trimps-Soushen(公安部三所):目标定位第一。
  • CUvideo(商汤科技联合港中文):视频中物体检测子项目第一。
  • NUIST(南京信息工程大学):视频中的物体探测两个子项目第一。
  • Hikvvision(海康威视):场景分类第一。
  • SenseCUSceneParsing(商汤科技联合港中文):场景分析第一。

1.3.2 Kaggle

如果说ILSVRC企业参加的居多,那Kaggle这个平台则更多地面向个人开发者。图 1-7展示的是Kaggle的官方网站首页。

Kaggle成立于2010年,是一个进行数据发掘、数据分析和预测竞赛的在线平台。与Kaggle合作之后,一家公司可以提供一些数据,进而提出一个问题,Kaggle网站上的计算机科学家和数学家(也就是现在的数据科学家)将领取任务,提供潜在的解决方案。最终胜出的解决方案可以获得3万美元到25万美元的奖励。也就是说,Kaggle也是一个众包理念,利用全世界的人才来解决一个大问题。


图1-7


Kaggle这个比赛非常适合学生参加,因为一般在校学生可能拿不到很多数据。此外,Kaggle不仅对参赛者有算法能力上的要求,而且能锻炼参赛者对数据的“嗅觉”,使参赛者从数据本身问题出发来寻求解决方案。

1.3.3 天池大数据竞赛

“天池”是阿里搭建的一个大数据竞赛平台,图1-8展示的是它的官方网站页面。


图1-8


这个平台上一般会有一些穿衣搭配挑战、新浪微博互动预测、用户重复购买行为预测等赛事。平台提供的“赛题攻略”对新手入门有很大的引领作用。如果在一些项目上取得不错的成绩,还有丰厚的奖金,以及进入阿里巴巴的工作机会。

1.7 国内的人工智能公司

近年来,国内涌现出一批做人工智能的公司,很多原有的互联网公司也开始试水人工智能方向。虽然不可否认人工智能领域还是有一些泡沫存在,但是这个技术领域的井喷点确实来临了,确切地说是科研成果的井喷点。我们要做的就是加快科研成果向产品的转化速度。

国内的腾讯、阿里、百度三大公司在人工智能研究和商业化探索方面走得最早。腾讯优图是腾讯的人工智能开放平台;阿里云ET是阿里巴巴的智能机器人;百度主要在无人驾驶汽车和手机百度客户端的基于“自然语言的人机交互界面”的“度秘”上发力。这些都是人工智能在产业界应用的探索。此外,还有搜狗、云从科技、商汤科技、昆仑万维、格灵深瞳等公司,都在人工智能领域纷纷发力。

下面我们就来介绍国内几家比较有特色的做人工智能的公司。

(1)陌上花科技:衣+(dress+)。提供图像识别、图像搜索、物体追踪检测、图片自动化标记、图像视频智能分析、边看边买、人脸识别和分析等服务。其官方网站的首页如图1-8所示。

图1-8


(2)旷视科技:Face++。以人脸识别精度著称,并且提供人工智能开放平台。目前已经和美图秀秀、魔漫相机合作,实现美白、瘦脸、五官美化等美颜效果。此外,还和支付宝合作,未来有望推出“Smile to Pay”。其官方网站首页如图1-9所示。


图1-9


(3)科大讯飞。主要提供语音识别解决方案,以及语音合成、语言云(分词、词性标注、命名实体识别、依存句法分析、语义角色标注等)等语音扩展服务,有完善的SDK及多种语言实现的API。其官方网站首页如图1-10所示。


图1-10


(4)地平线。嵌入式人工智能的领导者,致力于提供高性能、低功耗、低成本、完整开放的嵌入式人工智能解决方案。其官方网站首页如图1-11所示。


图1-11

本文摘自《TensorFlow技术解析与实战》作者:李嘉璇。喜欢的读者请转发到朋友圈。

END


文章来源: https://www.toutiao.com/group/6677434842067501572/