自己從頭寫一個演算法,不僅能給你帶來成就感,也能幫你真正理解演算法的原理。可能你之前用 Scikit-learn 實現過演算法,但是從零開始寫個演算法簡單嗎?絕對不簡單。
有些演算法要比其它演算法複雜的多,所以在寫演算法時可以先從簡單的開始,比如單層的感知機。
下面就介紹機器學家 John Sullivan 總結出的 6 個步驟,以感知機演算法為例,教你從頭開始寫出一個機器學習演算法。文中的方法論同樣能應用到其它機器學習演算法上。這 6 個步驟是:
- 對演算法有個基本的瞭解
- 尋找實用的學習資源
- 把演算法拆成幾個部分
- 以一個簡單的例子開始
- 使用可靠的實現進行驗證
- 整理出寫演算法的過程
對演算法有個基本的瞭解
如果你不瞭解演算法的基本知識,先不要嘗試從頭寫演算法。至少。你應該能回答以下問題:
- 演算法的含義?
- 它通常用來幹嗎?
- 什麼時候不能用它?
以感知機為例,我們試著回答這些問題:
單層感知機是最簡單的神經網路,通常用於二元分類問題(1或0,“是”或“否”)。
它相當於一個二元分類器,所以只有出現線性決策邊界時才會用到它。還有些簡單的用途,比如情感分析(正面或負面回應)或貸款違約預測(會違約,不會違約)。在這兩類用途中,決策邊界都需要是線性的。
如果決策邊界是非線性的,那麼就不能使用感知機。對於這類問題,需要使用其它演算法。
尋找一些學習資源
在對演算法有個基本的理解後,就可以開始做點研究了。建議多用一些不同的資源,有些人看書學得快,有些是看視訊學得快。學習感知機知識,這裡有一些不錯的資源:
- 書本:
《統計學習精要》:
《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…
- 視訊:
感知機演算法訓練:
感知機演算法工作原理:
把演算法拆成幾部分
等收集好資源後,就開始學習了。首先準備好紙筆,我們不是通讀整個章節或整篇部落格,而是略讀章節標題和其它一些重要資訊。寫下內容要點,試著概述演算法。
在看完學習資料後,我們將感知機演算法拆成以下幾個部分:
- 初始化權重
- 將權重和輸入相乘,並求和
- 將結果和闕值進行比較,以計算輸出(1或0)
- 更新權重
- 重複
像這樣將演算法拆成幾個部分,學起來會更容易。基本上我們先以虛擬碼概述演算法,再回頭填補細節。下圖是第二步時John Sullivan所做的筆記,即權重和輸入的點積:
以一個簡單的例子開始
整理好演算法的筆記後,開始用程式碼實現。在深入研究一個複雜的問題之前,建議先從一個簡單的例子開始。對於感知機來說,與非門(NAND gate)是一個完美的簡單資料集。如果兩個輸入都為真(1)則輸出為假(0),否則輸出為真。以下是資料集的示例:
現在使用一個簡單的資料集,開始實現我們在步驟 3 中概述的演算法。最好以塊的方式寫演算法,並進行測試,不要試圖一次性寫完。這樣你在剛開始時更容易除錯。當然最後可以回去整理一下,使程式碼看起來更整潔一些。
下面是在第 3 步中演算法的點積部分的 Python 程式碼:
使用可靠的實現進行驗證
等寫完程式碼並用小資料集測試以後,接下來嘗試較大的資料集。為了確保程式碼能在更復雜的資料集上正確執行,最好用可靠的實現進行測試。對於感知機來說,我們可以用 Scikit-learn 中的實現。
測試程式碼時需要檢視權重。如果正確地實現了演算法,權重應該與 scikit-learn 感知機的權重相匹配。
如果最開始沒有得到相同的權重,那麼就需要調整 scikit-learn 感知機中的預設設定。如果每次都實現一個新的隨機狀態,只是一個固定的種子,那麼就必須關閉它。在 Jason Sullivan 自己的實踐操作中,為了匹配學習率,他將 eta0 改為 0.1。最後,他關閉了 fit_intercept 選項,在特徵資料集中包含了一個 1 的虛擬列,所以已經自動擬合了截距(也就是偏置項)。
這就給我們一個很重要的啟示。在驗證模型的現有實現時,你需要非常瞭解模型的輸入。永遠不應盲目地使用模型,要始終對你的假設以及每個輸入的確切含義保持懷疑。
整理出寫演算法的過程
過程的最後一步可能是最重要的,前面完成學習、做筆記、寫演算法以及將結果和可靠實現比較等這幾個步驟後,最後把這個過程整理出來很重要,有兩個原因:
- 隨著你向別人展示自己所學的東西,你會對演算法有更深入的理解;
- 可以作為一項成果,展示給潛在的僱主,作為求職的加分項。使用機器學習庫實現一個演算法是一回事,自己從頭開始寫出一個演算法是另一回事,而後者給人留下的印象更深刻。
以上就是從頭開始實現一個機器學習演算法的 6 個步驟,剛開始最好先從簡單的演算法開始,熟練這套方法論後再擴充套件到其它更復雜的演算法上。
參考資料:
www.kdnuggets.com/2018/09/6-s…
我們的新課程平臺,歡迎試用:jizhi.ai/