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