寫一個像Keras的深度學習框架需要學習哪些知識?

想用Python也寫一個深度學習框架,看到keras等深度學習框架很牛逼,但是不知道從何處下手,看看大家的看法


寫過一個小的toolbox,曾經有和題主一樣的想法,分享一下。

個人看法:keras不能算是框架,只能算是一個warpper,集成了一些標準化的th/tf函數。

真正的框架應該是th/tf/caffe這樣的。它們在底層實現了io、cpu/gpu管理、張量定義和操作以及symbolic體系,構建了一個適用於深度學習的科學計算體系。

如果你要做的是keras/tflearn/tensorlayer這樣的high-level的框架(或者說API),那麼最基本的是深入了解一個底層框架比如tf,你需要用它來寫高效的、標準化的層,寫模塊化的介面並整合一些其他組件構成一個框架。

如果你要做的是th/tf這樣的底層框架,那麼你需要具備手寫dl演算法的能力,包括feedfoward、反向求導、update,各種損失函數、optimizer。你還需要精通cuda編程,了解cudnn庫……

實現symbolic應該算是一個大難點。


其實 Theano 已經替你把真正困難的事情(GPU 操作、符號求導)都幹了,所以 Keras 之類的框架,只是實現了神經網路中常見的模塊(feed-forward 層、卷積層、recurrent 層等等)和訓練演算法(梯度下降、RMSProp、Adam 等等)。不過要做框架的話,對通用性的要求特別高。


同意@王贇 Maigo的觀點,像keras,lasagne等框架都是在theano或者tensorflow的輪子基礎上造車的過程。如果真正想自己做一個輪子,建議以自己的任務出發以最小的外部依賴完成一個神經網路正向傳遞和誤差梯度的反向傳播。比如你自己做圖像,那你就自己動手寫一個最簡單的單層CNN,然後寫一個最簡單的優化演算法如隨機梯度下降。

如果這個模型做好了,那麼恭喜你就可以繼續下一步了那就是從1到n的過程,即加層,加網路,加優化演算法,加正則演算法。


軟體架構能力

設計框架的模塊與各個模塊之間的介面,如何分層等

深度學習領域知識

知道一些常見的operator(如卷積、pooling、LSTM unit等),以及常見的network(如alexnet、resnet、sequence to sequence等)

編碼實現能力

具體用什麼語言,需要熟練該語言

演算法實現

類似卷積怎麼實現,怎麼優化等等問題

理解硬體

包括各種CPU的差異,GPU怎麼用等

對於框架實現者來說,前2點最重要。


首先,Keras是一個high-level的深度學習框架,將網路結構抽象為layer和node等,後端現在可以使用Theano、tensorflow和CNTK,後端完成具體的計算以及設備的選擇。據此,想要自己寫類似Keras的框架,有以下幾點基本要求:1. 選擇後端(操作設備執行具體的計算);2. 熟悉常見的網路結構(CNN、RNN等),這個會影響框架的整體結構;3. 在2的基礎上,抽象出框架的基本組件,合理組織這些組件;4. 可能還需要考慮優化方面的方法,包括訓練效果和訓練速度


拷貝和修改現有的


推薦閱讀:

對於一個可以窮舉的問題,比如五子棋,深度學習得到的模型和窮舉的演算法有啥異同?
如何系統的學習深度學習?
如何評價 Facebook 新推出的 CNN 機器翻譯項目 Fairseq?
multi-task深度神經網路如何實現,優化?
如何評價陳天奇團隊新開源的TVM?

TAG:機器學習 | 深度學習DeepLearning | TensorFlow |