Software is eating the world, but Neural Network is going to eat software.
軟件正在吞噬世界邦邦,而神經(jīng)網(wǎng)絡(luò)將吞噬軟件考蕾。
最初聽說Karpathy這里提的軟件2.0相關(guān)概念時(shí)互妓,是在吳教授采訪Hinton胖替,Hinton無意中提到的一段關(guān)于當(dāng)前高校計(jì)算機(jī)科學(xué)領(lǐng)域的不足,還有未來的發(fā)展方向氨淌。
他提到現(xiàn)在各大高校里猎荠,特別是計(jì)算機(jī)科學(xué)學(xué)院,并不缺各種編程大牛斧拍。只是現(xiàn)在的情況是雀扶,因?yàn)樯窠?jīng)網(wǎng)絡(luò)的普適性,所以實(shí)際上可能未來最重要的并不是如何來編一個(gè)程序肆汹,而是如何將數(shù)據(jù)展示給神經(jīng)網(wǎng)絡(luò)愚墓,來訓(xùn)練出來高性能網(wǎng)絡(luò)。
這次看到這個(gè)軟件2.0的概念時(shí)昂勉,感到很興奮浪册,因?yàn)檫@將Hinton提到趨勢(shì)系統(tǒng)性地?cái)U(kuò)展,不光只從所需人才岗照,還從計(jì)算村象、硬件、以及便利性展示了一個(gè)宏偉的前景攒至。
軟件2.0
現(xiàn)在可能大多數(shù)人還只是把神經(jīng)網(wǎng)絡(luò)當(dāng)做是"機(jī)器學(xué)習(xí)工具箱中的一個(gè)工具"厚者,很多教科書里也是這樣來介紹。包括有名的西瓜書迫吐,實(shí)際對(duì)神經(jīng)網(wǎng)絡(luò)的介紹只有一章库菲,而深度學(xué)習(xí)只有2頁。
這些想法會(huì)說:神經(jīng)網(wǎng)絡(luò)有它的優(yōu)點(diǎn)和缺點(diǎn)志膀,擅長(zhǎng)處理某些任務(wù)熙宇,你有時(shí)可以用它來贏得kaggle比賽。
但可惜的是溉浙,如果只是這樣子來看待神經(jīng)網(wǎng)絡(luò)烫止,那就是撿了芝麻,丟了西瓜放航。因?yàn)樯窠?jīng)網(wǎng)絡(luò)代表的并不僅僅只是另一種分類器烈拒,它更代表著寫軟件方式的根本性轉(zhuǎn)變的開始。而轉(zhuǎn)變的結(jié)果就是軟件2.0广鳍。
首先來介紹一下軟件1.0吧。它也就是我們所熟悉的吓妆,程序員用一種語言比如Python或者C++赊时,組合里面各種指令,寫出一行行程序行拢,使得程序執(zhí)行一些行為祖秒。
相比之下,軟件2.0則不是用編程語言寫的了,而是用神經(jīng)網(wǎng)絡(luò)的權(quán)重寫的竭缝。人們并不會(huì)參與編寫這種程序中去房维,因?yàn)橐粋€(gè)大的神經(jīng)網(wǎng)絡(luò)有太多權(quán)重了(成百上千萬)。
而我們能做的抬纸,是對(duì)程序的行為提出一些要求咙俩,然后設(shè)置約束 (比如用一個(gè)有輸入輸出對(duì)的數(shù)據(jù)集),讓神經(jīng)網(wǎng)絡(luò)自己搜尋程序空間湿故,得到滿足約束的結(jié)果阿趁。而其中神經(jīng)網(wǎng)絡(luò)搜索的手段,就是熟悉的反向傳播還有隨機(jī)梯度下降了坛猪。
事實(shí)上脖阵,對(duì)于很多現(xiàn)實(shí)問題來說,往往收集數(shù)據(jù)要比老老實(shí)實(shí)編程序容易得多墅茉。很大一部分的程序員命黔,未來可能不再是維護(hù)復(fù)雜的軟件庫,寫繁雜的程序就斤,或者分析運(yùn)行時(shí)間悍募。而是收集、清理战转、操作搜立、標(biāo)準(zhǔn)、分析槐秧、還有可視化喂給神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù) (我覺得這樣的程序員2.0啄踊,可以叫做訓(xùn)網(wǎng)員了)。
雖然這樣說刁标,但軟件2.0并不是說要取代軟件1.0颠通,而只是漸漸把之前軟件1.0主要負(fù)責(zé)的任務(wù)取代過來。事實(shí)上膀懈,我們也需要1.0的底層架構(gòu)顿锰,來訓(xùn)練2.0的代碼。
下面來看寫些启搂,軟件2.0的實(shí)例吧硼控。
一些實(shí)例
視覺識(shí)別,比起過去那種用手工特征的分類器胳赌,現(xiàn)在大多數(shù)成功的分類器都是CNN家族里的架構(gòu)牢撼,而最近一些研究更進(jìn)了一步,開始自動(dòng)搜尋架構(gòu)了疑苫。
語音識(shí)別熏版,過去要用有很多預(yù)處理過程的纷责,高斯混合模型還有隱馬爾科夫模型,但現(xiàn)在幾乎都完全是神經(jīng)網(wǎng)絡(luò)了撼短。
語音合成再膳,過去的處理方法包括各種各樣的拼接技術(shù),但現(xiàn)在的模型就直接是一個(gè)大型CNN網(wǎng)絡(luò)(比如WaveNet)輸出音頻數(shù)據(jù)曲横。
機(jī)器翻譯喂柒,過去最好的是基于短語的統(tǒng)計(jì)機(jī)器翻譯(Phrase-based Statistical Machine Translation, PSMT),但是現(xiàn)在神經(jīng)網(wǎng)絡(luò)已是主流 (PSMT已淪為基準(zhǔn)的基準(zhǔn)了)胜榔。其中最有意思的胳喷,當(dāng)然就是谷歌的多語言翻譯系統(tǒng),一個(gè)模型就幾乎可以在任何語言之間進(jìn)行翻譯夭织,還做到了Zero-Shot吭露。此外,最近ICLR2018那篇尊惰,非監(jiān)督學(xué)習(xí)的機(jī)器翻譯也是賺足了眼球讲竿。
機(jī)器人學(xué),長(zhǎng)期以來都是把問題分成各個(gè)小的部分弄屡,感知题禀、姿態(tài)估計(jì)、計(jì)劃膀捷、控制... 這些模塊之間用各種顯式的程序和算法來處理迈嘹。雖然現(xiàn)在也并沒有太大的進(jìn)展,但至少根據(jù)UC Berkeley還有Google的一些研究全庸,暗示著可能軟件2.0可以取代所有這些代碼秀仲,取得更好的成果。(之前在機(jī)器人實(shí)驗(yàn)室壶笼,看有些基于神經(jīng)學(xué)習(xí)的行走機(jī)器人相關(guān)研究時(shí)神僵,機(jī)器人自己學(xué)習(xí)走路真的很令人震驚。)
游戲覆劈,這個(gè)就不用多說了保礼。這也是各種媒體爆料最多的一塊了,從AlphaGo Zero現(xiàn)在的獨(dú)孤求敗责语,到之前DOTA2虐職業(yè)玩家炮障,已經(jīng)有了很多發(fā)展。
軟件2.0的好處
為什么我們會(huì)想把復(fù)雜的程序轉(zhuǎn)成軟件2.0呢坤候?
一個(gè)簡(jiǎn)單的答案當(dāng)然就是铝阐,因?yàn)檫@樣工作性能更好。然而除此之外铐拐,其實(shí)也有很多便利的地方徘键,使得我們更加青睞于軟件2.0。
來看看軟件2.0(比如一個(gè)CNN網(wǎng)絡(luò))和軟件1.0(一個(gè)產(chǎn)品級(jí)的C++代碼庫)的比較遍蟋。軟件2.0會(huì)有這些好處:
計(jì)算均一性吹害。一個(gè)典型的神經(jīng)網(wǎng)絡(luò),通常只有兩種操作: 矩陣運(yùn)算和在0處閾值化(ReLU)虚青。而傳統(tǒng)的軟件里面它呀,操作就各種各樣而且更加復(fù)雜了。
容易燒錄進(jìn)硅芯片棒厘。作為一個(gè)必然的結(jié)果纵穿,因?yàn)樯窠?jīng)網(wǎng)絡(luò)的指令集相對(duì)比較小,所以用硅片來實(shí)現(xiàn)這些網(wǎng)絡(luò)會(huì)變得很簡(jiǎn)單奢人,比如說定制的ASICs谓媒,神經(jīng)形態(tài)(neuromorphic)芯片等等。而當(dāng)這些低能耗的智能芯片普及時(shí)何乎,那么世界將會(huì)發(fā)生很大的變化句惯。想想未來一些便宜的小芯片里面,已經(jīng)集成了預(yù)訓(xùn)練好的CNN網(wǎng)絡(luò)支救、WaveNet語言生成網(wǎng)絡(luò)抢野,我們可以把它們用到任何東西上面去,就讓人興奮各墨。
固定的運(yùn)行時(shí)間指孤。每一次網(wǎng)絡(luò)的前饋迭代都只會(huì)使用同樣的運(yùn)算量。而且以這種方式贬堵,也不會(huì)進(jìn)入意料之外的無限循環(huán)恃轩。
固定的內(nèi)存使用量。沒有動(dòng)態(tài)分配的內(nèi)存扁瓢,所以內(nèi)存溢出這樣你需要在你代碼里注意的東西也會(huì)減少详恼。
跨平臺(tái)能力強(qiáng)。比起傳統(tǒng)的二進(jìn)制文件或者腳本引几,一系列的矩陣相乘更容易在任意計(jì)算結(jié)構(gòu)上運(yùn)行昧互。
非常靈敏。假如入你有一個(gè)C++程序伟桅,突然被要求讓它運(yùn)行速度加快一倍敞掘,那么為了滿足這個(gè)新要求而改寫代碼,是件很麻煩的事情楣铁。而如果是神經(jīng)網(wǎng)絡(luò)玖雁,你只需移除一半的通道,重新訓(xùn)練一下盖腕,速度就變成原來的兩倍了赫冬,只是性能會(huì)下降一些浓镜。反過來說,如果你突然有了更多數(shù)據(jù)或者計(jì)算量劲厌,那么你就可以增加通道膛薛,然后重訓(xùn)練,提高性能补鼻。
各個(gè)模塊可以組成一個(gè)最優(yōu)化的整體哄啄。現(xiàn)在的軟件一般都是分成各個(gè)模塊,然后用API這樣的公共函數(shù)來交流风范。然而咨跌,如果是軟件2.0的話,最初分別訓(xùn)練的模塊硼婿,如果組合起來锌半,很容易就能用反向傳播來優(yōu)化整個(gè)模型。
很好上手加酵。深度學(xué)習(xí)很淺拳喻,這是Karpathy說的一個(gè)玩笑。指的是現(xiàn)在學(xué)習(xí)深度學(xué)習(xí)猪腕,你并不需要像核物理一樣有一個(gè)博士學(xué)位冗澈,你只需最基礎(chǔ)的線代、高數(shù)陋葡、python知識(shí)亚亲,然后在網(wǎng)上上點(diǎn)課,就能上手了腐缤。當(dāng)然捌归,這里說的只是上手,要成為大師的話岭粤,還是需要一些功夫的惜索。
它通常做的要比你好。最后同樣也是最重要的一點(diǎn)剃浇,一般神經(jīng)網(wǎng)絡(luò)比你想到的代碼要好的多巾兆,至少現(xiàn)在已經(jīng)在和圖像/視頻、聲音/語言虎囚、還有文本有關(guān)的任務(wù)上已經(jīng)是這樣了角塑。
軟件2.0的不足
軟件2.0也不都是一些好的地方,它也有自己的不足淘讥。
通常在優(yōu)化后圃伶,會(huì)得到一個(gè)龐大的神經(jīng)網(wǎng)絡(luò),性能很好,但是卻很難解釋為什么好窒朋。所以對(duì)于很多應(yīng)用領(lǐng)域搀罢,我們需要選擇是用90%準(zhǔn)確,但能理解的模型炼邀;還是99%準(zhǔn)確魄揉,但卻不能理解的模型。
還有拭宁,軟件2.0會(huì)出現(xiàn)一些預(yù)料之外,而且很尷尬的錯(cuò)誤(之前微軟的Tay)瓣俯,甚至更壞杰标,“什么也不做”。卻又很難去對(duì)它們進(jìn)行分析和檢測(cè)彩匕。
最后腔剂,現(xiàn)在仍發(fā)現(xiàn)軟件2.0還有很多奇怪的特性。比如說對(duì)抗性樣本的存在驼仪,以及用這個(gè)來進(jìn)行的攻擊掸犬。
最后
如果你把神經(jīng)網(wǎng)絡(luò)想成是軟件,而不僅僅是個(gè)比較好的分類器的話绪爸,很明顯它一下子就有了很多優(yōu)點(diǎn)湾碎,而且有很大的潛力改變軟件世界。
長(zhǎng)期來看奠货,軟件2.0的未來是光明的介褥,因?yàn)楝F(xiàn)在大家心里越來越清楚,當(dāng)我們想要開發(fā)AGI(強(qiáng)人工智能)递惋,它必然是使用軟件2.0來寫出的柔滔。
最后的最后,關(guān)于個(gè)人的發(fā)展方面萍虽,我們可以更加關(guān)注于如何來利用數(shù)據(jù)和神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)自己的任務(wù)睛廊,使自己能夠成為軟件2.0的先驅(qū)者。