0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

傳奇工程師卡馬克入坑 AI:徒手一周實現(xiàn)反向傳播和 CNN

DPVg_AI_era ? 來源:未知 ? 作者:鄧佳佳 ? 2018-03-13 14:03 ? 次閱讀

前言

有這么一個大牛程序員,他在幾乎沒有接觸過神經(jīng)網(wǎng)絡的情況下,僅用了一周時間,在幾乎是最基礎(chǔ)且受限的編程環(huán)境下,從零開始徒手擼碼,實現(xiàn)了反向傳播和 CNN。今年,這位程序員已經(jīng) 48 歲了,他叫:約翰 · 卡馬克。

約翰 · 卡馬克是何方神圣?誰是約翰 · 卡馬克?

他是一位集傳奇工程師、大神、瘋狂程序員、黑客之神、第一人稱射擊游戲之父、業(yè)界活化石、一代玄學碼神所有稱號為一身的老牌程序員,一舉一動都牽動人心。

約翰 ·D· 卡馬克二世(John D. Carmack II,出生于 1970 年 8 月 20 日),是美國的電玩游戲程序員、id Software 的創(chuàng)始人之一,id 是一家專門開發(fā)電子游戲、電視游戲的公司,成立于 1991 年。

至于 id Software 這家公司都制作過什么游戲呢?說幾個你應該就知道了:《CS(反恐精英)》、《半條命》、《毀滅戰(zhàn)士》都出自這家公司。

怎么樣,對這位卡馬克先生多少有些了解了吧?

當然,對技術(shù)大牛的一切不提技術(shù)水平的吹捧都是耍流氓!——沃茨 · 基碩德,那我們就來說一說這位卡馬克大神的技術(shù)水平。

卡馬克最讓人咋舌的冒險就是涉足了第一人稱射擊游戲領(lǐng)域。他的編程能力得以毫無保留地展現(xiàn),隨后的《德軍總部 3D》(Wolfenstein 3D)、《毀滅戰(zhàn)士》(Doom)和《雷神之錘》(Quake)就是最好的佐證。這些游戲和它們的后續(xù)版本都獲取了巨大的成功。

卡馬克喜歡在電腦圖像領(lǐng)域嘗試新的技術(shù),比如他在 Doom 上第一次使用了二叉樹分區(qū)技術(shù),表面緩存技術(shù)則在 Quake 中第一次出現(xiàn)。還有就是后來在 Doom3 里面使用的 “卡馬克反轉(zhuǎn)”(即 shadow volume 的 z-fail 方法。事實上并不是卡馬克首先創(chuàng)新了這個技術(shù),他在后來獨立研究出來)。

卡馬克創(chuàng)造的游戲引擎被用來制作其他的第一人稱射擊游戲,比如《半條命》(Half-life)和《榮譽勛章》(Medal of Honor)。

在 2007 年蘋果公司全球軟件開發(fā)者年會上,卡馬克宣布了 id Tech 5,它實際上消除了過去對美工和設(shè)計人員的紋理內(nèi)存限制,允許在像素級別上對整個游戲世界實現(xiàn)獨特的定制設(shè)計,并提供了幾乎無限的視覺真實性。"該技術(shù)可以允許" 廣袤的戶外場景,而室內(nèi)場景則具有前所未見的藝術(shù)細節(jié)。

2013 年的 QuakeCon,卡馬克表示對函數(shù)式編程很感興趣。他在 Twitter 上表示了 “已經(jīng)學習 Haskell 一年”,“學習 SICP 和嘗試使用 Scheme 中”,并且表示正在用 Haskell 重寫德軍總部。與此同時,卡馬克建議其他游戲開發(fā)者嘗試函數(shù)式編程。

除了游戲領(lǐng)域,卡馬克還是個火箭愛好者,并成立了名為犰狳宇航(Armadillo Aerospace)的私人研發(fā)團隊。

總結(jié)起來,這位卡馬克大神就是:特別能創(chuàng)造、特別能折騰還特別聰明。在 AI 大火的今天,他又把自己的 “折騰精神” 發(fā)揮得淋漓盡致。

大神的一周編程實踐:徒手實現(xiàn)反向傳播與 CNN

幾天之前,卡馬克大神在 Facebook 上發(fā)表了一篇文章,總結(jié)了一下自己如何徒手實現(xiàn)反向傳播與 CNN 的事情。以下內(nèi)容編譯自卡馬克的自述文章:

間隔了好幾年,我終于又可以進行我的一周編程實踐了,在編程的世界里我可以在隱士模式下工作,遠離日常的工作壓力。過去幾年,我的妻子一直慷慨地為我打造這種環(huán)境,但我一般不善于在工作中休息。

隨著 Oculus(卡馬克目前所在公司)工作步伐的改變,我打算從頭開始編寫一些 C ++ 代碼來實現(xiàn)神經(jīng)網(wǎng)絡,而且我想用嚴格的 OpenBSD 系統(tǒng)來實現(xiàn)。有人可能會說這是一個非常隨意且不太靠譜的選擇,但事實證明這是行得通的。

盡管我沒有真正使用過它,但我一直很喜歡 OpenBSD——一個相對簡單且足夠自用的系統(tǒng),它具有緊湊的圖形界面,并且重視質(zhì)量和工藝。Linux 什么都好,但圖形界面不夠緊湊。

我不是 Unix 極客。各種系統(tǒng)我都可以用,但我最喜歡在 Windows 上使用 Visual Studio 進行開發(fā)。我認為在老式的 Unix 風格下完成一周的沉浸式工作會很有趣,即使這意味著工作速度要慢一些。這是一次復古計算的冒險——使用 fvwm 和 vi。不是 vim,實際上是 BSD vi。

其實到最后,我也并沒有真正全面地探索這個系統(tǒng),95%的時間都花在基本的 vi/make/gdb 操作中。我喜歡那些操作手冊頁面,因為我試圖在自帶的系統(tǒng)中做所有事情,而不訴諸于互聯(lián)網(wǎng)搜索。閱讀諸如 Tektronix 終端等已有 30 多年歷史的事物的參考手冊是一件很有意思的事情。

我有點意外,C++ 的支持做得不是很好。G++ 不支持 C++ 11,并且 LLVM C++ 不能很好地與 gdb 配合使用。Gdb 也讓我踩了不少坑,我同樣懷疑是由于 C++ 的問題。我知道你可以獲得更新的版本,但我堅持使用基礎(chǔ)系統(tǒng)。

事后看來,我還不如完全復古,干脆在 ANSI C 中做所有事情。和許多老程序員一樣,有很長一段時間,我一直在琢磨 “也許 C++ 并不像我們想象的那么好”。我仍然喜歡 C++ 的很多方面,但對于我來說用普通的 C 語言來構(gòu)建小型項目并不困難。

也許下次我再進行一周編程實踐時,我會嘗試完整的 emacs,這是另一個我還沒怎么接觸過的主流文化。

我對大多數(shù)機器學習算法已經(jīng)有比較基本的了解,并且我已經(jīng)完成了一些線性分類器和決策樹的工作,但出于某種原因,我從未使用過神經(jīng)網(wǎng)絡。在某種程度上,我懷疑是深度學習太過流行導致那個不愿意人云亦云的內(nèi)在的我感到抵觸。我仍然持有一點反思性的偏見,反對 “把所有的東西都扔在 NN(神經(jīng)網(wǎng)絡)上,讓它自己整理出來!”

為了徹底貫徹我這次復古主題的精神,我打印了幾篇 Yann LeCun 的舊論文,并打算完全脫離互聯(lián)網(wǎng)去完成所有事情,這就好像我被困在了某個山間的小屋里,但最后我還是在 YouTube 上看了很多斯坦福 CS231N 課程視頻,并發(fā)現(xiàn)它們非常有價值。我一般很少看課程視頻,因為這通常讓我覺得時間花的不值,但在我 “隱退編程” 的這段時間里看這些視頻感覺還是很棒的!

我不認為我有什么特別的洞察力來為神經(jīng)網(wǎng)絡添磚加瓦,但對我來說這是非常高效的一周,充分將 “書本知識” 轉(zhuǎn)化為真實體驗。

我采用了一種我經(jīng)常使用的模式:先寫出一段粗糙且不怎么優(yōu)美的代碼,初步得到結(jié)果,然后用從視頻課程學到的東西再寫出一段全新且更優(yōu)美的代碼,這樣一來兩份代碼可以并存和交叉檢查。

