從I到R:人工智慧語言簡史

AI科技大本營發表於2019-02-07

640?wx_fmt=jpeg

整理 | apddd

出品 | AI科技大本營(ID:rgznai100)


語言的界限就是我與世界的界限。

——維特根斯坦

程式語言之所以能持續吸引新使用者,大多並非源於語言自身特性,而是因其成為了某種流行系統的一部分。AI程式語言的歷史亦大抵如此。


史前時代


高階語言出現前,人們就已經在開發複雜的AI應用程式,比如IPL(Information Processing Language),僅比機器語言略高階(國際象棋程式NSS、Logic Theorist和General Problem Solver,都是使用IPL在IBM計算機上開發)。


640?wx_fmt=jpeg

IPL引入的大量特性如今仍在使用,比如列表、遞迴、高階函式、符號,甚至能將元素列表對映到一個迭代並處理該列表的函式的生成器。

儘管IPL大獲成功並廣泛部署在當時的計算機架構上,但它很快被一種更高階的語言所取代,在幾乎60年後仍在使用。

640?wx_fmt=png


LISP叱吒六十年


彼時,許多AI問題都被視為搜尋問題,1956年,John McCarthy建立了一種稱為alpha-beta剪枝的樹搜尋剪枝模式。資源有限的早期計算機系統上,記憶體和計算能力受到嚴重限制,但這項技術,使開發人員能編寫邏輯複雜的程式。當時AI遊戲應用程式,普遍應用了alpha-beta剪枝演算法。

640?wx_fmt=jpeg


LISP是從AI研發中孕育出來的——因為AI對應用程式有獨特需求,不斷有語言被創造出來。

這年8月的達特茅斯會議,雖沒有達成普遍的共識,但是卻為會議討論的主題起了一個名字:人工智慧。因此,1956年也被稱為人工智慧元年。

達特茅斯會議之後,McCarthy致力於為AI工作開發一種專注於IBM 704平臺的語言(IBM是當時對AI研究有大量資助)。1957年,在同一平臺上引入了FORTRAN,而IBM用一種稱為FORTRAN List Processing Language (FLPL) 的語言將FORTRAN擴充套件用於列表處理,成功用於IBM的平面幾何學專案,但作為FORTRAN的擴充套件,FLPL缺少一些關鍵特性,例如遞迴、條件表示式。

LISP的演化,經歷了三個階段:

1. 1956至1958年夏天,John McCarthy完成了對LISP的大部分構想(部分基於FLPL)。

作為程式語言,McCarthy在設計LISP時,遵循的主要原則包括:

  • 使用符號表示式(symbolic expression),而非數值(number)計算——創新之處還在於,捨棄了人們熟悉的中綴表示法,而以字首表示法代之,這樣可以簡化邏輯、代數運算,否則得額外加入一個翻譯程式——在編寫大型程式時,這種設計令LISP較同一時代的其他幾種符號語言(如SNOBOL)更具優勢。

McCarthy後來評價道:“這個明智的選擇,好比計算機採用二進位制而非十進位制,並且有過之無不及。”這是種違反直覺的表達方式,在當時能夠被接受,也是因為1950年代,在計算機上輸入和輸出與今天大不相同(穿孔卡片,而非更直觀的顯示器),那時的程式設計師們不大在意字首還是中綴。

640?wx_fmt=jpeg

  • 符號表示式及其他資訊,都以“列表”(list)結構,儲存在記憶體中——這樣才能既像句子一樣表達資訊,又適合作為程式程式碼精確執行,進行邏輯演繹;

  • 在外部媒介,以多重列表和S-expression表示資訊;

  • 函式由一小組選擇和構造操作組成;

  • 建構函式用於組成更復雜的函式;

  • 由條件表示式選擇函式執行的分枝,條件表示式的布林值,可起到連線程式的作用;例如(M, N1, N2)——依據M的取值,執行N1或N2,其優點在於縮短了程式碼,並提高了可讀性

  • 函式中引入遞迴條件表示式;

  • 使用Lambda表示式為函式命名——以使函式可匿名優雅地作為引數遞迴呼叫——McCarthy曾說:“Church的書其餘部分我都沒讀懂,因此只借用了這麼一個概念,而沒照搬他那套更通用的機制來定義函式。比如Church就不是用條件表示式——但對計算機來說,條件表示式反而順理成章。”

  • LISP程式亦是LISP資料;

  • eval既是函式,也是直譯器;

  • 引入垃圾回收機制;

  • 數學上簡潔也是語言的設計目標,因而要剋制語言核心功能。

