屬於動態圖的未來:橫向對比PyTorch與Keras
選自reddit
作者:Marc Schmidt
參與:Rick、李澤南
PyTorch 對機器學習領域的影響正在不斷擴大,人們在使用中也在不斷將其和其他機器學習框架進行對比。最近,Marc Schmidt 在 Reddit 上撰文對 Keras 和 PyTorch 進行了全面的對比。作者認為,PyTorch 在版本管理和調試等方面具有很大優勢。
我可以根據自己作為軟體工程師的經驗(10 年以上)來給你一些答案。我也參與過很多開源項目,還是幾十個開源庫的作者,這些庫都有成千上萬的收藏量和數百萬的安裝量,因此我對於雙方(作者和用戶)在私人和商業領域的應用都相當了解。另外,很多人問我為什麼使用的是 aetros.com Keras 而非 Pytorch/xy。
讓我們定義一些屬性來定義庫 X 的好壞:
1 星 - 低於平均水平,2 星 - 平均水平,3 星 - 高於平均水平
我來詳細解釋下這張表。
版本管理
當你使用庫(無論開源的還是商業的)並想繼續使用該庫來開發一個應用時,非常重要的一點是這其中不會有隱藏的變化,而且你的應用程序不會在你更新庫(以得到想要的功能或 bug 修復)時發生中斷。最壞的情況是,當你更新第三方庫時出現了一些 bug,你就得開始進行調試。這不僅會花費很多時間而且令人討厭。所以,重要的是你要知道庫更新前後的變化。最好的情況是,庫使用了依據 semver(http://semver.org/)的語義版本控制,這確保了你在更新較小的補丁版本時不會發生中斷(至少是在嘗試,並不總能行,但這裡的意圖是好的)。
至少,你標記的每個版本都需要一份更新日誌,這樣你就能看到 bug(如有)是否已被修復或者一個新功能(如需要)是否已得到實現。我在過去兩年里用 Keras 的次數越來越多,並發現了很多被標記好的版本就簡單地被稱作「新流程發布(New PiPy release)」。可以想像,一個普通的開發者完全不會知道該標籤版本發生了哪些變化。這實際上是 Keras 在行業的專業使用方面尚未完備的其中一個原因,同時它對於優秀且使用廣泛的庫的質量標準也很高。用了 Keras 2 之後,該作者表明他所描述的版本開始變得越來越好了。然而相比於 Pytorch,它仍然給人感覺像是一個自娛自樂的業餘項目。參見 https://github.com/fchollet/keras/releases 與 https://github.com/pytorch/pytorch/releases。在看到這樣一個詳細的 Pytorch 版本說明之後我幾乎(幸福地)要哭了。當你在一個專業的環境(對於行業來說,時間就是金錢)中處理它時,這將是你最喜歡的。
在版本管理上,我給 Keras 1 星,因為它的版本管理讓我噁心了好幾次;我給 Pytorch 3 顆星,因為你可以看到在它後面有一個團隊,他們投入了更多的精力來使用戶保持信息靈通。對於 Keras,編寫這種版本說明更像是一個令人討厭的流程。我也跟 PyTorch 的一位作者 Adam Paszke 聊了一下,他說他們很注重這個環節,這讓我有信心在自己的項目中使用它。
調試
好吧,這也是我喜歡 Pytorch 的一點。寫代碼意味著總是發現並修復 bug。你的(隱藏在庫和概念後面的)代碼越不可思議,理解 bug 並找出對應的錯誤代碼行與解決方案的過程就越令你感到痛苦。像 Theano 和 Tensorflow 那樣的靜態圖形庫在尋找問題——「不能將 xy 應用於一個非 2D 或 3D 的張量中」或「輸入 (233, 3, 44, 55) 與 (233, 3, 55, 44) shape 不相容」——根源方面表現得非常笨拙。你需要檢查你的模型並在大腦中計算張量的 shape,也許可以通過注釋掉一些層來找到原因。
有了像 Pytorch 一類的動態圖像,你就可以在堆棧跟蹤中看到哪一行代碼導致了錯誤。你甚至可以在調試器中停掉解釋器並看看某個層會產生什麼。通過採用斷點並逐句檢查代碼,你發現上述 bug 的速度就可以提高 100 倍。在你遇到 bug 時,這幾乎就成為了純粹的享受,因為你已經知道「只要讓調試器高速運行就可以在一秒內解決這個小 bug」。這實際上令我回想起自己剛開始使用真正互動式的、帶斷點和運行時評估等功能的調試器的日子,那是一種全新的效率體驗。其中唯一的限制是你在代碼中所建立的抽象邏輯。如果你不能用調試器和 IDE 來調試它,那麼你的代碼要麼是太糟糕要麼是過於抽象。
開發體驗
在這兩個庫中,你的深度神經網路運行得都很快。Pytorch 還沒有如 Keras 那樣高層次的抽象(帶有回調函數),而是在網路之外訓練抽象等功能。所以你還是需要寫一些樣板文件。然而,這裡(https://github.com/ncullen93/torchsample)Keras 提供的 API 基本上與 Pytorch 的相同。Pytorch 還很青澀,你會遇到一些 DX 方面的問題,比如「如何讓卷積層變平,使它與隱藏層兼容」(提示:僅僅「.add(Flatten())」是無法解決的,但我相信 Pytorch 開發者們正在想辦法解決它。這是我給 Pytorch 2 顆星而給 Keras 3 顆星的原因。Keras 在開發經驗(除了調試)方面非常出色。你可以得到很好的早期效果且能夠進行傻瓜式層編寫。
上線時間
當我在談論庫的上線時間時其實是在說:我們的開發人員需要多長時間來理解庫、發現/修復漏洞、受到庫的啟發(最後一點尤其重要,因為一個開發者在燃起了對工具的使用興緻後,其開發速度通常會提升 2-5 倍)。兩個庫都很好,儘管 Keras 出現的時間更早且有更多的網上教程和文檔。所以 Pytorch 就比 Keras 少 1 顆星。
社區支持
這個問題很棘手。什麼是社區?對於像 Pytorch 和 Keras 之類較小的庫,得有一些對其進行宣傳並(即使是對垃圾問題)提供有價值的解答以及幫助修復社區 bug 的人,這點非常重要。如果你像 Keras 那樣自娛自樂,那麼要搞定所有問題是非常困難的。你可以在 Keras 的問題追蹤器中很清楚地看到 2,500 個開放的問題,以至於該項目完全不堪重負。相比之下,Pytorch 是由一個 Facebook 的工程師團隊進行維護,你可以看到那裡的問題更少且社區支持更加活躍。如果你在 Keras 中遇到一個問題,可能要等上幾周/月的時間才能(如果可能)得到解決方案。
商業支持
Pytorch 太新了,幾乎還沒有人提供商業支持。我相信連 Facebook 都不會提供任何資金支持。Keras 則有些不一樣。已經有很多使用 Tensorflow/Theano/Keras 來提供開發服務的公司。所以,如果你遇到一個問題並想用錢來解決,則最好用 Keras/Tensorflow。
長期發展
我相信在 Facebook 和谷歌對兩個項目的支持下,你大可以說二者會在未來幾年內依然存在。儘管我真的希望 Keras 可以得到一支谷歌團隊或一個開源組織的支持,這樣它就不會僅僅因為大量開放且不斷湧入的問題而死掉。
從長遠來看,靜態圖會成為過去,而相對便於使用的庫會得到越來越多的使用,因為在正常的軟體開發領域,調試和上市時間對於行業的可維護性(機器學習正在朝此方向行進)來說是最重要的。在所有這三個類別中,像 PyTorch 那樣的動態圖像都將綻放光芒。
你可以對任何任務同時部署 Keras 和 PyTorch。你對誰了解得更深,那麼你用它編寫異乎尋常的代碼就會更快。雖然我傾向於認為 Pytorch 在編寫非同尋常的事物方面更加靈活,而你可能認為層代碼的編寫就不是這樣。
結論
我現在更喜歡 Keras,因為我上一次試用 PyTorch 時,它還有幾個 GPU 方面的問題,還有另一些問題我沒有克服。在 Keras 上,我的項目已經運行了數月,其效果相當不錯,儘管我在運行時間更久(並非幾天時間)的項目中看到了一些 bug 報告,而且使用靜態圖的後端來調試 Keras 相當麻煩。在接下來的幾個月里,如果 PyTorch 變得越來越穩定,我肯定會轉投 PyTorch 陣營。然而我還想試試 Caffe2。
※MIT 新突破:實現光學深度神經網路系統
※MIT Nature Photonics新突破:實現光學深度神經網路系統
※研學社|一起研習 Domingos的《終極演算法》第二期
※聯合國首次人工智慧峰會召開:讓AI符合可持續發展目標
※我們和專家聊了聊,梳理了軟銀收購波士頓動力這件事
TAG:機器之心 |