做爲普通Ruby開發,我如何從零轉型機器學習

1. 不要擔憂

假設你對數學不怎麼感冒,就我我的而言,八年前,我從理工學院畢業以後,就再也沒有碰過數學教科書了(至少在我開始學習深度學習以前是這樣)。你要知道它到底是怎麼回事:你閱讀語言、框架文檔的頻率可比其餘任何東西高多了。node

通過一些初步的 Google 搜索,並與周圍的數學高手交談以後,我獲得一種印象,如下羅列的是你在嘗試用神經網絡解決現實問題以前就須要積累的數學知識。至少,我兩年前的印象是這樣的:  程序員

  • 掌握線性代數。web

  • 熟悉機率論。面試

  • 學習全部經典的機器學習概念,從線性迴歸開始。算法

  • 學習如何使用 Python、C、C++、或 Java 實現全部這些算法。編程

  • 學習如何處理數據集,提取特徵、參數微調以及發展直覺,瞭解哪一種特定算法適合手頭的任務。數組

  • 熟悉深度學習框架 / 庫(我那會兒是 Theano 和 Torch 的天下,如今多是 PyTorch、TensorFlow 和 Keras 大行其道)。服務器

據一些專家說,只有掌握上述提到的全部知識以後,你纔可以解決一些實際的問題,好比區分貓和狗。網絡

若是你的狀況與我相似,上面的清單就足以讓你產生畏難情緒,並致使拖延症發做。app

不過別擔憂!雖然從技術上來講,上述列表中全部的內容都是適用的,但這些並不是入門級要求。若是你知道如何編程,那麼你就已經知道如何訓練模型。

2. 記住,它仍然是代碼

看看這段代碼:

圖片

從這段代碼中,你能獲得什麼信息呢?

  • 這是一段用 Python 編寫的代碼。

  • 它使用了 fastai 深度學習庫。

  • 它只有三行(不包括 import)。

  • resnet34 在這裏彷佛很重要。經搜索以後,咱們知道了緣由:https://www.kaggle.com/pytorch/resnet34/home

這是來自 Jermy Howard 教授的 fast.ai 課程中的一個例子,這門課程很棒,並且免費。Jeremy 倡導的理念是:從預先準備好的抽象概念開始,只有通過一些實踐練習後,才能深刻挖掘。

上面的代碼調整了預訓練的圖像分類模型(在 ImageNet 上訓練,大約 1500 萬張圖像的數據集),這樣它就能夠解決前面提到的 Dogs vs. Cats 任務。它在短短三個輪數以內(經過數據傳遞)就達到了 98% 的準確率。在配備 GPU 的計算機上進行訓練須要 17 秒鐘。這些結果使長久以來未能解決一樣問題的嘗試獲得迎刃而解。

固然,別看只有短短三行代碼,要知道這三行代碼背後凝聚了多年的研究、數十篇學術論文和數千小時的反覆試驗。但這些都是你如今可用的幾行代碼。一旦你掌握了爲你本身的用例對圖片進行分類(並在生產中進行使用)的要點,那麼就跟區分貓和狗沒有什麼區別了。

3. 找一個合做夥伴

我更願意將本身視爲一個勤勞的人,一個善於學習的人。做爲一名初出茅廬的程序員,我是從微軟產品開始接觸 C# 和.NET 的。不久以後,我就發現了 Ruby 的美和表現力,並轉投到 Rails 中,最終成爲了一名優秀的 Ruby 程序員,並經過 Evil Martians 爲初級開發人員而設的面試挑戰。我在一家之內部項目起家的初創公司很快升任爲 CTO。同時,我還開發了一些 Ruby gems(gon 在 Rails 社區中很是受歡迎),在會議上發言,在最佳實踐方面爲開發人員提供一些指導,當你是 Evil Martians 團隊的一員時,一切照舊。固然,我也相信改變觀點的好處。在使用 Ruby 全職工做期間,我還涉足了 C++、Haskell。JavaScript 以及有些晦澀難懂的 Eve。

在個人業餘時間裏,我喜歡彈低音大提琴和吉他,還喜歡畫油畫、衝浪。

