誰會成為AI 和大數據時代的第一個開發語言?這本來已經是個不需要爭論的問題。如果說三年前,Matlab、Scala、R、Java 和Python還各有機會,局面尚且不清楚,那麼三年之後,趨勢已經非常明確了,特別是前兩天Facebook 開源了PyTorch 之後,Python 作為AI時代頭牌語言的位置基本上已經確立,未來的懸念只是誰能坐穩第二把交椅。
谷歌的AI擊敗了一位圍棋大師,是一種衡量人工智慧突然的快速發展的方式,也揭示了這些技術如何發展而來和將來可以如何發展。
人工智慧是一種未來性的技術,目前正在致力於研究自己的一套工具。一系列的進展在過去的幾年中發生了:無事故駕駛超過300000英里並在三個州合法行駛迎來了自動駕駛的一個里程碑;IBM Waston擊敗了Jeopardy兩屆冠軍;統計學習技術從對消費者興趣到以萬億記的圖像的複雜數據集進行模式識別。這些發展必然提高了科學家和巨匠對人工智慧的興趣,這也使得開發者們了解創建人工智慧應用的真實本質。開發這些需要注意的第一件事是:
哪一種程式語言適合人工智慧?
你所熟練的每一種程式語言都可以是人工智慧的開發語言。
人工智慧程式可以使用幾乎所有的程式語言實現,最常見的有:Lisp,Prolog,C/C++,近來又有Java,最近還有Python.
LISP
像LISP這樣的高級語言在人工智能中備受青睞,因為在各高校多年的研究後選擇了快速原型而捨棄了快速執行。垃圾收集,動態類型,資料函數,統一的語法,互動式環境和可擴展性等一些特性使得LIST非常適合人工智慧程式設計。
PROLOG
這種語言有著LISP高層和傳統優勢有效結合,這對AI是非常有用的。它的優勢是解決“基於邏輯的問題”。 Prolog提供了針對邏輯相關問題的解決方案,或者說它的解決方案有著簡潔的邏輯特徵。它的主要缺點(恕我直言)是學起來很難。
C/C++
就像獵豹一樣,C/C++主要用於對執行速度要求很高的時候。它主要用於簡單程序,統計人工智慧,如神經網路就是一個常見的例子。 Backpropagation 只用了幾頁的C/C++程式碼,但要求速度,即使程式設計師只能提升一點點速度也是好的。
JAVA
新來者,Java使用了LISP中的幾個理念,最明顯的是垃圾收集。它的可移植性使它可以適用於任何程序,它還有一套內建類型。 Java沒有LISP和Prolog高級,又沒有C那麼快,但如果要求可移植性那它是最好的。
PYTHON
Python是一種用LISP和JAVA編譯的語言。根據Norvig文章中對Lips和Python的比較,這兩種語言彼此非常相似,僅有一些細小的差異。還有JPthon,提供了存取Java圖像使用者介面的途徑。這就是PeterNorvig選擇用JPyhton翻譯他人工智慧書籍中程式的原因。 JPython可以讓他使用可移植的GUI演示,和可移植的http/ftp/html庫。因此,它非常適合作為人工智慧語言的。
在人工智慧上使用Python比其他程式語言的好處
優質的文件
平台無關,可以在現在每一個*nix版本上使用
和其他物件導向程式語言比學習更簡單快速
honPyt有許多影像強化庫像Python Imaging Libary,VTK和Maya 3D視覺化工具包,Numeric Python, Scientific Python和其他許多可用工具可以於數值和科學應用。
Python的設計非常好,快速,堅固,可移植,可擴展。很明顯這些對於人工智慧應用來說都是非常重要的因素。
對於科學用途的廣泛程式設計任務都很有用,無論從小的shell腳本還是整個網站應用。
最後,它是開源的。可以得到相同的社區支持。
AI的Python庫
整體的AI庫
AIMA:Python實現了從Russell到Norvigs的「人工智慧:一種現代的方法」的演算法
pyDatalog:Python中的邏輯程式設計Python實現在「人工智慧:一種現代的方法」這本書中所描述的人工智慧的演算法。它專注於提供一個易於使用,有良好文件和測試的庫。
EasyAI:一個雙人AI遊戲的python引擎(負極大值,置換表、遊戲解決)
機器學習庫
PyBrain 一個靈活,簡單而有效的針對機器學習任務的演算法,它是模組化的Python機器學習庫。它也提供了多種預先定義的環境來測試和比較你的演算法。
PyML 一個用Python寫的雙邊框架,專注於SVM和其他核心方法。它支援Linux和Mac OS X。
scikit-learn旨在提供簡單而強大的解決方案,可以在不同的上下文中重複使用:機器學習作為科學和工程的一個多功能工具。它是python的一個模組,整合了經典的機器學習的演算法,這些演算法是和python科學包(numpy,scipy.matplotlib)緊密聯繫在一起的。
MDP-Toolkit這是一個Python資料處理的框架,可以很容易的進行擴充。它海收集了有監管和沒有監管的學習算飯和其他資料處理單元,可以組合成資料處理序列或更複雜的前饋網路結構。新演算法的實作是簡單和直觀的。可用的演算法是在不斷的穩定增加的,包括訊號處理方法(主成分分析、獨立成分分析、慢特徵分析),流型學習方法(局部線性嵌入),集中分類,機率方法(因子分析,RBM) ,資料預處理方法等等。
自然語言和文字處理庫
NLTK 開源的Python模組,語言學資料和文檔,用來研究和開發自然語言處理和文本分析。有windows,Mac OSX和Linux版本。
案例
做了一個實驗,一個使用人工智慧和物聯網做員工行為分析的軟體。該軟體透過員工情緒和行為的分心提供了一個有用的回饋給員工,從而提高了管理和工作習慣。
使用Python機器學習庫,opencv和haarcascading概念來訓練。建立了樣品POC來檢測透過安置在不同地點的無線攝影機傳遞回來基礎情感像幸福,生氣,悲傷,厭惡,懷疑,蔑視,謳諷和驚喜。收集到的資料會集中到雲端資料庫中,甚至整個辦公室都可以透過在Android設備或桌面點擊一個按鈕來取回。
開發者在深入分析臉部情感上複雜點和挖掘更多的細節中取得進展。在深入學習演算法和機器學習的幫助下,可以幫助分析員工個人績效和適當的員工/團隊回饋。
結論
python因為提供像 scikit-learn的好的框架,在人工智慧方面扮演了一個重要的角色:Python中的機器學習,實現了這一領域中大多的需求。 D3.js JS中資料驅動文件時可視化最強大且易於使用的工具之一。處理框架,它的快速原型製造使得它成為一門不可忽視的重要語言。 AI需要大量的研究,因此沒有必要要求一個500KB的Java樣板程式碼去測試新的假說。 python中幾乎每一個想法都可以迅速透過20-30行程式碼來實現(JS和LISP也是一樣)。因此,它對於人工智慧是一門非常有用的語言。
對於希望加入 AI 和大數據產業的開發人員來說,把雞蛋放在 Python 這個籃子裡不但是安全的,而且是必須的。或者換個方式說,如果你將來想在這個行業混,什麼都不用想,先閉著眼睛把 Python 學會了。當然,Python不是沒有它的問題和短處,你可以也應該有另外一種甚至幾種語言與 Python 形成搭配,但是Python 將坐穩數據分析和 AI 第一語言的位置,這一點毫無疑問。我甚至認為,由於Python 坐穩了這個位置,由於這個行業未來需要大批的從業者,更由於Python正在迅速成為全球大中小學程式設計入門課程的首選教學語言,這種開源動態腳本語言非常有機會在不久的將來成為第一個真正意義上的程式設計世界語。
討論程式語言的優劣興衰一直被認為是一個口水戰話題,被資深人士所不屑。但我認為這次 Python 的上位是一件大事。請設想一下,如果十五年後,所有40歲以下的知識工作者,無分中外,從醫生到建築工程師,從辦公室秘書到電影導演,從作曲家到銷售,都能使用同一種程式語言進行基本的數據處理,呼叫雲端上的人工智慧API,操縱智慧機器人,進而相互溝通想法,那麼這個普遍編程的協作網絡,其意義將遠遠超越任何程式語言之爭。目前看來,Python 最有希望擔任這個角色。
Python 的勝出令人意外,因為它缺點很明顯。它語法上自成一派,讓許多老手感到不習慣;「裸」 Python 的速度很慢,在不同的任務上比C 語言大約慢數十倍到數千倍不等;由於全域解釋器鎖(GIL )的限制,單一Python 程式無法在多核心上並發執行;Python 2 和Python 3 兩個版本長期並行,很多模組需要同時維護兩個不同的版本,給開發者選擇帶來了很多不必要的混亂和麻煩;由於不受任何一家公司的控制,一直以來也沒有一個技術巨頭肯死挺Python ,所以相對於Python 的應用之廣泛,其核心基礎設施所得到的投入和支持其實是非常薄弱的。直到今天,26歲的Python 都還沒有一個官方標配的 JIT 編譯器,相較之下, Java 語言在發布之後頭三年內就獲得了標配 JIT 。
另一個事情更能夠說明問題。 Python 的 GIL 核心程式碼 1992 年由該語言創造者 Guido van Rossum 編寫,此後十八年時間沒有一個人對這段至關重要的程式碼改變過一個位元組。十八年!直到2010年,Antoine Pitrou才對 GIL 進行了近二十年來的第一次改進,而且僅在 Python 3.x 版本中使用。這也就是說,今天使用 Python 2.7 的大多數開發者,他們所寫的每一段程式仍然被26年前的一段程式碼牢牢制約著。
Python 就是這樣一個帶著各種毛病衝到第一方陣的賽車手,但即便到了幾年前,也沒有多少人相信它有機會摘取桂冠,很多人認為Java 的位置不可動搖,還有人說一切程式都會用JavaScript重寫。但今天我們再看,Python 已經是資料分析和 AI的第一語言,網路攻防的第一駭客語言,正在成為程式設計入門教學的第一語言,雲端運算系統管理第一語言。 Python 也早就成為Web 開發、遊戲腳本、電腦視覺、物聯網管理和機器人開發的主流語言之一,隨著 Python 用戶可以預期的成長,它還有機會在多個領域中登頂。
而且不要忘了,未來絕大多數的 Python 使用者並不是專業的程式設計師,而是今天還在使用 Excel、PowePoint、SAS、Matlab和影片編輯器的那些人。就拿 AI 來說,我們首先要問一下,AI 的主力人群在哪裡?如果我們今天靜態的來談這個主題,你可能會認為 AI 的主力是研究機構裡的 AI 科學家、擁有博士學位的機器學習專家和演算法專家。但上次我提到李開復的「AI紅利三段論」明確告訴我們,只要稍微把眼光放長遠一點,往後看三至五年,你會看到整個AI 產業的從業人口將逐漸形成一個巨大的金字塔結構,上述的AI 科學家只是頂端的那麼一點點,95% 甚至更多的AI 技術人員,都將是AI 工程師、應用工程師和AI 工具用戶。我相信這些人幾乎都會被Python 一網打盡,成為 Python 陣營的龐大後備軍。這些潛在的Python 用戶至今仍在技術圈之外,但隨著AI 應用的發展,數百萬之眾的教師、公司職員、工程師、翻譯、編輯、醫生、銷售、管理者和公務員將裹挾著各自領域中的產業知識和數據資源,湧入Python 和AI 大潮之中,深刻的改變整個IT,或者說DT (數據科技)產業的整體格局和麵貌。
為什麼 Python 能夠後來居上呢?
如果泛泛而論,我很可以列舉 Python 的一些優點,例如語言設計簡潔優雅,對程式設計師友好,開發效率高。但我認為這不是根本原因,因為其他一些語言在這方面表現得併不差。
還有人認為Python 的優勢在於資源豐富,擁有堅實的數值演算法、圖標和數據處理基礎設施,建立了非常良好的生態環境,吸引了大批科學家以及各領域的專家使用,從而把雪球越滾越大。但我覺得這是倒因為果。為什麼偏偏是 Python 能夠吸引人們使用,建立起這麼好的基礎架構呢?為什麼世界上最好的語言 PHP 裡頭就沒有像 numpy 、NLTK、sk-learn、pandas 和 PyTorch 這樣等級的函式庫呢?為什麼 JavaScript 極度繁榮之後就搞得各種程式庫層次不齊,一地雞毛,而 Python 的各種程式庫既繁榮又有序,能夠保持較高水準呢?
我認為最根本的原因只有一點:Python 是眾多主流語言中唯一一個戰略定位明確,而且始終堅持原有戰略定位不動搖的語言。相較之下,太多的語言不斷的用戰術上無原則的勤奮去侵蝕和模糊自己的戰略定位,最終只能等而下之。
Python 的策略定位是什麼?其實很簡單,就是要做一種簡單、易用但專業、嚴謹的通用組合語言,或者叫膠水語言,讓普通人也能夠很容易的入門,把各種基本程序元件拼裝在一起,協調運作。
正是因為堅持這個定位,Python 始終把語言本身的優美一致放在奇技妙招前面,始終把開發者效率放在CPU效率前面,始終把橫向擴張能力放在縱向深潛能力之前。長期堅持這些策略選擇,為 Python 帶來了其他語言望塵莫及的豐富生態。
比如說,任何一個人,只要願意學習,可以在幾天的時間裡學會Python基礎部分,然後乾很多很多事情,這種投入產出比可能是其他任何語言都無法相比的。再比如說,正是由於Python 語言本身慢,所以大家在開發被頻繁使用的核心程式庫時,大量使用C 語言跟它配合,結果用Python 開發的真實程式跑起來非常快,因為很有可能超過80% 的時間系統執行的程式碼是C 寫的。相反,如果Python 不服氣,非要在速度上較勁,那麼結果很可能是裸速提高個幾倍,但這樣就沒人有動力為它開發C 模組了,最後的速度遠不如混合模式,而且很可能語言因此會變得更複雜,結果是一個又慢又醜陋的語言。
更重要的是,Python 的包裝能力、可組合性、可嵌入性都很好,可以把各種複雜性包裝在 Python 模組裡,露出漂亮的介面。很多時候,一個程式庫本身是用C/C++ 寫的,但你會發現,直接使用C 或C++ 去調用那個程式庫,從環境配置到介面調用,都非常麻煩,反而隔著一層,用其python 包裝庫更清爽整潔,又快又漂亮。這些特質到了 AI 領域中,就成了 Python 的強大優勢。 Python 也藉助 AI 和資料科學,攀爬到了程式語言生態鏈的頂級位置。 Python 與 AI綁在一起,對它們來說,無論是電子商務、搜尋引擎、社交網路還是智慧硬件,未來都只是生態鏈下游的資料乳牛、電子神經和執行工具,都將聽命於自己。
對程式語言發展歷史缺乏了解的人可能會覺得,Python 的策略定位是犬儒主義和缺乏進取心的。但事實證明,能同時做到簡單而嚴謹、易用而專業,是很難的,而能夠堅守膠水語言的定位,更是難上加難。
有的語言,從一開始就是出於學術而非實用的目的,學習曲線過於陡峭,一般人很難接近。有的語言,過度依賴背後金主的商業支持,好的時候風光無限,一旦被打入冷宮,連生存下去都成問題。有的語言,設計的時候有明確的假想場景,要嘛是為了解決大規模並發,要嘛是為了解決矩陣運算,要嘛是為了做網頁渲染模板,一旦離開這個場景,就各種不爽。更多的語言,剛剛取得一點成功,就迫不及待的想成為全能冠軍,在各個方向上拼命的伸展觸角,特別是在增強表達能力和提升性能方面經常過分積極,不惜將核心語言改得面目全非,最後變成誰都無法掌控的龐然大物。相較之下,Python 是現代程式語言設計和演化當中的一個成功典範。
Python 之所以在戰略定位上如此清晰,戰略堅持上如此堅定,歸根結底是因為其社區構建了一個堪稱典範的決策和治理機制。這個機制以 Guido van Rossum (BDFL,Pythoners 都知道這是什麼意思), DavidBeazley, Raymond Hettinger 等人為核心,以 PEP 為組織平台,民主而有序,集中而開明。只要這個機製本身得以維繫,Python 在可見的未來仍將一路平穩上行。
最有可能向 Python 發起挑戰的,當然是Java。 Java 的使用者存量大,它本身也是一種策略定位清晰且非常堅定的語言。但我並不認為 Java 有很大的機會,因為它本質上是為建構大型複雜系統而設計的。什麼是大型複雜系統?就是由人清清楚楚描述和建構出來的系統,其規模和複雜性是外生的,或者說外界賦予的。而 AI 的本質是一個自學習、自組織的系統,其規模和複雜性是一個數學模型在數據的餵養下自己長出來的,是內生的。因此,Java大多數的語言結構對於大數據的處理和 AI 系統的開發顯得使不上勁,你強的東西這裡用不上,這裡需要的東西你做起來又彆扭。而 Python 在資料處理方面的簡潔強悍早就盡人皆知。比較兩個功能相同的 Java 和 Python 機器學習程序,正常人只要看兩眼就能做出判斷,一定是 Python 程式更清爽痛快。
大概在 2003 或 2004 年的時候,我買過一本 Python 的書,作者是一位巴西人。他說自己之所以堅定的選擇 Python,是因為他小時候常常夢到未來世界將由一條大蟒蛇(蟒蛇的英文為python)統治。我當時覺得這哥們好可憐,做夢都能夢到這麼恐怖的場景。但今天來看,也許他只是像駭客任務裡的程式設計師安德森一樣,不小心穿越到未來,並且窺探了世界的真相。