深度学习:一起玩转TensorLayer(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-27 22:47:17

点击下载

作者:董豪,郭毅可,杨光,等

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

深度学习:一起玩转TensorLayer

深度学习:一起玩转TensorLayer试读:

前言

深度学习已经成为了当今人工智能发展的主要助力,国务院印发的《新一代人工智能发展规划》中表示,2020年我国人工智能核心产业规模超过1500亿元,带动相关产业规模超过1万亿元;2030年人工智能核心产业规模超过1万亿元,带动相关产业规模超过10万亿元。

为此产业界急需大量实用性人才,而深度学习是一门理论与工程相结合的科学,本书将以通俗易懂的方式讲解深度学习技术,并辅以实践教学。本书同时面向深度学习初学者、进阶者及工程师,内容涵盖了全连接网络、自编码器、卷积神经网络、递归神经网络、深度增强学习、生成对抗网络,等等,并附有多个进阶实例教程。与传统深度学习书籍相比,本书有以下特点:

本书注重实践,科研人员和工程师都希望有一个深度学习开发工具可以同时满足学术界和产业界的需求,可让最新的人工智能算法很快地从实验室投入到产品中。为此我们开发了深度学习框架——TensorLayer。读者可以从零基础开始学习掌握目前最新的深度学习技术。更多关于TensorLayer的设计思路请见第1章。

本书对深度学习的最新方法进行了更多的阐述,特别是生成对抗网络方面,该研究方向已在无监督学习方面取得重大突破,并已经开始在产业界产生非常大的影响。本书还介绍及使用了多种新的反卷积方法,如子像素卷积和缩放卷积。

研究深度学习需要做大量的实验,本书在讲解技术的同时传授了很多实验经验。除神经网络外,本书还讲解了数据预处理、数据后加工、训练、服务架设等任务,这些都是搭建整个学习系统和产品的基本工作流。

本书编著方式与其他同类书籍不同,是由TensorLayer中文社区众包完成的,由董豪统稿。本书代码除第3章和第14章实例五外都由董豪提供,本书第1章由莫元汉和董豪执笔;第2章教学部分由杨光执笔,实现讲解部分由董豪执笔;第3章由幺忠玮执笔;第4章由林一鸣执笔;第5章由王剑虹执笔;第6章由袁航执笔;第7章由于思淼执笔;第8章与第12章实例三由张敬卿执笔;第9章、第10章实例一和第13章实例四由董豪执笔;第11章实例二讲解部分由杨光执笔,实现部分由董豪执笔;第14章实例五由陈竑执笔。本书图片整理由出版社,吴超,赵婧楠和种道涵完成,封面设计由出版社和王盼完成。

虽然本书的作者都是一线科研人员和技术人员,但是不妥和错误之处在所难免,真诚地希望有关专家和读者给予批评指正,以便再版时修改。最后,在计算机技术发展非常快的今天,书籍里的知识更新速度有限,建议读者多参与社区讨论交流。本书代码例子使用TensorFlow1.2和TensorLayer1.5.3,Python3在Ubuntu下测试。由于TensorFlow和TensorLayer在不断地更新,若出现兼容性问题,请到各章节给定的网址链接中获取最新的代码。本书作者2017年12月本书作者

董豪:目前就读于帝国理工学院,从事计算机视觉、医疗数据分析和深度学习理论研究,在ICCV、TNSRE、TIFS、ACM MM等顶级会议和期刊发表过论文,Neurocomputing、TIP等会议和期刊的审稿人。有创业经验,擅长把深度学习算法与实际问题结合,获得多项国家发明专利和实用新型专利,TensorLayer创始人。

杨光:帝国理工医学院高级研究员,皇家布朗普顿医院医学图像分析师,伦敦大学圣乔治医学院荣誉讲师,伦敦大学学院(UCL)硕士、博士、IEEE会员、SPIE会员、ISMRM会员、BMVA会员,专注于医疗大数据以及医学图像的成像和分析,在各类期刊会议上发表论文近40篇,国际专利两项,Medical Physics杂志临时副主编,MIUA会议委员会委员,长期为专业杂志会议义务审稿50余篇。其研究方向获得英国EPSRC、CRUK、NIHR和British Heart Foundation (BHF)资助。近期致力于Medical AI方向的创新创业。

吴超:帝国理工数字科学研究所研究员,主要从事医疗和城市领域数据分析和建模的研究工作,研究工作获得EPSRC、Royal Society等多项研究基金资助。

王剑虹:帝国理工硕士及利物浦大学本科毕业,主要研究语音识别分类问题;目前在UCL攻读研究型硕士,主要研究增强学习在游戏中的运用。

幺忠玮:帝国理工硕士,本科毕业于北京邮电大学,主要研究方向为计算机视觉,对生成模型和目标识别领域感兴趣。目前致力于将目标检测算法植入嵌入式系统实现即时检测。

张敬卿:帝国理工博士在读,研究型硕士,主要研究兴趣包括深度学习、数据挖掘、时间序列与文本挖掘、多模态问题与生成模型。本科毕业于清华大学计算机科学与技术系,曾获得中国国家奖学金。

陈竑:北京大学光华管理学院在读,哈尔滨工业大学电子与信息工程学院毕业,深度学习爱好者。

林一鸣:帝国理工博士在读,主要研究深度学习在人脸分析方向的应用。

于思淼:帝国理工博士在读,浙江大学本科毕业,主要研究方向为深度学习、生成模型及其在计算机视觉方面的应用。

莫元汉:帝国理工博士在读,北京航空航天大学本科毕业,主要研究方向为深度学习、动力学及其在医疗图像分析方面的应用。

袁航:瑞士洛桑联邦理工(EPFL)硕士在读,本科就读于德国雅各布大学(Jacobs)计算机系,及在美国卡内基梅隆大学(CMU)计算机科学学院交换学习,主要从事计算神经科学与电脑人机接口研究。之前分别在帝国理工及马克斯普朗克智能系统研究院(Max Planck Institute for Intelligent Systems)进行研习,现在主要在EPFL G-lab研究脊髓修复对运动功能康复及血压控制等课题。

本书章节具体作者情况如下表所示。本书作者致谢

首先感谢TensorLayer中文社区,特别是帝国理工华人学生群体和郭毅可教授的支持,感谢Google公司开源TensorFlow。

其次要感谢电子工业出版社给我们这样一个机会来分享知识,发展中文社区。感谢编辑对细节的执着。

最后也是最重要的,感谢家人对我们工作的支持和强大的祖国对人工智能产业的重视。如何阅读本书

鉴于不同的读者情况会有所差异,比如有的读者可能是第一次接触深度学习,而有的读者可能已经对深度学习有一定的了解;有的读者已经用过TensorFlow,而有的读者没有用过;有的读者只是想了解深度学习的概念,而有的读者是准备长期从事深度学习研究的。这里根据不同的读者情况给予不同的阅读建议。

动手永远是最高效的学习,本书侧重实践,建议读者在阅读时配置好实验环境,打开TensorFlow文档、TensorLayer文档,并在Github下载好TensorLayer的例子。在Python2和Python3方面,虽然编程上并不会有太大的不同,TensorLayer也兼容Python2,但本书作者推荐使用Python3,因为它的性能比老版本有了很多的优化,设计更加合理,从长久考虑建议使用Python3。而且目前TensorLayer的主要开发团队和使用者普遍使用Python3,统一的代码有利于社区交流。

在代码方面,为了更好地阅读各章节的实现部分,读者必须要完全掌握第2章的代码,包括矩阵乘法、训练数据的格式和维度、训练的迭代方式、placeholder的作用,layer类、模型参数的维度,等等。

TensorFlow文档:https://www.tensorflow.org

TensorLayer文档:http://www.tensorlayer.org

TensorLayer例子:https://github.com/zsdonghao/tensorlayer/tree/master/example

我想了解深度学习

本书每一章都是先讲解后实验,讲解方式也是通俗易懂的,即使是文科背景也应该能看懂。在阅读其他内容之前,建议先认真看完第1章的“人工智能”和“神经网络”,这部分讲解了人工智能的发展历史,深度学习只不过是人工智能最近发展最快、效果最好的技术而已,“神经网络”部分的目的是让大家快速明白不同种类的神经网络各有什么特长,以及它们的基本原理。建议完全明白了不同神经网络的目的之后,再阅读其他章节。

我是初学者,从头开始学习

第1章和第2章是入门的重点,特别是第1章的“神经网络”能让您对各类网络有初步的认识,接着第2章的多层感知器的代码一定要完完全全掌握,如果觉得第3章和第5章有难度,则可以先看其他章节。第1章“学习方法建议”介绍了如何与开源社区交流,基本原则是先靠自己后请教他人。另外,会Python是阅读本书最基本的条件,因为所有教学代码都是基于Python的,若您对Python不熟悉,可看看《Python3程序开发指南》一书。由于深度学习经常需要数学计算,Python的numpy工具包也是要必须掌握的。值得注意的是,TensorFlow和numpy的API格式非常相似,其目的是为了让数据维度统一,方便开发,比如它们都可以把表示10张50×50大小的RGB图片维度表示为[10,50,50,3]。除这些软技能外,您还需要一台配有NVIDIA GPU的电脑,虽然TensorFlow也支持CPU工作模式,但一旦要跑卷积神经网络的实验,CPU的速度完全不能胜任,为了学习的效率,GPU是必须要有的。

我接触过深度学习,希望更进一步

若您已经接触过深度学习,可能已经听说过Caffe、Theano之类的经典框架,Ten-sorFlow其实和Theano非常相似,之前开发Theano的人有不少参与过TensorFlow的开发。而TensorLayer作为TensorFlow的高级抽象,在神经网络层抽象方面和Theano的Lasagne比较相似。TensorLayer非常接近底层的TensorFlow,若您已经用过TensorFlow,则能很轻松地掌握TensorLayer。如果您已经掌握某些章节的神经网络,则可跳过该章节,直接看TensorLayer对应的代码例子。

我是科研人员,将长期研究深度学习

若您在未来将长期研究深度学习,本书可以帮您快速地上手,不过本书只是讲解了目前常用的神经网络,很多网络变种和理论并没有涉及。所以除了阅读本书,我们也建议阅读Ian Goodfellow、Yoshua Bengio和Aaron Courville一起写的Deep Learning一书,此书为开源书籍,网上有免费的版本。此外第1章的“学习方法建议”是本书作者总结的,希望对您有用。

Deep Learning网页版:http://www.deeplearningbook.org

Deep Learning PDF版:https://github.com/zsdonghao/deep-learning-book

我是工程师,想尽快找到解决方案

运行速度也许是您选择TensorLayer的原因,TensorLayer并不会因为对TensorFlow做高层抽象而导致运行速度下降。由于使用TensorFlow作为后端,因此TensorLayer训练好模型后可以导出成C++或其他语言的API,以供产品开发使用。本书中的实例部分,如脑部肿瘤分割、超高分辨率复原和文本反垃圾都是目前工业界最新的方法,若您要开发的功能与这几个功能类似,则可修改使用之。不过在阅读实例之前,我们还是建议先掌握第2章的多层感知器的代码,了解复用(Reuse)机制,之后再根据产品需要选择要阅读的章节。1 深度学习简介1.1 人工智能、机器学习和深度学习1.1.1 引言“人工智能”(Arttificial Intelligence,AI),这个术语起源于1956年的达特矛斯夏季人工智能研究计划(Dartmouth Summer Research Project on Artificial Intelligence)。会议上的先驱们希望借助当时计算机强大的运算能力来创造一个具有人类智能的复杂机器。这样的机器并不是用来处理一些特定的计算任务,比如财会的账务软件,流体力学的模拟程序等,而是应该具有通用性,它可以处理更加复杂的任务,比如理解语言,对人类语言中的概念进行自我学习,并具有一定的推理能力,就像我们在电影中看到的那些机器人一样。这就是所谓的“通用人工智能”或“强人工智能”(General AI)。

虽然无数的科学家都在不遗余力地朝着通用人工智能的方向努力,但遗憾的是,我们现在还不能创造出一台具有类似人类智能的机器。我们现在可以做的只是在某些特定任务上达到或者超过人类的水平,比如说人脸识别、垃圾邮件的分类等。我们认为这样的系统具有一定的智能,但并不是之前所说的通用人工智能,而是“弱人工智能”(Narrow AI)。1.1.2 人工智能、机器学习和深度学习三者的关系

弱人工智能的实现得益于当下机器学习的蓬勃发展,机器学习作为一种数据驱动(Data-Driven)的学习理论,需要大量的数据和强大的计算资源来让机器更好、更快地“理解”数据中的模式,以达到预测的目的。但是我们也应该知道,机器学习只是实现人工智能的众多途径中的一种,与之相对应的还有规则驱动模型(Rule-Based)。近十年来,随着移动互联网和高性能计算硬件(如GPU)的发展,使得机器学习的这两个先决条件(数据和计算资源)得到了满足,机器学习这个领域也再度活跃起来。深度学习(多层神经网络)作为机器学习的一个子学科更是一个以数据为核心的方法。早期由于数据量的限制,人们发现多层(深度)神经网络的训练难以收敛,或者只能收敛到局部次优解,这样训练出来的网络的性能还不如浅层神经网络,这个严重的问题直接导致了深度学习方法的上一次衰败。然而近十年随着数据以爆炸式的规模积累以及计算能力的突飞猛进,人们发现在大量数据训练下的深度神经网络可以表现得很好,而且计算能力的进步也让训练时间可以接受。总的来说,深度学习、机器学习和人工智能可以用一个蕴含关系来表达,即人工智能包含机器学习,机器学习包含深度学习,如图1.1所示。图1.1 人工智能包含机器学习,包含深度学习

计算机视觉可能是当前机器学习应用最成功的领域,过去的方法需要大量的人工来提取特征。比如,人们需要手工编写分类器、边缘检测器,以便让程序能识别物体从哪里开始,到哪里结束。通过用上面这些人工提取的特征对算法进行训练,机器学习的算法终于可以用来识别图像是不是一只猫,而且效果还不错。但是,这样训练出来的模型对含有噪声的数据并不能很好地处理,比如动物的某一部位块被遮挡了,或者照片是在不同的光照环境下采集的。这些都会大大影响算法性能,导致识别的准确率下降。这也是为什么在之前几年,机器学习算法虽然有着显著的进步但是还不足以接近人的能力。因为,人工提取的特征太僵化,许多环境的因素没有考虑。但是,随着深度学习的崛起,这样瓶颈已经不复存在了。

一般我们会通过三个方面来描述一个机器学习模型,它们是“模型”、“策略”和“算法”。模型讨论了在数据学习的过程中,用来表达数据的参数将以何种形式进行工作。有了模型,接下来需要考虑的问题是我们以何种标准来寻找模型的最优参数。最后是算法,机器学习(深度学习)的模型是基于数据进行学习的,有了学习的模型和标准后,就需要考虑通过怎样的数值方法来求解最优模型。在下一节中我们会从这三个方面来介绍深度学习的基础。1.2 神经网络

人工神经网络(Artificial Neural Networks)方面的研究很早就已开始,其发展大致经历了三次高潮:20世纪40年代到60年代的控制论,20世纪80年代到90年代中期的联结主义,以及2006年以来的深度学习。今天,人工神经网络已是一个庞大的而且是多学科交叉的研究领域。那么人工神经网络的定义究竟是什么呢?对于人工神经网络的定义,各学科之间有很大差异,我们引用了目前最常见的一种,即“人工神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统,并对真实世界物体做出交互反应(这是T.Kohonen在1988年Neural Networks杂志创刊号上给出的定义)”。总而言之,神经网络的研究大体分为了对大脑中生物过程的研究,以及把神经网络应用于人工智能的研究(人工神经网络),本书所谈及的是“人工神经网络”,不同于生物学意义上的神经网络。1.2.1 感知器

在介绍神经网络之前,我们先来看神经网络的一个基本组成单元——感知器(Per-ceptron)。感知器是在1950年由科学家Frank Rosenblatt提出的一种做二元分类(Binary classification)的算法。然而现代的感知器和最早提出的感知器有细微的区别,让我们来看看最早的感知器是如何工作的,如图1.2所示。

假设我们现在有三个变量(特征值)x ,x ,x ∈0,1输入到123图1.2的感知器中,我们希望感知器的输出也是一个二进制的数来代表分类(即0代表类别1,1代表类别2)。Rosenblatt提出了一个解决方案,为每个输入变量引入一个相乘的权重来表达每个变量的重要程度,即w,w,w,然后我们对乘积求和z=wx+wx+wx。最后123112233我们设定一个阈值(Threshold),如果z大于这个阈值,感知器就输出1,反之则输出0。用数学语言来表达就是:图1.2 单个感知器(神经元)

通过这样简单的线性相加和阈值对比,我们就实现了简单的二元分类。感知器是一个最基本的分类模型,它通过把加权后的特征值相加来做出相应的判断。打个比方,小明打算周六到附近的足球场去踢足球,但是有几个因素会影响小明是否会去踢球:1)周六天气是否不错。2)小明的同学小张会不会跟他一起去。3)足球场收费是不是很高。我们可以用刚才那三个变量来代表这三个因素x ,x ,x ,123当x =1时代表周六天气很好,x =0时代表小张同学不会和小明前往。12然后,我们假设小明认为在这三个因素中天气的影响是最重要的,其次是他的同学会不会一起去,小明是个土豪,他并不在乎足球场的费用。那么我们可以用感知器来模拟这样的决策过程。我们设w =5,1w =2,w =1,把阈值设为5。可以看出小明认为天气的好坏确实对23踢足球影响很大,无论足球场费用有多高,小张是否一同前往,只要天气好,感知器就会输出1,代表小明会去踢足球。

