What is PyTorch
PyTorch是一个Python库,可以帮助我们构建深度学习项目。它强调灵活性并允许我们使用熟悉的Python格式来表达深度学习模型。PyTorch的易用性使得其很早便被研究社区所接纳,并且自官方库发布以来的几年中,它已成长为最广泛应用的深度学习工具之一。
PyTorch提供了一个核心数据结构——Tensor,这是一个与NumPy数组非常相似的多维数组。 基于Tensor构建了一系列功能,以简化项目的启动和运行,以及对设计和训练一个新的神经网络体系结构的探索。Tensor可用于加速数学运算(假设硬件和软件搭配适当),除此之外,PyTorch内置的包可用于分布式训练、高效数据加载,并且内置了大量常用的深度学习函数。
正如Python用于编程一样,PyTorch不仅是入门深度学习的杰出工具,同时也是在专业环境下用于现实世界中高水平作业的工具。
What is this book
本书旨在为精通Python并愿意使用PyTorch来构建深度学习项目的软件工程师、数据科学家和积极进取的学生提供入门方法。为此,书中采取了动手实战的教学方式。本书十分鼓励在学习本书的同时随时准备好使用计算机,以便亲自动手体验相关案例,并继续做更进一步的探索。
尽管深度学习的动手实践很重要,但是本书不仅仅是只作为一个工具技能使用的参考,更希望本书能够帮助下一代的研究者和从业人员在未来几十年的工作中,将书中学到的理论知识作为骨架构建起新的软件和应用。
为了理解书中的大多数内容,你需要具备两项条件:
一些Python的编程经验,但不必有压力,仅仅需要掌握常见的Python数据类型、类、和浮点数等相关知识;
一颗愿意动手的心。跟着书中的知识动手实践会使得学习变得更加容易。
深度学习是一个庞大的学科领域。本书只会涉及该领域中的一小部分,使用PyTorch构建一些小规模的项目。大多数的项目示例中会用到2D和3D图像数据集的处理。本书专注于PyTorch的实战练习,希望帮助读者打好基础,从而能够利用深度学习来解决现实问题或探索研究文献中的新模型。ArXiV存储了很多深度学习相关的最新研究,托管地址是https://arxiv.org。
Why PyTorch
通过给模型输送数据的方式,深度学习可以执行各种复杂的任务,例如机器翻译,玩策略游戏以及识别混乱场景中的目标物。但是完成这些任务需要灵活的工具,可以应对不同的场景,同时能提高效率,可在较短时间内完成对大量数据的训练。而且读者有时也会需要预训练好的网络能够对未知的输入数据顺利执行,并得出正确的结果。
PyTorch非常容易上手。许多研究者和从业者都认为PyTorch易于学习、使用、扩展功能和调试代码。风格Python化,对于任何有过Python编程经验的研发者来说,使用PyTorch会有种非常熟悉的感觉。
对于那些熟悉NumPy数组的研发者,PyTorch中的Tensor类会变得非常容易。PyTorch感觉就像是能够在GPU上运行并且带有自动求导功能的NumPy,非常适合于深度学习中的反向传播。
Tensor API功能非常强大,基本可以满足用户的大部分需求。PyTorch的设计理念是强大的表达能力,允许开发人员在实现复杂模型的同时避免增加不必要的复杂性(库不是一个框架,感觉这里在暗指某厂 - -)。在深度学习领域,PyTorch可以说是最容易将想法转换为代码实现的深度学习库。因此,PyTorch已在研究中得到广泛采用,国际会议的高引用率证明了这一点(哈哈,感觉作者有点小傲娇)。
PyTorch也能完成从研发到生产的过渡。尽管PyTorch最初专注于研究,但它也配备了高性能的C++运行引擎,用户完全可以脱离Python来部署模型,这一做法保留了PyTorch的大部分灵活性,并且可以摆脱Python运行机制的限制。作者认为当你精读完本书一定会认同他的观点(最后还是承认自卖自夸不太合适,还是得实践出真知哈)。
The deep learning revolution
在这一节中,我们将介绍一些历史来作证PyTorch适合深度学习(嗯,作者自夸还是很有一套的)。
直到2000年代末,常用的“机器学习”系统还是非常依赖于特征工程。特征是输入数据的数值表征,其产生的数值特征有助于后续算法(例如分类器)在面对新数据时获得正确的结果。特征工程将原始的输入数据转换成特征,以便输入给某个算法来解决某个问题。例如,在手写数字图像中把0和1区分开,可能需要使用一组filters来预估图像上边缘的方向并训练一个分类器。之后给定一个边缘方向的分布,分类器就可以预测出准确的数字。除了边缘,特征也可能是零、八或两个环中的两个封闭圆的数量。
与机器学习不同的是,深度学习从原始数据中自动学习特征,进而成功地执行任务。在区分1和0的例子中,将在训练过程中不断迭代输入数据和标签来改进filters。这并不是说特性工程在深度学习中不重要,开发人员通常需要将某种形式的知识注入到学习系统中。然而,神经网络能够根据输入数据提取出有价值的特征,这正是深层学习如此强大的原因。深度学习实践者的重点不是关注如何人为提取这些特征,而是思考模型架构,使得该模型能够从训练数据中自主地提取特征。通常,这些自动提取的特征比手工提取的特征要更具有代表性!和其他的许多颠覆性技术一样,这项技术也提供了不同的思路。
下图中左侧是一个机器学习的例子,研发者忙于定义特征工程,模型最终的效果取决于研发者所提取特征的表征能力。右侧采用深度学习,直接将原始 数据输入给算法,基于优化算法自动提取特征,模型最终的效果取决于研发者根据任务所用的算法性能。