Lesson 7 (3) 深入理解PyTorch与PyTorch库架构
我們已經(jīng)理解了神經(jīng)網(wǎng)絡(luò)是如何誕生的,也了解了怎樣的算法才是一個(gè)優(yōu)秀的算法,現(xiàn)在我們需要借助深度學(xué)習(xí)框架(Deep?learning?framework)來幫助我們實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)算法。在本門課程中,我們所使用的深度學(xué)習(xí)框架是PyTorch,也就是Torch庫的Python版本。之前我們已經(jīng)仔細(xì)地介紹了PyTorch中的基本數(shù)據(jù)結(jié)構(gòu)Tensor以及自動(dòng)求梯度工具autograd,相信你已經(jīng)對(duì)PyTorch有了一定的了解。在今天的課程中,我們將更深入地理解PyTorch庫的構(gòu)成以及PyTorch框架的設(shè)計(jì)理念,為之后熟練使用PyTorch打下基礎(chǔ)。
1?PyTorch的優(yōu)勢(shì)
對(duì)于已經(jīng)選擇了這門課的你,應(yīng)該早就把PyTorch的優(yōu)勢(shì)爛熟于心了。就如同每一個(gè)學(xué)習(xí)Python的人在Python課程的第一堂課會(huì)聽到的內(nèi)容一樣,無數(shù)的資料、課程都在說著相似的話:PyTorch簡單易用、上手容易、語法清晰……這些雖然是事實(shí),但卻無法加深你對(duì)PyTorch或深度學(xué)習(xí)的理解。在這一節(jié),我們將從深度學(xué)習(xí)模型的判別框架來看待,為什么PyTorch是一個(gè)優(yōu)秀的深度學(xué)習(xí)框架。
我們?cè)谏弦还?jié)中說過,一個(gè)好的深度學(xué)習(xí)模型,應(yīng)該是預(yù)測(cè)結(jié)果優(yōu)秀、計(jì)算速度超快、并且能夠服務(wù)于業(yè)務(wù)(即實(shí)際生產(chǎn)環(huán)境)的。巧合的是,PyTorch框架正是基于這樣目標(biāo)建立的。
一個(gè)神經(jīng)網(wǎng)絡(luò)算法的結(jié)果如何才能優(yōu)秀呢?如果在機(jī)器學(xué)習(xí)中,我們是通過模型選擇、調(diào)整參數(shù)、特征工程等事項(xiàng)來提升算法的效果,那在神經(jīng)網(wǎng)絡(luò)中,我們能夠做的其實(shí)只有兩件事:
1)加大數(shù)據(jù)規(guī)模
2)調(diào)整神經(jīng)網(wǎng)絡(luò)的架構(gòu),也就是調(diào)整網(wǎng)絡(luò)上的神經(jīng)元個(gè)數(shù)、網(wǎng)絡(luò)的層數(shù)、信息在網(wǎng)絡(luò)之間傳遞的方式。
對(duì)于第一點(diǎn),PyTorch的優(yōu)勢(shì)是毫無疑問的。PyTorch由Facebook AI研究實(shí)驗(yàn)室研發(fā)。在2019年,FB每天都需要支持400萬億次深度學(xué)習(xí)算法預(yù)測(cè),并且這個(gè)數(shù)據(jù)還在持續(xù)上漲,因此PyTorch天生被設(shè)計(jì)成非常適合進(jìn)行巨量數(shù)據(jù)運(yùn)算,并且可以支持分布式計(jì)算、還可以無縫銜接到NVIDIA的GPU上來運(yùn)行。除此之外,PyTorch的運(yùn)行方式有意被設(shè)計(jì)成更快速、更穩(wěn)定的方式,這使得它運(yùn)行效率非常高、速度很快,這一點(diǎn)你在使用PyTorch進(jìn)行編程的時(shí)候就能夠感受到。為高速運(yùn)行巨量數(shù)據(jù)下的神經(jīng)網(wǎng)絡(luò)而生,PyTorch即保證了神經(jīng)網(wǎng)絡(luò)結(jié)果優(yōu)秀,又權(quán)衡了計(jì)算速度。
而第二點(diǎn),則是深度學(xué)習(xí)整個(gè)學(xué)科的靈魂操作。我們耳熟能詳?shù)?/span>RNN、CNN、LSTM等算法,其實(shí)都是在原始神經(jīng)網(wǎng)絡(luò)上進(jìn)行了神經(jīng)元、鏈接、或信息傳遞方式的改變而誕生的。因此,一個(gè)優(yōu)秀的深度學(xué)習(xí)框架,必須具備非常高的靈活性和可調(diào)試性,才有可能不斷推進(jìn)深度學(xué)習(xí)算法的研究。(同時(shí),一個(gè)優(yōu)秀的深度學(xué)習(xí)算法工程師,必須具備靈活調(diào)用任何可用網(wǎng)絡(luò)結(jié)構(gòu)的能力,才可能搭建出適應(yīng)實(shí)際工業(yè)場(chǎng)景的神經(jīng)網(wǎng)絡(luò))。幸運(yùn)的是,PyTorch框架的創(chuàng)始團(tuán)隊(duì)在建立PyTorch時(shí)的目標(biāo),就是建立最靈活的框架來表達(dá)深度學(xué)習(xí)算法,這為PyTorch能夠最大程度釋放神經(jīng)網(wǎng)絡(luò)算法的潛力、放大深度學(xué)習(xí)的本質(zhì)優(yōu)勢(shì)、實(shí)現(xiàn)更好的算法效果提供了基礎(chǔ)。
同時(shí),為了能夠讓算法調(diào)試變得更加容易,PyTorch在設(shè)計(jì)之初就支持eager?model(類似于在jupyter notebook的運(yùn)行方式,可以每寫幾行代碼就運(yùn)行,并且返回相應(yīng)的結(jié)果,通常在研究原型時(shí)使用),而tensorflow等框架在最初是不支持eager model,只支持graph-based model(一次性寫完全部的代碼,編譯后上傳服務(wù)器進(jìn)行全部運(yùn)行,這種類型的代碼更加適合部署到生產(chǎn)環(huán)境中)。現(xiàn)在的PyTorch使用JIT編輯器,使得代碼能夠在eager和graph?model之間自由轉(zhuǎn)換,tensorflow也在1.7版本之后補(bǔ)充了這個(gè)功能。
最難得的是,PyTorchAPI簡化程度很高,代碼確實(shí)簡單易懂。在編程的世界里,封裝越底層就越靈活(如C++就比Python更加靈活),但越底層的框架往往就越復(fù)雜,需要的代碼量也越多。PyTorch建設(shè)團(tuán)隊(duì)在構(gòu)筑PyTorch項(xiàng)目時(shí),一直遵守“簡單勝于復(fù)雜”的原則。為了讓PyTorch盡量簡單,他們參考了大量NumPy以及Python的基本語法,讓PyTorch可以無縫銜接到Python中,在保留靈活性的同時(shí),最高程度地簡化了API,繼承了Python的大部分語法風(fēng)格。對(duì)于熟練使用Python的人來說,使用PyTorch庫通常輕而易舉。
除此之外,PyTorch十分重視從研發(fā)算法到工業(yè)應(yīng)用的過程。在PyTorch的官網(wǎng)頭圖上,甚至能夠直接看到from?research to production(從研發(fā)到生產(chǎn))的字樣。他們甚至完整地定義了算法部署到實(shí)際環(huán)境中需要達(dá)到的數(shù)個(gè)要求,并在2019年QCon會(huì)議的演講中詳細(xì)地說明了PyTorch團(tuán)隊(duì)是如何圍繞”從研發(fā)到生產(chǎn)“這個(gè)目標(biāo)設(shè)計(jì)了PyTorch的部署模塊JIT。
總結(jié)一下,??PyTorch的優(yōu)勢(shì)可以概括為以下幾點(diǎn):
- 天生支持巨量數(shù)據(jù)和巨大神經(jīng)網(wǎng)絡(luò)的高速運(yùn)算
- 靈活性高,足以釋放神經(jīng)網(wǎng)絡(luò)的潛力,并且在保留靈活性的同時(shí),又有Python語法簡單易學(xué)的優(yōu)勢(shì)?
- 支持研究環(huán)境與生產(chǎn)環(huán)境無縫切換,調(diào)試成本很低
作為深度學(xué)習(xí)框架,PyTorch可以說具備幾乎所有產(chǎn)出優(yōu)質(zhì)深度學(xué)習(xí)算法的條件。現(xiàn)在,PyTorch社區(qū)及圍繞PyTorch的生態(tài)還在建設(shè)中,這可以說是它唯一的弱勢(shì)了。作為一門深度學(xué)習(xí)入門課程,我們非常推薦你選擇PyTorch作為你的第一個(gè)深度學(xué)習(xí)框架。但它是否會(huì)成為你的最后一個(gè)深度學(xué)習(xí)框架,將交由學(xué)完課程的你來決定。
2?PyTorch庫的基本架構(gòu)
雖然PyTorch庫在建設(shè)時(shí)擁有許多先進(jìn)的理念,但在庫的規(guī)劃整理這一點(diǎn)上,它卻與大部分編程庫一樣,顯得有些潦草。任何編程庫都不是在一個(gè)完美的企劃下被設(shè)計(jì)出來的,而是在實(shí)際應(yīng)用中不斷被探索出來的,這就導(dǎo)致大部分編程庫的體系是混亂的——即初學(xué)者完全不知道應(yīng)該從哪里開始學(xué)習(xí),典型的代表就是matplotlib,??NumPy這些明明很有用,但是官網(wǎng)寫得不知所云的庫。
PyTorch官網(wǎng)在深度學(xué)習(xí)領(lǐng)域常常受到贊揚(yáng),許多人認(rèn)為PyTorch官網(wǎng)寫得簡單明了,容易上手。但如果是學(xué)過sklearn課堂的小伙伴,就會(huì)知道sklearn官網(wǎng)是多么規(guī)范、多么易學(xué):
再看看PyTorch官網(wǎng)這令人窒息的,按字母表順序排列的類的列表:
文檔寫得好?其實(shí)全是同行的襯托,反正比tf寫得好一點(diǎn)點(diǎn)。
在開始學(xué)習(xí)PyTorch之前,我們對(duì)PyTorch的核心模塊進(jìn)行了梳理。現(xiàn)在PyTorch中的模塊主要分為兩大類:原生Torch庫下,用于構(gòu)建靈活神經(jīng)網(wǎng)絡(luò)的模塊,以及成熟AI領(lǐng)域中,用以輔助具體行業(yè)應(yīng)用的模塊。
?
兩大模塊的層次是并列的,當(dāng)我們導(dǎo)入庫的時(shí)候,我們是這樣做:
import torch import torchvision實(shí)際上在我們對(duì)PyTorch進(jìn)行安裝的時(shí)候,我們也是同時(shí)安裝了torch和torchvision等模塊。?當(dāng)我們需要優(yōu)化算法時(shí),我們運(yùn)行的是:
from torch import optim看出庫的層次區(qū)別了嗎?在我們課程的前幾周,我們會(huì)集中在Torch模塊中,幫助大家熟悉PyTorch的基本操作,并培養(yǎng)從0建立起自定義神經(jīng)網(wǎng)絡(luò)的能力。在課程后續(xù)的篇章中,我們將會(huì)涉入成熟AI領(lǐng)域的許多庫中,對(duì)成熟算法和先進(jìn)的神經(jīng)網(wǎng)絡(luò)架構(gòu)進(jìn)行講解。為了構(gòu)建強(qiáng)大的神經(jīng)網(wǎng)絡(luò),我們會(huì)交叉使用兩個(gè)模塊的內(nèi)容。在我們學(xué)習(xí)的過程中,我們或許會(huì)用到不在這兩張架構(gòu)圖上的庫,后續(xù)我們會(huì)繼續(xù)補(bǔ)充和修繕這兩張架構(gòu)圖。
了解了這么多內(nèi)容后,你終于可以開始學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)了。PyTorch代碼雖然簡單,但運(yùn)行一行簡單的代碼卻需要豐富的基礎(chǔ)知識(shí)。從下一節(jié)課開始我們從0學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),并逐漸讓你掌握PyTorch中的代碼。
總結(jié)
以上是生活随笔為你收集整理的Lesson 7 (3) 深入理解PyTorch与PyTorch库架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lesson 7(12)神经网络的诞生与
- 下一篇: Lesson 8.18.2 单层回归神经