当我们要考虑的因素很多时,感知器的运算可以用矩阵乘法来实现,x是形状为[1,n]的一个横向量,W 是形状为[n,1]的竖向量,矩阵运算为y=f (z)=f (x*W)。若x有100个输入,输出有1个,则W 维度为[100,1]。

虽然上面例子中实现了简单的二元分类,但很显然用感知器来模拟人类的决策过程是非常不准确的,人类的决策过程比感知器要复杂许多。不过感知器通过加权后的特征值相加可以提供一定的决策能力,我们是否能将多个感知器连接起来,以达到模拟一个更加复杂的决策过程呢?答案是肯定的。

图1.3展示了一个网络结构,这个网络由三层感知器组成。第一层神经元有三个,其中每个神经元都接收多个输入变量。我们把带有这种连接的层式叫作全连接层(Fully Connected Layer或Dense Layer)。我们看到第二层的每个感知器对第一层的感知器采用了同样的连接方式。这样做的好处是,比方说第一层的某个感知器的输出会传播给所有在第二层的感知器。而对于第二层的某个感知器来说,它会根据所有第一层的输出来做决策,第三层也是同理。这样的网络结构显然可以做出更加复杂的决策过程。这种结构也可称为多层感知器(Multilayer Perceptron,MLP),我们将在第2章深入介绍。图1.3 多层感知器1.2.2 激活函数

