教你6步從頭寫機器學習演算法——以感知機演算法為例

景略集智發表於2018-11-16

自己從頭寫一個演算法,不僅能給你帶來成就感,也能幫你真正理解演算法的原理。可能你之前用 Scikit-learn 實現過演算法,但是從零開始寫個演算法簡單嗎?絕對不簡單。


有些演算法要比其它演算法複雜的多,所以在寫演算法時可以先從簡單的開始,比如單層的感知機。


下面就介紹機器學家 John Sullivan 總結出的 6 個步驟,以感知機演算法為例,教你從頭開始寫出一個機器學習演算法。文中的方法論同樣能應用到其它機器學習演算法上。這 6 個步驟是:

  • 對演算法有個基本的瞭解
  • 尋找實用的學習資源
  • 把演算法拆成幾個部分
  • 以一個簡單的例子開始
  • 使用可靠的實現進行驗證
  • 整理出寫演算法的過程


對演算法有個基本的瞭解


如果你不瞭解演算法的基本知識,先不要嘗試從頭寫演算法。至少。你應該能回答以下問題:


  • 演算法的含義?
  • 它通常用來幹嗎?
  • 什麼時候不能用它?


以感知機為例,我們試著回答這些問題:

單層感知機是最簡單的神經網路,通常用於二元分類問題(1或0,“是”或“否”)。

它相當於一個二元分類器,所以只有出現線性決策邊界時才會用到它。還有些簡單的用途,比如情感分析(正面或負面迴應)或貸款違約預測(會違約,不會違約)。在這兩類用途中,決策邊界都需要是線性的。


如果決策邊界是非線性的,那麼就不能使用感知機。對於這類問題,需要使用其它演算法。


教你6步從頭寫機器學習演算法——以感知機演算法為例


尋找一些學習資源


在對演算法有個基本的理解後,就可以開始做點研究了。建議多用一些不同的資源,有些人看書學得快,有些是看視訊學得快。學習感知機知識,這裡有一些不錯的資源:


  • 書本:

《統計學習精要》:

web.stanford.edu/~hastie/Pap…


《Understanding Machine Learning: From Theory To Algorithms》:

www.cs.huji.ac.il/~shais/Unde…


  • 部落格:

John Brownslee 寫的這篇《用 Python 從頭實現感知機演算法》:

machinelearningmastery.com/implement-p…


Sebastian Raschka 的部落格《單層神經網路與梯度下降》:

sebastianraschka.com/Articles/20…


  • 視訊:

感知機演算法訓練:

www.youtube.com/watch?v=5g0…


感知機演算法工作原理:

www.youtube.com/watch?v=1Xk…


把演算法拆成幾部分

等收集好資源後,就開始學習了。首先準備好紙筆,我們不是通讀整個章節或整篇部落格,而是略讀章節標題和其它一些重要資訊。寫下內容要點,試著概述演算法。


在看完學習資料後,我們將感知機演算法拆成以下幾個部分:


  • 初始化權重
  • 將權重和輸入相乘,並求和
  • 將結果和闕值進行比較,以計算輸出(1或0)
  • 更新權重
  • 重複


像這樣將演算法拆成幾個部分,學起來會更容易。基本上我們先以虛擬碼概述演算法,再回頭填補細節。下圖是第二步時John Sullivan所做的筆記,即權重和輸入的點積:


教你6步從頭寫機器學習演算法——以感知機演算法為例


以一個簡單的例子開始


整理好演算法的筆記後,開始用程式碼實現。在深入研究一個複雜的問題之前,建議先從一個簡單的例子開始。對於感知機來說,與非門(NAND gate)是一個完美的簡單資料集。如果兩個輸入都為真(1)則輸出為假(0),否則輸出為真。以下是資料集的示例:


教你6步從頭寫機器學習演算法——以感知機演算法為例


現在使用一個簡單的資料集,開始實現我們在步驟 3 中概述的演算法。最好以塊的方式寫演算法,並進行測試,不要試圖一次性寫完。這樣你在剛開始時更容易除錯。當然最後可以回去整理一下,使程式碼看起來更整潔一些。


下面是在第 3 步中演算法的點積部分的 Python 程式碼:


教你6步從頭寫機器學習演算法——以感知機演算法為例


使用可靠的實現進行驗證


等寫完程式碼並用小資料集測試以後,接下來嘗試較大的資料集。為了確保程式碼能在更復雜的資料集上正確執行,最好用可靠的實現進行測試。對於感知機來說,我們可以用 Scikit-learn 中的實現。


教你6步從頭寫機器學習演算法——以感知機演算法為例


測試程式碼時需要檢視權重。如果正確地實現了演算法,權重應該與 scikit-learn 感知機的權重相匹配。


教你6步從頭寫機器學習演算法——以感知機演算法為例


如果最開始沒有得到相同的權重,那麼就需要調整 scikit-learn 感知機中的預設設定。如果每次都實現一個新的隨機狀態,只是一個固定的種子,那麼就必須關閉它。在 Jason Sullivan 自己的實踐操作中,為了匹配學習率,他將 eta0 改為 0.1。最後,他關閉了 fit_intercept 選項,在特徵資料集中包含了一個 1 的虛擬列,所以已經自動擬合了截距(也就是偏置項)。


這就給我們一個很重要的啟示。在驗證模型的現有實現時,你需要非常瞭解模型的輸入。永遠不應盲目地使用模型,要始終對你的假設以及每個輸入的確切含義保持懷疑。


整理出寫演算法的過程

過程的最後一步可能是最重要的,前面完成學習、做筆記、寫演算法以及將結果和可靠實現比較等這幾個步驟後,最後把這個過程整理出來很重要,有兩個原因:

  1. 隨著你向別人展示自己所學的東西,你會對演算法有更深入的理解;
  2. 可以作為一項成果,展示給潛在的僱主,作為求職的加分項。使用機器學習庫實現一個演算法是一回事,自己從頭開始寫出一個演算法是另一回事,而後者給人留下的印象更深刻。


以上就是從頭開始實現一個機器學習演算法的 6 個步驟,剛開始最好先從簡單的演算法開始,熟練這套方法論後再擴充套件到其它更復雜的演算法上。


參考資料:
www.kdnuggets.com/2018/09/6-s…

我們的新課程平臺,歡迎試用:jizhi.ai/



相關文章