長期用 C++ 和 MATLAB 做機器學習的你,有沒有遇到一個讓你相見恨晚的語言或包?

好吧,題主我就長期用C++和Matlab做機器學習,對C++寫性能關鍵代碼,Matlab作為腳本環境這一套流程還比較玩得轉。這倆搭配雖不是珠聯璧合,也算差強人意,風風雨雨也就這麼過來了,直到我最近發現了Lua + Torch...

說起來Torch也是老牌的庫了,當年LeCun還未必有Leon Bottou有名的時候就聽說他們那幫法國人特別推崇這個。可是彼時的Lua也感覺整一非主流腳本,哪像現在這樣在遊戲工業里大紅大紫。所以一開始我是拒絕的,覺得Torch + Lua這倆是哪冒出來的神馬東西,加重學習負擔,無視之...

最近一個偶然的機會,發現Torch裡面用有向無環圖(Directed Acyclic Graph)搭積木一樣build一個LSTM (Long Short Term Memory)的代碼是如此簡潔優雅:https://github.com/wojzaremba/lstm(對了順便吐槽下某個Python實現https://github.com/karpathy/neuraltalk,前者比後者不知道高到哪裡去。然後duang的一下,我那個醐醍灌頂的感覺... 接下來又花了12小時稍微看了下Torch的做法,感覺我一直以來想用Matlab和C++實現的東西,Torch里基本都有了。

最大的問題,是之前被Matlab的mxArray束縛了手腳。出於很多線性代數計算的需要,mxArray強制要求內存連續排列,這樣在一些機器學習任務中要用到In-Place operation或者sub slicing的時候會造成不便——Matlab的copy-on-write語義在這時會複製新數據,造成無法共享內存,除非你在外圍調用時用handle class再加一層包裝。而torch.Tensor就避免了這個問題。

另一個,在Matlab里寫mex,工具鏈還算完備,包裝也不算太難。可是Lua對C語言的包裝甚至更簡單...而且Matlab只暴露了mxArray等基本數據類型的介面,對class的介面幾乎就沒有暴露,你甚至還得去undocumentmatlab上查一些不為人知的API...Lua裡面,用C語言直接manipulate各種Lua的數據結構,毫無保留...

好吧,這個其實既是一個問題,也是自己(一時心血來潮)的吐槽...

更新:

關於原文那個被吐槽的Python實現karpathy/neuraltalk · GitHub,作者居然整了一個新的基於Lua/Torch的實現karpathy/neuraltalk2 · GitHub,好應景...另外該作者在博客The Unreasonable Effectiveness of Recurrent Neural Networks中簡要說明了為什麼選用Lua/Torch,值得一看。


開發期:誠心推薦 python。理由如下: (1) python 適合在開發其做實驗,代碼比較簡潔,開發速度快 (2) 在資料處理上,有完整的支持套件 (3) 視覺化呈現工具完整 (4) 傳統機器學習演算法,有完善的支持 (scikit learn) (5) 最新的深度學習演算法,有完善的支持,且總是走在最新的發展潮流上。(theano, tensorflow)

假設實驗結果如果能接受,有效能上的考量時,可以 migrate 到 C++ 進行加速。Matlab 則是比較合適做科學計算與視覺化。

以下是使用 python 開發 ML 時,可以參考的資料

(1) 如果是使用傳統的machine learning,建議使用 scikit learn (sklearn package)

這邊有tutorial http://gael-varoquaux.info/scikit-learn-tutorial/ 可以無腦使用 ML

由上圖所示,第二行 new了一個 svc classifier, 第三行 svc.fit 就train 好了。

更多關於 sklearn 的資訊,可以參考 http://scikit-learn.org/stable/

(2) 如果是要使用 deep learning,建議使用 tensorflow

(a) 安裝文檔 https://www.tensorflow.org/install/

(b) 基礎教程 https://www.tensorflow.org/get_started/get_started

(c) 莫凡的視頻教程: https://morvanzhou.github.io/tutorials/machine-learning/

(包含了 tensorflow, keras , scikit learn)

(3) 如果覺得tensorflow 太麻煩,可以使用keras。 keras 是 tensor flow theano 的一個抽象層,會讓使用起來更簡便(莫凡的教學視頻里也有keras)

(4) 假設,machine learning 的model train 好後,要讓別人呼叫使用時,可以參考這篇文章

https://www.zhihu.com/question/37426733/answer/155517062

裡面的大意:

在machine learning 裡面,會分成兩個步驟。 (1) offline training (2) online inference/prediction。 在 training step 的時候,都會在offline 操作,裡面包含了 (a) 調參 (b) validation (cross validation) (c) feature engineer (d) model selection。 model training 完之後,會把model pickle 起來。

在 step2: online inference 的時候,通常會 透過 http request (GET, POST) 來傳遞資訊。

假設 online web service 的 template 寫好後,就只要更新那個 ml 的 model 的 pickle 檔就完成更新了。


我一直長期寫C++/matlab(取決於效率要求),近期為了用pytorch開始寫一點python。

目前感覺寫python體驗不要太好(配合pycharm),anaconda一裝基本可以完全取代matlab。Matlab大公司裡面都不常用,很多連license都不全,matlab用舒服了真的一點好處都沒有。用什麼framework個人感覺不太有所謂,反正都是python, 換一個框架還有很多代碼可以回收。我個人喜歡pytorch因為簡潔。

luaTorch似乎已經被棄用了,主要是lua的學習曲線太陡了,對大多數人來說熟練掌握lua好像也沒什麼用。


用 python 吧,torch都不再更新了。TensorFlow 是好選擇,但若不想寫太多代碼,可用 TensorLayer


可以試試pytorch,torch的python版本,facebook的框架,很簡潔,可以看看這篇文章的介紹

https://zhuanlan.zhihu.com/p/26635366


比簡潔么,Graham Neubig用193行Python實現了LSTM語言模型:This is a minimal implementation of training for a language model using long short-term memory (LSTM) neural networks


本來想安利一下我優雅的C++11/Python,然後看到題主吐槽了python的NeuralTalk……

Lua相比起主流語言來說還是太小眾了,而且這兩個github項目從watch/star/fork數來看,你真的覺得這兩個開源項目的適用性和功能是在同個級別的嗎?


cuda,優秀的並行計算框架,一步到位,使我無需考慮分散式機器學習


學校學machine learning的時候用matlab然而當我找工作的時候發現幾乎沒有公司用它的時候我就果斷轉去學python了。。。關鍵問題就是matlab它要錢呀!!


人生苦短啊。

Python的keras簡直了……


以前用caffe,奈何c++能力不過關,寫的甚是蛋疼,後來發現了tensorflow+keras!強烈推薦!從此世界變的很美好!無腦搭模型,每個層可以callable,可以作為tensorflow的介面,也可以callback tensorboard,寫代碼從來沒有這麼爽過!強力安利!


python/cython/tensorflow tensorflow用起來很舒服,不用你去考慮回傳梯度求偏導。 不過噁心的是介面多,動態效果差了點,特別是shape。如果你想自己實現簡單操作的話,可以用cython直接生成c代碼


theano,caffe都很好啊


同C++/Matlab飄過,有空試試題主的Lua/Torch. 新手莫打……



推薦閱讀:

devcpp的ascii碼輸出字元時為什麼和ascii碼錶上的字元不同?
在C++11中,如何將一種編碼的string轉換為另一種編碼的string?
如何將一個函數編譯成二進位文件?
微軟對 C++ 的影響力有多大?
為什麼要有堆區和棧區呢?

TAG:MATLAB | 機器學習 | CC | Lua | 深度學習DeepLearning |