我們該如何學習機器學習中的數學

機器之心發表於2018-08-04

數學在機器學習中非常重要,不論是在演算法上理解模型程式碼,還是在工程上構建系統,數學都必不可少。通常離開學校後很難有機會靜下心學習數學知識,因此我們最好能通過閱讀小組或讀書會等形式營造環境,並專注學習那些在實踐中常常需要用到的數學知識。

數學達到什麼水平才可以開始機器學習?人們並不清楚,尤其是那些在校期間沒有研究過數學或統計學的人。

本文的寫作目的是介紹構建機器學習產品或進行相關學術研究所必需的數學背景,以及數學在工程和研究中的重要性。這些建議是根據我和機器學習工程師、研究者和教育者交流而得到的,當然也有我自己在機器學習研究和業界工作中的個人經驗。

為了構建必備的數學背景,我首先提出不同的思維模式和策略,幫助大家在學校之外也可以接受數學教育。然後,我會給出不同種類機器學習工作所需的數學背景,從高中水平的統計學和微積分到概率圖模型(PGM)的最新進展。希望大家讀完本文後,能夠對自己在機器學習工作中所需要的數學教育有清楚的認知。

關於數學焦慮

很多人害怕數學,包括工程師。首先,我想解決「擅長數學」這一迷思。

一般精通數學的人有大量和數學有關的實踐經驗。因此,他們在研究數學時更容易保持專注。相比內在能力,學生的思維模式才是決定一個人學習數學能力的關鍵。

不過要想達到這種狀態需要付出大量時間和努力,但是這並不會讓你感到無聊。下文將幫助大家確定你所需要的數學水平,以及學習策略。

機器學習中的數學

作為軟體工程的開發者,我們一般有基礎的線性代數與矩陣微分學知識,也有一些概率論和程式設計的基礎。因此以它們為基礎,我們只需要根據不同的方向與領域調整知識結構就行。

那麼我們該如何在校外學習數學呢?我相信學習數學最好的方法是將其作為一份全職工作,也就是學生。因為離開了學校,我們很難進行結構化的學習,也很難有正向的同齡壓力和眾多的學習資源。但是在校外學習中,我比較推薦成立學習小組或研討會,它們同樣能提供類似學校的學習環境。

在研究實驗室中,這種課外學習可能是以閱讀小組的形式進行。我們可以討論課本中難以理解的地方,也可以討論自己對它們的見解。而學習的環境是支援長期數學學習的動力,因此建立這種環境並意識到數學在工程與研究中的重要性非常關鍵。

數學與程式碼

數學和程式碼在機器學習工作流程中高度交織在一起。程式碼通常可以根據數學直觀地構建,它甚至會共享數學符號與句法。實際上,NumPy 等現代資料科學框架令數學運算很容易轉化為直觀的程式碼。我們可以將程式碼作為鞏固學習的方式,且數學和程式碼都依賴於對概念的精確理解與符號表示。例如,手動用 NumPy 實現損失函式或最優化演算法是理解它們概念非常好的方式。

作為通過程式碼學習數學的案例,我們可以考慮一個實際的案例,即為神經網路實現反向傳播和 ReLU 啟用函式。作為入門級概念,反向傳播是一種依賴於微積分鏈式求導法則的技術,它能高效計算梯度。為了在神經網路中利用鏈式求導法則,我們可以使用 ReLU 啟用函式的梯度乘以上游導數。

為了完成反向傳播的案例,首先我們可以視覺化 ReLU 啟用函式

我們該如何學習機器學習中的數學

為了計算 ReLU 的梯度或斜率,我們可以將其視覺化為分段函式,其中自變數小於零的地方斜率為 0,自變數大於零的地方斜率恆等於 1。

我們該如何學習機器學習中的數學

NumPy 可以幫助我們構建 ReLU 函式,使用 maximum 函式可以只輸出該函式中所有引數中相對較大的值。如下所示 x 為輸入,relu 為輸出:

relu = np.maximum(x, 0)

ReLU 啟用函式的梯度值可以表示為以下,其中 grad 表示為上游梯度:

grad[x < 0] = 0

如果沒有首先手動推匯出梯度,上述程式碼可能並不是那麼容易理解。在我們的程式碼中,其將所有滿足條件 [x < 0] 的元素梯度 grad 都設定為零,也就是說上游梯度只有在 x>0 的情況下才能繼續向前傳播。在數學上,這等價於 ReLU 啟用函式梯度的分段線性表徵,它將所有小於 0 的值壓縮為 0,並乘上上游梯度。

如上所示,若對於微積分有一定的理解,那麼我們可以清晰地理解這兩行基本程式碼。因為機器學習中很多程式碼都在描述數學運算,因此瞭解數學原理對於理解機器學習模型過程非常重要。

構建機器學習產品中的數學