我们已经大概了解到一个感知器和一个多层感知器网络(神经网络)是如何进行决策的。在机器学习这个领域中,用一个已经训练过的模型参数来求出输出的这个过程叫作预测(Prediction)或者推断(Inference)。但是如何通过数据来决定神经网络中每个权重和阈值的大小呢?假设现在有一个上文中使用阈值法的神经网络,我们对其中一个感知器的某一个权重进行微调,那么能不能在输出层也观察到一个相应的变化呢?如图1.4所示。

如果可以的话,我们能不能根据输出的变化反过来调节权重,通过给定已知的网络的输入输出来求出网络权重参数?

比方说,某种条件下小明会选择去踢足球,但是神经网络的预测却是相反的。那么我们就可以通过预测和真实情况之前的差值,来调整神经网络中的权重。如果我们能够获得大量关于小明决策结果的历史数据,就可以根据历史真实数据不断地调整网络的权重,以达到训练的目的。图1.4 微调参数

事实上,如果我们的神经网络是由使用阈值法的感知器组成的,那么我们并不总是能观察到这个变化。这是因为根据感知器的定义,z需要大于一个阈值才能引起输出从0到1的变化,这是一个不连续的数值变化,不能求导。所以对于w的一个微小变化,有可能使z大于阈值,也有可能使z仍然小于阈值。所以,由感知器组成的神经网络是难以训练的。

