0
本文作者: 楊曉凡 | 2017-11-20 10:48 |
雷鋒網(wǎng) AI 科技評論按:有越來越多的傳統(tǒng)編程語言(C、C++、Java)等程序員開始學(xué)習(xí)機器學(xué)習(xí)/深度學(xué)習(xí),而對機器學(xué)習(xí)/深度學(xué)習(xí)的研究人員來說,編程也是必備技巧。那么傳統(tǒng)程序員和深度學(xué)習(xí)專家對編程的軟件的看法一樣嗎?計算機軟件會在深度學(xué)習(xí)時代發(fā)生什么新的變化嗎?
近日,計算機視覺領(lǐng)域大牛之一、李飛飛高徒、曾在OpenAI任研究科學(xué)家、現(xiàn)任特斯拉AI總監(jiān)的 Andrej Karpathy 就發(fā)表了一篇博客,介紹了他眼中神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)帶來的“軟件2.0”的全新開發(fā)思維。他相信這不僅是重要的軟件開發(fā)變化趨勢,正需要所有人都正視它、仔細思考它的優(yōu)缺點。
雷鋒網(wǎng) AI 科技評論把Andrej Karpathy的這篇博客全文翻譯如下。
有時候我會碰到這樣的人,他們把神經(jīng)網(wǎng)絡(luò)看作“機器學(xué)習(xí)工具箱里的一個新工具”。深度學(xué)習(xí)有優(yōu)點也有缺點,它們在挺多場景下都能發(fā)揮作用,有時候也能用深度學(xué)習(xí)在Kaggle的比賽中獲勝。
然而不幸的是,這種觀點其實是一葉障目不見泰山。神經(jīng)網(wǎng)絡(luò)并不僅僅是一類新的分類器,它們標(biāo)志著人類編寫軟件的方式開始發(fā)生根本性的改變。這就是“軟件2.0”(Software 2.0)。
“軟件1.0”中經(jīng)典的一層層結(jié)構(gòu)大家都已經(jīng)非常熟悉了,編寫它們用的是Python、C++等等語言,包含的也就是程序員顯式地寫下的計算機命令。每寫下一行代碼,程序員就把程序空間中的某個具體的點定義為了一個需要的行為。
“軟件2.0”則截然不同,它的呈現(xiàn)方式是神經(jīng)網(wǎng)絡(luò)的權(quán)重。人類程序員沒法自己動手編寫這類代碼,因為它們是一大堆權(quán)重(典型的神經(jīng)網(wǎng)絡(luò)中可能有上百萬個權(quán)重),直接把代碼寫成權(quán)重很困難(我試過)。實際上的做法是,人們對一個理想的程序的行為設(shè)定一些限制(比如通過帶有成對的輸入輸出樣本的數(shù)據(jù)集),然后用手頭的計算資源在程序空間中搜索,找到一個能符合那些限制的程序。以神經(jīng)網(wǎng)絡(luò)為例,我們把搜索過程限定在程序空間的一個連續(xù)的子集當(dāng)中,在這個子集里我們可以用反向傳播和最速梯度下降的方法把搜索過程變得高效(有時候極為高效)。
事實上,真實世界中的很多問題都有這樣一種特性,收集它們的數(shù)據(jù)要比明確地寫下一行行程序容易得多。未來的程序員里相當(dāng)大的一部分都不需要做維護復(fù)雜的代碼庫、編寫復(fù)雜的程序以及分析程序運行時等等工作。他們要做的事情都會圍繞著要喂給神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù):收集數(shù)據(jù)、清洗數(shù)據(jù)、操作數(shù)據(jù)、給數(shù)據(jù)加標(biāo)簽、分析數(shù)據(jù)、做數(shù)據(jù)可視化等等。
“軟件2.0”并不會取代1.0(顯而易見,訓(xùn)練和推理這樣的軟件2.0代碼的“編譯”過程需要很多1.0代碼編寫的基礎(chǔ)架構(gòu)支持),但是如今的軟件1.0所完成的任務(wù)里將會有越來越高的比例被軟件2.0替代。下面我們來看幾個正在發(fā)生這種轉(zhuǎn)換的例子來確認這個觀點。
視覺識別 以前的做法是做特征工程,然后在最后面、最頂層用了一點點機器學(xué)習(xí)(比如SVM)。后來,我們(在卷積網(wǎng)絡(luò)架構(gòu)家族中)開發(fā)出了新的識別原理,找到了強大得多的圖像分析程序;近期我們也已經(jīng)開始探索更多的網(wǎng)絡(luò)架構(gòu)。
語音識別 以前需要很多的預(yù)處理、高斯混合模型以及隱馬爾可夫模型,但今天幾乎全都是由神經(jīng)網(wǎng)絡(luò)搞定的。
語音生成 歷史上人們用過各種各樣的音素拼接方式,而現(xiàn)在的頂級模型都是大規(guī)模卷積神經(jīng)網(wǎng)絡(luò)(比如WaveNet),它們可以直接生成原始的音頻信號輸出。
機器翻譯 以往的通常做法是用一些基于短語的統(tǒng)計學(xué)技巧,但神經(jīng)網(wǎng)絡(luò)的方法很快就成為了主流。我自己最喜歡的架構(gòu)是在多語言設(shè)置下訓(xùn)練的,不僅單獨一個模型就可以從任意源語言翻譯到任意目標(biāo)語言,而且還可以是弱監(jiān)督(甚至完全無監(jiān)督)的。
機器人 這個領(lǐng)域的傳統(tǒng)一直是把問題分解為感知、位姿預(yù)測、規(guī)劃、控制、不確定建模等等模塊,在中間層表征之上運用顯式表征和算法。雖然完全離解決問題還有相當(dāng)?shù)木嚯x,但UC伯克利和谷歌的研究人員都通過種種證據(jù)表明軟件2.0可能會在表征所有這些代碼上發(fā)揮出好得多的作用。
游戲 下圍棋的程序已經(jīng)存在了很久了,但是AlphaGo Zero(能夠直接觀察棋盤狀態(tài)并下出一步棋的卷積神經(jīng)網(wǎng)絡(luò))已經(jīng)成為了目前最強的圍棋棋手。我預(yù)計我們還能在其它領(lǐng)域看到非常類似的結(jié)果,比如DOTA2或者星際爭霸。
可能有讀者發(fā)現(xiàn)上面提到的很多研究都來自谷歌。這是因為谷歌目前就站在把大型軟件重寫成軟件2.0代碼的最前沿。“One model to rule them all”這篇論文里就給大家?guī)砹艘稽c早期感受,每個領(lǐng)域各自的統(tǒng)計力量可以聯(lián)合起來形成對世界的一致理解。
為什么我們應(yīng)當(dāng)主動把復(fù)雜的程序轉(zhuǎn)換到軟件2.0的形式呢?有個簡單又明確的答案就是,它們在實際情況中的表現(xiàn)要更好。除此之外也有很多別的好原因選擇這種模式。下面我們來把軟件2.0(比如一個卷積神經(jīng)網(wǎng)絡(luò))和軟件1.0(比如一個生產(chǎn)級別的C++代碼庫)做個比較,看看有哪些好處。軟件2.0的特點是:
計算同質(zhì)化。從第一階來說,一個典型的神經(jīng)網(wǎng)絡(luò)是由矩陣乘法和零閾值(ReLU)像三明治那樣一層接一層堆疊起來形成的。和傳統(tǒng)軟件的指令集相比,神經(jīng)網(wǎng)絡(luò)計算的同質(zhì)化程度要高許多、計算復(fù)雜度也要高許多。由于用軟件1.0實現(xiàn)神經(jīng)網(wǎng)絡(luò)時只需要為一小部分核心計算提供支持(比如矩陣乘法),那么需要保證計算的正確率、提高計算性能等等時就簡單的多。
可以簡單地集成進硅片中。由于神經(jīng)網(wǎng)絡(luò)的指令集相對很小,就可以得到一個推論,那就是想要用更接近硅片的方式實現(xiàn)神經(jīng)網(wǎng)絡(luò)的時候就要簡單得多,比如通過定制的ASIC、仿神經(jīng)計算芯片等等。當(dāng)?shù)凸牡闹悄苄酒h(huán)繞著我們的時候,整個世界將會變得大為不同。這些又小又便宜的芯片可以包含著訓(xùn)練過的卷積網(wǎng)絡(luò)、語音識別器、WaveNet語音生成器等等,這樣的小巧的原始大腦可以連接到任何東西上面。
恒定的運行時間。神經(jīng)網(wǎng)絡(luò)典型的前向迭代過程總會需要同樣的浮點運算量。運行在盤根錯節(jié)的C++代碼基礎(chǔ)上的神經(jīng)網(wǎng)絡(luò)運算即便采用不同的路徑運行,所需的計算量也不會有任何變化。當(dāng)然了,計算圖也可以是動態(tài)的,但執(zhí)行的數(shù)據(jù)流總的來說還是有著非常大的限制、沒法做出大幅度變化。這樣一來,可以說我們幾乎永遠都不會意外地陷在無限的循環(huán)計算中出不來。
固定的內(nèi)存使用量。跟前一點類似,各個地方都沒有動態(tài)分配的內(nèi)存,所以幾乎不會出現(xiàn)用硬盤做緩沖區(qū)的需求,也不會有什么需要追蹤代碼才能發(fā)現(xiàn)的內(nèi)存泄露問題。
高可遷移性。與傳統(tǒng)二進制程序代碼或者腳本相比,一系列的矩陣乘法操作想要運行在任意的計算硬件上要簡單太多了。
非常靈活。如果有一段C++代碼的程序,然后有人想要把它的運行速度提升到原來的兩倍那么快(如果需要的話也要付出一點執(zhí)行效果代價),那么為新指標(biāo)調(diào)整這個系統(tǒng)是一件非常困難的事情。然而,對于軟件2.0來說,只需要去掉網(wǎng)絡(luò)中一半的通道、重新訓(xùn)練一下,它就可以直接以原來的兩倍的速度運行,只不過表現(xiàn)要差一點點。這就有點神奇了。反過來說,如果你剛好有更多的數(shù)據(jù)、更多的計算能力,你也只需要給程序中加入更多的通道、再重新訓(xùn)練一下,就可以提高它的表現(xiàn)。
可以融合多個模型達到全局最優(yōu)。目前的軟件通??梢苑纸獬刹煌哪K,它們通過公有函數(shù)、API或者終端相互溝通。不過,如果兩個本來分別獨立訓(xùn)練的軟件2.0模塊需要互動的話,可以很輕松地做全局反向傳播。想想看,如果你的瀏覽器可以自動重新設(shè)計10層底層指令集來達到更高的網(wǎng)頁加載效率的話,這將是多么驚人的一件事啊。而在軟件2.0中,這會成為默認發(fā)生的一件事。
易學(xué)。我喜歡開玩笑說“深度學(xué)習(xí)挺淺的”。因為深度學(xué)習(xí)并不是原子物理,你不需要先讀一個博士學(xué)位才能做出來任何一件有意義的事情。理解深度學(xué)習(xí)背后的概念只需要基礎(chǔ)的線性代數(shù)、微積分、Python以及CS231n中的幾節(jié)課。當(dāng)然了,在實踐的過程中也還能學(xué)到許多精辟的見解和直覺,所以更準(zhǔn)確的表述應(yīng)該是:軟件2.0的層層知識想學(xué)的話很容易入門,但是想成為高手也并不容易。
它要比你強。最后,以及最重要的是,一個神經(jīng)網(wǎng)絡(luò)對應(yīng)的代碼要比你、我、甚至任何人能在某個很大的具體領(lǐng)域?qū)懗龅拇a都要好得多,目前神經(jīng)網(wǎng)絡(luò)至少就和圖像/視頻,聲音/語音以及文本有關(guān)系。
軟件2.0的方法也有一些自己的缺點。優(yōu)化之后我們得到的結(jié)果是運行表現(xiàn)出色、但非常難以解釋的大規(guī)模網(wǎng)絡(luò)。在許許多多的應(yīng)用場景中我們都面臨著這樣的選擇:是選那個我們能理解為什么但只有90%準(zhǔn)確率的模型,還是選擇那個有99%準(zhǔn)確率但我們不理解的模型。
軟件2.0的方法也可能帶來反直覺的、令人尷尬的做法,甚至更糟。它們可能“悄悄地崩潰”,比如從訓(xùn)練數(shù)據(jù)中悄悄地學(xué)到了偏見。訓(xùn)練數(shù)據(jù)中的偏見又很難正確分析和檢驗,數(shù)據(jù)集的大小多數(shù)時候都是百萬級起步的,進一步增大了這個困難。
最后,軟件2.0中新的奇怪特性也在不斷被研究人員們發(fā)現(xiàn)著。比如,對抗性樣本和攻擊的存在就體現(xiàn)出了軟件2.0方法反直覺的本質(zhì)。
如果你心中的神經(jīng)網(wǎng)絡(luò)是一種新的軟件編寫方法,而不僅僅是一類不錯的分類器的話,那你很快就能發(fā)現(xiàn)它們有許許多多的優(yōu)點,也有很大的潛力改變整個軟件業(yè)態(tài)。
長期來看,軟件2.0的未來非常明亮,對于通用人工智能的開發(fā)者來說這件事已經(jīng)變得越來越明確,它一定會是用軟件2.0寫出來的。
那么軟件3.0呢?那完全要看通用人工智能的發(fā)展如何了。
(完)
大家都能認可深度神經(jīng)網(wǎng)絡(luò)是新的思路新的做法,不過在Andrej Karpathy的這篇文章之前我們也不常細想它會對傳統(tǒng)軟件產(chǎn)生多大的影響。不過正如他在文中所說,“軟件2.0”的前途還非常光明,雷鋒網(wǎng) AI 科技評論也期待著深度神經(jīng)網(wǎng)絡(luò)帶來更大的改變。
via Medium
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。