Categories
程式開發

論機器學習的正確學習姿勢


很多開發人員並沒有機器學習的背景,在機器學習如火如荼的今天,沒學過機器學習的開發人員要怎樣才能學會機器學習呢? Caleb Kaiser 為我們帶來了他的學習建議。

本文最初發表在 Towards Data Science,經原作者 Caleb Kaiser 授權,InfoQ 中文站翻譯並分享。

如果你是一名開發人員,你可能至少對機器學習有一時的興趣。若能夠靠著自學就掌握預測的算法概念,真的有點酷。

然而,如果你真的下定決定去學習機器學習,並遵循典型的入門建議開始學習的話,那麼,在放棄學習機器學習之前,你很可能需要花上兩個星期來學習線性代數和多元微積分。

原因在於,大多數機器學習的入門資料並不是為開發人員編寫的,而是面向機器學習研究人員,這對於那些只是想用機器學習來開發產品的開發人員來說,是個問題。

你是想做產品,還是想做研究?

在 2000 年代後期之前,機器學習或多或少只是一個研究問題而已。當時,並沒有多少公司在生產中以有意義的方式來使用機器學習。

因此,許多機器學習的入門資料都是從這個研究角度來編寫的。這些入門資料都首先從數學的角度解釋神經網絡,解釋機器學習背後的所有理論,比如反向轉播和對抗網絡。

甚至連非大學的附屬資料在某種程度上也遵循了這種模式。例如,下面是直接摘自 TensorFlow 的《初學者快速入門》(Quickstart for Beginners)的一段:

undefined

losses.SparseCategoricalCrossentropy 損失採用 logits 的向量和 True 索引,並為每個示例返回一個標量損失。

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

該損失等於真實類的負對數概率:如果模型確定了正確類別,則為零。

這個未經訓練的模型給出了接近隨機的概率(每個類的概率為 1/10),因此初始損失應該接近 -tf.log(1/10) ~= 2.3

loss_fn(y_train[:1], predictions).numpy()

如果你覺得我在用詰屈聱牙的語言,那請你閱讀整篇文章看看。

如果你已經熟悉機器學習背後的數學知識,或者對學習機器學習很感興奮,那麼這種方法對你來說是可行的。但是,如果你主要是想用機器學習來開發某種東西的話,那麼,這就可能並不是你想要的學習方法了。

想要用推論的方法來學習編程?這種方法就像是通過首先學習彙編語言來學習編寫代碼。實際上,沒有哪一個開發人員是這樣學習的。

注意:如果你以某種方式學會了使用彙編語言編寫代碼,我會接受你憤怒的評論,並且令我印象深刻的是,你能夠在任何晦澀的 Linux 發行版上安裝瀏覽器。

當你學習編程時,你很可能是通過使用高級語言編寫 “hello world” 來學習的。然後,隨著一點一點地向項目引入複雜性,你可以根據需要去學習越來越多的底層編程。

這種學習模式在開發軟件的人中很成功,因為它優先考慮的是開發內容,如果你對開發推薦引擎比發表論文更感興趣的話,那麼這就是你應該如何學習機器學習的方法。

如何通過開發軟件來學習機器學習

如果你是那種通過學習課程學習效果最好的人,那麼最好的資源,或許也是這種自上而下,邊做邊學的機器學習方法最積極的倡導者,就是 Fast.ai 的《程序員實用深度學習課程》(Practical Deep Learning For Coders)。

或者,如果你是那種通過自己鑽研並自己動手來學習效果最好的那類人,那麼開始學習機器學習和學習其他編程領域是一樣的。我整理了一份龐大的項目列表,這些項目都是對初學者友好的自然語言處理項目,你可以看看,選擇一個你感興趣的項目,然後加入進來。

如果你正是這樣學習的,那麼熟悉使用機器學習開發的好方法是:

  1. 確定一個目標,比如,開發一個文本自動完成器,或者一個車牌識別器。
  2. 找到適合你的項目的預訓練模型,如 GPT-2 或 YOLOv3,這兩個分別適用於上面提到的兩個項目。
  3. 如果你喜歡的話,甚至還可以使用 gpt-2-simple 之類的庫來微調(根據你自己的數據定制)你的模型。
  4. 最後,將模型部署為微服務。

一旦你將模型部署為 API,就可以像查詢任何其他 Web 服務一樣對其進行查詢,並圍繞它開發應用程序。

通過這種方法,你可以了解各種流行的模型架構和機器學習方法,以及它們適用於哪些應用程序。同樣重要的是,你將會了解機器學習基礎設施,這對於從模型中開發真正的產品至關重要。

開發與理論學習並重

如果你是一名工程師,你以前可能實現過某種形式的身份驗證,這意味著你(希望如此)對密碼進行了哈希處理。

在設置密碼哈希時,你是否編寫了自定義的哈希算法?你花了幾個禮拜的時間去學習密碼學?還是你只不過是使用了 bcrypt 而已?

類似的,當你開發你的第一個 Web 應用程序時,你是否花了幾個星期的時間來學習數據庫?你是自己從零開始編寫程序的嗎?還是使用了你最喜歡的框架附帶的任何 ORM?

同樣的邏輯也適用於機器學習。如果你是那種喜歡開發軟件的人,那麼可以從使用機器學習開發軟件開始,讓工具、預訓練模型和機器學習框架抽像出機器學習的基本理論。然後,如果你很好奇,或者你的項目需要更多的複雜性,就深入研究,看看機器學習是如何工作的。

免責聲明: 以下內容是基於我對機器學習團隊的觀察,而不是對該行業的學術調查。利益相關:我是 Cortex 的貢獻者,Cortex 是一個用於在生產環境中部署模型的開源平台。

作者介紹:

Caleb Kaiser,Cortex Lab 創始團隊成員,曾在 AngelList 工作,最初在 Cadillac 供職。

原文鏈接:

https://towardsdatascience.com/dont-learn-machine-learning-8af3cf946214