下面我们来看看这个问题是如何解决的。首先,对函数f (z)进行一些小的改动。刚才提到函数f (z)需要z大于某个阈值才会引起输出的改变,我们可以让z加上一个偏值(Bias)b,即z=x*W+b。偏值代表了f (z)被激发的难易程度。回到刚才的问题,为了让输出可以随权重的任意变化而改变,我们引入一种新的神经元——Sigmoid神经元。这种神经元和感知器主要有两个区别:1)神经元的输入变量x ,x ,x不再只能取0,1两个值,而是可以取任意实数;2)神123经元的输出不再是0或者1,而是把z输入到一个新的函数,我们把这个函数称为Sigmoid函数。可以表达成如下形式:

现在我们来讨论一下这个Sigmoid函数,当z是一个很大的正数的-a时候,e约等于0,所以会导致σ(z)约等于1。当z是一个非常大的-a负数的时候。e会趋近于正无穷,导致σ(z)趋近于0。也就是说,当f (z)的绝对值非常大的时候,带Sigmoid的神经元和阈值感知器所展现的功能是差不多的。如果f (z)的取值是在0附近呢?让我们来看看两类神经元的输出图像,如图1.5和图1.6所示。图1.5 Sigmoid函数图1.6 阈值法可用Step函数表示

从图中可以看到,其实Sigmoid函数就是平滑过的感知器的阈值法。通过这种平滑,我们就可以从神经元的输出里间接地观测到权重的改变,输出变得连续可求导。可以用一个公式来表示这种变化:

