1.1 深度学习与TensorFlow简介 本节首先介绍深度学习的发展简史,简单列举了深度学习在图像和自然语言处理方向的技术,然后介绍TensorFlow的开发环境。 1.1.1 深度学习简介 深度学习有望成为实现人工智能的最佳途径,未来正沿着大型神经系统的方向发展。在许多其他领域都能看到深度学习的巨大进步,如谷歌DeepMind团队研发的人工智能程序AlphaGo战胜世界围棋名将李世石,最强最新AlphaGo Zero的横空出世,无人驾驶公交客车正式上路,等等。相比这些新闻,我们也许更关心其背后的支撑技术,深度学习就是AlphaGo和无人驾驶等背后的重要技术。 深度学习已经广泛地应用在计算机视觉、自然语言处理等人工智能领域中,极大地推动了人工智能的发展。但深度学习的发展并不是一帆风顺的,经历过几次高潮和低谷,是一段漫长的发展史。回顾深度学习的发展历程有助于了解深度学习领域。 最早的神经网络起源于1943年由麦卡洛克和皮兹提出的MCP(作者姓名McCulloch和Pitts的缩写)神经元模型,包括多个输入参数和权重、内积运算和二值激活函数等神经网络的要素。 1958年,罗森布拉特(Rosenblatt)发明了感知器(perceptron)算法,感知器能够对输入的多维数据进行二元分类,且能够从训练样本中自动学习更新权值。感知器对神经网络的发展具有里程碑式的意义,引发神经网络的第一次热潮。 1969年,明斯基(Minsky)证明感知器本质上是一种线性模型,只能处理线性分类问题,甚至连最简单的异或(XOR)问题都无法正确解决。神经网络进入第一个寒冬期,研究陷入近20年的停滞。 1986年,辛顿(Hinton)发明多层感知器的反向传播(BP)算法,解决了非线性分类和参数学习的问题。神经网络再次引起人们广泛的关注,引发神经网络的第二次热潮。 1991年,人们发现,当神经网络的层数增加时,BP算法会出现“梯度消失”的问题,无法对前层进行有效的学习,并且20世纪90年代中期以支持向量机(SVM)为代表的机器学习算法取得很好的效果,使得神经网络的发展再次进入衰退期。 2006年,辛顿等人正式提出深度学习的概念,并且在世界顶级学术期刊Science中提出深层网络训练中梯度消失问题的解决方案:使用无监督学习方法逐层训练算法,再使用有监督反向传播算法进行调优。这在学术圈引起了巨大的反响。 2012年,辛顿课题组参加ImageNet图像识别比赛,采用深度学习模型AlexNet一举夺冠,碾压第二名的SVM方法,深度学习吸引了很多研究者的注意。在随后的三年中,深度学习不断在ImageNet比赛中取得进步。 2016年,谷歌公司基于深度学习技术,研发的AlphaGo以4∶1的比分战胜国际顶尖围棋高手李世石,证明在围棋界,基于深度学习技术的计算机已经超越了人类。 2017年,基于强化学习算法的AlphaGo的升级版——AlphaGo Zero诞生,它采用自对弈强化学习的学习模式,完全从随机落子开始,不再使用人类棋谱,AlphaGo Zero轻易打败先前的AlphaGo。 除了以上的图像领域和围棋领域,深度学习在自然语言处理领域也取得了显著的成果。例如,词向量(Word2Vec)已经成为自然语言处理的核心,其基本思想是把人类语言中的字或词转换为维度可控的机器容易理解的稠密向量,容易计算出词与词之间的相互关系,因而在机器翻译、情感分析等方向取得很好的效果。LSTM、GRU、注意力机制、ELMo、Transformer、BERT、GPT和GPT2等新模型、新方法令人目不暇接,基于深度学习的自然语言处理在机器翻译、智能问答和聊天机器人等方向都取得惊人的成就。 总之,今天的深度学习已经越来越趋于成熟,尽管在落地应用上还需要解决许多实际问题,但深度学习无疑是有趣和有挑战性的充满希望的新兴领域。 1.1.2 TensorFlow简介 TensorFlow框架是谷歌公司开发的最受欢迎的端到端深度学习平台,是一个用Python、C++和CUDA语言编写的免费开源软件库,广泛用于语音识别、计算机视觉、自然语言处理等各种深度学习网络。从2010年开始,谷歌大脑(Google Brain)团队开发TensorFlow的前身DistBelief,作为在谷歌内部使用的第一代机器学习系统。后来谷歌指派著名计算机科学家Geoffrey Hinton和Jeff Dean,对DistBelief的代码库进行了简化和重构,使之成为一个更快、更健壮的应用级别代码库——TensorFlow,于2015年11月9日在Apache 2.0开源许可证下发布。 TensorFlow是谷歌大脑团队的第二代系统,其1.0.0版本于2017年2月11日发布。除了在单机上运行外,TensorFlow支持模型的分布式训练,支持模型的多机多卡(多个CPU和GPU)。分布式系统可以实现在上百个GPU上训练一个模型,可以大大减少训练时间,研究人员从而有更多的机会去尝试各种超参数组合。 TensorFlow支持64位Linux、MacOS和Windows操作系统,甚至还可以运行在包括Android和iOS的移动计算平台上。 TensorFlow提供了稳定的Python API (适用于所有平台的Python 3.7版)和C API,以及C++、Go、Java、JavaScript和早期版本的Swift等没有向后兼容性保证的API。TensorFlow对Python支持更多,因此Python API提供了更多的功能。另外,TensorFlow还提供TensorFlow.js、TensorFlow Lite和TensorFlow Extended库。TensorFlow.js是一个JavaScript库,用于在浏览器和Node.js上训练和部署模型。TensorFlow Lite是一个精简库,用于在移动设备和嵌入式设备上部署模型。TensorFlow Extended是一个端到端平台,用于在大型生产环境中准备数据以及训练、验证和部署模型。 尽管TensorFlow在业界堪称一枝独秀,但仍然受到很多竞争者的冲击,尤其是PyTorch和Keras。图1.1所示为杰夫· 黑尔(Jeff Hale)于2019年4月发表的博文Which Deep Learning Framework is Growing Fastest?中统计得到的在线工作增长的数据,说明TensorFlow的工作机会仍然排列第一。