深度學習入門該用PyTorch還是Keras?熱門公開課換框架背後的學問

李林 問耕 編譯整理

量子位 出品 | 公眾號 QbitAI

你知道fast.ai么?

他們以提供零基礎的深度學習課程而聞名,宣稱:只要你有高中數學基礎、一年的編程經驗,就能通過七周的學習,具備一流的深度學習實踐能力。

剛剛,他們宣布了一件事。

下一個fast.ai的課程,將完全基於一個使用PyTorch開發的框架,拋棄原來的TensorFlow和Keras框架。這是為什麼?

Jeremy Howard

且聽創始人Jeremy Howard詳解緣由,也相當於分析了初學者該選擇什麼樣的框架。量子位節選編譯如下:

我們為什麼開始嘗試PyTorch?

當我們開發第二門課《面向程序員的前沿深度學習》的時候,原來選的TensorFlow和Keras框架開始讓我們處處碰壁。

比如說,現在自然語言處理中最重要的技術,大概是attention模型。可是我們發現,當時在Keras上沒有attention模型的有效實現,而TensorFlow實現沒有文檔、一直在改,還複雜得毫無必要。

結果是我們決定自己在Keras里做一個attention模型實現,花了好長時間,debug也非常難。

接下來,我們又開始研究dynamic teacher forcing的實現。要實現一個準確的神經網路翻譯模型,dynamic teacher forcing是其中的關鍵,但我們無論是在Keras里還是TensorFlow里,都找不到這個模型的實現。

於是,我們又開始嘗試自己搞,這次比attention模型還失敗,根本就沒做出來能用的。

這時候,PyTorch的第一個預發布版出現了。這個新框架不是基於靜態計算圖,而是一個動態的框架,這為我們帶來了新的希望。它說,動態框架讓我們在開發自己的神經網路邏輯時,只需要寫普通的Python代碼,像正常用Python一樣去debug。

我們第一次用PyTorch,就用它從頭開始在實現了Attention模型和dynamic teacher forcing,只用了幾個小時。

PyTorch在教學的好處

上文提到的那門課,一個重要的目標就是讓學生能讀最近的論文,然後實現它們。

這非常重要,因為到目前為止,在一些學術界比較關注的領域,我們對深度學習應用的研究反倒很有限,因此,用深度學習解決很多現實世界問題的時候,不僅需要了解基礎技術,還要能針對特定的問題和數據去實現定製化的深度學習模型。

PyTorch,就讓學生們能充分利用普通Python代碼的靈活性和能力,來構建、訓練神經網路。這樣,他們就能解決更廣泛的問題。

PyTorch的另一個好處是,它能讓學生們更深入地了解每個演算法中發生了什麼。用TensorFlow那樣的靜態計算圖庫,你一旦聲明性地表達了你的計算,就把它發送到了GPU,整個處理過程就是一個黑箱。

但是通過動態的方法,你可以完全進入計算的每一層,清楚地看到正在發生的情況。我們認為學習深度學習的最佳途徑就是通過編程、實驗,動態的方法正是我們的學生所需要的。

令我們驚奇的是,我們還發現很多模型在PyTorch上訓練比在TensorFlow上更快。這和我們所熟知的「靜態計算圖能帶來更多優化,所以應該性能更好」恰恰相反。

在實踐中我們看到,有些模型快一點,有些慢一點,每個月都不一樣。問題的關鍵似乎在於以下兩點:

PyTorch提高了開發人員的生產力和debug經驗,因此可以帶來更快的開發迭代和更好的實現;

PyTorch中更小、更集中的開發團隊不會對每個功能都進行微優化,而是要尋求「大勝」。

為什麼在PyTorch上構建一個新框架?

然而,對於課程的第一部分來說,PyTorch還遠遠談不上是一個很好的選擇。沒有機器學習背景的人根本沒法上手。

PyTorch沒有Keras那樣簡單明了的API來訓練模型,每個項目都需要幾十行代碼來實現一個神經網路的基礎訓練。另外,Keras的默認設置就挺有用,而PyTorch一切都需要詳細設置。

不過,Keras還能更好。我們發現大家一直在Keras里犯相同的錯誤,例如不能在我們有需要時打亂數據,反之亦然。另外,很多新出的最佳實踐並沒有被納入Keras,特別是在快速發展的自然語言處理(NLP)領域。

所以我們在想,能不能構建一個比Keras更好的東西,用來快速訓練最棒的深度學習模型。

經過一些研究和探索後,我們做到了。我們構建的模型比用Keras構建的更快、更準確、更複雜,而且更少的代碼寫就。最近對多個領域論文進行的實現,都證明了這一點。

關鍵是創建一個OO分類,其中包含了所有重要的數據選擇(例如預處理、增強、測試、訓練和驗證集、多類和單類的分類與回歸等)以及模型架構的選擇。

我們完成這個工作之後,就能在很大程度上自動找出模型與數據最佳的架構、預處理和訓練參數。突然間,我們的工作效率大幅提升,而且很少犯錯,因為一切都是自動化的。但是我們在每個階段提供了定製化的能力,所以可以輕鬆嘗試不同的方法。

隨著工作效率的提升,我們能夠嘗試更多的技術,在這個過程中,我們發現了一些非常差的方法。例如,我們發現批量歸一化(幾乎所有最新CNN架構都用)和模型預訓練及微調(每個項目也該用)的組合,可以讓標準訓練方式的精度下降500%。

我們稍後會逐步放出這個研究的詳細情況。(我們還缺一個名字……)

— 完 —

誠摯招聘

量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復「招聘」兩個字。

量子位 QbitAI

?"?" ? 追蹤AI技術和產品新動態


推薦閱讀:

python3.6.1及TensorFlow和PyTorch

TAG:深度学习DeepLearning | PyTorch | Keras |