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


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



整理 | apddd

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

語言的界限就是我與世界的界限。——維特根斯坦

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

史前時代


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


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


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

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


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


LISP叱吒六十年


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


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



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年代,在計算機上輸入和輸出與今天大不相同(穿孔卡片,而非更直觀的顯示器),那時的程序員們不大在意前綴還是中綴。


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


  • 符號表達式及其他信息,都以“列表”(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是他的設計,不如說是他的發現。”


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



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的指導老師。


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


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/ ),能使用自然語言與用戶進行交互。


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


程序代表著一個積木世界,用戶可以與該世界進行交互:“拿起大個兒紅色積木”、“一塊積木能否支撐錐體?”。這個積木世界中的自然語言理解和規劃的演示,讓當時的人們對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。


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


冬眠與新生命


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++),從系統到嵌入式設備開發都在使用它。


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


計算架構和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擴展接口來提高性能。


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



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

近代時期


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

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

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


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



R語言(以及使用它的軟件環境)大抵遵循Python模型。這是一種用於統計編程和數據挖掘的開源環境,使用C語言開發。

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


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


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

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

結語


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

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

相關推薦

推薦中...