儘管如此,拖延症對我來講也不是什麼新鮮事:在我工做效率很低的時候,我常常追劇,把時間浪費在 MMORPG(Massive Multiplayer Online Role Playing Games,大型多人在線角色扮演遊戲)以及奇幻小說上,畢竟我是個書呆子。

當我準備涉足機器學習,尤爲是深度學習時,我和我朋友那會兒正是《風暴英雄》(Heroes of the Storm)多人在線競技遊戲的玩家。

爲了讓本身在通往新知識的漫長道路上邁出第一步,我必須與一樣夢想着人工智能的朋友達成協議。咱們決定一塊兒治癒拖延症,參加相同的課程,互相督促學習。如今咱們常常一塊兒參加比賽。

若是你的線下朋友都不肯意和你一塊兒學習,那麼互聯網就是你的朋友:網上有不少地方,你能夠找到其餘初學者一塊兒學習。

AI 前線注:網上有不少這樣的地方,如 http://u6.gg/eH96j、http://u6.gg/eH96U、http://u6.gg/eH97m 等,都是值得一去的地方。

4. 避免認知超載

衆所周知,學習太難的東西是一種使人沮喪的經歷。做爲人類,咱們有信心避免沮喪。與此同時,學習太容易的東西也不會讓你滿意:你很快就會失去任何動力。關鍵是要儘量的咬牙堅持下去。

我參加的第一個在線課程是 Udacity 的 Deep Learning Nanodegree(深度學習納米學位):這是一個昂貴的計劃(如今 999 美圓,我當時花了大約 400 美圓),承諾爲期四個月的理論入門以及將所學知識應用於現實世界所需的實踐。做爲獎勵,修完這門課程後,參加 Self-Driving Cars Nanodegree(無人自駕車納米學位)的在線課程能夠享受折扣。

AI 前線注:納米學位(Nanodegree)是美國出現的新型學位憑證,這一類憑證專爲企業定製並輸送專門人才,能實現定製型人才的快速就業,它具備針對性強、技術難度不高、就業快捷、市場需求量大等特色。Deep Learning Nanodegree 見 http://u6.gg/eH9Cd。Self-Driving Cars Nanodegree 見 http://u6.gg/eH9EB。

我錯在深陷其中,不能自拔。首先,沒有覆蓋到個人基礎。當我對課程中提到的一些概念感到吃力時,我就惶恐不安,開始閱讀網上所能找到的一些:文章、書籍和其餘課程。

結果,我沒法專一於本應給我打下基礎的資料。過後看來,我強烈建議你堅持學習一門課程,而不是同時學習多門課程。畢竟,人類在多任務處理方面的能力是出了名的差。

若是我如今開始的話,我會先看看 Jeremy Howard 的 fast.ai,前面我已經提過,還有 Andrew Ng 最新的 Coursera(有個證書費用,但你可免費得到)。它包含五門課程:從神經網絡概述、深度學習、經過發現卷積神經網絡(對處理圖像數據相當重要),到序列模型(語音識別、音樂合成、任什麼時候間序列數據)。

第二門課程更側重於理論,而第一門課程強調的是「快速而隨性」的實現,我認爲這是最好的入門方法。只要記住調整本身的步調,避開同時處理多任務,並採起一些較小的步驟。

5. 設定目標

不要試圖一次學完全部的東西,要試着選擇那些使用深度學習技術可以給你我的帶來滿意結果的領域。處理與你相關的事情(而非處理隨機抽象數據點),會讓你保持積極性。你須要一個反饋循環,一種從實驗中得到實際結果的方法。