這些原則多數由LISP原創。而且僅用quote、atom、eq、car、cdr、cons和cond七個操作符構造,令它既成為優雅的數學系統(對於可計算函式,以及遞迴,比圖靈機和當時的遞迴函式理論都要簡潔得多),又是實用的程式語言。從語言角度看,這是它經久不衰的原因之一(仍在廣泛使用,僅次於FORTRAN,第二古老的高階程式語言)。

在千禧年伊始,曾將LISP重新帶回大眾視野的YC創始人Paul Graham這樣評價:“McCarthy對程式設計的貢獻,有如歐幾里德對幾何的貢獻。……與其說LISP是他的設計,不如說是他的發現。”

640?wx_fmt=jpeg


2. 1958年秋,至1962年,語言被真正實現,並開始應用於AI

McCarthy最初的設想,是開發一個編譯器,但在當時的技術條件下,編譯器是個大工程,要先做些驗證工作,例如子程式連結、堆疊的處理、擦除之類的大致範本。於是McCarthy的第一步,是手工把函式翻譯成組合語言,以及子程式,完成一個可以讀取、列印list結構的“LISP環境”。

程式碼起初使用M-expressions語法(現代語言中,如果你用過Mathematica/Wolfram,就是這種語法),為的是與FORTRAN儘可能接近,而現代LISP使用S-expression:

M-expressions表示函式和引數 f[x;y]

S-expressions表示函式和引數 (f x y)

第一個LISP實現,是Steve Russell在IBM 704上實現的,他用更低階的機器語言編寫了通用求值器,這樣在直譯器裡,就可以執行LISP程式了——REPL(讀取-求值-輸出迴圈,越來越多現代程式語言開始包含這個功能)。

現代LISP方言裡,仍在使用的car(返回列表的第一項)和cdr(返回列表第一項之後的其他項)(讀音分別為:/kɑːr/和/ˈkʊdər/)兩個操作符,是IBM 704組合語言的兩個巨集。

提到Steve Russell,他還和同學編寫了視訊遊戲的始祖《Spacewar!》,另外,當年他還是湖畔中學程式設計小組兩位同學Bill Gates和Paul Allen的指導老師。

640?wx_fmt=jpeg

LISP 1.5是第一個被廣泛使用的版本,1962年,由McCarthy和他在MIT的同事完成。

3. 1962年之後,多種LISP標準出現,不同領域融入了不同想法

