机器学习从理论到工程的第一步-编程语言篇
前言
在文章《機器學習從業者如何兼顧理論與工程》中,小夕對編程語言的選擇進行了小小建議。鑒于有些同學對小夕建議的“主python,輔C++,備用matlab和java”疑問較大,小夕在此詳細解釋一下,也歡迎大家補充新觀點哦。
為什么不是matlab?
有同學問小夕,為什么將matlab作為備用語言而不是主力語言呢?matlab也很好用啊~
其實這句話是沒錯的。小夕覺得,暫且不論matlab超容易學的傻瓜式語法,如果論快速實現一個機器學習的新算法的話,“matlab+庫”應該比“python+庫”更加方便,實現效率更高。
而且更加重要的是,以小夕感性的實踐,matlab對內存的管理真的是非常非常棒,不愧是基于C實現的,這一點的優勢是python和java很難比擬的。因此,在個人的電腦上訓練一個深度學習model的話,可能python會由于內存不夠而無法繼續,而matlab完全可能勝任(以后小夕有時間給大家做個正式的對比實驗)。
?
這也是為什么,學術界的大牛們,還有實驗室的老師們,甚至Andrew Ng說的硅谷的程序員們在驗證新算法時,似乎都是用matlab。
?
但是,注意,從頭到尾,小夕一直在夸matlab實現新算法時怎么怎么樣。但是相信大部分人學習機器學習還是要走向工業界的,哪怕是在學術界,一般也不會是做純理論的,哪怕是做純理論的,一般也不會完全不接觸dirty的原始數據,或者完整工程,或者別人用其他語言實現的源碼。因此,這就是說,如果要用一門語言實現一個完整的工程,那這門語言的工具庫必須形成一個完整的開發鏈。比如原始數據是在互聯網上需要自己搜集,那么這門語言:
1、最好有簡單易用的爬蟲庫
2、要有簡單易用的dirty數據預處理的庫
3、要有高效率的科學計算庫
4、如果數據量很大,而數據或模型并行性良好,因此要有簡單易用的gpu計算支持
5、做完之后要有簡單易用的可視化庫
?
然而,matlab非常擅長第3步,第5步也不錯,第4好像也還可以(雖然小夕沒用matlab并行計算過),第2有點不方便但是也還可以,但是第1就有點非主流了。應該“得益于”matlab是商業軟件,而非開源吧。
?
如果換成python呢?
第1就不用說了,scrapy應該沒有人不知道吧。。。給滿分是沒有多少疑問的。第2步也不用說了,pandas等庫也是耳熟能詳的名字。第3步,numpy、scipy、tensorflow(咦?有人以為tensorflow是專門做深度學習的?)等,雖然內存管理、易用程度上會比matlab遜色一些,但是做科學計算的話最少也是第二名吧。第4步,cuda(配合深度學習框架)、openCL的支持不必說了。第5步,與matlab孰優孰劣不多說,有matplotlib等庫的支持,就算比matlab差,也不會差很多。
?
這樣的對比應該比較明顯啦,可以將matlab看作一個專才,將python看作一個優秀的通才。因此在特定問題上,matlab可能會甩python及其庫一截,但是比拼一個完整的工程的話,用matlab的綜合代價可能會高很多了。
?
因此,小夕說,matlab當然要掌握啦,但是只是作為一個備選語言。在你復現一篇很新的論文的時候,恰好這個論文中的算法又難以使用當前已有的框架實現的時候,就是matlab大顯身手的時候。
或者你們實驗室的服務器突然掛掉了,而你要急著訓練一個很吃內存的model,那么丟給matlab,在你的小本本上慢慢跑(其實跑的真的很快)也是可以的啦。
?
因此python,就是小夕推薦的主力語言,正是因為小夕發現python似乎在機器學習及其周邊需求上,幾乎總是有非常棒而毋庸置疑的庫存在,而且語法本身又沒有C/C++/Java的限制多,因此用來實現一個以科學計算(比如機器學習)為核心的完整工程是十分完美的。
為什么要C++?
那么小夕為什么要輔助C++呢?python不是已經那么棒了嗎?為什么是C++而不是Java呢?
除了眾所周知的”速度“原因之外,小夕覺得還有一個相當重要的原因就是“內存管理”。
?
python畢竟是一個腳本語言,雖然易用,開發效率高,然而正所謂“越高級的語言越慢、越消耗資源”,雖然python在科學計算上優化很足,這方面速度很快了,但是由于太過智能的語法和自動內存管理而導致內存消耗會比手動管理內存時多很多,這對于工業界產品而言是噩夢般的存在。因此,如果將來并不是奔著“此生只做絕對理論研究”的目標,那么C++就是繼python之后第二需要掌握的語言。因此,在這方面,Java的重要度就比C++差一些了。
?
當然啦,為什么是C++而不是C,相信大家都清楚啦。工業界不僅需要速度與資源,還需要”面向對象“!我們做的是軟件!高效的上層軟件!
?
小夕今天特意的搜了一下百度的人工智能相關崗位(機器學習、深度學習、模式識別、自然語言處理等)(雖然百度的道德底線有問題,但是在人工智能技術上,還是不否認其成績的),發現了相當多的python+C++組合,小夕真想說,【此處已打碼】\(//?//)\~
?
當然啦,C++也是Google開發人工智能產品的主力語言(道聽途說),雖然貌似Google在大力推廣Go語言?
哪里有Java了?
?
當然,也不是所有公司都是python+C++的,比如twitter就是python+java開發產品的,很多中小企業也是python+java的組合(畢竟C++相對來說難學)。
?
所以不要再糾結太多編程語言的事情啦,反正主python,輔C++,備用matlab和java的建議可以結合自己的情況來~在人工智能行業,編程語言真是最不重要的東西啦~沒人會在你的C++代碼中糾結“你在傳地址時用的是指針(*)還是引用(&)”,但是會糾結“你的這個神經網絡為什么要這樣初始化呢?”
總結
以上是生活随笔為你收集整理的机器学习从理论到工程的第一步-编程语言篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YUI事件体系之Y.CustomEven
- 下一篇: Category 特性在 iOS 组件化