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