我一開始嘗試實現(xiàn)反向傳播,結(jié)果兩次都做錯了,數(shù)值微分比較至關(guān)重要!有趣的是,即使在各個部分都出現(xiàn)錯誤的情況下,訓練仍然能夠進行——只要大多數(shù)時候符號正確,通常就會取得進展。

我對我的多層神經(jīng)網(wǎng)絡代碼非常滿意,它已經(jīng)可以在我未來的工作中直接使用。是的,對于很多重要的事情我一般都使用一個已有的庫,但是在很多時候,哪怕只有一個. cpp 和. h 文件是你自己寫出來的,還是會方便許多。

我的 CNN 代碼還很粗糙但已經(jīng)湊合能用了,我可能還會再用一兩天的時間來完成一個更干凈而靈活的實現(xiàn)。

有一件事我覺得很有趣,在加入任何卷積之前,用我的初始 NN 基于 MNIST 進行測試,我得到的結(jié)果明顯好于 LeCun 98 年的論文中報告的用于比較的非卷積 NN——我使用了包含 100 個節(jié)點的單個隱藏層,在測試集上的錯誤率大約為 2%,而 LeCun 論文中使用了包含更多節(jié)點和更深層的網(wǎng)絡錯誤率卻是 3%。我將其歸因于現(xiàn)代最佳實踐——ReLU、Softmax 和更好的初始化過程。

我認為這是關(guān)于神經(jīng)網(wǎng)絡工作的最有趣的事情之一 :它非常簡單,突破性的進步通常只需要幾行代碼即可表達出來。這感覺和圖形世界中的光線跟蹤有一些相似之處,只要你擁有數(shù)據(jù)并且對運行時間有足夠的耐心,你就可以很快地實現(xiàn)基于物理的光傳輸光線跟蹤器,并生成最先進的圖像。

通過探索一系列訓練參數(shù),我對過度訓練 / 泛化 / 正則化有了更好的理解。在我不得不回家的前一天晚上,我不再修改架構(gòu),只是玩超參數(shù)?!坝柧?!”簡直比 “編譯!” 更糟糕,更難讓人保持專注。

現(xiàn)在,我要開始睜大眼睛尋找新的工作機會了,我迫不及待地想把我學到的新技能用起來!

我有點擔心明天進入辦公室時,我的郵箱和工作區(qū)將會變成什么樣子。

之后,大神 Yann LeCun 也回復了卡馬克:

歡迎入坑,約翰!在 OpenBSD 上用 vi 來完成這件事實屬英雄所為!每個人第一次嘗試的時候都會遇到梯度錯誤。

在過去的 35 年里,我也做過很多次類似的事情。我的第一個反向傳播模擬器是在 PDP11 的 FORTRAN 中編寫的(大約在 1984 年)。第二個是在 Pascal 上的 Pr1me OS(大約在 1986 年,使用類似 Emacs 的編輯器)。第三個是由 Leon Bottou 和我在 C 中使用 emacs / gcc / make 在我們的 Amiga 1000s 上編寫的(1987 年),我們寫了一個 lisp 解釋器用作交互式前端語言。當我在 1987 年搬到多倫多時,我把這個東西移植到了 Sun OS(BSD Unix)上。直到 2011 年左右,我們一直使用這個系統(tǒng)及其后繼者(稱為 Lush),2011 年之后我們才切換到 Torch7。但在 2010 年,我開始編寫一個名為 EBLearn 的 C ++ 深度學習框架,由 Pierre Sermanet 和 Soumith Chintala 完成并維護。

在我們 1998 年的論文中,MNIST 上的全連接網(wǎng)絡的錯誤率是次優(yōu)的,因為我們使用了最小平方損失(對于標記噪聲往往更加魯棒),而不是交叉熵,利用交叉熵和更大的網(wǎng)絡(>1000 個隱藏單元),錯誤率可以下降到 1.6%左右。

對于不太了解技術(shù)的讀者,大概會產(chǎn)生一種 “神仙聊天” 的感覺,每一個字你都認識,但是你就是看不懂,所以我們貼心地為大家解釋了一個簡約版:

首先,大神卡馬克牛逼在哪兒了呢?看下知乎網(wǎng)友 wsivoky 的總結(jié):

48 歲仍然在學習新技術(shù)、編寫代碼

喜歡受限的開發(fā)環(huán)境(Twitter 上曾說過,受限環(huán)境有益)