1968年,MIT的Terry Winograd(後來他去了史丹佛大學,還成了Google創始人之一Larry Page的PhD導師)用LISP開發了一個開創性的程式SHRDLU( http://hci.stanford.edu/winograd/shrdlu/ ),能使用自然語言與使用者進行互動。

640?wx_fmt=png

程式代表著一個積木世界,使用者可以與該世界進行互動:“拿起大個兒紅色積木”、“一塊積木能否支撐錐體?”。這個積木世界中的自然語言理解和規劃的演示,讓當時的人們對AI和LISP語言抱有極大希望。

作為程式語言,LISP 1.5有諸多限制,比如數值計算非常緩慢,用暫存器塊表示物件,以及GC都沒實現,而對AI研究來說,當時科研機構裡最流行的PDP-10處理能力和記憶體也都已經無法勝任,LISP 2和之後出現的硬體——Lisp Machine工作站修正了這些問題。

Lisp Machine商業價值巨大,眾多產品中,從MIT AI Lab分化的商業品牌Symbolics對後人的影響最深遠——不單因為symbolics.com是第一個.com域名,它的商業化過程,也是黑客文化的分水嶺,MIT黑客社群開放合作的文化幾乎因此終結,作為反抗Richard Stallman發起GNU。

640?wx_fmt=jpeg


冬眠與新生命


1974至1993年是AI開發和資助的一個不穩定時期。其中1980年,專家系統曾經短暫重燃了人們對AI的關注並帶來了資金。這段時間,LISP繼續被用在一系列應用中,通過各種方言得到傳播——主要靠著Common LISP、Scheme、Clojure和Racket生存了下來。

LISP背後的概念繼續通過這些語言和其他語言而擴充套件到了函式領域之外,例如LISP繼續為最老的計算機代數系統Macsyma(由MIT AI小組開發)提供支援,是Mathematica、Maple的鼻祖。

但這個時期孕育出了新的方法,比如連線機制方法再次興起,以及新的神經網路方法提出,AI研究走入近代。

LISP方言激增(流行的有Maclisp、ZetaLisp、NIL等),導致了名為Common LISP出現,該語言主要改良自MacLisp,集當時的流行方言特性之大成。1994年,Common LISP被批准為美國國家標準協會X3.226-1994標準。

在這個時間段,其他語言開始相繼出現,它們不一定專注於AI,但推動了AI的發展。C語言是專為UNIX系統設計的的一種系統語言,但它很快發展為一種最流行的語言(具有各種變體,比如 C++),從系統到嵌入式裝置開發都在使用它。

640?wx_fmt=jpeg

計算架構和AI理論都發生了變化,在AI應用上,LISP已經不是唯一選擇,C/C++、Prolog都頗受歡迎,例如深藍的核心用C編寫,Watson解析自然語言部分用的是Prolog(讀者們熟悉的AlphaGo主要以C++和Lua寫成)。

一種名為Prolog (Programming in Logic)的關鍵語言在法國開發出來。該語言實現了一個稱為霍恩子句的邏輯子集,它允許使用事實和規則來表示資訊,而且允許對這些關係執行查詢。下面的簡單Prolog示例演示瞭如何定義一個事實(蘇格拉底是一個凡人)和一條規則(規定凡人終有一死):

man( socrates ).                    // Fact: Socrates is a man.

mortal( X ) :- man( X ).            // Rule: All men are mortal.

Prolog繼續被用在各種領域,而且擁有許多變體,這些變體合併了諸多特性,比如物件導向、編譯為原生機器碼的能力,以及流行語言(如 C)的介面。

Prolog在這段時間的關鍵應用之一是開發專家系統。這些系統支援將知識整理為事實,然後利用一些規則基於此資訊進行推理。這些系統的問題在於,它們很脆弱,而且將知識保留在系統中既麻煩又容易出錯。

Prolog和LISP 不是唯一用於開發生產系統的語言。1985年,C語言整合生產系統 (CLIPS) 被開發出來,成為了構建專家系統使用最廣泛的系統。CLIPS在一個由規則和事實組成的知識系統上執行,但它是用C編寫的,而且提供了一個C擴充套件介面來提高效能。

640?wx_fmt=jpeg


專家系統的失敗是導致第二個AI寒冬來臨的一個因素。它們的前景和交付能力的缺乏導致AI研究資金顯著減少。但是,這個灰色時期孕育出了新的方法,比如連線機制方法再次興起,並讓我們進入了近代時期。


近代時期


AI的近代時期開始從實用的角度考慮該領域,而且非常成功地將AI方法應用到實際問題上,包括AI歷史發展初期的問題。儘管新語言被應用來解決AI問題,但AI的主力(LISP和Prolog)繼續得到應用並取得成功。在這個時代,連線機制和新的神經網路方法也再次興起。


在這個時期,多樣化的程式語言開始出現,一些基於電腦科學中的新概念,另一些基於關鍵特徵(比如多泛型和容易學習)。Python屬於後一種類別的關鍵語言。它是一種通用解釋型語言,它包含來自許多語言的特性(比如物件導向特性和受LISP啟發的函式特性)。

Python在智慧應用程式開發中的實用之處在於,在該語言外有許多模組可用。這些模組涵蓋了機器學習(scikit-learn、Numpy)、自然語言和文字處理 (NLTK),以及包含廣泛的拓撲結構的許多神經網路庫。

640?wx_fmt=png


R語言(以及使用它的軟體環境)大抵遵循Python模型。這是一種用於統計程式設計和資料探勘的開源環境,使用C語言開發。

因為大量現代機器學習實質上是統計性的,所以使用R有頗多便利,自2000年釋出穩定版本以來越來越受歡迎。R包括大量的涵蓋各種技術的庫,還包括使用新特性擴充套件該語言的能力。

640?wx_fmt=jpeg


隨著迴歸到連線機制架構,新應用應運而生,改變了影像和視訊處理和識別的局面。深度學習被用於識別影像或視訊中的物體,通過自然語言提供影像或視訊的文字描述,甚至通過實時檢測道路和物體為自動駕駛車輛鋪平道路。其網路可能非常龐大,以至於傳統計算架構無法高效處理。但通過引入圖形處理單元 (GPU),現在可以應用這些網路。

此時,需要使用新的語言將傳統CPU和GPU結合起來。Open Computing Language (OpenCL) 的開放標準語言允許在包含數千個處理單元的GPU上執行類似C或C++的程式,並允許通過CPU統籌安排GPU內的操作並行性。


結語


影響語言興衰的另一股暗流,是流水線般的現代軟體產業,它令一切工程朝著這樣的方向一去不返——工程師需要像零部件一樣,隨時可被替代,員工通過培訓即可上崗,再強大的程式語言亦無法抵抗這股潮流,然而所謂的“工業最佳實踐”,對開發字處理軟體,與構建精巧的思維繫統是一回事嗎?


(本文為 AI科技大本營整理文章,轉載請微信聯絡 1092722531

徵稿

640?wx_fmt=png


推薦閱讀:

點選“閱讀原文”,開啟CSDN APP 閱讀更貼心!

相關文章