在这个公式中,代表输出根据每个权重和偏值变化的速率,Δw和Δb代表某个权重和偏值具体变化的量。把所有的这些变化加起来后就得到了输出的变化Δoutput。

前面无法从神经元输出中观测权重和偏值影响的问题,到此就可以初步解决了。但是Sigmoid神经元的输出不再只有两个值,而是从(0,1)这个区间取值的一个实数,这实际上可以看成是一种对结果概率化的描述,即结果的可能性——0%到100%。

如果我们将一个神经网络里的感知器全部替换成Sigmoid神经元,那么就得到了一个可以从任何权重变化来观测结果的系统。我们称这样的神经网络是可以微分的。现在我们已经有了一个由Sigmoid神经元组成的神经网络,给定一些已经标记好的数据(比如MINST手写数字集),那么要如何来寻找这个神经网络中最优的参数呢?1.2.3 损失函数

当我们有了一个神经网络结构以及标记的数据后,就需要使用这些数据来训练我们的网络,让网络的参数可以对新的数据进行正确的预测。但是要根据一个什么样的标准来调整参数呢?这里要引入损失函数(Loss Function)这个概念。损失函数是用来衡量网络输出和数据标记(Ground Truth)之间的差距的。

最开始,在神经网络的参数还没有进行训练时,神经网络对每个在训练数据中的样本的输出是随机的,所以网络的输出和数据的标记之间会有很大的误差,也就是说,损失函数的值会很大。但是通过优化模型参数的算法,损失函数的值会逐渐减小,使得神经网络对训练数据预测的错误率不断减小,这样训练出来的神经网络在遇到与训练数据类似的新的数据时能得到正确的结果。现在假设有一个训练集 T=(x,y),(x,y),...,(x,y),这里x 代表第n个输入的1122nnn向量,每个向量的特征是x,y是每个数据的正确的分类。现在假设nn神经网络的输出是a,并给出损失函数:

这里W 和b代表模型的参数,n是训练集合中样本的数目。显然模型的输出y是由W、b和x决定的。这种类型的损失函数实际上描述的是神经网络的预测和样本标注之前的最小平方差(均方误差,Mean Squared Error)。注意,这个函数是非负的,我们可以通过最小化这个均方误差让预测模型去拟合训练数据,在遇到新的数据时得到正确的输出。如果预测模型是一个线性模型,就可以通过简单的梯度下降法来得到模型的参数。但是一个神经网络模型一般由多层神经元组成,如何将预测与标注之间的错误传播到每一个神经元,是一个复杂的问题,我们将在后面一节介绍“反向传播算法”。在此之前,我们先看看如何用梯度下降法(Gradient Descent)和随机梯度下降法(Stochastic Gradient Descent,SGD)来求得一个函数的全局最小值。1.2.4 梯度下降和随机梯度下降

假设现在有一个函数C(v,v),这个函数的图像如图1.7所12示。图1.7 C(v,v)函数与梯度下降12

这个函数十分简单,肉眼就可以看出来它的最小值在哪里。此外,通过对这个函数求偏导数,并找到偏导数的零点,也可以得到这个函数最小值的解。但是这种求法只有在函数变量较少的时候才是可行的,如果函数变量过多,C(v,v,...,v)求偏导数的方法可能就不12n再适用了,尤其是像神经网络这样有成千上万个变量的模型。这时候我们就需要用梯度下降法来求得函数的全局最小值。简单来说,梯度下降就好像模拟了一个小球被放在图1.7所示的函数C(v,v)代表12的曲面上任意一个位置,然后重力使得小球向位置较低的地方移动,直到停在了整个曲面位置最低的地方。

现在先随意将小球随意放在曲面上的一个位置,然后让它沿着v1的方向移动Δv ,沿着v的方向移动Δv ,根据多元复合函数求导法122则,可以得出这样一个位移导致函数C(v,v)的值ΔC的变化:12

如果我们能找到这么一个位移 (Δv ,Δv )使得 ΔC 是负数,12那么很显然通过有限次数的迭代(小球移动到新的位置,计算新的 Δv 和 Δv ,然后继续根据新的位移移动)就可以使得这个小球移动12到这个函数最小值的位置。为了方便,我们设位移Δv:=(Δv ,1Δv ),并定义函数C的梯度,2这样公式(1.5)就可以写成位移和函数C梯度的内积形式。即:

我们的目的是通过选择合适的Δv,来让公式(1.6)的ΔC一直是负的。假设Δv=-η∇C(这里η是一个很小的正数),并代入可以得到:22

然后可以得到ΔC=-η||∇C|| ,因为||∇C||恒大于0,而-η又是小于0的,所以保证了ΔC一直小于0,这样就有了更新的Δv的公式,即:

