行者知趣
框架是一種抽象。而抽象非常重要。
本質上,深度學習是在操作大量的浮點矩陣。但是,如果你在實現深度學習的時候,思考層次在矩陣乘法之類的上面,那這個層級太低了。
比如說,利用Keras搭一個深度學習模型,可能花不了一刻鐘:
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32)
我們看到,使用框架,不僅寫起來快,而且可讀性很好。
上面的代碼中,我們用了兩個密集(Dense)層(也就是全連接的層):
- 第一層:輸入維度100,神經元64個,激活函數ReLU
- 第二層:神經元10個,激活函數softmax
然後是編譯模型,損失函數選交叉熵,優化用SGD(隨機梯度下降),評估指標是精確度。
最後擬合訓練數據,epoch為5,batch size為32.
如果我們不用框架,從頭寫起,一刻鐘也許剛剛寫好ReLU和softmax的定義。等我們把網絡架構、損失函數、優化方法什麼一一實現,可能已經過去一週了,而且我們自己實現的性能還不一定好。
然後,別人看我們的代碼,密密麻麻的幾千行,看起來也累。這都是抽象層次太低的緣故。
當然,另一方面,“框架”其實也“框”住了我們。上面的代碼中,有一個`model.compile`的語句。這背後其實很有深義。我們需要先定義一個模型,然後編譯,然後再運行。這是因為Keras基於TensorFlow,而TensorFlow是一個define-and-run的框架,不支持動態圖模型。如果我們使用PyTorch、MXNet這樣支持動態圖模型的框架,就可以使用動態圖模型,在運行中動態調整模型,也就是所謂define-by-run。(其實TensorFlow去年引入了貪婪執行模式,最近剛剛又推出了Swift For TensorFlow這樣的研究項目,不過總的來說,TensorFlow的define-by-run模式還處於試驗階段。)
結一下,深度學習框架為我們提供了高層抽象,大大提升了開發效率,另一方面,也可能限制我們的思路,這個算是負作用吧。
論智
根據github上的star數量開看,目前市場佔有率是:
tensorflow>keras>caffe>pytorch>Theano
tensorflow偏底層,對理解深度學習的模型設計有點用。我們熟知的AlphaGo就是構建在tensorflow上。keras更上層,是搭建在Theano、tensorflow和CNTK之上的,所以使用起來比較簡單,缺點是不夠靈活,因為畢竟它是在別人的基礎上構建的。caffe算是深度學習早期發展最好的框架了,現在很多實驗室還都偏向使用caffe,因為caffe不管是在訓練階段和投入到生產中運算速度都比較快。但是在研發迭代中因為修改會比較多的牽扯到c++和cuda編程,所以也是不夠靈活易用的,它主要在計算機視覺方面表現比較好。然後pytorch,pytorch是今年或者去年年末才發佈的,現在衝到第四的位置是很厲害,它和tensorflow相比一個很大的優勢是它是動態神經網絡。Theano是非常老牌的,它更適合數值計算優化。
如果新手入手學習,推薦tensorflow、keras和pytorch。