屬于動(dòng)態(tài)圖的未來(lái):橫向?qū)Ρ萈yTorch與Keras
PyTorch 對(duì)機(jī)器學(xué)習(xí)領(lǐng)域的影響正在不斷擴(kuò)大,人們?cè)谑褂弥幸苍诓粩鄬⑵浜推渌麢C(jī)器學(xué)習(xí)框架進(jìn)行對(duì)比。最近,Marc Schmidt 在 Reddit 上撰文對(duì) Keras 和 PyTorch 進(jìn)行了全面的對(duì)比。作者認(rèn)為,PyTorch 在版本管理和調(diào)試等方面具有很大優(yōu)勢(shì)。
我可以根據(jù)自己作為軟件工程師的經(jīng)驗(yàn)(10 年以上)來(lái)給你一些答案。我也參與過(guò)很多開(kāi)源項(xiàng)目,還是幾十個(gè)開(kāi)源庫(kù)的作者,這些庫(kù)都有成千上萬(wàn)的收藏量和數(shù)百萬(wàn)的安裝量,因此我對(duì)于雙方(作者和用戶)在私人和商業(yè)領(lǐng)域的應(yīng)用都相當(dāng)了解。另外,很多人問(wèn)我為什么使用的是 aetros.com Keras 而非 Pytorch/xy。
讓我們定義一些屬性來(lái)定義庫(kù) X 的好壞:
1 星 - 低于平均水平,2 星 - 平均水平,3 星 - 高于平均水平
我來(lái)詳細(xì)解釋下這張表。
版本管理
當(dāng)你使用庫(kù)(無(wú)論開(kāi)源的還是商業(yè)的)并想繼續(xù)使用該庫(kù)來(lái)開(kāi)發(fā)一個(gè)應(yīng)用時(shí),非常重要的一點(diǎn)是這其中不會(huì)有隱藏的變化,而且你的應(yīng)用程序不會(huì)在你更新庫(kù)(以得到想要的功能或 bug 修復(fù))時(shí)發(fā)生中斷。最壞的情況是,當(dāng)你更新第三方庫(kù)時(shí)出現(xiàn)了一些 bug,你就得開(kāi)始進(jìn)行調(diào)試。這不僅會(huì)花費(fèi)很多時(shí)間而且令人討厭。所以,重要的是你要知道庫(kù)更新前后的變化。***的情況是,庫(kù)使用了依據(jù) semver(http://semver.org/)的語(yǔ)義版本控制,這確保了你在更新較小的補(bǔ)丁版本時(shí)不會(huì)發(fā)生中斷(至少是在嘗試,并不總能行,但這里的意圖是好的)。
至少,你標(biāo)記的每個(gè)版本都需要一份更新日志,這樣你就能看到 bug(如有)是否已被修復(fù)或者一個(gè)新功能(如需要)是否已得到實(shí)現(xiàn)。我在過(guò)去兩年里用 Keras 的次數(shù)越來(lái)越多,并發(fā)現(xiàn)了很多被標(biāo)記好的版本就簡(jiǎn)單地被稱作「新流程發(fā)布(New PiPy release)」??梢韵胂?,一個(gè)普通的開(kāi)發(fā)者完全不會(huì)知道該標(biāo)簽版本發(fā)生了哪些變化。這實(shí)際上是 Keras 在行業(yè)的專業(yè)使用方面尚未完備的其中一個(gè)原因,同時(shí)它對(duì)于優(yōu)秀且使用廣泛的庫(kù)的質(zhì)量標(biāo)準(zhǔn)也很高。用了 Keras 2 之后,該作者表明他所描述的版本開(kāi)始變得越來(lái)越好了。然而相比于 Pytorch,它仍然給人感覺(jué)像是一個(gè)自?shī)首詷?lè)的業(yè)余項(xiàng)目。參見(jiàn) https://github.com/fchollet/keras/releases 與 https://github.com/pytorch/pytorch/releases。在看到這樣一個(gè)詳細(xì)的 Pytorch 版本說(shuō)明之后我?guī)缀?幸福地)要哭了。當(dāng)你在一個(gè)專業(yè)的環(huán)境(對(duì)于行業(yè)來(lái)說(shuō),時(shí)間就是金錢(qián))中處理它時(shí),這將是你最喜歡的。
在版本管理上,我給 Keras 1 星,因?yàn)樗陌姹竟芾碜屛覑盒牧撕脦状?我給 Pytorch 3 顆星,因?yàn)槟憧梢钥吹皆谒竺嬗幸粋€(gè)團(tuán)隊(duì),他們投入了更多的精力來(lái)使用戶保持信息靈通。對(duì)于 Keras,編寫(xiě)這種版本說(shuō)明更像是一個(gè)令人討厭的流程。我也跟 PyTorch 的一位作者 Adam Paszke 聊了一下,他說(shuō)他們很注重這個(gè)環(huán)節(jié),這讓我有信心在自己的項(xiàng)目中使用它。
調(diào)試
好吧,這也是我喜歡 Pytorch 的一點(diǎn)。寫(xiě)代碼意味著總是發(fā)現(xiàn)并修復(fù) bug。你的(隱藏在庫(kù)和概念后面的)代碼越不可思議,理解 bug 并找出對(duì)應(yīng)的錯(cuò)誤代碼行與解決方案的過(guò)程就越令你感到痛苦。像 Theano 和 Tensorflow 那樣的靜態(tài)圖形庫(kù)在尋找問(wèn)題——「不能將 xy 應(yīng)用于一個(gè)非 2D 或 3D 的張量中」或「輸入 (233, 3, 44, 55) 與 (233, 3, 55, 44) shape 不相容」——根源方面表現(xiàn)得非常笨拙。你需要檢查你的模型并在大腦中計(jì)算張量的 shape,也許可以通過(guò)注釋掉一些層來(lái)找到原因。
有了像 Pytorch 一類的動(dòng)態(tài)圖像,你就可以在堆棧跟蹤中看到哪一行代碼導(dǎo)致了錯(cuò)誤。你甚至可以在調(diào)試器中停掉解釋器并看看某個(gè)層會(huì)產(chǎn)生什么。通過(guò)采用斷點(diǎn)并逐句檢查代碼,你發(fā)現(xiàn)上述 bug 的速度就可以提高 100 倍。在你遇到 bug 時(shí),這幾乎就成為了純粹的享受,因?yàn)槟阋呀?jīng)知道「只要讓調(diào)試器高速運(yùn)行就可以在一秒內(nèi)解決這個(gè)小 bug」。這實(shí)際上令我回想起自己剛開(kāi)始使用真正交互式的、帶斷點(diǎn)和運(yùn)行時(shí)評(píng)估等功能的調(diào)試器的日子,那是一種全新的效率體驗(yàn)。其中唯一的限制是你在代碼中所建立的抽象邏輯。如果你不能用調(diào)試器和 IDE 來(lái)調(diào)試它,那么你的代碼要么是太糟糕要么是過(guò)于抽象。
開(kāi)發(fā)體驗(yàn)
在這兩個(gè)庫(kù)中,你的深度神經(jīng)網(wǎng)絡(luò)運(yùn)行得都很快。Pytorch 還沒(méi)有如 Keras 那樣高層次的抽象(帶有回調(diào)函數(shù)),而是在網(wǎng)絡(luò)之外訓(xùn)練抽象等功能。所以你還是需要寫(xiě)一些樣板文件。然而,這里(https://github.com/ncullen93/torchsample)Keras 提供的 API 基本上與 Pytorch 的相同。Pytorch 還很青澀,你會(huì)遇到一些 DX 方面的問(wèn)題,比如「如何讓卷積層變平,使它與隱藏層兼容」(提示:僅僅「.add(Flatten())」是無(wú)法解決的,但我相信 Pytorch 開(kāi)發(fā)者們正在想辦法解決它。這是我給 Pytorch 2 顆星而給 Keras 3 顆星的原因。Keras 在開(kāi)發(fā)經(jīng)驗(yàn)(除了調(diào)試)方面非常出色。你可以得到很好的早期效果且能夠進(jìn)行傻瓜式層編寫(xiě)。
上線時(shí)間
當(dāng)我在談?wù)搸?kù)的上線時(shí)間時(shí)其實(shí)是在說(shuō):我們的開(kāi)發(fā)人員需要多長(zhǎng)時(shí)間來(lái)理解庫(kù)、發(fā)現(xiàn)/修復(fù)漏洞、受到庫(kù)的啟發(fā)(***一點(diǎn)尤其重要,因?yàn)橐粋€(gè)開(kāi)發(fā)者在燃起了對(duì)工具的使用興致后,其開(kāi)發(fā)速度通常會(huì)提升 2-5 倍)。兩個(gè)庫(kù)都很好,盡管 Keras 出現(xiàn)的時(shí)間更早且有更多的網(wǎng)上教程和文檔。所以 Pytorch 就比 Keras 少 1 顆星。
社區(qū)支持
這個(gè)問(wèn)題很棘手。什么是社區(qū)?對(duì)于像 Pytorch 和 Keras 之類較小的庫(kù),得有一些對(duì)其進(jìn)行宣傳并(即使是對(duì)垃圾問(wèn)題)提供有價(jià)值的解答以及幫助修復(fù)社區(qū) bug 的人,這點(diǎn)非常重要。如果你像 Keras 那樣自?shī)首詷?lè),那么要搞定所有問(wèn)題是非常困難的。你可以在 Keras 的問(wèn)題追蹤器中很清楚地看到 2,500 個(gè)開(kāi)放的問(wèn)題,以至于該項(xiàng)目完全不堪重負(fù)。相比之下,Pytorch 是由一個(gè) Facebook 的工程師團(tuán)隊(duì)進(jìn)行維護(hù),你可以看到那里的問(wèn)題更少且社區(qū)支持更加活躍。如果你在 Keras 中遇到一個(gè)問(wèn)題,可能要等上幾周/月的時(shí)間才能(如果可能)得到解決方案。
商業(yè)支持
Pytorch 太新了,幾乎還沒(méi)有人提供商業(yè)支持。我相信連 Facebook 都不會(huì)提供任何資金支持。Keras 則有些不一樣。已經(jīng)有很多使用 Tensorflow/Theano/Keras 來(lái)提供開(kāi)發(fā)服務(wù)的公司。所以,如果你遇到一個(gè)問(wèn)題并想用錢(qián)來(lái)解決,則***用 Keras/Tensorflow。
長(zhǎng)期發(fā)展
我相信在 Facebook 和谷歌對(duì)兩個(gè)項(xiàng)目的支持下,你大可以說(shuō)二者會(huì)在未來(lái)幾年內(nèi)依然存在。盡管我真的希望 Keras 可以得到一支谷歌團(tuán)隊(duì)或一個(gè)開(kāi)源組織的支持,這樣它就不會(huì)僅僅因?yàn)榇罅块_(kāi)放且不斷涌入的問(wèn)題而死掉。
從長(zhǎng)遠(yuǎn)來(lái)看,靜態(tài)圖會(huì)成為過(guò)去,而相對(duì)便于使用的庫(kù)會(huì)得到越來(lái)越多的使用,因?yàn)樵谡5能浖_(kāi)發(fā)領(lǐng)域,調(diào)試和上市時(shí)間對(duì)于行業(yè)的可維護(hù)性(機(jī)器學(xué)習(xí)正在朝此方向行進(jìn))來(lái)說(shuō)是最重要的。在所有這三個(gè)類別中,像 PyTorch 那樣的動(dòng)態(tài)圖像都將綻放光芒。
你可以對(duì)任何任務(wù)同時(shí)部署 Keras 和 PyTorch。你對(duì)誰(shuí)了解得更深,那么你用它編寫(xiě)異乎尋常的代碼就會(huì)更快。雖然我傾向于認(rèn)為 Pytorch 在編寫(xiě)非同尋常的事物方面更加靈活,而你可能認(rèn)為層代碼的編寫(xiě)就不是這樣。
結(jié)論
我現(xiàn)在更喜歡 Keras,因?yàn)槲疑弦淮卧囉?PyTorch 時(shí),它還有幾個(gè) GPU 方面的問(wèn)題,還有另一些問(wèn)題我沒(méi)有克服。在 Keras 上,我的項(xiàng)目已經(jīng)運(yùn)行了數(shù)月,其效果相當(dāng)不錯(cuò),盡管我在運(yùn)行時(shí)間更久(并非幾天時(shí)間)的項(xiàng)目中看到了一些 bug 報(bào)告,而且使用靜態(tài)圖的后端來(lái)調(diào)試 Keras 相當(dāng)麻煩。在接下來(lái)的幾個(gè)月里,如果 PyTorch 變得越來(lái)越穩(wěn)定,我肯定會(huì)轉(zhuǎn)投 PyTorch 陣營(yíng)。然而我還想試試 Caffe2。
原文:
https://www.reddit.com/r/MachineLearning/comments/6grw9t/n_early_access_to_deep_learning_book_by_keras/
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】