在这个公式中,代表根据更新后的位置,v代表更新前的位置,-η代表步长(step-size),∇C代表位移的向量。

通过上面的介绍,我们已经知道如何使用梯度下降来找到一个只有两个变量的函数的最小值。事实上,当目标函数有很多变量时,梯度下降法依然能够找到函数的最小值。对于一个神经网络,我们也可以通过这个方法来找到可以让损失函数最小化的网络中的参数w和b,它们的更新规则如下所示:

对于神经网络来说,梯度下降虽然有可能找到全局最小值,但是它的计算成本太大,我们回忆一下均方差这个损失函数,它是定义在所有训练样本上的,也就是说,要得出∇C (w,b),就需要计算每一个训练集中样本的预测与标记的方差,然后再求出它们的平均值。在一般的机器学习任务中,训练集的样本数量一般都是巨大的,这有可能导致训练模型的时间非常长。随机梯度下降有效地解决了这个问题,随机梯度下降的核心思想是损失函数不再去估计所有样本,而是每次更新过程中,随机地从整个训练集中选取一个大小为m的子集(mini-batch),来估计整个训练集的均方差的梯度,即:

对于一个神经网络模型,用随机梯度下降更新参数的公式可以变成:

随机梯度下降的更新过程是这样的:(1)将训练集根据随机分割成几个长度为m的子集。(2)根据上面两个公式,用每个随机生成的子集更新网络的参数。(3)重复第(1)步和第(2)步,直到损失函数收敛。

在实际的神经网络训练中,随机梯度下降是最常用的训练方法。读者需要掌握其中的核心思想,因为本书后面的实例都是使用这个算法来对网络的权重进行更新的。1.2.5 反向传播算法简述

在1.2.4节中,我们已经了解到随机梯度下降可以用来更新网络的权重,但是神经网络一般是由数层神经元构成的,每个神经元都有自己的参数,对每一个神经元的求偏导数是一个十分复杂的过程。在这里只给出反向传播算法(Backpropagation)的简述,并直接给出反向传播算法最重要的四个公式,对其中的数学推导证明不做过多讲解。对于工程人员来说,现代机器学习框架已经对这些过程进行封装,即使不了解这个算法,也不影响你使用这些框架。

我们知道,从训练集中给定一个输入,一个没有经过训练的网络的输出和数据的标注之间会产生一个差值,这个差值可以定义为:L

这个公式中的δ代表最后输出层L的差值,代表损失函数对于最后一层激活函数的偏L导数,⊙代表Hadamard乘积,z代表最后一层网络每个神经元没有加激活函数的值。通过这个公式可以得到一个网络最后一层输出与数据标注之间的差值。下面给出第二个公式,把这个差值从最后一层传播到之前的神经网络层:

这个公式代表l层的差值可以通过之前层的差值、之前层的权重l和本层的输出z得到。这样我们就可以把差值一层一层地朝着输入层的方向进行传播,然后得到每个神经元所对应的差值。有了每个神经元的差值,就可以计算如下两个偏导数:

得到了每个神经元的梯度,我们就可以使用随机梯度下降来选择最优的模型参数。下面给出反向传播的伪代码:1(1)输入x:将相应的特征值设为输入层的值a。lllll(2)前向传播:对于每一层l=1,2,...L计算z =wa+b和a l=σ(z)。(3)用公式(1.13)计算最后一层的差值。(4)用公式(1.14)将差值从最后一层朝着输入层的方向进行反向转播。(5)有了每层的差值,就用公式(1.15)和公式(1.16)计算每个神经元关于权重与偏执的偏导数,并用梯度下降进行更新。

以上就是关于如何训练一个神经网络的全部内容,我们首先通过神经网络中最小的组成单元开始认识了多层感知器是如何构建起来的,然后引入了损失函数,通过损失函数可以有效地衡量神经网络模型和目标分布之间的差距。之后通过随机梯度下降和反向传播算法,神经网络的参数可以逐步被调整,直到损失函数收敛。不过请读者注意,由于神经网络的训练是一个高维非凸问题,所以有的时候并不能保证上述算法可以使得损失函数收敛到全局最优解。而且,由于网络在训练之前,其参数的初始化是随机的,所以对于同样的训练集和同样的训练参数,是有可能训练出参数不同的模型的。1.2.6 其他神经网络

为了便于读者理解,上文所介绍的神经网络模型、损失函数和训练算法都只是深度学习这个领域中最基础、最简单的方法。事实上,我们可以根据不同的任务来选择不同的模型或者损失函数。比如对于计算机视觉方面的任务,卷积神经网络(Convolution Neural Network,CNN)会有更大的优势。简单来说,卷积神经网络是为了图像应运而生的,它用卷积操作来代替感知器那种全连接结构。图像边缘提取其实就是一种卷积操作,大家可以先简单地把卷积神经网络理解为多层的边缘提取算法,即第一层卷积层对原图使用多个卷积核进行卷积得到多个边缘提取图像,第二层卷积层则从第一层卷积层得到的边缘提取图像上再次进行更高级的边缘提取,最后根据任务来选择输出层和损失函数,具体请阅读第4章。

对于时间序列数据,递归神经网络(Recurrent Neural Network,RNN)可能更加适合。多层感知器和卷积神经网络都只是输入一个x,输出一个y,而递归神经网络在输出y时会考虑过去出现过的x。简单来说,它比其他网络多了一个状态输出,即每次输入x后,都有一个状态输出,而这个状态输出则会作为下一步的状态输入,从而具备记忆能力。

