『壹』 機器學習幾個重要概念
機器學習幾個重要概念
統計學習的演算法可以分為以下幾個類別:監督學習、非監督學習、半監督學習以及強化學習。
監督學習的輸入數據都有對應的類標簽或是一個輸出值,其任務是學習一個模型,使模型能夠對任意給定的輸入,對其相應的輸出做出一個好的預測。
非監督學習就是沒有對應的類標簽或是輸出值。學習中並沒有任何標准來告訴你,某個概念是否正確,需要學習器自身形成和評價概念。就是自動地從數據中挖掘出結構信息或是抽取出一些規則。近年來,非監督學習被認為是解決一些重要問題的突破口所在。因為科學的產生就是人類中無監督學習的最佳案例。
半監督學習就是介於監督學習和非監督學習之間。這在最近的研究領域也是被大家所熱烈探討的,因為對於現實數據來說,有標簽的數據總是少量的,往往都需要人工來進行標注。而無標簽數據是能夠大量獲得的。
增強學習強調如何基於環境而行動,以取得最大化的預期利益。其靈感來源於心理學中的行為主義理論,即有機體如何在環境給予的獎勵或懲罰的刺激下,逐步形成對刺激的預期,產生能獲得最大利益的習慣性行為。強化學習和標準的監督式學習之間的區別在於,它並不需要出現正確的輸入/輸出對,也不需要精確校正次優化的行為。(以上內容摘自維基網路)這在機器人、無人機領域中應用的還是非常廣泛的。
在線學習與離線學習
對於機器學習演算法的分類,站在不同的角度就能有不同的分類方法。在具體的應用中還有一種常用的分類方法是:在線學習與離線學習。
在線學習,是在獲取到新的數據後就能夠輸入到模型中進行學習。這需要學習演算法能夠在處於任何狀態時都能進行參數的更新。而且需要演算法對雜訊數據有很好的魯棒性。
離線學習就正好與在線學習相反,當數據有更新時,需要將其與原來的數據一起對模型的參數進行重新地訓練。這時,整個訓練的過程能夠被很好的控制,因為所有的數據都是已知的,能夠對數據進行細致的預處理過程。
生成模型與判別模型
這種分類方式是針對於監督學習來進行分類的。這個在我騰訊面試的時候還被問到過這個問題。
生成模型
生成方法由數據學習聯合概率分布P(X,Y)
,然後求出條件概率分布P(Y|X)
作為預測的模型,即生成模型:
模型表示了給定輸入X產生輸出Y的生成關系。典型的生成模型有:樸素貝葉斯方法和隱馬爾可夫模型。
生成模型能夠還原出聯合概率分布P(X,Y)
;生成模型的收斂速度快,當樣本容量增加的時候,學到的模型可以更快地收斂於真實模型;當存在隱變數時,仍可以使用生成學習方法,此時判別方法就不能用。
判別模型
判別方法由數據直接學習決策函數f(x)
或者條件概率分友卜中布P(Y|X)
作為預測的模型,即判別模型。典型的判別模型包括:k近鄰法、感知機、決策樹、logistic回歸模型、最大熵模型、支持向量機、提升方法和條件隨機場。
判別模型直接面對預測,往往學習的准確率越高。可以對數據進行各種程度上的抽好山象、定義特徵並使用特徵,因此可以簡化學習問題。
演算法的歸納偏好
機器學習演算法在學習過程中對某種類型假設的偏好稱為『歸納偏好』。這個『假設』包含了一個演算法方方面面的內容。
任何一個有效的機器學習演算法必有其歸納的偏好,否則它將被假設空間中看似在訓練集上『等效』的假設所迷惑,而無法產生確定的學習結果。例如在分類問題中,如果隨機抽選訓練集上等效的假設(可以認為所有的正反例並沒有區別),那麼它的分類結果其實是不確定的,這要根據它所選取的樣本來決定,這樣的學習顯然是沒有意義的。
歸納偏好對應了學習演算法本身所做出的關於『什麼樣的模型更好』的假設。在具弊睜體的問題中,這個假設是否成立,即演算法的歸納偏好是否與問題本身匹配,大多數時候直接決定了演算法能否取得好的性能。
『奧卡姆剃刀』就是一個常用的原則,『若有多個假設與觀察一致,則選擇最簡單的那個』。對於一些以簡潔為美的人來說是再正確不過了。在一些工程技術中有一些問題也確實是這樣,一個較為簡單的方法所取得的效果雖然不是最好,但是它的代價與其效果之比已然是最優。
對於一個線性回歸問題,如下圖所示:
根據『奧卡姆剃刀』原則,你肯定會選擇中間那條經過回歸處理之後的直線作為之後預測的標准。在一些場景下,這樣選擇自然是正確的。如果再給你更多的數據點,你發現這些點正好是在穿過所有紅色點的曲線之上,你還會選擇那條回歸的直線嗎?這就牽扯出一個非常有意思的定理,『沒有免費的午餐』。
這個定理所描述的是,對於任意兩個學習演算法A和B,它們在任意分布數據上的誤差其實是相等的。仔細想想的話確實是那麼回事。這個定理有一個重要的前提:所有問題出現的機會相同或是所有問題都是同等重要的。
這時候你肯定會有疑問,既然所有的學習演算法的期望性能都和隨機猜測差不多,那學習的過程豈不是並沒有什麼用。注意到一點,上面所說的相等是在所有數據的分布之下,但是我們所處理的問題的數據往往是某一特定分布的。
欠擬合與過擬合
當目標函數給定時,基於目標函數的模型訓練誤差和模型測試誤差就自然成為學習方法的評估標准。注意,學習方法具體採用的目標函數未必是評估時所使用的標准。關於評估標准這一問題會在之後的博客中提到。
假設學習到的模型是Y=f^(x)
,訓練誤差是模型關於訓練數據數據集的平均損失:
其中N是訓練樣本容量。
測試誤差是模型關於測試數據集的平均損失:
其中N』是測試樣本容量。
通常將學習方法對未知數據的預測能力稱為泛化能力。顯然,我們希望得到泛化誤差小的學習器。然而,事先我們並不知道新樣本是什麼樣的,實際能做的是努力使在訓練集上的誤差最小化。
如果一味追求提高對訓練數據的預測能力,所選模型的復雜度往往會比真模型要高。這種現象稱為過擬合。過擬合是指學習時選擇的模型包含參數過多,以致於出現這一模型對已知數據預測的很好,但對未知數據預測得很差的現象。與過擬合相對的是欠擬合,這是指對訓練樣本的一般性質尚未學好。
欠擬合比較容易克服,一般只需要增加訓練的次數。而過擬合是機器學習面臨的關鍵障礙,各類學習演算法都必然帶有一些針對過擬合的措施;然而必須認識到,過擬合是無法徹底避免的,我們所能做的只是緩解。這是因為,機器學習面臨的問題一般是NP難甚至是更難的,而有效的學習演算法必然是在多項式時間內完成的。若可以徹底避免過擬合,這就意味著我們構造性地證明了『NP = P』,那麼你就可以獲得圖靈獎了。只要相信『P != NP』,過擬合就無法避免。
關於過擬合與欠擬合圖形化的解釋,下面那張圖中有具體說明。
方差與偏差
偏差方差-分解試圖對學習演算法的期望泛化誤差進行分解。推導的過程這里就不寫了,直接給出公式。
這個式子表示的是泛化誤差可以分解為偏差、方差與雜訊之和。偏差度量了學習演算法的期望預測與真實結果的偏離程度,即刻畫了學習演算法本身的擬合能力。為什麼一個演算法會有偏差呢,下面這句話給出了答案:
Biases are introced by the generalizations made in the model including the configuration of the model and the selection of the algorithm to generate the model.
我個人的理解是,因為對於演算法的選擇乃至於調整參數方法的選擇導致了演算法是有偏差的。因為演算法的選擇中就蘊含著偏好。
方差度量了同樣大小的訓練集的變動所導致的學習性能的變化,即刻畫了數據擾動所造成的影響;雜訊則表達了在當前任務上任何學習演算法所能到達的期望泛化誤差的下界,即刻畫了問題本身的難度。
泛化能力是由學習演算法的能力、數據的充分性以及學習任務本身的難度所共同決定的。給定學習任務,為了取得好的泛化性能,則需使偏差較小,即能充分擬合數據,並且使方差較小,即使得數據擾動產生的影響小。
但偏差與方差是不能同時達到最優的,這稱為偏差方差窘境。
這個圖所表達的含義相信不用過多地解釋了吧。
『貳』 機器人是如何學習處理矢量圖輸入輸出的
引言:人工智慧受到人們的關注,一直以來人工智慧都伴隨著機器人學習從而來進行發展,而機器人的學習,是可以通過人們的編程和一次又一次的反復訓練來進行的。機器人是如何學習處理矢量圖輸入輸出的?
『叄』 機器學習framework怎麼畫
1 畫機器學習framework,需要掌握數據分析或者機器學習的基礎知識,同時也需要了解具體的framework的特點和使用方法。
2 機器學習framework通常包含數據的輸入輸出、數據清洗、模型訓練和模型預測等環節,因此需要考慮猛模清楚每個環節的組成和交互關系。
3 可早肆以通過流程圖或者框圖的方式來展示機器學習framework,其中每個環節需要給出具體的演算法或者工具的名稱,以及對應的參數和輸出結果。
延伸陸知轎:在實際的機器學習過程中,framework的選擇和使用對模型的性能和效果有著重要的影響,因此需要根據具體的問題和數據特點來選擇最合適的framework。
同時,不同的framework還具有各自的優缺點和適用范圍,需要根據實際情況進行權衡和選擇。
『肆』 機器學習系列 - 3. 數據預處理
KNN的主要優點有:
理論成熟,思想簡單,既可以用來做分類也可以用來做回歸
天然解決多分類問題,也可用於回歸問題
和樸素貝葉斯之類的演算法比,對數據沒有假設,准確度高,對異常點不敏感
由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合
KNN的主要缺點有:
計算量大,效率低。即使優凳罩化演算法,效率也不高。
高度數據相關,樣本不平衡的時候,對稀有類別的預測准確率低
相比決策樹模型,KNN模型可解釋性不強
維度災難:隨著維度的增加,「看似相近」的兩個點之間的距離越來越大,而knn非常依賴距離
KNN優化演算法之一。
原理:kd樹是一種對k維空間中的實例點進行存儲以便對其進行快速檢索的樹形數據結構,且kd樹是一種二叉樹,表示對k維空間的一個劃分。
k-d tree是每個節點均為k維樣本點的二叉樹,其上的每個樣本點代表一個超平面,該超平面垂直於當前劃分維度的坐標軸,並在該維度上將空間劃分為兩部分,一部分在其左子樹,另一部分在其右子樹。即若當前節點的劃分維度為d,其左子樹上所有點在d維的坐標值均小於當前值,右子樹上所有點在d維的坐標值均大於等於當前值,本定義對其任意子節點均成立。
KD樹的構建:
循環依序取數據點的各維度來作為切分維度,
取數據點在該維度的中值作為切分超平面,
將中值左側的數據點掛在其左子樹,將中值右側的數據點掛在其右子樹,
遞歸處理其子樹,直至所有數據點掛載完畢。
對於構建過程,有兩個優化點:選擇切分維度:根據數據點在各維度上的分布情況,方差越大,分布越分散,從方差大的維度開始切分,有較好的切分效果和平衡性。
確定中值點:預先對原始數據點在所有維度進行一次排序,存儲下來,然後在後續的中值選擇中,無須每次都對其子集進行排序,提升了性能。也可以從原始數據點中隨機選擇固定數目的點,晌粗跡然後對其進行排序,每次從這些樣本點中取中值,來作為分割超平面。該方式在實踐中被證明可以取得很好性能及很好的平衡性。
1.數據標准化:
標准化的前提是特徵值服從正態分布,標准化後,其轉換成標准正態分布。
數據標准化優缺點:
優點:
Z-Score最大的優點就是簡單,容易計算,Z-Score能夠應用於數值型的數據,並且不受數據量級的影響,因為它本身的作用就是消除量級給分析帶來的不便。
缺點:
估算Z-Score需要總體的平均值與方差,但是這一值在真實的分析與挖掘中很難得到,大多數情況下是用樣本的均值與標准差替代;
Z-Score對於數據的分布有一定的要求,正態分布是最有利於Z-Score計算的;
Z-Score消除了數據具有的實際意義,A的Z-Score與B的Z-Score與他們各自的分數不再有關系,因此Z-Score的結果只能用於比較數據間的結果,數據的真實意義還需要還原原值;
在存在異常值時無法保證平衡的特徵尺度。
2.歸一化:
1)MinMax歸一化:區間縮放法,利用於邊界值信息。將屬性縮放到[0,1]
缺點:
這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義;
MinMaxScaler對異常值的存在非常敏感。
2)MaxAbs 歸一化:
單獨地縮放和轉換每個特徵,使得訓練集中的每個特徵的最大絕對值將為1.0,將屬性縮放到[-1,1]。它不會移動/居中數據,因此不會破壞任何稀疏性。
缺點:
這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義;
MaxAbsScaler與先前的縮放器不同,絕對值映射在[0,1]范圍內。在僅有正數據時,該縮放器的行為MinMaxScaler與此類似,因此也存在大的異常值。
3)正態分布化:
定義:正則化的過程是將每個樣本縮放到單位范數(每個樣本的范數為1),如果要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。
該方法是文本分類和聚類分析中經常使宴並用的向量空間模型(Vector Space Model)的基礎。
Normalization主要思想是對每個樣本計算其p-范數,然後對該樣本中每個元素除以該范數,這樣處理的結果是使得每個處理後樣本的p-范數(l1-norm,l2-norm)等於1。
4.標准化與歸一化對比
1)標准化與歸一化的異同
相同點:
它們的相同點在於都能取消由於量綱不同引起的誤差;都是一種線性變換,都是對向量X按照比例壓縮再進行平移。
不同點:
目的不同,歸一化是為了消除綱量壓縮到[0,1]區間;
標准化只是調整特徵整體的分布;
歸一化與最大,最小值有關;
標准化與均值,標准差有關;
歸一化輸出在[0,1]之間;
標准化無限制。
2)什麼時候用歸一化?什麼時候用標准化?
如果對輸出結果范圍有要求,用歸一化;
如果數據較為穩定,不存在極端的最大最小值,用歸一化;
如果數據存在異常值和較多噪音,用標准化,可以間接通過中心化避免異常值和極端值的影響。
3)歸一化與標准化的應用場景
在分類、聚類演算法中,需要使用距離來度量相似性的時候(如SVM、KNN)、或者使用PCA技術進行降維的時候,標准化(Z-score standardization)表現更好;
在不涉及距離度量、協方差計算、數據不符合正太分布的時候,可以使用第一種方法或其他歸一化方法。
比如圖像處理中,將RGB圖像轉換為灰度圖像後將其值限定在[0 255]的范圍;
基於樹的方法不需要進行特徵的歸一化。
例如隨機森林,bagging與boosting等方法。
如果是基於參數的模型或者基於距離的模型,因為需要對參數或者距離進行計算,都需要進行歸一化。
一般來說,建議優先使用標准化。對於輸出有要求時再嘗試別的方法,如歸一化或者更加復雜的方法。很多方法都可以將輸出范圍調整到[0, 1],如果我們對於數據的分布有假設的話,更加有效的方法是使用相對應的概率密度函數來轉換。
1.無監督分箱法
1)自定義分箱
2)等距分箱 - pd.cut
3)等頻分箱 - pd.qcut
4)聚類分箱:基於k均值聚類的分箱:k均值聚類法將觀測值聚為k類,但在聚類過程中需要保證分箱的有序性:第一個分箱中所有觀測值都要小於第二個分箱中的觀測值,第二個分箱中所有觀測值都要小於第三個分箱中的觀測值,等等。
5)二值化:二值化可以將數值型(numerical)的feature進行閥值化得到boolean型數據。
2.無監督分箱法
1)卡方分箱法:自底向上的(即基於合並的)數據離散化方法。它依賴於卡方檢驗:具有最小卡方值的相鄰區間合並在一起,直到滿足確定的停止准則。
基本思想:
對於精確的離散化,相對類頻率在一個區間內應當完全一致。因此,如果兩個相鄰的區間具有非常類似的類分布,則這兩個區間可以合並;否則,它們應當保持分開。而低卡方值表明它們具有相似的類分布。
2)最小熵法分箱:需要使總熵值達到最小,也就是使分箱能夠最大限度地區分因變數的各類別。
熵是資訊理論中數據無序程度的度量標准,提出信息熵的基本目的是找出某種符號系統的信息量和冗餘度之間的關系,以便能用最小的成本和消耗來實現最高效率的數據存儲、管理和傳遞。
數據集的熵越低,說明數據之間的差異越小,最小熵劃分就是為了使每箱中的數據具有最好的相似性。給定箱的個數,如果考慮所有可能的分箱情況,最小熵方法得到的箱應該是具有最小熵的分箱。
『伍』 機器學習入門報告之 解決問題一般工作流程
機器學習入門報告之 解決問題一般工作流程
對於給定的數據集和問題,用機器學習的方法解決問題的工作一般分為4個步驟:
一. 數據預處理
首先,必須確保數據的格式符合要求。使用標准數據格式可以融合演算法和數據源,方便匹配操作。此外還需要為機器學習演算法准備特定的數據格式。
然後,直接得到的數據集很少可以直接使用,可能有以下原因:
1. 樣本某些屬性缺失
2. 某些樣本未標記
3. 樣本屬性過多
4. 沒有分出訓練集和測試集
5. 不同類別訓練樣例比例相差太大
對於1,2這樣的情況,在該類樣本數較少的情況下一般通過刪除該類無效樣本來清洗數據。
對於3
·過多的特徵可能誤導學習器
·更多的特徵意味著更多的參數需要調整,過擬合的風險加大
·數據的可視化要求維度不高於3
·維度越少訓練越快,可嘗試的東西越多,能得到更好地效果
·數據的維度可能虛高。
解決方法就是降維,降維分為特徵選擇法和特徵抽取法。
特徵選擇法:
所謂特徵選擇,就是選擇樣本中有用、跟問題相關的特徵。事實上並不一定樣本的所有屬性對具體問題都是有用的,通過一定的方法選擇合適的特徵可以保證模型更優。常用的方法大致分三類:過濾式、包裹式和嵌入式。
特徵抽取法:
特徵抽取試圖將原始特徵空間轉換成一個低維特徵空間而不丟失主要信息。無法使用選擇方法來刪除特徵,而特徵又太罩尺多的時候,這種方法很有效。我們可以通過主成分分析PCA和線性判別式分析和多維標度法來驗證。
對於4,為了方便訓練和驗證模型好壞,數據集一般會以9:1或者其他合適比例(比例選擇主要基於實際問題)分為測試集和驗證集。如果給定的數據集只是已經標記好的樣本,那麼劃分時必須保證數據集和測試集的分布大致均勻。
對於5,即類別不均衡問題,處理的一個基本策略是—再縮放。
二. 選定演算法
一種方式是根據有沒有標記樣本考慮。
如果是有標記樣本,可以考慮有監督學習,反之則是無監督學習。
無監督學習方法主要是聚類。隨機選定幾個樣本,通過一定的演算法不停迭代直至收斂或者達到停止條件,然後便將所有樣本分成了幾類。
對有監督學習而言,根據最終所需要的輸出結果
如果是分類問題,可以參考的模型有線性回歸及其非線性擴展、決策樹、神經網路、支持向量機SVM、規則學習蠢扮等
如果是回歸問題,可以認為是分類的連續形式,方法便是以上模型的變種或擴展
如果涉及到概率,可帶悶灶以參考的有神經網路、貝葉斯、最大似然、EM、概率圖、隱馬爾科夫模型、強化學習等
三. 訓練演算法
將格式化數據輸入到演算法,從中抽取知識或信息。這里的得到的知識需要存儲為計算機可以處理的格式,方便後續使用。
四. 性能評估和優化
如果要評估訓練集和測試集的劃分效果,常用的有留出法、交叉驗證法、自助法、模型調參等
如果模型計算時間太長,可以考慮剪枝
如果是過擬合,則可通過引入正則化項來抑制(補償原理)
如果單個模型效果不佳,可以集成多個學習器通過一定策略結合,取長補短(集成學習)
『陸』 python處理圖片數據
生成一張純色的圖片
先設置圖片的顏色,接著悄臘利用Image模塊的new方法新生成一張圖片,png格式的圖片需要設置成rgba,類似的還有rgb,L(灰度圖等),尺寸設定為640,480,這個可以根據自己的情況設定,顏色同樣如此。
『柒』 機器學習中的數據預處理有哪些常見/重要的工具
不太清攜滑楚你說的是搭建pipeline的工具還是說pipeline裡面處理數據的工具,就順道都說一下。
pipeline工具本身一般是控制這些工具的流程,最簡單的crontab就定時執行就好,但是有時候會有數據依賴的問題,比如第7步依賴第三步的兩個文件以及平行的第6步的文件,這個依賴並不是線性的,而是一個圖的形式。當中加上有些辯行臘技術延遲比如有些數據生成失敗了需要重啟某些特定的步驟重新生成,這個問題就稍微復雜了。crontab一般在這時候就搞不定,需要一些專門的pipeline管理,比如 spotify/luigi · GitHub 或者 Azkaban
2. 預處理文本數據本身一般用一些Linux的工具比如cut啊awk啊等等做數據篩選和清理,自己寫一寫python小工具做數據的簡單組合比如復雜的regex規則組合,比較大的數據歸類和抽象一般用Hive之類的hadoop工具都可以,里帶棚面也可以插入linux小工具和自己寫的工具。
工業界的數據項目多數時間要設計如何清理數據,這和學術界的玩具數據玩起來很不一樣,歡迎來到真實的世界。-ITjob
『捌』 機器學習的常用方法有哪些
梯度下降是非常常用的優化演算法。作為機器學習的基礎知識,這是一個必須要掌握的演算法。藉助本文,讓我們來一起詳細了解一下這個演算法。
前言
本文的代碼可以到我的Github上獲取:
https://github.com/paulQuei/gradient_descent
本文的演算法示例通過Python語言實現,在實現中使用到了numpy和matplotlib。如果你不熟悉這兩個工具,請自行在網上搜索教程。
關於優化
大多數學習演算法都涉及某種形式的優化。優化指的是改變x以最小化或者最大化某個函數的任務。
我們通常以最小化指代大多數最優化問題。最大化可經由最小化來實現。
我們把要最小化或最大化的函數成為目標函數(objective function)或准則(criterion)。
我們通常使用一個上標*表示最小化或最大化函數的x值,記做這樣:
[x^* = arg; min; f(x)]
優化本身是一個非常大的話題。如果有興趣,可以通過《數值優化》和《運籌學》的書籍進行學習。
模型與假設函數
所有的模型都是錯誤的,但其中有些是有用的。– George Edward Pelham Box
模型是我們對要分析的數據的一種假設,它是為解決某個具體問題從老洞數據中學習到的,因此它是機器學習最核心的概念。
針對一個問題,通常有大量的模型可以選擇。
本文不會深入討論這方面的內容,關於各種模型請參閱機器學習的相關書籍。本文僅以最簡單的線性模型為基礎來討論梯度下降演算法。
這里我們先介紹一下在監督學習(supervised learning)中常見的三個符號:
m,描述訓練樣本的數量
x,描述輸入變數或特徵
y,描述輸出變數或者叫目標值
訓練集會包含很多的樣本,我們用 表示其中第i個樣本。
x是數據樣本的特徵,y是其目標值。例如,在預測房價的模型中,x是房子的各種信息,例如:面積,樓層,位置等等,y是房子的價格。在圖像識別的任務中,x是圖形的所有像素點數據,y是圖像中包含的目標對象。
我們是希望尋找一個函數,將x映射到y,這個函數要足夠的好,以至於能夠預測對應的y。由於歷史原因,這個函數叫做假設函數(hypothesis function)。
學習的過程如下圖所示。即:首先根據已有的數據(稱之為訓練集)訓練我們的演算法模型,然後根據模型的假設函數來進行新數據的預測。
線性模型(linear model)正如其名稱那樣:是希望通過一個直線的形式來描述模式。線性模型的假設函數如下所示:
[h_{ heta}(x) = heta_{0} + heta_{1} * x]
這個公式對於大家來說應該都是非常簡單的。如果把它繪制出來,其實就是一條直線。
下圖是一個具體的例子,即: 的圖形:
在實際的機器學習工程中碰含伍,你會擁有大量的數據。這些數據會來自於某個數據源。它們存儲在csv文件中,或者以其他的形式打包。
但是本文作為演示使用,我們通過一些簡單的代碼自動生成了需要的數據。為了便於計算,演示的數據量也很小。
import numpy as np
max_x = 10
data_size = 10
theta_0 = 5
theta_1 = 2
def get_data:
x = np.linspace(1, max_x, data_size)
noise = np.random.normal(0, 0.2, len(x))
y = theta_0 + theta_1 * x + noise
return x, y
這段代碼很簡單,我們生成了x范圍是 [1, 10] 整數的10條數據。對應的y是以線性模型的形式計算得到,其函數是:。現實中的數據常常受到各種因素的干擾,所以對於y我們故意加上了一些高斯雜訊。因此最終的y值為比原先會有輕微的偏離。
最後我們的數據如下所示:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
我們可以把這10條數據繪制出來這樣就有一個直觀的了解了,如下圖所示:
雖然演示用的數據是我們通過公式計算得到的。但在實際的工程中,模型的參數是需要我們通過數據學習到的。所以下文我們假設我們不知道這里線性模式的兩個參數是什麼,而是通過演算法的形式求得。
最後再跟已知的參數進行對比以驗證我們的演算法是否正確。
有了上面的數據,我們可以嘗試畫一條直線來描述我們的模型。
例如,像下面這樣畫一條水平的直線:
很顯然,這條水平線離數據太遠了,非常的不匹配。
那我們可以再畫一條斜線。
我們初次畫的斜線可能也不貼切,它可能像下面這樣:
最後我們通過不斷嘗試,找到了最終最合適的那條,如下所示:
梯度下降演算法的計算過程,就和這種本能式的試探是類似的,它就是不停的迭代,一步步的接近最終的結果。
代價函數
上面我們嘗試了幾次通過一條直線來擬合(fitting)已有的數據。
二維平面上的一條直線可以通過兩個參數唯一的確定,兩個參數的確定也即模型的確定。那如何描述模型與數據的擬合程度呢?答案就是代價函數。
代價函數(cost function)描述了學習到的模型與實際結果的偏差程度。以上面的三幅圖為例,最後一幅圖中的紅線相比第一條水平的綠線,其偏離程度(代價)應該是更小的。
很顯然,我們希望我們的假設函數與數據盡可能的貼近,也就是說:希望代價函數的結果盡可能的小。這就涉及到結果的優化,而梯度下降就是尋找最小值的方法之一。
對於每一個樣本,假設函數會依據計算出一個估算值,我們常常用來表示。即 。
很自然的,我們會想到,通過下面這個公式來描述我們的模型與實際值的偏差程度:
[(h_ heta(x^i) - y^i)^2 = (widehat{y}^{i} - y^i)^2 = ( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
請注意, 是實際數據的值, 是我們的模型的估算值。前者對應了上圖中的離散點的y坐標,後者對應了離散點在直線上投影點的y坐標。
每一條數據都會存在一個偏差值,而代價函數就是對所有樣本的偏差求平均值,其計算公式如下所示:
[L( heta) = frac {1}{m} sum_{i=1}^{m}(h_ heta(x^i) - y^i)^2 = frac {1}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
當損失函數的結果越小,則意味著通過我們的假設函數估算出的結果與真實值越接近。這也就是為什麼我們要最小化損失函數的原因。
藉助上面這個公式,我們可以寫一個函數來實現代價函數:
def cost_function(x, y, t0, t1):
cost_sum = 0
for i in range(len(x)):
cost_item = np.power(t0 + t1 * x[i] - y[i], 2)
cost_sum += cost_item
return cost_sum / len(x)
這個函數的代碼應該不用多做解釋,它就是根據上面的完成計算。
我們可以嘗試選取不同的 和 組合來計算代價函數的值,然後將結果繪制出來:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
theta_0 = 5
theta_1 = 2
def draw_cost(x, y):
fig = plt.figure(figsize=(10, 8))
ax = fig.gca(projection='3d')
scatter_count = 100
radius = 1
t0_range = np.linspace(theta_0 - radius, theta_0 + radius, scatter_count)
t1_range = np.linspace(theta_1 - radius, theta_1 + radius, scatter_count)
cost = np.zeros((len(t0_range), len(t1_range)))
for a in range(len(t0_range)):
for b in range(len(t1_range)):
cost[a][b] = cost_function(x, y, t0_range[a], t1_range[b])
t0, t1 = np.meshgrid(t0_range, t1_range)
ax.set_xlabel('theta_0')
ax.set_ylabel('theta_1')
ax.plot_surface(t0, t1, cost, cmap=cm.hsv)
在這段代碼中,我們對 和 各自指定了一個范圍進行100次的采樣,然後以不同的 組合對來計算代價函數的值。
如果我們將所有點的代價函數值繪制出來,其結果如下圖所示:
從這個圖形中我們可以看出,當 越接近 [5, 2]時其結果(偏差)越小。相反,離得越遠,結果越大。
直觀解釋
從上面這幅圖中我們可以看出,代價函數在不同的位置結果大小不同。
從三維的角度來看,這就和地面的高低起伏一樣。最高的地方就好像是山頂。
而我們的目標就是:從任意一點作為起點,能夠快速尋找到一條路徑並以此到達圖形最低點(代價值最小)的位置。
而梯度下降的演算法過程就和我們從山頂想要快速下山的做法是一樣的。
在生活中,我們很自然會想到沿著最陡峭的路往下行是下山速度最快的。如下面這幅圖所示:
針對這幅圖,細心的讀者可能很快就會有很多的疑問,例如:
對於一個函數,怎麼確定下行的方向?
每一步該往前走多遠?
有沒有可能停留在半山腰的平台上?
這些問題也就是本文接下來要討論的內容。
演算法描述
梯度下降演算法最開始的一點就是需要確定下降的方向,即:梯度。
我們常常用 來表示梯度。
對於一個二維空間的曲線來說,梯度就是其切線的方向。如下圖所示:
而對於更高維空間的函數來說,梯度由所有變數的偏導數決定。
其表達式如下所示:
[ abla f({ heta}) = ( frac{partial f({ heta})}{partial heta_1} , frac{partial f({ heta})}{partial heta_2} , ... , frac{partial f({ heta})}{partial heta_n} )]
在機器學習中,我們主要是用梯度下降演算法來最小化代價函數,記做:
[ heta ^* = arg min L( heta)]
其中,L是代價函數,是參數。
梯度下降演算法的主體邏輯很簡單,就是沿著梯度的方向一直下降,直到參數收斂為止。
記做:
[ heta ^{k + 1}_i = heta^{k}_i - lambda abla f( heta^{k})]
這里有幾點需要說明:
收斂是指函數的變化率很小。具體選擇多少合適需要根據具體的項目來確定。在演示項目中我們可以選擇0.01或者0.001這樣的值。不同的值將影響演算法的迭代次數,因為在梯度下降的最後,我們會越來越接近平坦的地方,這個時候函數的變化率也越來越小。如果選擇一個很小的值,將可能導致演算法迭代次數暴增。
公式中的 稱作步長,也稱作學習率(learning rate)。它決定了每一步往前走多遠,關於這個值我們會在下文中詳細講解。你可以暫時人為它是一個類似0.01或0.001的固定值。
在具體的項目,我們不會讓演算法無休止的運行下去,所以通常會設置一個迭代次數的最大上限。
線性回歸的梯度下降
有了上面的知識,我們可以回到線性模型代價函數的梯度下降演算法實現了。
首先,根據代價函數我們可以得到梯度向量如下:
[ abla f({ heta}) = (frac{partial L( heta)}{ partial heta_{0}}, frac{ partial L( heta)}{ partial heta_{1}}) = (frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) , frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i})]
接著,將每個偏導數帶入迭代的公式中,得到:
[ heta_{0} := heta_{0} - lambda frac{partial L( heta_{0})}{ partial heta_{0}} = heta_{0} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) heta_{1} := heta_{1} - lambda frac{partial L( heta_{1})}{ partial heta_{1}} = heta_{1} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i}]
由此就可以通過代碼實現我們的梯度下降演算法了,演算法邏輯並不復雜:
learning_rate = 0.01
def gradient_descent(x, y):
t0 = 10
t1 = 10
delta = 0.001
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
t0_ = t0 - 2 * learning_rate * sum1 / len(x)
t1_ = t1 - 2 * learning_rate * sum2 / len(x)
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
這段代碼說明如下:
我們隨機選擇了 都為10作為起點
設置最多迭代1000次
收斂的范圍設為0.001
學習步長設為0.01
如果我們將演算法迭代過程中求得的線性模式繪制出來,可以得到下面這幅動態圖:
最後演算法得到的結果如下:
Times: 657, gradient: [5.196562662718697, 1.952931052920264]
Times: 658, gradient: [5.195558390180733, 1.9530753071808193]
Times: 659, gradient: [5.194558335124868, 1.9532189556399233]
Times: 660, gradient: [5.193562479839619, 1.9533620008416623]
Gradient descent finish
從輸出中可以看出,演算法迭代了660次就收斂了。這時的結果[5.193562479839619, 1.9533620008416623],這已經比較接近目標值 [5, 2]了。如果需要更高的精度,可以將delta的值調的更小,當然,此時會需要更多的迭代次數。
高維擴展
雖然我們舉的例子是二維的,但是對於更高維的情況也是類似的。同樣是根據迭代的公式進行運算即可:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=1}^{m}(h_ heta(x^{k})-y^k)x_i^k]
這里的下標i表示第i個參數,上標k表示第k個數據。
梯度下降家族BGD
在上面的內容中我們看到,演算法的每一次迭代都需要把所有樣本進行遍歷處理。這種做法稱為之Batch Gradient Descent,簡稱BGD。作為演示示例只有10條數據,這是沒有問題的。
但在實際的項目中,數據集的數量可能是幾百萬幾千萬條,這時候每一步迭代的計算量就會非常的大了。
於是就有了下面兩個變種。
SGD
Stochastic Gradient Descent,簡稱SGD,這種演算法是每次從樣本集中僅僅選擇一個樣本來進行計算。很顯然,這樣做演算法在每一步的計算量一下就少了很多。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - lambda(h_ heta(x^k)-y^k)x_i^k]
當然,減少演算法計算量也是有代價的,那就是:演算法結果會強依賴於隨機取到的數據情況,這可能會導致演算法的最終結果不太令人滿意。
MBGD
以上兩種做法其實是兩個極端,一個是每次用到了所有數據,另一個是每次只用一個數據。
我們自然就會想到兩者取其中的方法:每次選擇一小部分數據進行迭代。這樣既避免了數據集過大導致每次迭代計算量過大的問題,也避免了單個數據對演算法的影響。
這種演算法稱之為Mini-batch Gradient Descent,簡稱MBGD。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=a}^{a + b}(h_ heta(x^k)-y^k)x_i^k]
當然,我們可以認為SGD是Mini-batch為1的特例。
針對上面提到的演算法變種,該如何選擇呢?
下面是Andrew Ng給出的建議:
如果樣本數量較小(例如小於等於2000),選擇BGD即可。
如果樣本數量很大,選擇 來進行MBGD,例如:64,128,256,512。
下表是 Optimization for Deep Learning 中對三種演算法的對比
方法准確性更新速度內存佔用在線學習BGD好慢高否SGD好(with annealing)快低是MBGD好中等中等是
演算法優化
式7是演算法的基本形式,在這個基礎上有很多人進行了更多的研究。接下來我們介紹幾種梯度下降演算法的優化方法。
Momentum
Momentum是動量的意思。這個演算法的思想就是藉助了動力學的模型:每次演算法的迭代會使用到上一次的速度作為依據。
演算法的公式如下:
[v^t = gamma v^{t - 1} + lambda abla f( heta) heta = heta - v_t]
對比式7可以看出,這個演算法的主要區別就是引入了,並且,每個時刻的受前一個時刻的影響。
從形式上看,動量演算法引入了變數 v 充當速度角色——它代表參數在參數空間移動的方向和速率。速度被設為負梯度的指數衰減平均。名稱動量來自物理類比,根據牛頓運動定律,負梯度是移動參數空間中粒子的力。動量在物理學上定義為質量乘以速度。在動量學習演算法中,我們假設是單位質量,因此速度向量 v 也可以看作是粒子的動量。
對於可以取值0,而是一個常量,設為0.9是一個比較好的選擇。
下圖是momentum演算法的效果對比:
對原來的演算法稍加修改就可以增加動量效果:
def gradient_descent_with_momentum(x, y):
t0 = 10
t1 = 10
delta = 0.001
v0 = 0
v1 = 0
gamma = 0.9
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
v0 = gamma * v0 + 2 * learning_rate * sum1 / len(x)
v1 = gamma * v1 + 2 * learning_rate * sum2 / len(x)
t0_ = t0 - v0
t1_ = t1 - v1
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
以下是該演算法的輸出:
Times: 125, gradient: [4.955453758569991, 2.000005017897775]
Times: 126, gradient: [4.955309381126545, 1.9956928964532015]
Times: 127, gradient: [4.9542964317327005, 1.9855674828684156]
Times: 128, gradient: [4.9536358220657, 1.9781180992510465]
Times: 129, gradient: [4.95412496254411, 1.9788858350530971]
Gradient descent finish
從結果可以看出,改進的演算法只用了129次迭代就收斂了。速度比原來660次快了很多。
同樣的,我們可以把演算法計算的過程做成動態圖:
對比原始的演算法過程可以看出,改進演算法最大的區別是:在尋找目標值時會在最終結果上下跳動,但是越往後跳動的幅度越小,這也就是動量所產生的效果。
Learning Rate 優化
至此,你可能還是好奇該如何設定學習率的值。
事實上,這個值的選取需要一定的經驗或者反復嘗試才能確定。
關鍵在於,這個值的選取不能過大也不能過小。
如果這個值過小,會導致每一次迭代的步長很小,其結果就是演算法需要迭代非常多的次數。
那麼,如果這個值過大會怎麼樣呢?其結果就是:演算法可能在結果的周圍來回震盪,卻落不到目標的點上。下面這幅圖描述了這個現象:
事實上,學習率的取值未必一定要是一個常數,關於這個值的設定有很多的研究。
下面是比較常見的一些改進演算法。
AdaGrad
AdaGrad是Adaptive Gradient的簡寫,該演算法會為每個參數設定不同的學習率。它使用歷史梯度的平方和作為基礎來進行計算。
其演算法公式如下:
[ heta_i = heta_i - frac{lambda}{sqrt{G_t + epsilon}} abla f( heta)]
對比式7,這里的改動就在於分號下面的根號。
根號中有兩個符號,第二個符號比較好理解,它就是為了避免除0而人為引入的一個很小的常數,例如可以設為:0.001。
第一個符號的表達式展開如下:
[G_t = sum_{i = 1}^{t} abla f( heta){i} abla f( heta){i}^{T}]
這個值其實是歷史中每次梯度的平方的累加和。
AdaGrad演算法能夠在訓練中自動的對learning rate進行調整,對於出現頻率較低參數採用較大的學習率;相反,對於出現頻率較高的參數採用較小的學習率。因此,Adagrad非常適合處理稀疏數據。
但該演算法的缺點是它可能導致學習率非常小以至於演算法收斂非常的慢。
關於這個演算法的直觀解釋可以看李宏毅教授的視頻課程:ML Lecture 3-1: Gradient Descent。
RMSProp
RMS是Root Mean Square的簡寫。RMSProp是AI教父Geoff Hinton提出的一種自適應學習率方法。AdaGrad會累加之前所有的梯度平方,而RMSProp僅僅是計算對應的平均值,因此可緩解Adagrad演算法學習率下降較快的問題。
該演算法的公式如下:
[E[ abla f( heta_{i})^2]^{t} = gamma E[ abla f( heta_{i})^2]^{t - 1} + (1-gamma)( abla f( heta_{i})^{t})^{2} heta_i = heta_i - frac{lambda}{sqrt{E[g^2]^{t+1} + epsilon}} abla f( heta_{i})]
類似的,是為了避免除0而引入。 是衰退參數,通常設為0.9。
這里的 是t時刻梯度平方的平均值。
Adam
Adam是Adaptive Moment Estimation的簡寫。它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。
Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定范圍,使得參數比較平穩。
該演算法公式如下:
[m^{t} = eta_{1} m^{t-1} + (1-eta_{1}) abla f( heta) v^{t} = eta_{2} v^{t-1} + (1-eta_{2}) abla f( heta)^2 widehat{m}^{t} = frac{m^{t}}{1 - eta^{t}_1} widehat{v}^{t} = frac{v^{t}}{1 - eta^{t}_2} heta = heta - frac{lambda}{sqrt{widehat{v}^{t}} + epsilon}widehat{m}^{t}]
,分別是對梯度的一階矩估計和二階矩估計。, 是對,的校正,這樣可以近似為對期望的無偏估計。
Adam演算法的提出者建議 默認值為0.9,默認值為0.999,默認值為 。
在實際應用中 ,Adam較為常用,它可以比較快地得到一個預估結果。
優化小結
這里我們列舉了幾種優化演算法。它們很難說哪種最好,不同的演算法適合於不同的場景。在實際的工程中,可能需要逐個嘗試一下才能確定選擇哪一個,這個過程也是目前現階段AI項目要經歷的工序之一。
實際上,該方面的研究遠不止於此,如果有興趣,可以繼續閱讀 《Sebastian Ruder: An overview of gradient descent optimization algorithms》 這篇論文或者 Optimization for Deep Learning 這個Slides進行更多的研究。
由於篇幅所限,這里不再繼續展開了。
演算法限制
梯度下降演算法存在一定的限制。首先,它要求函數必須是可微分的,對於不可微的函數,無法使用這種方法。
除此之外,在某些情況下,使用梯度下降演算法在接近極值點的時候可能收斂速度很慢,或者產生Z字形的震盪。這一點需要通過調整學習率來迴避。
另外,梯度下降還會遇到下面兩類問題。
局部最小值
局部最小值(Local Minima)指的是,我們找到的最小值僅僅是一個區域內的最小值,而並非全局的。由於演算法的起點是隨意取的,以下面這個圖形為例,我們很容易落到局部最小值的點裡面。
這就是好像你從上頂往下走,你第一次走到的平台未必是山腳,它有可能只是半山腰的一個平台的而已。
演算法的起點決定了演算法收斂的速度以及是否會落到局部最小值上。
壞消息是,目前似乎沒有特別好的方法來確定選取那個點作為起點是比較好的,這就有一點看運氣的成分了。多次嘗試不同的隨機點或許是一個比較好的方法,這也就是為什麼做演算法的優化這項工作是特別消耗時間的了。
但好消息是:
對於凸函數或者凹函數來說,不存在局部極值的問題。其局部極值一定是全局極值。
最近的一些研究表明,某些局部極值並沒有想像中的那麼糟糕,它們已經非常的接近全局極值所帶來的結果了。
鞍點
除了Local Minima,在梯度下降的過程中,還有可能遇到另外一種情況,即:鞍點(Saddle Point)。鞍點指的是我們找到點某個點確實是梯度為0,但它卻不是函數的極值,它的周圍既有比它小的值,也有比它大的值。這就好像馬鞍一樣。
如下圖所示:
多類隨機函數表現出以下性質:在低維空間中,局部極值很普遍。但在高維空間中,局部極值比較少見,而鞍點則很常見。
不過對於鞍點,可以通過數學方法Hessian矩陣來確定。關於這點,這里就不再展開了,有興趣的讀者可以以這里提供的幾個鏈接繼續探索。
參考資料與推薦讀物
Wikipeida: Gradient descent
Sebastian Ruder: An overview of gradient descent optimization algorithms
吳恩達:機器學習
吳恩達:深度學習
Peter Flach:機器學習
李宏毅 - ML Lecture 3-1: Gradient Descent
PDF: 李宏毅 - Gradient Descent
Intro to optimization in deep learning: Gradient Descent
Intro to optimization in deep learning: Momentum, RMSProp and Adam
Stochastic Gradient Descent – Mini-batch and more
劉建平Pinard - 梯度下降(Gradient Descent)小結
多元函數的偏導數、方向導數、梯度以及微分之間的關系思考
[Machine Learning] 梯度下降法的三種形式BGD、SGD以及MBGD
『玖』 機器學習是什麼
提起機器學習,我們不得不給機器學習下一個准確的定義。在直觀的層面,如果說計算機科學是研究關於演算法的科學,那麼機器學習就是研究關於「學習演算法」的科學,或者說,不同於一般的顯式編程,機器學習就是研究如何使得計算機在無法被顯式編程的情況下進行學習的領域,需要注意的是,顯式與否都是對於人類而言的——人類能否明確的搞清楚每個決策步驟,對於計算機而言,構成不同演算法的代碼與指令沒有任何區別。
更加精確的說,機器學習的定義如下:
A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.
一個(機器學習)的程序就是可以從經驗數據E中對任務T進行學習的演算法,它在任務T上的性能度量P會隨著對於經驗數據E的學習而變得更好
由於機器學習必然利用了某些經驗,它們常常數據的形式存在,我們稱之為數據集,其中的每個數據稱為記錄。例如我們通過一個人的性別、年齡和身高預測他是否患某種常見疾病,有以下數據:
(性別:男;年齡:18;身高:174;是否得病:否)
(性別:女;年齡:17;身高:164;是否得病:是)
(性別:男;年齡:20;身高:181;是否得病:是)
(性別:女;年齡:16;身高:161;是否得病:是) ……
這可以被稱為一個數據集,其中每個人的數據稱為記錄。在記錄中,關於該對象的描述型數據稱為屬性,由於屬性往往有很多個——如上文的年齡,身高等,可以構成屬性向量,這些向量張成的空間稱為屬性空間。而我們的演算法需要預測那個量被稱為標記(label)——在上文中便是「得病與否」。在有的數據集中存在標記,有的不存在。標記構成的空間稱為標記空間,也稱為輸出空間。
顯然,由於我們只能得到整個總體數據的一部分——即訓練樣本,我們程序得到的模型卻不能只適應於這個訓練樣本,它寬孫必須對整個總體數據都有比較好的預測效果。這就是說我們的模型必須具有泛化的能力。
我們訓練得到棚梁的模型稱為一個假設,所有的模型一起構成了假設空間。顯然,可能有多種假設空間和訓練數據一致——就好像對於一個知識點很少的課堂學習,有不少人能得到很高的分數,但是對於整個總體數據,學習的不同模型顯然效果差別很大——真正考驗很多難的知識點的考試,考驗把上述表面上的學霸分開。
每個假設——也就是訓練的模型,必然有其歸納偏好,也就是說,在訓練集中沒有見過的情況,或者兩者皆可的情況,模型會選擇哪種。歸納偏好是模型進行泛化鏈巧運的能力基礎。
『拾』 關於機器學習應用不得不思考哪些問題
機器學習是一種能夠賦予機器學習的能力以此讓它完成直接編程無法完成的功能的方法。但從實踐的意義上來說,機器學習是一種通過利用數據,訓練出模型,然後使用模型預測的一種方法。
讓我們具體看一個例子。
圖4房價的例子
拿國民話題的房子來說。現在我手裡有一棟房子需要售賣,我應該給它標上多大的價格?房子的面積是100平方米,價格是100萬,120萬,還是140萬?
很顯然,我希望獲得房價與面積的某種規律。那麼我該如何獲得這個規律?用報紙上的房價平均數據么?還是參考別人面積相似的?無論哪種,似乎都並不是太靠譜。
我現在希望獲得一個合理的,並且能夠最大程度的反映面積與房價關系的規律。於是我調查了周邊與我房型類似的一些房子,獲得一組數據。這組數據中包含了大大小小房子的面積與價格,如果我能從這組數據中找出面積與價格的規律,那麼我就可以得出房子的價格。
對規律的尋找很簡單,擬合出一條直線,讓它「穿過」所有的點,並且與各個點的距離盡可能的小。
通過這條直線,我獲得了一個能夠最佳反映房價與面積規律的規律。這條直線同時也是一個下式所表明的函數:房價=面積*a+b
上述中的a、b都是直線的參數。獲得這些參數以後,我就可以計算出房子的價格。
假設a=0.75,b=50,則房價=100*0.75+50=125萬。這個結果與我前面所列的100萬,120萬,140萬都不一樣。由於這條直線綜合考慮了大部分的情況,因此從「統計」意義上來說,這是一個最合理的預測。
在求解過程中透露出了兩個信息:
1.房價模型是根據擬合的函數類型決定的。如果是直線,那麼擬合出的就是直線方程。如果是其他類型的線,例如拋物線,那麼擬合出的就是拋物線方程。機器學習有眾多演算法,一些強力演算法可以擬合出復雜的非線性模型,用來反映一些不是直線所能表達的情況。
2.如果我的數據越多,我的模型就越能夠考慮到越多的情況,由此對於新情況的預測效果可能就越好。這是機器學習界「數據為王」思想的一個體現。一般來說(不是絕對),數據越多,最後機器學習生成的模型預測的效果越好。
通過我擬合直線的過程,我們可以對機器學習過程做一個完整的回顧。首先,我們需要在計算機中存儲歷史的數據。接著,我們將這些數據通過機器學習演算法進行處理,這個過程在機器學習中叫做「訓練」,處理的結果可以被我們用來對新的數據進行預測,這個結果一般稱之為「模型」。對新數據的預測過程在機器學習中叫做「預測」。「訓練」與「預測」是機器學習的兩個過程,「模型」則是過程的中間輸出結果,「訓練」產生「模型」,「模型」指導「預測」。