PyTorch 入門,坑著實(shí)不少。咱們來談?wù)劊绾芜x個(gè)合適的教程,避開它們。
選擇
好幾位讀者,都留言問我:
王老師,我想學(xué)深度學(xué)習(xí),到底是該學(xué) Tensorflow ,還是 PyTorch?
沒有水晶球,我也不知道誰會(huì)最終勝出。
從現(xiàn)狀來看,PyTorch 的發(fā)展勢(shì)頭非常迅猛。在深度學(xué)習(xí)的頂會(huì)上,相關(guān)論文增速大幅超越 Tensorflow 。
Javaid Nabi 總結(jié)了一張最近兩年 arxiv 機(jī)器學(xué)習(xí)論文中提及 PyTorch 的折線圖,增長(zhǎng)趨勢(shì)一目了然。
在機(jī)器學(xué)習(xí)頂會(huì) NeurIPS 2019 上,PyTorch 更是被單獨(dú)拿出來討論。
底下的聽眾,是這樣的。
而另一邊,Google 的 Tensorflow 2.X 版本,在 Reddit 上正被吐槽和圍觀。
如果你是個(gè)應(yīng)用機(jī)器學(xué)習(xí)前沿技術(shù)的研究者,卻還對(duì) PyTorch 的存在熟視無睹,恐怕不是一個(gè)明智的選擇。
你該依賴的,是深度學(xué)習(xí)研發(fā)領(lǐng)域的生態(tài)系統(tǒng)。具體的原理,我在《學(xué) Python ,能提升你的競(jìng)爭(zhēng)力嗎?》和《數(shù)據(jù)科學(xué)入門后,該做什么?》兩篇文章里,已經(jīng)給你詳細(xì)闡釋過了。
簡(jiǎn)單來說,別人都用來溝通和協(xié)作的東西,你一竅不通,那就沒法愉快參與協(xié)作了。深度嵌入到系統(tǒng)的協(xié)作能力,才是你贏得競(jìng)爭(zhēng)的秘密武器。
例如,有人把 Google 的 BERT 從 Tensorflow 遷移到 PyTorch 后,就迅速開拓了一個(gè)評(píng)價(jià)高達(dá) 18.4K 顆星的項(xiàng)目。該項(xiàng)目受到學(xué)術(shù)界、工業(yè)界,乃至整個(gè)兒開發(fā)圈子的熱情追捧。
為什么?
因?yàn)樵?PyTorch 模型的基礎(chǔ)上進(jìn)行修改,非常方便,一切都是那么自然和透明。這吸引了許多研究者參與進(jìn)來,一步一個(gè)腳印,利用別人做出來的東西,更進(jìn)一步攀爬。
如果你做研究用到機(jī)器學(xué)習(xí),需要站在前人的肩膀上,那 PyTorch 已經(jīng)成為了你爬上別人肩膀的重要階梯。
可當(dāng)你信心滿滿,開始認(rèn)真學(xué)習(xí) PyTorch 時(shí),多半會(huì)……
掉在前方的陷坑里。
想想看,為什么網(wǎng)上為初學(xué)者展示深度學(xué)習(xí)“多么簡(jiǎn)單”的文章,舉的例子除了 Keras 就是 fast.ai ,而不是 PyTorch ?
因?yàn)?PyTorch 學(xué)起來,確實(shí)沒有它們那樣簡(jiǎn)便。
障礙
你要學(xué)習(xí) PyTorch ,會(huì)遇到哪些問題?
太多了。
篇幅所限,咱們只講其中最大的兩個(gè)坑。
首先是面向?qū)ο?/strong>(Object-Oriented Programming, OOP)。
PyTorch 的代碼,當(dāng)然也可以寫成 Keras 那種序列化形式。
然而對(duì)于大部分的 PyTorch 用戶的應(yīng)用場(chǎng)景來說,寫成那樣,是沒有什么意義的。
因?yàn)樗麄冎械闹黧w,是研究者。研究者不會(huì)滿足于現(xiàn)有結(jié)果或者重復(fù)已知模型。他們要搭建自己的模型結(jié)構(gòu),嘗試做自己的實(shí)驗(yàn)。
如果你要深度定制自己的模型架構(gòu),甚至對(duì)于一些細(xì)節(jié)作出精妙的修改(例如對(duì)不同模型層次,使用不同學(xué)習(xí)速率),那 PyTorch 寫出來,就會(huì)像是這個(gè)樣子。
看到 class
這樣的陌生關(guān)鍵詞,你可能會(huì)覺得有些發(fā)懵——用 Python 有段時(shí)間了,沒見過這玩意兒啊。
Python 說簡(jiǎn)單很簡(jiǎn)單,因?yàn)樗梢员划?dāng)成腳本語言來使用。也就是用順序、循環(huán)和判斷組織起來,類似英文的操作說明。
然而,說復(fù)雜,它也可以變得非常復(fù)雜。因?yàn)樗耆梢员划?dāng)成面向?qū)ο?/strong>語言來用。
許多標(biāo)題里帶著“入門”字樣的 PyTorch 教材或者課程,往往會(huì)直接假設(shè)你已經(jīng)掌握了面向?qū)ο缶幊痰幕A(chǔ)知識(shí),一帶而過。或者干脆告訴你,先去學(xué)習(xí)一下 OOP ,然后再回來繼續(xù)學(xué)。
于是,你打開一本講授面向?qū)ο缶幊?/strong>的書,旋即被其中的“抽象”、“繼承”、“封裝”、“多態(tài)”等術(shù)語繞暈,輕松完成“從入門到放棄”。
其實(shí),你根本用不著完全掌握 面向?qū)ο蟪绦蛟O(shè)計(jì)的各種要素,就可以學(xué) PyTorch 。早有 William Falcon 等人把 PyTorch 的程序?qū)懛ù笮栋藟K,給了你模板。真正用的時(shí)候,你只需對(duì)著模板填空就好。
可是,一些必要的面向?qū)ο笾R(shí),還是得學(xué)。不然填空你都不知道該填的位置,容易張冠李戴。
說完了“面向?qū)ο蟆保蹅冊(cè)僬f第二個(gè)坑,也就是“張量”(Tensor)。
PyTorch 讓許多研究者用戶大呼過癮的奧秘,其實(shí)就在于“張量”。
因?yàn)楦唠A API,例如 Keras, 甚至是 fast.ai ,都對(duì)張量進(jìn)行了重度包裹。
用戶不需要理解什么是張量,也可以做圖片分類,也可以分析文本的情感。
但是,PyTorch 不想慣你這種毛病。
想用它來搭建神經(jīng)網(wǎng)絡(luò)?你就必須直面張量。
你必須能夠說清楚每一層輸入和輸出張量的樣子。你必須知道怎么把你的原始數(shù)據(jù),轉(zhuǎn)換成這種樣子。
這種負(fù)擔(dān),看似會(huì)惹惱或者嚇走用戶。然而我們看問題不能只看一面。它的好處在于,代碼書寫規(guī)則,一下子變得簡(jiǎn)潔和一致。
因?yàn)槟阍缫岩粭U子到底,知道在 PyTorch 深度學(xué)習(xí)模型構(gòu)建中,最本質(zhì)的操作究竟是什么。你不需要?jiǎng)e人每次都為你提供高層 API 包裹的拐棍。
你可以隨時(shí)知道怎么完成各種操作。例如怎樣修改設(shè)置細(xì)節(jié)。遇到意想不到的問題,也能了解如何高效查錯(cuò)。
可是要理解張量,并不像 Pandas 數(shù)據(jù)框那么簡(jiǎn)單而直觀。
你會(huì)看到不少 PyTorch 的書籍和教程,都干脆指引你去學(xué)會(huì) numpy 。然后告訴你,PyTorch 可以近似看成 numpy 的一個(gè)輕量包裹。作者其實(shí),是在寄希望于你能自學(xué)好一大塊知識(shí)結(jié)構(gòu),并且還可以觸類旁通。
你怎么通?
從頭學(xué) numpy ?還是更進(jìn)一步,把線性代數(shù)也學(xué)一遍?
這樣做,聽起來沒有問題。打牢基礎(chǔ)是好事兒嘛。但是,你可能真的等不及。
你可能是想要復(fù)現(xiàn)一篇論文里的結(jié)果,并且進(jìn)行調(diào)整改進(jìn)。
等你耐下性子,東一榔頭西一棒子,學(xué)完了剛才說過的好幾門基礎(chǔ)課,別人的論文早就發(fā)出來了。
大多數(shù)時(shí)候,科學(xué)界只獎(jiǎng)勵(lì)先到者。第二名不會(huì)有任何的功勞(credit)。
況且,如果能這樣學(xué)完,你至少還掌握了一項(xiàng)技能。
更大的可能,是你在自學(xué)相關(guān)知識(shí)體系的途中跌倒了,再也沒有爬起來。
痛點(diǎn)
為什么 PyTorch 初學(xué)者,會(huì)遭遇這些困境?
因?yàn)楝F(xiàn)有的教程,大多與你不匹配。
甚至就連 PyTorch 的預(yù)期用戶,也和你不匹配。
PyTorch 的設(shè)計(jì),顯然不是為了完全不懂編程的普通用戶。按照作者原先的預(yù)想,只有學(xué)過了線性代數(shù)、科學(xué)計(jì)算、數(shù)據(jù)結(jié)構(gòu)和面向?qū)ο蟪绦蛟O(shè)計(jì)的專業(yè)人士,才是它的核心用戶群體。
然而,深度學(xué)習(xí)的突破進(jìn)展,像一個(gè)黑洞,吸引力異常強(qiáng)大。它把許多從來沒有學(xué)過編程的人,都裹挾了進(jìn)來。
在機(jī)器學(xué)習(xí)日新月異的進(jìn)展下,太多領(lǐng)域存在著低垂的果實(shí)。只要你學(xué)會(huì)了應(yīng)用現(xiàn)有深度學(xué)習(xí)工具,稍加改進(jìn)就可以采摘到它們。
這種誘惑,你能抵擋嗎?
對(duì)這個(gè)突然冒出來的人群,現(xiàn)有的教材和教程,很難做出足夠快速和必要的調(diào)整。所以你學(xué)起來,會(huì)很吃力。
那么,作為一個(gè)非計(jì)算機(jī)類專業(yè)出身的研究者,你需要什么樣的教程呢?
它應(yīng)該至少有以下兩個(gè)特點(diǎn):
- 一站式
- 樣例導(dǎo)向
所謂一站式,就是別只顧給出鏈接和線索,讓讀者東奔西走,甚至還得自己尋找相關(guān)的學(xué)習(xí)資源。遇到某個(gè)知識(shí)點(diǎn),例如面向?qū)ο螅蛘邚埩浚噲D從頭到尾完整學(xué)習(xí)體系知識(shí),顯然效率不高。做深度學(xué)習(xí)需要用到的,就該認(rèn)真掰開揉碎講清楚;暫時(shí)用不到的,就根本先不要提,免得讓學(xué)習(xí)者被一下子涌來的信息淹沒掉。
所謂樣例導(dǎo)向,就是能有實(shí)際的例子,讓學(xué)習(xí)者跟著作者講解的進(jìn)程,輕松上手操作實(shí)踐。有些知識(shí)點(diǎn),只要上手了,練過,犯過錯(cuò),你立即就能明白其中的關(guān)竅。你從而迅速掌握,并且建立寶貴的成就感。反之,如果只是給你憑空灌輸一系列的概念,或許能讓你聽著好像懂得了。可真正要用的時(shí)候,你立即就會(huì)感受到什么叫“書到用時(shí)方恨少”。
滿足上述兩個(gè)必要條件的合適教程,有嗎?
教程
不好找。
要滿足上述兩點(diǎn),教程的編寫者就需要長(zhǎng)期的技能培養(yǎng)和打磨。技能不僅包括對(duì)于 PyTorch 本身的深入理解和掌握,還得充分理解初學(xué)者的需求,知道如何把握講授的進(jìn)度和節(jié)奏。
這還不夠。作者還得尋找合適的樣例,用形象化的方式表述抽象概念,甚至是用動(dòng)態(tài)的效果展示張量操作與權(quán)重變化……這些,都需要耗費(fèi)大量寶貴的時(shí)間。
大部分機(jī)器學(xué)習(xí)領(lǐng)域的教材和教程,在編寫的時(shí)候,都有嚴(yán)格的時(shí)間進(jìn)度限制。這個(gè)領(lǐng)域,一直是高強(qiáng)度競(jìng)爭(zhēng)性。大家生怕自己的東西發(fā)布晚了,別人搶占先機(jī),所以很難有足夠的耐心。東西做到60分,能有一定合適的閱讀學(xué)習(xí)群體,那還不趕緊發(fā)布?等什么?
另外,擁有這種技能的作者,往往機(jī)會(huì)成本非常高。能夠全心全意投入教學(xué),而不選擇拿著自己高超的深度學(xué)習(xí)應(yīng)用技能出去賺快錢,也非易事。
我最開始學(xué) PyTorch 時(shí),嘗試了若干主流 MOOC 平臺(tái),還見識(shí)了不少網(wǎng)紅教師的教程。可惜,不僅學(xué)得效率低,過程也很痛苦。
后來,我終于找到一套視頻課程,真的可以滿足上述兩點(diǎn)要求。
譬如說,它將張量和面向?qū)ο笾R(shí)的介紹,包含在了課程里面。作者用淺明易懂的例子,讓你了解必要概念和技能后,迅速上手。
為了讓你能夠做一個(gè)圖像分類深度學(xué)習(xí)模型,作者真的精心設(shè)計(jì),幫你把它拆分成若干前后聯(lián)系緊密的模塊,一一娓娓道來。
視頻中使用了不少特效和動(dòng)畫。例如幫助你理解一張圖片如何轉(zhuǎn)化成張量,如何經(jīng)由你自行構(gòu)造的模型加以轉(zhuǎn)化,最終支持機(jī)器判斷類別,以及如何計(jì)算損失,迭代改進(jìn),讓你的分類模型越變?cè)铰斆鳌?/p>
甚至,對(duì)于為什么 GPU 可以加速深度學(xué)習(xí),都有專門的章節(jié),給你娓娓道來。
每一個(gè)視頻,大約都是10分鐘-20分鐘的長(zhǎng)度。足夠慢慢談透一個(gè)知識(shí)點(diǎn),也不會(huì)讓你覺得疲倦。
大部分視頻,都結(jié)合代碼來介紹。你可以打開 Google Colab 或者 Kaggle Notebook ,利用免費(fèi)的 GPU ,嘗試自己建構(gòu)和運(yùn)行。
視頻末尾,還總是有一些有趣的彩蛋。為了不剝奪你的樂趣,就不劇透了,你自己看。
為了保證視頻的品質(zhì),這套教程精細(xì)打磨。從2018年秋天開始發(fā)布第一個(gè)視頻起,一直持續(xù)更新了一年多的時(shí)間,才算全部制作完畢。
我學(xué)的時(shí)候,看教程是很愉快的。但是等候更新如同追劇,總是讓人覺得時(shí)間過得太慢,很難熬。
好消息是,你現(xiàn)在不用等了。因?yàn)樵摻坛趟械钠露家妖R備。你只需學(xué)就好了。
羨慕你。
在我的公眾號(hào)“玉樹芝蘭”后臺(tái),回復(fù)“pytorch”,我會(huì)發(fā)給你全套視頻教程的鏈接。
小結(jié)
這篇文章里,咱們談到了以下知識(shí)點(diǎn),我?guī)湍闶崂硪幌隆?/p>
- PyTorch 在科研領(lǐng)域作用日益重要,你如果做深度學(xué)習(xí)科研,恐怕是不得不學(xué)習(xí)它;
- PyTorch 包含了一些面向?qū)ο蟆埩坎僮鞯惹皩?dǎo)知識(shí)要求,初學(xué)者會(huì)有不小的學(xué)習(xí)障礙。所以選擇好的教程很重要;
- 在良莠不齊的 PyTorch 教程中,我把自己已發(fā)現(xiàn)的最精良一個(gè)視頻教程推薦給你。希望它也能幫你快速上手 PyTorch,助你早日做出自己的優(yōu)秀研究成果。論文發(fā)表了,別忘請(qǐng)我喝杯咖啡。
祝深度學(xué)習(xí)愉快!
讀過本文,如果覺得有收獲,請(qǐng)點(diǎn)贊。
要讀更多的文章,微信關(guān)注我的公眾號(hào)“玉樹芝蘭”(nkwangshuyi)。別忘了加星標(biāo),以免錯(cuò)過新推送提示。
如果本文對(duì)你身邊的親友有幫助,也歡迎你把本文通過微博或朋友圈分享給他們。
延伸閱讀
你可能也會(huì)對(duì)以下話題感興趣。點(diǎn)擊鏈接就可以查看。