损失函数除了均方差,也有交叉熵(Cross Entropy)等可以进行选择。训练算法上也有创新,比如基于动量更新的学习步长的算法等。

对于深度学习入门,除了上文的多层感知器,卷积神经网络和递归神经网络也是必须要掌握的。不同的神经网络有其特有的功能,有时候为了实现一些功能,需要把两种甚至两种以上的网络种类一起使用,这和玩乐高积木非常类似。比如基于视频的时间序列应用,就会把图像输入卷积神经网络中,然后把卷积神经网络的输出输入到递归神经网络中。总之,深度学习为广大工程师提供了一个巨大的工具箱,工程师们应该根据不同的任务来选择自己的工具,以得到最佳的性能。1.3 学习方法建议

授之以鱼不如授之以渔,学会学习方法甚至比阅读本书更加重要,这里总结了一些学习方法建议,希望对您有用。1.3.1 网络资源

Karpathy目前是特斯拉的人工智能负责人,斯坦福大学博士毕业,李飞飞的学生之一,他在读博之余写了很多博客,经过他的授权,TensorLayer的深度增强学习例子Pong Game就是用TensorLayer重新实现了他的numpy版本。此外还推荐另外两个博客Colah’s和Wildml,网址链接如下:

· Karpathy's Blog:http://karpathy.github.io

· Colah's Blog:http://colah.github.io

· Wildml:http://www.wildml.com

在论文方面,康奈尔大学(Cornell University)建立的arXiv网站有大量免费的论文可供阅读。由于计算机发展速度非常快,有时候论文还没发表出来技术就已经过时了,所以现在很多顶级的计算机文章都会先发布到arXiv上,以供同行阅读促进技术交流,这样做的好处是大家可以第一时间知道最新的人工智能研究。为此,Karpathy还做了一个arXiv-sanity网站来自动整理arXiv上的大量论文,方便大家搜索。这对从事深度学习研究的读者来说非常重要。此外,我们往往会忽略Google Scholar查找文章被引用信息的功能,很多非常好的论文会被该领域大量引用,因此当您想深入研究某个子领域时,您可以找出该领域比较出名的论文,查询哪些论文引用了它,通过引用时间排序,您就可以掌握当前该领域最新的进展了。

· arXiv:http://arxiv.org

· arXiv-sanity:http://www.arxiv-sanity.com/

· Google Scholar:https://scholar.google.co.uk

Github上不仅可以找到很多例子代码,我们还可以关注一些经验总结,比如waga-mamaz总结了TensorLayer使用的技巧,soumith总结了GAN的训练技巧。这些经验总结对于深度学习研究,有时候比找代码的意义更大。

· TensorLayer Tricks:https://github.com/wagamamaz/tensorlayer-tricks

· GAN Hacks:https://github.com/soumith/ganhacks1.3.2 TensorFlow官方深度学习教程

基于TensorFlow的库(Wrapper)会在不同程度上把运算操作隐藏起来,以简化程序,不过若想真正学好深度学习,需要理解每一个运算操作,至少要明白一些基本操作,这时就有必要了解一些TensorFlow的基础知识。在这里,我们建议在阅读本书之余,看看TensorFlow官方的深度学习教程,极客学院有对应的中文翻译版本。该教程涵盖全连接网络、图像识别、词的向量表达、语言建模、机器翻译等经典问题,而TensorLayer官方的深度学习教程包含了这些教程的实现,方便读者对照TensorFlow版本学习,本书中一些例子也是通过重复实现TensorFlow深度学习教程来讲解的。

· TensorFlow官方深度学习教程:https://www.tensorflow.org/tutorials/

· 极客学院中文翻译版本:http://wiki.jikexueyuan.com/project/tensorflow-zh

· TensorLayer深度学习教程:http://tensorlayer.readthedocs.io/en/latest/user/tutorial.ht ml

· TensorLayer深度学习教程(中文):http://tensorlayercn.readthedocs.io/zh/latest/user/tutorial.html1.3.3 开源社区

多与活跃的开源社区保持沟通可以加快学习速度,认识更多的合作伙伴,例如本书由TensorLayer中文社区众包完成,很多作者都是在社区交流活动中相互认识的。中文开源社区的微信、QQ和Slack联系方式可以在Github上找到,申请加入微信群和QQ群时,需要注明真实姓名、单位/学校,以及从事的研究方向(否则管理员可能会忽略),入群交流时需要遵守管理员的要求。

· Github:https://github.com/zsdonghao/tensorlayer

在微信群和QQ群问问题之前,如果是代码方面的问题请先查看Github Issues有没有您想要问的问题,常识性问题会引起他人的反感,影响社区氛围。熟练使用Tensor-Layer之后,可多在Github上贡献自己的代码并分享到群里,这看起来只是帮助他人,对自己并没有什么好处,然而事实恰恰相反,贡献代码可以使自己的代码更加精炼。这些技能是和他人进行技术合作时所必需的。1.4 TensorLayer1.4.1 深度学习框架概况

当读者开始实现一个深度学习项目时,最好使用一个支持你所会语言的框架。目前研究人员正在使用的深度学习框架不尽相同,很多大的AI企业也会有自己的框架,目前学术界和工业界的开源框架有TensorFlow、Torch、Caffe、Theano、Deeplearning4j等,科研人员在计算机视觉、语音识别、自然语言处理与生物信息学等领域使用这些框架并获取了极好的效果。