為了完成這一章節,我曾與機器學習工程師探討到底哪些數學對於除錯他們的系統最重要。以下一些問題與回答是工程師站在數學的角度下的看法。


  • 我們可以使用什麼樣的降維演算法視覺化高維使用者資料?

  • 方法:主成分分析與 t 分佈隨機近鄰嵌入


  • 我們該怎樣校準閾值(例如置信度選擇 0.9 或 0.8)以阻止一些欺騙性的使用者資料?

  • 方法:概率校準


  • 將衛星資料偏向矽谷或阿拉斯加等世界某塊具體地區的最好方法是什麼?

  • 方法:開放性問題,也許可以是人口統計學方法


一般而言,統計學和線性代數能以某些方式應用於這些問題。然而,為了獲得令人滿意的回答,我們通常需要特定領域的方法。如果是這樣的話,我們該如何選擇一些我們需要學習的數學內容?

定義你的系統

目前有非常多的資源可以幫助我們跨越寫程式碼而直接呼叫函式構建機器學習系統,例如資料分析中常用的 scikit-learn 和深度學習中常用的 keras。所以你們可以嘗試回答以下關於搭建機器學習流程的問題:

  1. 機器學習系統中輸入和輸出都是什麼?

  2. 我們該如何準備合適的資料以擬合系統?

  3. 如何構建特徵或資料以幫助模型提高泛化效能?

  4. 如何為我們的任務定義合適的目標函式

你可能會比較驚訝,定義機器學習系統可能會比較困難,但搭建的流程並不複雜。換而言之,構建機器學習產品要求非常多的工程工作,但並不要求有非常深厚的數學背景。

資源:谷歌機器學習應用的四十三條經驗法則(附 PDF)

學習必要的數學

如果一頭鑽進機器學習工作流,你可能會發現在除錯機器學習系統時會遇到一些困難。當遇到困難時你知道需要查詢什麼嗎?你的權重是不是合理?為什麼模型使用一些損失函式不能收斂?用什麼樣的度量方法衡量模型效能才是合理的?在這個時候,對資料分佈做出假設、約束最優化方法或採用不同的演算法都是非常有幫助的。

通常,你可能會發現在建模和除錯過程背後有直觀的數學原理,例如選擇損失函式或評估度量,這些數學原理都會幫助我們實現更優的工程決策。

因此,根據實際工程中遇到的數學,再進一步學習這些數學才是更好的方法。

機器學習研究中的數學

這裡,我想要描述下對機器學習研究有幫助的數學心態。對機器學習研究比較嘲諷的觀點認為,它是一種即插即用的系統,把大量計算層級堆疊在一起而獲得好的表現。在一些圈子裡,研究人員依然質疑經驗性的方法缺乏嚴謹的數學推導(例如,一些深度學習方法),無法為我們帶來廣義上的智慧。

它擔憂研究界可能是建立在已有的系統與假設上,並未擴充套件我們對機器學習領域的基礎理解。研究員們需要貢獻新的、基礎的研究模組,從而用於啟發全新的洞見與研究方法。例如像深度學習先驅 Geoff Hinton 提出 Capsule 網路一樣,它重新考慮影像分類中常用的 CNN 基礎。

為了機器學習的下一步躍遷,我們需要提出基礎問題。這需要對數學的熟練掌握,就像深度學習書籍的作者 Michael Nielsen 描述的「有趣的多探索」。這個過程可能經歷數千小時的思考、提問、推翻問題尋求新的視角。「有趣的探索」能讓科學家提出深度、有洞見的問題,超越簡單的想法和架構。

要清楚,在機器學習研究中,不可能什麼都學。為了正確地「有趣探索」,需要你遵照自己的興趣,而不是一直計較最熱的新研究。

機器學習是一個異常豐富的研究領域,有大量未解決的問題:公正、可解釋性、易用性。如同所有的學科一樣,基本思想不是請求式的過程,需要耐心地用高階數學框架思考重大難題的解決方案。

民主化機器學習研究

我希望我沒有把「研究數學」描述得過於難懂,因為使用數學的思路應該以直觀的方式表現。悲哀的是,許多機器學習論文仍然充滿大量複雜的、前後矛盾的術語,關鍵直覺難以理解。作為學生,你可以為自己、為這個領域做個偉大貢獻:通過部落格、推特等方式把這些密集的論文轉寫為可消化的直覺知識塊。以 distill.pub 為例,它就專注於提供對機器學習研究的清晰解釋。換言之,把技術思路的解釋作為學習探索的方式,有趣而又有幫助。

總結

希望本文能夠幫助大家針對機器學習提高數學水平。

  • 不同的問題要求不同的數學水平,我鼓勵大家首先理清自己的目標。

  • 如果你希望構建產品,那麼尋求同伴和研究小組,通過向最終目標的前進而激勵自己學習。

  • 在學界研究中,廣泛的數學基礎可以幫助貢獻新的基礎構造塊,進而推動領域發展。

  • 通常,數學(尤其是研究論文形式的數學)令人望而生畏,但是「沉醉其中」是學習過程的一大部分。

參考連結:https://blog.ycombinator.com/learning-math-for-machine-learning/

相關文章