vi&emacs 都用 (注意是 bsd vi, 不是 vim,前者是 bill joy 當初開發(fā)的第一版也是第一個 screen editor )

使用 OpenBSD,但喜歡 Windows Visual Studio

用 makefile&gdb

使用 C++,同時也吐槽 C++

不用 Google Search, 完全看 man(Tektronix terminal 是 bill joy 編寫 vi 時代的顯示器,更早時候是靠紙張輸出... )

對 Deep Learning 如此流行持保留態(tài)度

打印了 MNIST 早期論文并嘗試實現(xiàn)

最終忍不住看了 cs231n

使用自己喜歡的開發(fā)方式:先實現(xiàn)后優(yōu)化

實現(xiàn)反向傳播容易出錯

對 CNN 的效果很滿意 (Tensor 操作也是"from-scratch-in-C++"CPU 實現(xiàn)的?)

對 NN 代碼之少卻強大感到興奮(看到純手工擼的 NN 運行結(jié)果之神奇,是很持久的快感)

編寫算法實現(xiàn)對過擬合、正則化、調(diào)參有了更好的理解

再簡約一點兒,大概就是這樣:

卡神:反向傳播和 CNN 這東西之前沒搞過,那既然如此就自己動手試試吧。一個禮拜之后發(fā)現(xiàn):哎呀~ 神經(jīng)網(wǎng)絡這玩意兒還挺有意思,感覺入坑了。(?? ω ??)?

樂村兒:大兄弟你終于入坑了,來來來,我跟你說,用哥這方法你還有上升空間,以后咱們可以經(jīng)常交流經(jīng)驗。(*≧︶≦))( ̄▽ ̄*) ゞ

成為大神,從你做起!

卡馬克的一周編程實踐一出,迅速在國內(nèi)外程序員圈子里引發(fā)騷動。

國外程序員論壇 Reddit 的 MachineLearning 板塊下,卡馬克一周編程實踐的話題受關(guān)注度 364,共收獲 53 則留言

知乎上也很快有網(wǎng)友發(fā)布了相關(guān)問題,截止發(fā)稿時間,已有 685 人關(guān)注,瀏覽次數(shù) 25991

卡馬克 Facebook 下的留言大多是這樣的:

其實大家為之震動的并非卡馬克入坑 AI 這件事本身(當然大神神乎其技的編程水平也確實讓人頂禮膜拜),而是卡馬克作為一位諸多成就加身的老牌程序員兼 Oculus CTO,仍然狂熱地愛著編程這件事本身,并且保持著對一切新鮮事物感到好奇的赤子之心。

當卡馬克對 AI、神經(jīng)網(wǎng)絡、深度學習產(chǎn)生興趣,決定探索一下這些新技術(shù)時,他沒有直接安裝 TensorFlow 或 PyTorch, 而是花了一個星期的時間,通過逐一編寫各個功能模塊代碼,并進行了 MNIST 實驗,從頭開始實現(xiàn) CNN 和反向傳播。他沒有去學習最新的術(shù)語,但卻從中獲得了最有價值的知識。這里不爭論 scratching 到底好還是不好,但手擼新技術(shù)確實是學習的一種好途徑。面對新技術(shù),不糾結(jié)要不要嘗試、不猶豫會不會太難,而是動手干,無怪乎知乎網(wǎng)友將卡馬克稱作 “老程序員的標桿”。

這是一個最好的時代,技術(shù)日新月異,熱點一年一個,對技術(shù)人才的需求越來越大。這是一個最壞的時代,深陷技術(shù)漩渦的程序員們成為了最容易焦慮的群體,今天是 AI 火了我要不要轉(zhuǎn)行,明天是新技術(shù)太多學不動了,后天是 35 歲程序員中年危機了。其實哪里有那么多可焦慮的,有時間焦慮不如多擼幾行代碼?;ヂ?lián)網(wǎng)技術(shù)更新確實快,這要求程序員必須終身學習,但這是選擇了這個職業(yè)的宿命。

卡馬克告訴你:忘記中年危機吧,想想我們應該做些什么,才不辜負這美好的時代!

寫在最后

這里引用知乎網(wǎng)友姚鋼強的回答作為結(jié)語。

讀過《DOOM 啟世錄》 兩遍,John Carmack 說過:

