前言
有這么一個(gè)大牛程序員,他在幾乎沒(méi)有接觸過(guò)神經(jīng)網(wǎng)絡(luò)的情況下,僅用了一周時(shí)間,在幾乎是最基礎(chǔ)且受限的編程環(huán)境下,從零開(kāi)始徒手?jǐn)]碼,實(shí)現(xiàn)了反向傳播和 CNN。今年,這位程序員已經(jīng) 48 歲了,他叫:約翰 · 卡馬克。
約翰 · 卡馬克是何方神圣?誰(shuí)是約翰 · 卡馬克?
他是一位集傳奇工程師、大神、瘋狂程序員、黑客之神、第一人稱射擊游戲之父、業(yè)界活化石、一代玄學(xué)碼神所有稱號(hào)為一身的老牌程序員,一舉一動(dòng)都牽動(dòng)人心。
約翰 ·D· 卡馬克二世(John D. Carmack II,出生于 1970 年 8 月 20 日),是美國(guó)的電玩游戲程序員、id Software 的創(chuàng)始人之一,id 是一家專門開(kāi)發(fā)電子游戲、電視游戲的公司,成立于 1991 年。
至于 id Software 這家公司都制作過(guò)什么游戲呢?說(shuō)幾個(gè)你應(yīng)該就知道了:《CS(反恐精英)》、《半條命》、《毀滅戰(zhàn)士》都出自這家公司。
怎么樣,對(duì)這位卡馬克先生多少有些了解了吧?
當(dāng)然,對(duì)技術(shù)大牛的一切不提技術(shù)水平的吹捧都是耍流氓!——沃茨 · 基碩德,那我們就來(lái)說(shuō)一說(shuō)這位卡馬克大神的技術(shù)水平。
卡馬克最讓人咋舌的冒險(xiǎn)就是涉足了第一人稱射擊游戲領(lǐng)域。他的編程能力得以毫無(wú)保留地展現(xiàn),隨后的《德軍總部 3D》(Wolfenstein 3D)、《毀滅戰(zhàn)士》(Doom)和《雷神之錘》(Quake)就是最好的佐證。這些游戲和它們的后續(xù)版本都獲取了巨大的成功。
卡馬克喜歡在電腦圖像領(lǐng)域嘗試新的技術(shù),比如他在 Doom 上第一次使用了二叉樹(shù)分區(qū)技術(shù),表面緩存技術(shù)則在 Quake 中第一次出現(xiàn)。還有就是后來(lái)在 Doom3 里面使用的 “卡馬克反轉(zhuǎn)”(即 shadow volume 的 z-fail 方法。事實(shí)上并不是卡馬克首先創(chuàng)新了這個(gè)技術(shù),他在后來(lái)獨(dú)立研究出來(lái))。
卡馬克創(chuàng)造的游戲引擎被用來(lái)制作其他的第一人稱射擊游戲,比如《半條命》(Half-life)和《榮譽(yù)勛章》(Medal of Honor)。
在 2007 年蘋(píng)果公司全球軟件開(kāi)發(fā)者年會(huì)上,卡馬克宣布了 id Tech 5,它實(shí)際上消除了過(guò)去對(duì)美工和設(shè)計(jì)人員的紋理內(nèi)存限制,允許在像素級(jí)別上對(duì)整個(gè)游戲世界實(shí)現(xiàn)獨(dú)特的定制設(shè)計(jì),并提供了幾乎無(wú)限的視覺(jué)真實(shí)性。"該技術(shù)可以允許" 廣袤的戶外場(chǎng)景,而室內(nèi)場(chǎng)景則具有前所未見(jiàn)的藝術(shù)細(xì)節(jié)。
2013 年的 QuakeCon,卡馬克表示對(duì)函數(shù)式編程很感興趣。他在 Twitter 上表示了 “已經(jīng)學(xué)習(xí) Haskell 一年”,“學(xué)習(xí) SICP 和嘗試使用 Scheme 中”,并且表示正在用 Haskell 重寫(xiě)德軍總部。與此同時(shí),卡馬克建議其他游戲開(kāi)發(fā)者嘗試函數(shù)式編程。
除了游戲領(lǐng)域,卡馬克還是個(gè)火箭愛(ài)好者,并成立了名為犰狳宇航(Armadillo Aerospace)的私人研發(fā)團(tuán)隊(duì)。
總結(jié)起來(lái),這位卡馬克大神就是:特別能創(chuàng)造、特別能折騰還特別聰明。在 AI 大火的今天,他又把自己的 “折騰精神” 發(fā)揮得淋漓盡致。
大神的一周編程實(shí)踐:徒手實(shí)現(xiàn)反向傳播與 CNN
幾天之前,卡馬克大神在 Facebook 上發(fā)表了一篇文章,總結(jié)了一下自己如何徒手實(shí)現(xiàn)反向傳播與 CNN 的事情。以下內(nèi)容編譯自卡馬克的自述文章:
間隔了好幾年,我終于又可以進(jìn)行我的一周編程實(shí)踐了,在編程的世界里我可以在隱士模式下工作,遠(yuǎn)離日常的工作壓力。過(guò)去幾年,我的妻子一直慷慨地為我打造這種環(huán)境,但我一般不善于在工作中休息。
隨著 Oculus(卡馬克目前所在公司)工作步伐的改變,我打算從頭開(kāi)始編寫(xiě)一些 C ++ 代碼來(lái)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò),而且我想用嚴(yán)格的 OpenBSD 系統(tǒng)來(lái)實(shí)現(xiàn)。有人可能會(huì)說(shuō)這是一個(gè)非常隨意且不太靠譜的選擇,但事實(shí)證明這是行得通的。
盡管我沒(méi)有真正使用過(guò)它,但我一直很喜歡 OpenBSD——一個(gè)相對(duì)簡(jiǎn)單且足夠自用的系統(tǒng),它具有緊湊的圖形界面,并且重視質(zhì)量和工藝。Linux 什么都好,但圖形界面不夠緊湊。
我不是 Unix 極客。各種系統(tǒng)我都可以用,但我最喜歡在 Windows 上使用 Visual Studio 進(jìn)行開(kāi)發(fā)。我認(rèn)為在老式的 Unix 風(fēng)格下完成一周的沉浸式工作會(huì)很有趣,即使這意味著工作速度要慢一些。這是一次復(fù)古計(jì)算的冒險(xiǎn)——使用 fvwm 和 vi。不是 vim,實(shí)際上是 BSD vi。
其實(shí)到最后,我也并沒(méi)有真正全面地探索這個(gè)系統(tǒng),95%的時(shí)間都花在基本的 vi/make/gdb 操作中。我喜歡那些操作手冊(cè)頁(yè)面,因?yàn)槲以噲D在自帶的系統(tǒng)中做所有事情,而不訴諸于互聯(lián)網(wǎng)搜索。閱讀諸如 Tektronix 終端等已有 30 多年歷史的事物的參考手冊(cè)是一件很有意思的事情。
我有點(diǎn)意外,C++ 的支持做得不是很好。G++ 不支持 C++ 11,并且 LLVM C++ 不能很好地與 gdb 配合使用。Gdb 也讓我踩了不少坑,我同樣懷疑是由于 C++ 的問(wèn)題。我知道你可以獲得更新的版本,但我堅(jiān)持使用基礎(chǔ)系統(tǒng)。
事后看來(lái),我還不如完全復(fù)古,干脆在 ANSI C 中做所有事情。和許多老程序員一樣,有很長(zhǎng)一段時(shí)間,我一直在琢磨 “也許 C++ 并不像我們想象的那么好”。我仍然喜歡 C++ 的很多方面,但對(duì)于我來(lái)說(shuō)用普通的 C 語(yǔ)言來(lái)構(gòu)建小型項(xiàng)目并不困難。
也許下次我再進(jìn)行一周編程實(shí)踐時(shí),我會(huì)嘗試完整的 emacs,這是另一個(gè)我還沒(méi)怎么接觸過(guò)的主流文化。
我對(duì)大多數(shù)機(jī)器學(xué)習(xí)算法已經(jīng)有比較基本的了解,并且我已經(jīng)完成了一些線性分類器和決策樹(shù)的工作,但出于某種原因,我從未使用過(guò)神經(jīng)網(wǎng)絡(luò)。在某種程度上,我懷疑是深度學(xué)習(xí)太過(guò)流行導(dǎo)致那個(gè)不愿意人云亦云的內(nèi)在的我感到抵觸。我仍然持有一點(diǎn)反思性的偏見(jiàn),反對(duì) “把所有的東西都扔在 NN(神經(jīng)網(wǎng)絡(luò))上,讓它自己整理出來(lái)!”
為了徹底貫徹我這次復(fù)古主題的精神,我打印了幾篇 Yann LeCun 的舊論文,并打算完全脫離互聯(lián)網(wǎng)去完成所有事情,這就好像我被困在了某個(gè)山間的小屋里,但最后我還是在 YouTube 上看了很多斯坦福 CS231N 課程視頻,并發(fā)現(xiàn)它們非常有價(jià)值。我一般很少看課程視頻,因?yàn)檫@通常讓我覺(jué)得時(shí)間花的不值,但在我 “隱退編程” 的這段時(shí)間里看這些視頻感覺(jué)還是很棒的!
我不認(rèn)為我有什么特別的洞察力來(lái)為神經(jīng)網(wǎng)絡(luò)添磚加瓦,但對(duì)我來(lái)說(shuō)這是非常高效的一周,充分將 “書(shū)本知識(shí)” 轉(zhuǎn)化為真實(shí)體驗(yàn)。
我采用了一種我經(jīng)常使用的模式:先寫(xiě)出一段粗糙且不怎么優(yōu)美的代碼,初步得到結(jié)果,然后用從視頻課程學(xué)到的東西再寫(xiě)出一段全新且更優(yōu)美的代碼,這樣一來(lái)兩份代碼可以并存和交叉檢查。
我一開(kāi)始嘗試實(shí)現(xiàn)反向傳播,結(jié)果兩次都做錯(cuò)了,數(shù)值微分比較至關(guān)重要!有趣的是,即使在各個(gè)部分都出現(xiàn)錯(cuò)誤的情況下,訓(xùn)練仍然能夠進(jìn)行——只要大多數(shù)時(shí)候符號(hào)正確,通常就會(huì)取得進(jìn)展。
我對(duì)我的多層神經(jīng)網(wǎng)絡(luò)代碼非常滿意,它已經(jīng)可以在我未來(lái)的工作中直接使用。是的,對(duì)于很多重要的事情我一般都使用一個(gè)已有的庫(kù),但是在很多時(shí)候,哪怕只有一個(gè). cpp 和. h 文件是你自己寫(xiě)出來(lái)的,還是會(huì)方便許多。
我的 CNN 代碼還很粗糙但已經(jīng)湊合能用了,我可能還會(huì)再用一兩天的時(shí)間來(lái)完成一個(gè)更干凈而靈活的實(shí)現(xiàn)。
有一件事我覺(jué)得很有趣,在加入任何卷積之前,用我的初始 NN 基于 MNIST 進(jìn)行測(cè)試,我得到的結(jié)果明顯好于 LeCun 98 年的論文中報(bào)告的用于比較的非卷積 NN——我使用了包含 100 個(gè)節(jié)點(diǎn)的單個(gè)隱藏層,在測(cè)試集上的錯(cuò)誤率大約為 2%,而 LeCun 論文中使用了包含更多節(jié)點(diǎn)和更深層的網(wǎng)絡(luò)錯(cuò)誤率卻是 3%。我將其歸因于現(xiàn)代最佳實(shí)踐——ReLU、Softmax 和更好的初始化過(guò)程。
我認(rèn)為這是關(guān)于神經(jīng)網(wǎng)絡(luò)工作的最有趣的事情之一 :它非常簡(jiǎn)單,突破性的進(jìn)步通常只需要幾行代碼即可表達(dá)出來(lái)。這感覺(jué)和圖形世界中的光線跟蹤有一些相似之處,只要你擁有數(shù)據(jù)并且對(duì)運(yùn)行時(shí)間有足夠的耐心,你就可以很快地實(shí)現(xiàn)基于物理的光傳輸光線跟蹤器,并生成最先進(jìn)的圖像。
通過(guò)探索一系列訓(xùn)練參數(shù),我對(duì)過(guò)度訓(xùn)練 / 泛化 / 正則化有了更好的理解。在我不得不回家的前一天晚上,我不再修改架構(gòu),只是玩超參數(shù)?!坝?xùn)練!”簡(jiǎn)直比 “編譯!” 更糟糕,更難讓人保持專注。
現(xiàn)在,我要開(kāi)始睜大眼睛尋找新的工作機(jī)會(huì)了,我迫不及待地想把我學(xué)到的新技能用起來(lái)!
我有點(diǎn)擔(dān)心明天進(jìn)入辦公室時(shí),我的郵箱和工作區(qū)將會(huì)變成什么樣子。
之后,大神 Yann LeCun 也回復(fù)了卡馬克:
歡迎入坑,約翰!在 OpenBSD 上用 vi 來(lái)完成這件事實(shí)屬英雄所為!每個(gè)人第一次嘗試的時(shí)候都會(huì)遇到梯度錯(cuò)誤。
在過(guò)去的 35 年里,我也做過(guò)很多次類似的事情。我的第一個(gè)反向傳播模擬器是在 PDP11 的 FORTRAN 中編寫(xiě)的(大約在 1984 年)。第二個(gè)是在 Pascal 上的 Pr1me OS(大約在 1986 年,使用類似 Emacs 的編輯器)。第三個(gè)是由 Leon Bottou 和我在 C 中使用 emacs / gcc / make 在我們的 Amiga 1000s 上編寫(xiě)的(1987 年),我們寫(xiě)了一個(gè) lisp 解釋器用作交互式前端語(yǔ)言。當(dāng)我在 1987 年搬到多倫多時(shí),我把這個(gè)東西移植到了 Sun OS(BSD Unix)上。直到 2011 年左右,我們一直使用這個(gè)系統(tǒng)及其后繼者(稱為 Lush),2011 年之后我們才切換到 Torch7。但在 2010 年,我開(kāi)始編寫(xiě)一個(gè)名為 EBLearn 的 C ++ 深度學(xué)習(xí)框架,由 Pierre Sermanet 和 Soumith Chintala 完成并維護(hù)。
在我們 1998 年的論文中,MNIST 上的全連接網(wǎng)絡(luò)的錯(cuò)誤率是次優(yōu)的,因?yàn)槲覀兪褂昧俗钚∑椒綋p失(對(duì)于標(biāo)記噪聲往往更加魯棒),而不是交叉熵,利用交叉熵和更大的網(wǎng)絡(luò)(>1000 個(gè)隱藏單元),錯(cuò)誤率可以下降到 1.6%左右。
對(duì)于不太了解技術(shù)的讀者,大概會(huì)產(chǎn)生一種 “神仙聊天” 的感覺(jué),每一個(gè)字你都認(rèn)識(shí),但是你就是看不懂,所以我們貼心地為大家解釋了一個(gè)簡(jiǎn)約版:
首先,大神卡馬克牛逼在哪兒了呢?看下知乎網(wǎng)友 wsivoky 的總結(jié):
48 歲仍然在學(xué)習(xí)新技術(shù)、編寫(xiě)代碼
喜歡受限的開(kāi)發(fā)環(huán)境(Twitter 上曾說(shuō)過(guò),受限環(huán)境有益)
vi&emacs 都用 (注意是 bsd vi, 不是 vim,前者是 bill joy 當(dāng)初開(kāi)發(fā)的第一版也是第一個(gè) screen editor )
使用 OpenBSD,但喜歡 Windows Visual Studio
用 makefile&gdb
使用 C++,同時(shí)也吐槽 C++
不用 Google Search, 完全看 man(Tektronix terminal 是 bill joy 編寫(xiě) vi 時(shí)代的顯示器,更早時(shí)候是靠紙張輸出... )
對(duì) Deep Learning 如此流行持保留態(tài)度
打印了 MNIST 早期論文并嘗試實(shí)現(xiàn)
最終忍不住看了 cs231n
使用自己喜歡的開(kāi)發(fā)方式:先實(shí)現(xiàn)后優(yōu)化
實(shí)現(xiàn)反向傳播容易出錯(cuò)
對(duì) CNN 的效果很滿意 (Tensor 操作也是"from-scratch-in-C++"CPU 實(shí)現(xiàn)的?)
對(duì) NN 代碼之少卻強(qiáng)大感到興奮(看到純手工擼的 NN 運(yùn)行結(jié)果之神奇,是很持久的快感)
編寫(xiě)算法實(shí)現(xiàn)對(duì)過(guò)擬合、正則化、調(diào)參有了更好的理解
再簡(jiǎn)約一點(diǎn)兒,大概就是這樣:
卡神:反向傳播和 CNN 這東西之前沒(méi)搞過(guò),那既然如此就自己動(dòng)手試試吧。一個(gè)禮拜之后發(fā)現(xiàn):哎呀~ 神經(jīng)網(wǎng)絡(luò)這玩意兒還挺有意思,感覺(jué)入坑了。(?? ω ??)?
樂(lè)村兒:大兄弟你終于入坑了,來(lái)來(lái)來(lái),我跟你說(shuō),用哥這方法你還有上升空間,以后咱們可以經(jīng)常交流經(jīng)驗(yàn)。(*≧︶≦))( ̄▽ ̄*) ゞ
成為大神,從你做起!
卡馬克的一周編程實(shí)踐一出,迅速在國(guó)內(nèi)外程序員圈子里引發(fā)騷動(dòng)。
國(guó)外程序員論壇 Reddit 的 MachineLearning 板塊下,卡馬克一周編程實(shí)踐的話題受關(guān)注度 364,共收獲 53 則留言
知乎上也很快有網(wǎng)友發(fā)布了相關(guān)問(wèn)題,截止發(fā)稿時(shí)間,已有 685 人關(guān)注,瀏覽次數(shù) 25991
卡馬克 Facebook 下的留言大多是這樣的:
其實(shí)大家為之震動(dòng)的并非卡馬克入坑 AI 這件事本身(當(dāng)然大神神乎其技的編程水平也確實(shí)讓人頂禮膜拜),而是卡馬克作為一位諸多成就加身的老牌程序員兼 Oculus CTO,仍然狂熱地愛(ài)著編程這件事本身,并且保持著對(duì)一切新鮮事物感到好奇的赤子之心。
當(dāng)卡馬克對(duì) AI、神經(jīng)網(wǎng)絡(luò)、深度學(xué)習(xí)產(chǎn)生興趣,決定探索一下這些新技術(shù)時(shí),他沒(méi)有直接安裝 TensorFlow 或 PyTorch, 而是花了一個(gè)星期的時(shí)間,通過(guò)逐一編寫(xiě)各個(gè)功能模塊代碼,并進(jìn)行了 MNIST 實(shí)驗(yàn),從頭開(kāi)始實(shí)現(xiàn) CNN 和反向傳播。他沒(méi)有去學(xué)習(xí)最新的術(shù)語(yǔ),但卻從中獲得了最有價(jià)值的知識(shí)。這里不爭(zhēng)論 scratching 到底好還是不好,但手?jǐn)]新技術(shù)確實(shí)是學(xué)習(xí)的一種好途徑。面對(duì)新技術(shù),不糾結(jié)要不要嘗試、不猶豫會(huì)不會(huì)太難,而是動(dòng)手干,無(wú)怪乎知乎網(wǎng)友將卡馬克稱作 “老程序員的標(biāo)桿”。
這是一個(gè)最好的時(shí)代,技術(shù)日新月異,熱點(diǎn)一年一個(gè),對(duì)技術(shù)人才的需求越來(lái)越大。這是一個(gè)最壞的時(shí)代,深陷技術(shù)漩渦的程序員們成為了最容易焦慮的群體,今天是 AI 火了我要不要轉(zhuǎn)行,明天是新技術(shù)太多學(xué)不動(dòng)了,后天是 35 歲程序員中年危機(jī)了。其實(shí)哪里有那么多可焦慮的,有時(shí)間焦慮不如多擼幾行代碼?;ヂ?lián)網(wǎng)技術(shù)更新確實(shí)快,這要求程序員必須終身學(xué)習(xí),但這是選擇了這個(gè)職業(yè)的宿命。
卡馬克告訴你:忘記中年危機(jī)吧,想想我們應(yīng)該做些什么,才不辜負(fù)這美好的時(shí)代!
寫(xiě)在最后
這里引用知乎網(wǎng)友姚鋼強(qiáng)的回答作為結(jié)語(yǔ)。
讀過(guò)《DOOM 啟世錄》 兩遍,John Carmack 說(shuō)過(guò):
在信息時(shí)代,客觀障礙已不復(fù)存在,所謂障礙都是主觀上的。如果你想動(dòng)手開(kāi)發(fā)什么全新的技術(shù),你不需要幾百萬(wàn)美元的資金,你只需要在冰箱里放滿比薩和可樂(lè),再有一臺(tái)便宜的計(jì)算機(jī),和為之獻(xiàn)身的決心。我們?cè)诘匕迳纤^(guò),我們從河水中趟過(guò)。
他切實(shí)做到了,與君共勉。
-
AI
+關(guān)注
關(guān)注
87文章
31316瀏覽量
269659 -
cnn
+關(guān)注
關(guān)注
3文章
353瀏覽量
22268
原文標(biāo)題:傳奇工程師卡馬克入坑 AI:徒手一周實(shí)現(xiàn)反向傳播和 CNN
文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論