如下是啓動項目的一些想法:  

  • 若是你熱衷視覺藝術(如電影、攝影、視頻、美術等),那就去鑽研計算機視覺吧。神經網絡用來對圖像上的對象進行分類,突出顯示感興趣的區域(如核磁共振掃描的異常或道路上的行人),檢測肖像的情感或年齡,藝術風格遷移,甚至生產原創藝術品(http://u6.gg/eHAa6)。  

  • 若是你對聲音更感興趣,你能夠像 Spotify 那樣(http://u6.gg/eHBaa、http://u6.gg/eHBab),用神經網絡進行譜曲(http://u6.gg/eHAXs)、分類和推薦新曲目。或者,你能夠探索語音風格的轉換,並加裝用別人的聲音說話(http://u6.gg/eHBbp)。  

  • 若是你喜歡電子遊戲,你必定要看看強化學習。你能夠訓練一個遊戲智能體,在你最喜歡的遊戲中超越你本身的表現。並且,你能夠用智能體進行電子遊戲,沒有人會所以責怪你,由於你懂得,以研究的名義。  

  • 若是你熱衷於用戶體驗和客戶支持,請參閱天然語言處理和聊天機器人,這樣你就能夠在必定程度上自動化地與客戶進行交流:從聊天內容揣測客戶的意圖,對支持票證進行分類,爲大多數常見問題提供即時答案。

在嘗試計算機視覺領域以後,我和朋友將注意力轉向了自動語音識別(Automatic Speech Recognition,ACR)和天然語言處理。看看行業巨頭(Google、Apple 等)支持的無人駕駛汽車項目,就知道計算機視覺如今多是資金最多的研究領域,也是深度學習技術鞏固地位的領域:在圖像分類這塊,神經網絡預測的準確率從 2010 年低於 75% 增加到 2018 年的 98%。

另外一方面,與語言相關的挑戰(尤爲是那些與書面語言有關的挑戰),最近纔開始從神經網絡中受益。目前最熱門的領域是機器翻譯(Machine Translation,MT)。人們可能會注意到,Google 翻譯的質量在過去幾年來有了很大的提升。自 2015 年以來,深度學習在其中起到了重要的做用(詳見 http://u6.gg/eHBdX、http://u6.gg/eHBdY)。

注:形成這種延遲的主要緣由是硬件限制:機器翻譯任務須要大量的內存和處理能力來訓練大型神經網絡。

要想知道深度學習改變一個幾十年來未見重大進展的研究領域的速度有多快,看看下面一個有趣的事實就知道了:

機器翻譯競賽中首次出現神經網絡的影子,僅僅就在三年前的 2015 年。到了 2016 年,機器翻譯競賽中 90% 的競爭者都是基於神經網絡。

從關於這個主題的學術論文中能夠提取大量的知識,並應用到現實世界的任務中,特別是若是你的初創公司與文本(和 Amplifr)相關的話。

若是這些可以說服你本身嘗試將深度學習應用到天然語言處理,那麼請看看 Stanford 的 CS224n 課程:「Natural Language Processing with Deep Learning」(用深度學習進行天然語言處理)(https://web.stanford.edu/class/cs224n/)。你沒必要非得是斯坦福大學的學生才能學習這門課程,全部的講課視頻均可以在 YouTube 上找到。若是你在小組討論中取得最佳進展,那麼就可使用社交新聞網站 Reddit 專爲該課程開設的整個子版塊(https://www.reddit.com/r/CS224n/),在這裏你能夠找到同窗這門課程的在線學習夥伴。

6. 競爭力

機器學習領域本質上是充滿了競爭的。全球最大的數據科學家和機器學習從業者的社區 Kaggle,早在 2010 年就將***馬拉松的精神引入了這一學術領域。從那時起,解決機器學習任務的競爭方式就成爲了標準作法。從 Microsoft 到 CERN(歐洲核子研究組織)的公司和機構都爲解決挑戰提供了獎勵,以換取免版稅的許可,讓他們可使用獲獎做品背後的技術。

機器學習競賽是評估你技能的最佳方式,可以讓你在某個領域得到「基準線」的感受,從更高級的競爭對手那裏得到靈感,找到同事合做,並且還能讓你在機器學習領域中名揚天下。

參加競賽是機器學習業餘從業者的必經之路。對我和朋友來講,認識到這一點是在 2017 年,也就是咱們開始自學的那一年。咱們在 Kaggle 選擇了 Understanding the Amazon from Space(在太空中瞭解亞馬遜)競賽項目(http://u6.gg/eHBjM),由於這是咱們進行多分類圖像分類的機會(咱們也關心環境)。兩個多月以來的每一個週末,咱們都在解決這個任務:從衛星圖像中檢測森林砍伐狀況,並區分其緣由。

另外一個跡象代表,全部與深度學習相關的事情都在迅速發展:一年前,咱們花了大量的時間和精力設法讓 Google Cloud Platform 以更低的成原本運行咱們的實驗。到了今天,Google 提供了一個免費的 GPU 支持的 Jupyter notebook 環境(http://u6.gg/eHBmT),而且有不少服務能夠用來訓練你的模型(https://www.paperspace.com/、https://www.floydhub.com/)。

咱們雖然沒有拿到獎品,但咱們在排行榜上位列前 15%(這沒有什麼可吹噓的),在書中列舉了每一個初學者會犯下的錯誤,這些經驗都是無價的:咱們得到了繼續努力的信心,並選擇下一場競賽,此次是天然語言處理的領域。

開發問答系統的挑戰是由一家俄羅斯主要銀行主辦(http://u6.gg/eHBqW),競爭者必須使用一個由著名的 SQUAD 精神建立的獨特數據集(斯坦福大學的閱讀理解數據集,由志願者基於維基百科文章集建立的 15 萬個問題組成)(http://u6.gg/eHBrG),但這一次是俄文版的。

注:俄語是一種形態豐富的語言,在天然語言處理研究中被認爲資源不足,更多詳情請參閱此論文:http://worldcomp-proceedings.com/proc/p2015/ICA7022.pdf

這個任務是訓練一個系統,回答基於一段文字的問題。這個模型能夠在 Docker 容器中提交(RAM 被限制爲 8GB),它應該可以在一個以天然語言提問的問題中突出顯示文本段落中的相關部分。由於在最具挑戰性的比賽中,常常會出現這種狀況,所以咱們不得不提交未經訓練的模型,而是一個解決方案,必須在兩個小時的機器時間內徹底訓練並給出測試問題的答案(爲確保公平競爭,測試數據集僅部分公開)。

咱們的解決方案在公共排行榜上位列亞軍,但咱們太過專一於解決任務,忘記正確閱讀競賽規則:他們說團隊合做是禁止的,只接受我的參賽項目。咱們不得不全盤招供,並得到了「安慰獎」銅獎(這一獎項有點像戛納電影節的獎項,當電影做爲「非競賽片」展映時)。

咱們很幸運地避免了被取消比賽資格的厄運,但咱們汲取了教訓。如今,我強烈建議你們參賽時不要衝動,必定要花點時間仔細閱讀競賽規則。

因爲我對深度學習的興趣主要是以生產爲導向的(提出解決方案,能夠應用於個人創業公司的實際需求),我還注意到,查看排行榜可讓你很好地瞭解「接近生產」的程度。頂級的解決方案一般是學術性的,還沒有作好準備進行商業部署。而銀獎、銅獎以及後面的一些解決方案一般是最有但願的應用。

7. 隨時瞭解動態

深度學習領域不斷髮展的步伐有兩面性:有好處也有壞處。甚至這篇文章(做爲介紹性質的、我的的和非學術性的)在發表以前可能在某些方面就已通過時了。

保持最新狀態的最佳方式,就是加入到擁有大量機器學習愛好者的大型在線論壇。若是你瞭解俄語,那麼必定要加入 Open Data Science(開發數據科學社區,http://ods.ai/):擁有超過 12000 名用戶和 140 多個公共頻道的公共 Slack 服務器。經過 Reddit 的 r/MachineLearning 子版塊或 Meetup.com,總能找到更小的、更多的本地羣組。

創建一個 Twitter 訂閱源(http://u6.gg/eHCAU)和郵件訂閱(http://u6.gg/eHCB7)對於隨時瞭解動態也是相當重要的。你還能夠把時間投入到世界各地舉辦的各類線下新兵訓練營中。

曾經我覺得西班牙的夏令營就是衝浪的,直到我參觀了 Bilbao 的 International Summer School on Deep Learning(深度學習國際暑期學校,http://grammars.grlmc.com/DeepLearn2017/)以後方知並不是如此。這是一個草率的決定,但我並不後悔:它徹底適合個人水平(我當時加入這個領域有一年了)。在缺少實踐的狀況下,這所學校更像是一個會議,雖然是一個很是緊張的會議:天天上午九點到下午六點,連續五天。整個會程安排被分紅了幾個部分,每一個演講者都要進行三場爲期一個半小時的演講。

一旦你感到更有自信的話,那就試着參加關於人工智能、機器學習和深度學習的主要會議之一:ICLR(https://iclr.cc/),今年我就有幸參會。其餘值得關注的國際會議是 VCPR(特別是計算機視覺)(http://cvpr2018.thecvf.com/)和 NIPS(https://nips.cc/)。

8. 使用你的編程技能

咱們必須認可一個顯而易見的事實:Python 徹底贏得了人工智能和數據科學社區的支持。在今天,可能沒有理由從一種不一樣的語言開始,除非你真的很擅長這門語言,或者你計劃處理一些很是低級的優化。

對我來講,做爲一名 Ruby 開發人員,切換到 Python 真的是一種簡單、愉快的體驗。你只需幾個禮拜的練習(以及學習數組索引技巧和理解(http://u6.gg/eHCEP))就可讓本身感受舒服一些。可是,我仍是花了一些時間來完成一個免費的中級 Python 編程課程,固然,上這種課沒有什麼壞處。

對於軟件工程師來講,語言「障礙」並非什麼問題。但對於非編程背景的愛好者來講,進入深度學習領域很難。所以,你已經領先一步了。

可是,你不要期望一些優秀的 OOP 代碼和直觀的 API。大多數公共代碼示例在個人團隊中也不能經過嚴格的代碼審查。這與軟件工程無關,畢竟,這是關於數學的:矩陣乘法須要先把矩陣相乘,乾淨的領域特定語言(Ryby 讓你習慣優秀的 DSL)老是過後纔會考慮的事情。

AI 前線注:領域特定語言(domain-specific language,DSL),指的是專一於某個應用程序領域的計算機語言。又譯做領域專用語言。詳見 https://en.wikipedia.org/wiki/Domain-specific_language

即便在同一個庫中,相同的功能也能夠有不一樣的 API。使用 np.ones((2,3))(取一個元組)來建立一個 1 的數據(http://u6.gg/eHCFf)彷佛使人困惑,同時使用兩個單獨的證書參數建立相同形狀的隨機數的數組(http://u6.gg/eHCFM):np.random.randn(2,3)。

另外,不要對文檔或風格抱有過高的指望。一旦你在將學術論文翻譯成代碼時遇到了一些重要的細節,你將不得不閱讀庫的源代碼,並且這並不容易。測試覆蓋率也常常不足。

然而!這是一個很好的利用你最佳編程實踐的機會:你能夠自由地使用公開的 Jupyter notebook 製做優秀的可重用庫(http://u6.gg/eHCGJ)。

9. 最後,複習一下你的數學

固然,我把最好的心得經驗留在最後。最終,你將不得不縮小你的數學差距。特別是若是你在瞭解了本身的基礎知識以後,願意站在前沿並關注學術出版物的話。

幸運的是,機器學習也有它本身的「聖經」,由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 所著的一本長達 800 頁的大塊頭教科書《Deep Learning (Adaptive Computation and Machine Learning)》(深度學習)。好消息是,這本書能夠在網上免費下載!下載網址爲:http://www.deeplearningbook.org/

該書的第一部分(線性代數、機率論和信息論,數值計算,機器學習基礎知識)是最基本、最簡單的部分,屬於介紹性質的。使人驚訝的是,當你繼續跟進當前的研究時,它已經不那麼使人生畏了。是的,這是長達 130 頁的閱讀,雖然談不上清閒,但你絕對不會後悔閱讀這部分的內容。

我但願讀者們可以從這篇文章中,感覺到我對深度學習的熱情,讓這一領域對我這樣來自應用編程的人來講顯得平易近人。我真的相信,隨着人工智能和深度學習的進展,這個世界正在接近另外一個「電燈泡時刻」,是的,我指的就是愛迪生髮明的那盞燈泡。

像你我這樣的「充滿好奇心的軟件開發者」,將是這場已經開始的革命背後的主要推進力。也許,你並不徹底處於科學的前言(不然你可能不會讀到這篇文章),但你有能力實現學術界的最佳創意,那麼,每次一個應用,就是咱們改變世界的方式。

因此你繼續前進吧!你可閱讀文章中以及文末我列出的一些資源,創建你的信心,讓咱們開始踏上人工智能征途吧!