信息時代,客觀障礙已不復存在,所謂障礙都是主觀上的。如果你想動手開發(fā)什么全新的技術(shù),你不需要幾百萬美元的資金,你只需要在冰箱里放滿比薩和可樂,再有一臺便宜的計算機,和為之獻身的決心。我們在地板上睡過,我們從河水中趟過。

他切實做到了,與君共勉。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    28877

    瀏覽量

    266237
  • cnn
    cnn
    +關(guān)注

    關(guān)注

    3

    文章

    349

    瀏覽量

    21965

原文標題:傳奇工程師卡馬克入坑 AI:徒手一周實現(xiàn)反向傳播和 CNN

文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    正是拼的年紀|65歲電子工程師上班VLOG #65歲退休 #電子工程師 #搞笑 #上班vlog

    電子工程師
    安泰小課堂
    發(fā)布于 :2024年07月25日 11:31:02

    神經(jīng)網(wǎng)絡反向傳播算法的優(yōu)缺點有哪些

    神經(jīng)網(wǎng)絡反向傳播算法(Backpropagation Algorithm)是種廣泛應用于深度學習和機器學習領(lǐng)域的優(yōu)化算法,用于訓練多層前饋神經(jīng)網(wǎng)絡。本文將介紹反向
    的頭像 發(fā)表于 07-03 11:24 ?327次閱讀

    神經(jīng)網(wǎng)絡反向傳播算法的原理、數(shù)學推導及實現(xiàn)步驟

    神經(jīng)網(wǎng)絡反向傳播算法(Backpropagation Algorithm)是種用于訓練多層神經(jīng)網(wǎng)絡的算法,其基本原理是通過梯度下降法來最小化損失函數(shù),從而找到網(wǎng)絡的最優(yōu)權(quán)重和偏置。本文將介紹
    的頭像 發(fā)表于 07-03 11:16 ?406次閱讀

    神經(jīng)網(wǎng)絡前向傳播反向傳播區(qū)別

    神經(jīng)網(wǎng)絡是種強大的機器學習模型,廣泛應用于各種領(lǐng)域,如圖像識別、語音識別、自然語言處理等。神經(jīng)網(wǎng)絡的核心是前向傳播反向傳播算法。本文將詳細介紹神經(jīng)網(wǎng)絡的前向
    的頭像 發(fā)表于 07-02 14:18 ?361次閱讀

    嵌入式軟件工程師和硬件工程師的區(qū)別?

    嵌入式軟件工程師和硬件工程師的區(qū)別? 嵌入式軟件工程師 嵌入式軟件工程師是軟件開發(fā)領(lǐng)域中的種專業(yè)工程師
    發(fā)表于 05-16 11:00

    大廠電子工程師常見面試題#電子工程師 #硬件工程師 #電路知識 #面試題

    電子工程師電路
    安泰小課堂
    發(fā)布于 :2024年04月30日 17:33:15

    位硬件工程師的歷練之路:從入門學習理論到... #搞笑 #硬件工程師 #電子工程師 #揚興科技

    硬件工程師揚興科技
    揚興科技
    發(fā)布于 :2024年03月13日 17:50:21

    如何搞崩個硬件工程師心態(tài)?試試對ta說這幾句

    硬件工程師
    揚興科技
    發(fā)布于 :2024年02月20日 18:05:49

    #人工智能 #FPGA 怎么成為個合格的FPGA工程師?

    fpga工程師
    明德?lián)P助教小易老師
    發(fā)布于 :2023年12月18日 21:19:01

    電子工程師天上班就暴揍師傅。。。#科普 #示波器 #電子工程師 #打工日記

    電子工程師示波器
    安泰小課堂
    發(fā)布于 :2023年12月18日 17:36:12

    一周搞定系列之模電數(shù)電

    電子發(fā)燒友網(wǎng)站提供《一周搞定系列之模電數(shù)電.ppt》資料免費下載
    發(fā)表于 11-17 10:01 ?5次下載
    <b class='flag-5'>一周</b>搞定系列之模電數(shù)電

    FPGA工程師需要具備哪些技能?

    的狀態(tài)機以及高級邏輯電路。 FPGA工程師需要熟練掌握HDL語言,并能夠根據(jù)需要靈活使用這些語言。他們需要知道如何將各種邏輯電路和存儲器組合在起,以實現(xiàn)所需的功能。同時,F(xiàn)PGA工程師
    發(fā)表于 11-09 11:03