初學者必讀:從迭代的五個層面理解機器學習
你能猜到這個謎語的答案嗎?
- 如果你學習機器學習,它將隨處可見……
- 如果你是一個程序員,你會用它上千次……
- 如果你練習過任何技術,這儼然是第二個你……
不,答案不是狂飲咖啡……而是「迭代(iteration)」!
是的,迭代是為了實現某種結果而重復一組任務的過程。
等等,這難道不是詞典的定義嗎?好吧,是的,這就是迭代真正的意思。我們并不是要揭開一些令人興奮的秘密。但我們希望以一種對你來說可能是新的方式來構建這個簡單的概念。我們的目標是從不同的角度概覽機器學習的基本概念,這有別于教科書里的常規方法。
我們知道,大多數書都按照正向順序(sequential)講解機器學習的過程:加載數據、預處理、擬合模型、預測等。
這種順序方法當然是合理和有幫助的,但現實的機器學習很少如此線性。相反,實用機器學習有一個特殊的循環(cyclical)性質,需要不斷的迭代、調整和改進。
因此,我們想展示簡單的迭代技術是如何在機器學習中具有美麗形式和深刻意義的。這篇文章是針對初學者寫的,但更有經驗的讀者也不妨一讀。
為什么討論迭代問題?
迭代是機器學習的核心概念,它在許多方面至關重要。了解這個簡單的概念在機器學習工作流程中的確切位置,這會帶來很多切實的好處:
1. 你能更好地理解算法
2. 你能制定出更實際的項目進度時間表
3. 你會發現更容易實現的模型改進方法
4. 幫助你更容易堅持下去,即使初步結果較差
5. 幫助你進一步解決機器學習中更復雜的問題
根據經驗,以迭代的角度看機器學習的工作流,能夠幫助初學者了解機器學習背后的概念。
所以不用多說,讓我們開始介紹機器學習迭代的 5 個層面吧。
目錄
- 模型層面:擬合參數
- 微觀層面:調試超參數
- 宏觀層面:解決問題
- 元數據層面:改進數據
- 人類層面:提升自己
模型層面:擬合參數
迭代能夠起到重要作用的***個層面是模型層面。任何模型,無論是回歸模型、決策樹還是神經網絡,都是由許多(有時甚至數百萬)模型參數定義的。
例如,回歸模型由回歸系數定義,決策樹由節點分類的方式定義,神經網絡由連接各層的權重定義。
然而機器是如何學習正確的模型參數值的?其中迭代算法發揮了作用!
用梯度下降法擬合參數
梯度下降算法(或隨機梯度下降/stochastic gradient descent)是機器學習的巨大成功。
梯度下降是一種迭代方法,用于找到函數的最小值。在機器學習中,該函數通常是損失(loss)(或成本/cost)函數。「損失」指的是衡量預測錯誤代價的量化指標。
給定一組參數,梯度下降計算對應模型的預測損失,然后調整這些參數以減少損失。重復這一過程,直到損失不能進一步減少。
最小化損失的***一組參數就是最終的擬合模型。
直觀的梯度下降算法
我們不會在這里推導梯度下降的數學公式,但我們將直觀的給出梯度下降的概念:
1. 設想帶有山谷和山峰的山脈(損失函數);
2. 山脈的每個位置(參數集)都有一個高度(損失);
3. 現在把一個滾珠放在山脈的某個地方(初始化);
4. 在任何時刻,球沿最陡的方向(梯度)滾動;
5. 它繼續滾動(迭代),直到它卡在某個山谷底部(局部最小);
6. 理想情況下,你想找到***的山谷(全局最小);
7. 有很多聰明的方法來防止球被卡在局部最小值(例如初始化多個球,給它們更多的動量,以便球可以越過小山丘等);
8. 對了,如果山地形狀像碗(凸函數),那么球一定能到達***點。
在實踐中,調用機器學習的應用包(如 Scikit-Learn)時,并不需要從頭開始編寫梯度下降算法。
微觀層面:調試超參數
下一個迭代發揮巨大作用的層面是我們所謂的「微觀」水平,更通常被稱為通用模型或模型族(model family)。
你可以將模型族視為廣泛類別的具有可定制結構的模型。logistic 回歸、決策樹、支持向量機(SVM)和神經網絡實際上都是不同的模型族。在實際擬合模型參數之前,每個模型族都有一組結構可供選擇。
例如,在 logistic 回歸族中,可以使用 L1 或 L2 正則化懲罰項(regularization penalty)來構建單獨的模型。在決策樹族中,可以選用不同結構的模型,例如樹的深度(depth)、修剪閾值(pruning threshold)或分割標準(splitting criteria)。
這些結構選擇變量稱為超參數(hyperparameter)。
為什么超參數很特別
超參數是無法使用梯度下降或其它優化算法直接從數據學習的「更高級」參數。它們描述了在擬合模型參數之前必須確定的關于模型的結構信息。
所以當人們說他們要「訓練一個 logistic 回歸模型」時,他們真正的意思包含了兩個階段的過程。
- 首先,決定模型族的超參數。例如,模型是否應該添加 L1 或 L2 懲罰項以防止過擬合(overfitting)?
- 然后,根據數據擬合模型參數。例如,如何擬合模型系數(coefficient)以最小化損失函數(loss function)?
我們之前討論了梯度下降如何幫助執行步驟 2。但是為了使用梯度下降擬合模型參數,必須首先從模型族入手設置超參數。
那么我們如何處理步驟 1,找到模型族的***超參數?
使用交叉驗證調試超參數
交叉驗證(cross-validation)是在眾多場景最有用的技術之一,在使用它時幾乎有一種作弊的感覺。
在此背景下,交叉驗證也是一種迭代方法,用于評估用給定的一組超參數構建的模型的性能。這是一種重復使用訓練數據的聰明方式,將它分割成幾塊并循環使用它們(詳情見下一小節)。
使用交叉驗證,你可以僅使用訓練集來擬合和評估具有各種超參數集的模型。這意味著你可以將測試集單獨拿出來(hold-out set)并用于最終模型選擇(更多內容將在下一部分中介紹)。
交叉驗證詳細步驟
以下是使用 10 折交叉驗證選擇超參數的步驟:
1. 將訓練集分成 10 等份,即「折(fold)」;
2. 從備選的所有超參數集中,選擇一組超參數;
3. 在給定一組超參數后,用訓練數據的前 9 折訓練你的模型;
4. 用第 10 折,或單獨拿出的數據(hold-out)折去評估模型;
5. 用同一組超參數重復步驟(3)和(4)10 次,每次單獨拿出不同的數據折(10 折都要用一次)做評估;
6. 總計所有 10 次循環的結果,并作為該超參數集的性能指標;
7. 對于所有備選的超參數集,重復步驟(2)至(6);
下面是偽代碼:
- # pseudocode for cross-validation
- all_folds = split_into_k_parts(all_training_data)
- for set_p in hyperparameter_sets:
- model = InstanceFromModelFamily()
- for fold_k in all_folds:
- training_folds = all_folds besides fold_k
- fit model on training_folds using set_p
- fold_k_performance = evaluate model on fold_k
- set_p_performance = average all k fold_k_performances for set_p
- select set from hyperparameter_sets with best set_p_performance
宏觀層面:解決問題
現在我們要撇開單個模型,甚至模型族。我們將在解決問題層面討論迭代。
通常,***個構建的模型并不是***的,即使采用交叉驗證調試過參數。這是因為擬合模型參數和調試超參數只是整個機器學習問題解決工作流程的兩個部分。
還有其它的幾種迭代技術,可以利用它們來找到***性能的解決方案。我們認為下面的兩種技術可以比較容易地提高預測性能。
嘗試不同的模型族
機器學習中有一個概念稱為「無免費午餐定理(NFL/No Free Lunch theorem)」。人們對 NFL 定理有不同的解釋,但我們關心的是:沒有一個模型族是最適合每一個問題的。
由于各種因素,如數據類型、問題域、稀疏數據、甚至收集的數據量,不同的模型族會有不同的表現。
因此,為改進給定問題的解決方案,最簡單方法之一是嘗試幾個不同的模型族。這個迭代層面要高于之前其它的層面。
下面是偽代碼:
- # eudocode for selecting model family
- training_data, test_data = randomly_split(all_data)
- list_of_families = logistic regression,
- decision tree,
- SVM,
- neural network, etc…
- for model_family in list_of_families:
- best_model = tuned with cross-validation on training_data
- evaluate best_model from each model_family on test_data
- select final model
請注意,這里的交叉驗證步驟與上一節中的交叉驗證步驟相同。這種美麗的嵌套迭代(nested iteration)形式是解決機器學習問題的有效方法。
組合模型
下一個改進解決方案的方法是將多個模型組合成一個整合模型(ensemble)。這是從擬合這些模型的迭代過程的直接擴展。
我們將保存對不同的整合方法的詳細討論,但一個常見的整合形式是簡單地取多個模型預測的平均值。當然,還有更先進的方法來組合你的模型,但是擬合多個模型的迭代方法是一樣的。
這種組合的預測通常有與任何單個模型相比微小的性能提升。下面是構建一個簡單的整合模型的偽代碼:
- # pseudocode for building a simple ensemble modal
- training_data, test_data = randomly_split(all_data)
- list_of_families = logistic regression,
- decision tree,
- SVM,
- neural network, etc…
- for model_family in list_of_families:
- best_model = tuned with cross-validation on training_data
- average predictions by best_model from each model_family
- … profit! (often)
請注意,該過程的大部分內容與之前的技術完全相同!
實際上,這意味著你可以很容易地復制這兩種技術。首先,你可以從各種不同的模型族構建***模型。然后你可以整合它們。***,你可以在相同的測試集上評估單個模型和整合模型。
作為***一個忠告:你應該總是單獨拿出一個未經測試的測試集,以選擇你的最終模型。我們建議在建模過程開始時將數據分成訓練集和測試集。不到***不要使用測試集。
元數據層面:改進數據
更好的數據打敗更好的算法,但這并不總是意味著更多的數據打敗更好的算法。是的,更好的數據通常意味著更多的數據,但它也意味著更清潔的數據、更相關的數據、以及有更好的特征的數據。
改進數據也是一個迭代過程。當你面對機器學習的更大挑戰時,你會意識到,很難從一開始就完全獲得所有數據。
也許還有一些你沒有想到的關鍵特征。也許你沒有收集到足夠的數據。也許你錯誤理解了數據集中的一個列,需要返回去重新向同事解釋它。
一個偉大的機器學習從業者總是保持開放的心態,并不斷改進數據集。
收集更好的數據
收集更好的數據的能力是隨時間、經驗和更多領域專業知識而發展的技能。例如,如果你正在構建一個房地產定價模型,你應該收集關于房子本身、附近的社區、甚至過去支付的財產稅等公開可用的信息。
更好的數據的另一個要素是數據的整體清潔度(cleanliness)。這意味著減少丟失數據、降低測量誤差,并盡力用主要指標(primary metric)替換代理指標(proxy metric)。
這里有幾個問題,可以激發你改進數據集的想法:
- 正在收集的數據是否具有所需的所有特征?
- 你可以更好地清理數據嗎?
- 你能減少測量誤差嗎?
- 是否有可以刪除的異常值?
- 收集更多的數據是否廉價?
設計更好的特征
特征工程,或通過利用領域內知識從數據創建新特征,是用以改善模型的最有價值的活動。
它通常是困難和耗時的,但它被認為是應用機器學習的關鍵。因此,作為機器學習的從業者,你有責任在你選擇的領域繼續學習。
這是因為當你了解更多關于該領域的信息時,你將培養對***影響力的特征更好的直覺。你應該把學習過程也作為一個迭代過程,隨著個人專長的增長而改善。
人類層面:提升自己
現在我們已經到了機器學習中最重要的層面:人類層面。即使你忘記了這篇文章中的一切,我們希望你從這一節學習到東西。
真相是:機器學習和數據科學是非常大和麻煩的主題。特別是如果你是一個初學者,你可能會感到不知所措。有這么多內容,每天都有新的發展在發生。
你知道嗎?機器學習部分對于我們仍然非常艱難和困惑。但是沒關系,因為我們堅信,最重要的迭代層面是在個人層面,即機器學習的實踐者。
因此,我們要以幾塊建議來結束這篇冗長的文章。我們希望這***一部分可以幫助你保持洞察力,而不被這個領域超載的信息所淹沒。
#1. 不要停止學習
正像上文所說的,迭代建立在機器學習過程的每一個層面。你的個人技能也不例外。機器學習是一個深刻和豐富的領域,你練習得越多,一切就會變得越容易。
#2. 不要從一開始就期望***
你不需要贏得你的***次 Kaggle 比賽。即使你發現建立的模型完全不能用也沒有關系,最寶貴的寶藏是你的個人成長和改善,這應該是你的主要關注點。
#3. 什么都不知道也沒關系
事實上,一個人幾乎不可能知道關于機器學習的一切。關鍵是建立一個基礎,以幫助你根據需要選擇新的算法和技術。是的……理解迭代也是基礎的一部分。
#4. 至少嘗試兩次
掙扎在算法或任務之中?花費的時間比你想象的時間長嗎?沒問題,只記得至少多嘗試一次。第二次嘗試一切都變得更容易和更快,這是你進步的***方式。
#5. 理論、實踐和項目三者的循環
我們相信學習機器學習的最有效的方法是在理論、目標實踐和更大的項目之間循環。這是掌握理論同時發展應用、實際技能的最快方式。
總結
迭代是一個簡單而又美麗的概念,它能將機器學習的每一個層面粘合到一起:
- 人類層面:反復練習以提升技能
- 元數據層面:持續改進數據和特征
- 宏觀層面:探索不同的模型族和組合方式
- 微觀層面:交叉驗證以調試模型超參數
- 模型層面:梯度下降以擬合模型參數