torch,原意“火炬”
提及Pytorch就不得不先从深度学习开始讲起。从事数据相关岗位的都知道,深度学习是机器学习的一个子方向,其主要以神经网络为基础模块,通过灵活组合一定层数的网络实现特定的模型功能,尤其擅长于计算机视觉(CV)和自然语言处理(NLP)方向。其发展历史上,在经历了两次高潮和两次低谷之后,目前处于第三次高速发展的蓬勃期。
网图,侵删
这里,深度学习的深度主要体现为构建的模型层数较多,故称之为“深”;但其实这里隐藏着一个重要假设,就是构建的模型都以神经元作为网络的最小单元,所以严谨的讲应叫做基于神经网络的深度学习。自然,也可以不基于神经网络,比如周志华团队前几年探索提出了深度随机森林模型,可谓是提出了深度学习的一个新的研究思路。
从理论研究到工业应用,其中必然少不了成熟的工业级实现。对于经典的机器学习模型,那么必然人人皆知scikit-learn;而若提及深度学习,则相应的工具包则不那么“集中和统一”,甚至称得上是大厂纷争之地。其中,最具代表性和广泛使用的当属TensorFlow和Pytorch,前者源于google,后者发于Facebook;前者以工业应用居多,后者则流行于学术界。当然,单论学术界还是工业界而言,二者也没有明确的界限。
起初,在了解到TensorFlow广泛应用工业界,而自己早已远离院校所以就直接入坑了TensorFlow,当了一段时间的TF boy,尤其是了解到TensorFlow2.0克服了早期1.0版本饱受诟病的静态图问题,所以也不认为TensorFlow有啥缺点。但后来,随着学习的深入,加之通过周边同事的了解,发现Pytorch有着更为优秀的特点:比如与Numpy的设计更为接近,语法风格更加Pythonic等等。所以,个人也就果断转投Pytorch阵营。
本文作为第一篇,仅用来介绍Pytorch能干什么,以及对为什么这么设计的个人理解。
Torch是一个老牌的深度学习框架,最早是基于lua语言开发的,由于其开发语言的小众性,所以其发展和应用也是受到了很多限制。自从Facebook开源了Python生态圈的Torch工具包——Pytroch之后,其就一直是匹敌TensorFlow的一个重量级工具。目前Pytroch在GitHub上获得54k star(TensorFlow目前在GitGHub上获得163k star,差距还是比较大的,大概有3倍之多)。
也正是由于深度学习最广泛的舞台在于图像和语音以及文本等应用方向,所以与Pytorch配套的三个工具包以及一个模型服务工具包:
- torchvision
- torchtext
- torchaudio
当然,Pytorch仍然是基础和核心
作为一个深度学习工具包,Pytorch能用来干什么呢?这里引用官方文档对其定位的描述,广义来说有两方面功能:
即:
- 支持GPU加速的Tensor计算能力
- 支持自动求导的深度神经网络构建
那么问题来了:都说Pytorch是一个深度学习工具,为什么其核心功能设计为如上两点?对此,个人理解如下:
其一:Tensor是深度学习模型构建和训练的基础,其地位就好比是array之于Numpy、DataFrame之于Pandas,其本身是一种数据结构,但却构成了Pytorch的灵魂所在。这里,Tensor英文原义为“张量”,其实就是对应一个多维数组,本质上跟numpy的ndarray是一致的。
从这一角度来看,Pytorch可视作是numpy的升级版,这里的升级主要体现为可以利用GPU的强力并行计算能力。如果有Numpy基础,学习Pytorch其实可以很简单;另一方面,学Pytorch也完全可以作为是对Numpy的一个补充,而不去考虑构建深度学习模型的用途。
其二:Pytorch定位为一个深度学习工具,其更为主体的功能在于支持深度学习模型的构建和训练。与此同时,与经典机器学习中有成熟模型不同的是,深度学习网络大多没有固定的模型或范式,而一般由使用者将多个基础模块灵活搭配来组成(当然,其实也有一些成熟的模型,例如LeNet-5、AlexNet和VGGNet等,但更普遍的仍然需要使用者自己去定制),所以Pytorch对深度学习的支持不在于集成了多少成熟的模型,而在于提供了基础的深度学习模块,这些就好似脚手架一般,可以任意组合搭配,从而实现更为自由定制化的功能。
Pytorch功能还是比较丰富和繁杂的,最好的学习平台是查阅其官方文档,https://pytorch.org/。源于Pytroch群体的广泛性,目前其文档支持多种语言,包括中文文档在内,这也为自学者快速入门提供了更多渠道。我个人也是受益其中,后续的推文也将以此作为重要参考框架。
本篇推文就写这么多,对标从工具入门到模型建模,后续将每周更新一篇Pytorch学习系列推文。