我们来一起了解一下其中的一些框架。

1.TensorFlow

TensorFlow作为一款数值计算软件,使用数据流图(Data Flow Graph)来定义计算流程。在图中,每个节点代表数据的输入输出或者数学运算符号,其中输入输出可以是一个数,或者一个张量(tensor),连接节点间的线条代表张量之间的处理关系。用TensorFlow实现项目可以轻松地部署在一个或者多个CPU、GPU上,甚至可以被部署在移动设备上。TensorFlow现在已经开源,并由Google开发和维护。在开源之前,TensorFlow是由Google Brain的研究人员开发作为内部使用,开源之后可以在几乎各种领域适用。

2.Caffe

Caffe是由加州大学伯克利的博士贾扬清用C++开发的,它的全称为Convolutional Architecture for Fast Feature Embedding。Caffe是一个清晰而高效的开源深度学习框架,目前由伯克利视觉学习中心(Berkeley Vision and Learning Center,BVLC)进行维护。

3.Theano

Theano是一个进行数值运算的Python库,它的核心是一个数学表达式的编译器,它知道如何获取你的结构,并使之成为一个使用numpy、高效本地库的高效代码,并把它们部署在CPU和GPU上高效运行。Theano于2008年诞生于蒙特利尔理工学院,是专门为深度学习中处理大型神经网络模型所设计的。它是这类深度学习库的首创之一,被认为是深度学习研究和开发的行业标准。

4.PyTorch

PyTorch是一个基于Python的深度学习框架,它的前身是Torch,主要语言接口是Lua,由于现在Github上大部分深度学习框架的语言接口都是Python,因此PyTorch就用Python重写了整个框架,再次重新回到了研究人员的视线。

简单来说,Google用TensorFlow来做科研和产品,Facebook用PyTorch做科研,而产品化用Caffe2。

斯坦福 CS231N 课程中有更加详细的框架对比,感兴趣的读者可以进一步阅读:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture8.pdf。1.4.2 TensorLayer概括

简单来说,TensorLayer除了和其他库一样都提供大量层(layer)的高级抽象外,还提供了大量搭建整个学习系统和产品的必备功能,包括数据预处理、数据后处理、数据管理、模型管理、文件夹管理等,使得开发者只需要TensorLayer一个库就能完成全部从研发到产品的工作,我们称之为end-to-end workflow。TensorLayer的设计理念是尽可能地满足不同阶段的开发者,使得开发者在初学阶段和骨灰级阶段都能使用同一个库,这是由下面几点设计思路实现的:

· TensorLayer对TensorFlow的高级抽象不会导致模型速度变慢。

· TensorLayer有类似scikit-learn的简化版训练API,也有针对骨灰级用户使用的迭代器(iterator),有简化版和专业版的layer(如Conv2dLayer和Conv2d的关系),便于同时适合不同阶段的用户使用。

· TensorLayer对TensorFlow非常透明,灵活性强,这一点非常像Theano时代的Lasagne。

· TensorLayer使用layer in layer out的设计方式,而其他TensorFlow库使用tensor in tensor out的设计方式,它们都可以通过LambdaLayer变成TensorLayer的一部分。

更多TensorFlow库的比较请参考:http://blog.mdda.net/ai/2016/12/10/layers-on-top-of-tensorflow-review。

在开发文档方面,我们推荐英文好的读者优先阅读英文文档,因为表达会更清晰,而且英文文档往往会优先更新。不过英文一般的读者也不要担心,中文文档目前由几位中国作者管理,更新基本是同步的。TensorLayer的Github和文档中除了深度学习的教程外,还有大量常用例子,方便读者根据自身需求学习。

· Github:https://github.com/zsdonghao/tensorlayer

· 英文文档:http://tensorlayer.readthedocs.io或者http://tensorlayer.org

· 中文文档:http://tensorlayercn.readthedocs.io

最后,TensorLayer 使用 Apache 2.0 License,简单来说,大家可以完全免费使用TensorLayer,甚至开发商业产品。1.4.3 实验环境配置

TensorFlow目前支持Ubuntu、Windows以及Mac系统,不过目前最主流的深度学习开发操作系统是Ubuntu。在硬件方面,虽然TensorFlow提供CPU版本,但本书例子需要训练神经网络,强烈建议读者准备一台配有NVIDIA GPU的电脑,并根据TensorFlow官网安装好CUDA、CuDNN和GPU版本的TensorFlow。

最后要安装TensorLayer,目前TensorLayer代码在Github上管理,若想把整个项目下载下来,则需要执行:

把整个项目下载下来的好处是添加修改源码方便,若之后想成为TensorLayer贡献者,这个方法最好不过。

此外,TensorLayer也可以直接通过pip安装稳定版本:

这个版本相对Github的版本往往会有数周的延时,新的功能并不能马上用到。若您与开源社区保持着联系,我们推荐从Github上安装最新的版本,这样的好处是可以用到最新的功能,万一遇到问题也可以讨论解决。安装最新版本请执行:

最后需要注意的一个常见问题是,有的用户把TensorLayer安装在无显示屏的远程服务器上时,import tensorlayer as tl会在 visualize.py中报错,比如:

这是由 matplotlib导致的。

解决方法有两种:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载