熟悉電子游戲的讀者也許聽(tīng)說(shuō)過(guò)約翰·卡馬克(John Carmack),在游戲領(lǐng)域,這個(gè)名字稱得上是偶像級(jí)別的存在:3D引擎之父、第一人稱射擊游戲教父、電腦怪才……和那個(gè)時(shí)代的科技大牛一樣,他自學(xué)成才,考上名校,繼而輟學(xué)入職,投身游戲軟件開(kāi)發(fā)。他是個(gè)兼具數(shù)學(xué)家和哲學(xué)家氣質(zhì)的程序員,也是個(gè)只想寫(xiě)出好代碼的純粹的天才。那么,面對(duì)洶涌而來(lái)的人工智能浪潮,這位老一輩的程序員會(huì)有什么看法呢?
經(jīng)歷了一周努力學(xué)習(xí),近日,約翰·卡馬克在他的Facebook上發(fā)表了一篇名為1-week experience learning neural networks from scratch的學(xué)習(xí)心得,引起了網(wǎng)友的廣泛關(guān)注,以下是論智編譯的原文
隔了這么多年后,我終于找了一個(gè)遠(yuǎn)離工作事務(wù)紛擾的角落,撿起編程,以一個(gè)隱居者的心態(tài)學(xué)習(xí)了一周。在過(guò)去的幾年里,我的妻子一直慷慨地提供給我這樣的環(huán)境,但我始終無(wú)法從工作中脫身,連休假期間都不得安寧。
而現(xiàn)在,隨著我在Oculuss中工作進(jìn)展的變化,我想從頭開(kāi)始用C++編寫(xiě)一些神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)。我計(jì)劃挑選的操作系統(tǒng)是標(biāo)準(zhǔn)、準(zhǔn)確的OpenBSD,有人說(shuō)我的選擇太隨意了,可事實(shí)證明它確實(shí)沒(méi)問(wèn)題。
說(shuō)實(shí)在的,雖然我一直很欣賞OpenBSD的想法——這是一個(gè)相對(duì)簡(jiǎn)單同時(shí)又頗具見(jiàn)地的操作系統(tǒng),它目標(biāo)精準(zhǔn),重視程式碼的品質(zhì)和工藝,但之前我并沒(méi)有用過(guò)它。Linux什么都好,可惜的是這些優(yōu)點(diǎn)它都沒(méi)有。
這倒也不是說(shuō)我是個(gè)UNIX geek。我最喜歡的還是Windows的Visual Studio,所以其實(shí)我完全可以回避這些問(wèn)題。我只是單純覺(jué)得在老式UNIX風(fēng)格下進(jìn)行長(zhǎng)達(dá)一周的沉浸式工作會(huì)很有趣,即使進(jìn)度會(huì)慢一些。這是復(fù)古計(jì)算的一次冒險(xiǎn)——是fvwm & vi,而不是vim,是BSD vi。
而且我并沒(méi)有真正探索完整個(gè)系統(tǒng),因?yàn)槲野?5%的時(shí)間都花在基礎(chǔ)的 vi/make/gdb 操作上了。我很喜歡那些實(shí)用的幫助手冊(cè)頁(yè)面,雖然一直在摸索自己能在這個(gè)系統(tǒng)里做什么,但我實(shí)在不想上網(wǎng)直接搜。試想一下,我是在查閱30幾年前的老東西,如Tektronix terminal的手冊(cè),這簡(jiǎn)直不能更有趣。
有一點(diǎn)讓我比較驚訝,就是OpenBSD對(duì)C++的支持有點(diǎn)爛。G++不支持C++11,LLVM C++也不能很好地和gdb配合使用。我做gdb時(shí)系統(tǒng)崩了幾次,我懷疑是C++導(dǎo)致的。當(dāng)然,你不用跟我說(shuō)它可以升級(jí),我就想用最基礎(chǔ)的操作系統(tǒng)。
現(xiàn)在回過(guò)頭來(lái)看,我應(yīng)該是完全復(fù)古了,而且寫(xiě)的東西完全符合ANSI C標(biāo)準(zhǔn)。和許多老程序員一樣,有幾天我會(huì)忍不住反思:也許C++并沒(méi)有我們想得那么好……雖然我還喜歡很多其他的東西,但用普通的C語(yǔ)言寫(xiě)個(gè)小項(xiàng)目還難不倒我。當(dāng)然,如果還有下次的話,我會(huì)試試Emacs,這是另一個(gè)我沒(méi)怎么接觸過(guò)的領(lǐng)域。
在這之前,我其實(shí)已經(jīng)對(duì)大多數(shù)機(jī)器學(xué)習(xí)算法有了成熟的了解,而且也做過(guò)一些線性分類器和決策樹(shù)之類的工作。但出于某些原因,我還沒(méi)碰過(guò)神經(jīng)網(wǎng)絡(luò),這在某種程度上可能是因?yàn)?a target="_blank">深度學(xué)習(xí)太時(shí)髦了,導(dǎo)致我對(duì)它持保守意見(jiàn),或許也有一些反思性的偏見(jiàn)。我還不能接受“把所有東西丟進(jìn)神經(jīng)網(wǎng)絡(luò)里,然后讓它自己整理”這種套路。
而本著復(fù)古主義精神,我打印了幾篇Yann LeCun的舊論文,然后脫機(jī)工作,假裝自己正身處某地的山間小屋,但現(xiàn)實(shí)是——我還是偷偷在YouTube上看了不少斯坦福CS231N的視頻,并從中學(xué)到了很多東西。我一般很少看這種演講視頻,會(huì)覺(jué)得有點(diǎn)浪費(fèi)時(shí)間,但這樣“見(jiàn)風(fēng)使舵”的感覺(jué)也不賴。
我其實(shí)不認(rèn)為自己對(duì)神經(jīng)網(wǎng)絡(luò)有什么獨(dú)特的想法和建議,但就個(gè)人體驗(yàn)而言,這是高效的一周,因?yàn)槲野褧?shū)本上的知識(shí)固化成了真實(shí)經(jīng)驗(yàn)。我的實(shí)踐模式也很常規(guī):先用hacky代碼寫(xiě)一版,再根據(jù)視頻教程重寫(xiě)一個(gè)全新的、整潔的版本,所以兩者可以交叉檢查,不斷優(yōu)化。
我也曾在反向傳播上反復(fù)跌倒了好幾次,最后得出的經(jīng)驗(yàn)是比較數(shù)值差異非常重要!但很有趣的一點(diǎn)是,即使每個(gè)部分好像都錯(cuò)得離譜,神經(jīng)網(wǎng)絡(luò)似乎還是能正常訓(xùn)練的——甚至只要大多數(shù)時(shí)候符號(hào)是正確的,它就能不斷進(jìn)步。
對(duì)于最終得到的多層神經(jīng)網(wǎng)絡(luò)代碼,我是很滿意的,也產(chǎn)生了未來(lái)繼續(xù)完善的想法。是的,對(duì)于這類非常嚴(yán)肅的問(wèn)題,我一般會(huì)直接用已有的第三方庫(kù),但在過(guò)去的一周內(nèi),很多時(shí)候我會(huì)自己寫(xiě)單獨(dú)的.cpp文件和.h文件進(jìn)行編譯,這也很方便。
現(xiàn)在我的CNN代碼還需要優(yōu)化,我大概會(huì)花幾天時(shí)間做出一個(gè)干凈、靈活的實(shí)現(xiàn)。之前我把沒(méi)加進(jìn)卷積的初始神經(jīng)網(wǎng)絡(luò)放到MNIST上測(cè)試時(shí),發(fā)現(xiàn)它居然比LeCun論文里的結(jié)果更好——單個(gè)包含100個(gè)節(jié)點(diǎn)的隱藏層在測(cè)試集上的error是2%,論文里的網(wǎng)絡(luò)更廣更深,但它的error有3%。這個(gè)發(fā)現(xiàn)有點(diǎn)出乎我的意料,最后我總結(jié)的原因是激活函數(shù)——ReLU和Softmax。
如果要說(shuō)這一周的學(xué)習(xí)有什么最精彩的心得,那應(yīng)該就是神經(jīng)網(wǎng)絡(luò)非常簡(jiǎn)單,它只需寥寥幾行代碼就能實(shí)現(xiàn)突破性的進(jìn)步。我覺(jué)得這和圖形學(xué)中的光線追蹤有異曲同工之妙,只要我們有足夠的數(shù)據(jù)、時(shí)間和耐心,追蹤與光學(xué)表面發(fā)生交互作用的光線,得到光線經(jīng)過(guò)路徑的物理模型,我們就能生成最先進(jìn)的圖像。
同樣的,通過(guò)探索一系列訓(xùn)練參數(shù),我也對(duì) overtraining/generalization/regularization 有了更深的理解。回家的前一夜,我開(kāi)心地調(diào)起了超參數(shù)。為了保持專注,“訓(xùn)練”肯定比“編譯”更糟糕!
小結(jié)
讀了約翰·卡馬克的心得,不知各位讀者獲得了怎樣的體驗(yàn)。作為一名成功的資深程序員,卡馬克一直以來(lái)對(duì)編程的嚴(yán)苛要求是大家有目共睹的,而他這次抽出一周時(shí)間,以這么復(fù)古的形式學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),這樣的娛樂(lè)精神堪稱業(yè)界清流。這項(xiàng)“新技能”可能不會(huì)給他帶來(lái)世俗的快樂(lè),但在代碼中創(chuàng)造世界的樂(lè)趣使他感到幸福,卡馬克還是那個(gè)卡馬克。
除此之外,許多國(guó)外讀者又對(duì)深度學(xué)習(xí)的理論基礎(chǔ)產(chǎn)生了擔(dān)憂。正如文中所說(shuō)的:“即使每個(gè)部分好像都錯(cuò)得離譜,神經(jīng)網(wǎng)絡(luò)還是能正常訓(xùn)練——甚至只要大多數(shù)時(shí)候符號(hào)是正確的,它還能不斷進(jìn)步”。就梯度下降而言,理論上我們想要的是不斷走“下坡路”,走“上坡路”的結(jié)果注定是不理想的。但從長(zhǎng)遠(yuǎn)來(lái)看,如果兩者都能提高模型預(yù)測(cè)的結(jié)果,那走下坡的意義又在哪里?
這個(gè)領(lǐng)域內(nèi)的所有人都在追求各種進(jìn)步,擔(dān)當(dāng)他們被問(wèn)及為什么,大多數(shù)答案只是“just work”,如果只看結(jié)果,我們又該怎么判斷哪些是真正重要的東西?也許對(duì)于什么是“進(jìn)步”,我們也需要重新設(shè)定一個(gè)更嚴(yán)格的標(biāo)準(zhǔn)。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4774瀏覽量
100894 -
電子游戲
+關(guān)注
關(guān)注
0文章
39瀏覽量
9938 -
程序員
+關(guān)注
關(guān)注
4文章
953瀏覽量
29819
原文標(biāo)題:約翰·卡馬克(John Carmack):學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)這一周
文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論