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