機器學習系統設計
第九十三課:確定執行的優先級
當你在設計復雜的機器學習系統時所面臨的主要問題,并會在如何制定一個復雜的機器學習系統方面給出一些建議!
首先,在實際工過程中,我們應該優先處理哪些事情?
如何通過監督學習的方法來構造一個分類器,區分垃圾郵件和非垃圾郵件呢?
選擇單詞作為特征,單詞是否出現就組成了特征向量組!
如何在有限的時間內,讓你的垃圾郵件分類器具有高精準度和低錯誤率?
1.一種很容易想到的就是收集大量數據,數據收集的越多,分類就越準確。
2.用更復雜的特征變量來描述郵件,例如郵件人標題。
3.關注郵件的主體部分并構建更復雜的特征
...
有些時候花時間去研究這些方法那個更有效是徒勞的,所以有的人最后就干脆隨機決定使用哪種方法。
如何更加系統的選擇一種方式來增加算法的成功率呢?
第九十四課:誤差分析
它能幫助你更系統的在眾多方法中作出選擇。
如果你準備從事研發機器學習產品,或者開發機器學習應用。通常來說,最好的辦法,不是建立一個很復雜的有許多復雜特征的系統,而是通過一個簡單的算法來快速實現它。每當我開始一個機器學習問題時,我最多只會花一天時間,把這個項目簡單粗暴的做出來,而不是設計一個很復雜的系統。即使這個速成的東西不是很完美,但是通過交叉驗證集來測試數據,做完這些以后,你就能畫出相應學習曲線,通過畫出的學習曲線以及檢驗誤差,來找出你的算法是否存在高偏差或者高方差的問題。作出這些分析以后,再來決定是否使用更多的數據或者特征等等。因為你并不能驗證你是需要更多的特征還是需要更多的數據,在缺乏各種數據的前提下,你很難提前知道這些,因為你沒有畫出學習曲線。所以應當先進行一次簡單快速的實現,然后畫出學習曲線來幫助你進行之后的判斷。你要避免出現過早優化的問題,這種思想告訴我們,我們應當用實際的證據來指導我們的決策,來決定把時間花在哪里而不是憑直覺?
除了繪制學習曲線還有一件非常有用的事,就是誤差分析。通過觀察交叉驗證集的情況,然后看一看那些被算法錯誤分類的文件有什么共同的規律和特征。這樣就可以啟發你應該設計怎么樣的新特征,或是告訴你現在的算法有什么優點和缺點,然后指導你想出辦法來改進它。
舉個具體地例子:
對出現錯誤分類的例子進行總結和應對,手動誤差分析。可以快速找到算法的不足和難以處理的樣本類型,然后集中精力在它們上面。
另一個技巧是保證自己對學習算法有一種數值估計的方法。當你改進學習算法的時候,如果你的算法能夠返回一個數值評價指標來估計算法執行的效果將會很有幫助。可能算法是準確的,也有可能是錯誤的。但是這個數字能告訴你,你的學習算法效果有多好。
錯誤率數值變化,對這個特定的問題,這個很自然的單一規則的數值評價指標叫做交叉驗證錯誤率。它能更快的幫你決定是否使用詞干提取器軟件!
強烈推薦在交叉驗證集上做誤差分析,而不是在測試集上。
第九十五課:不對稱性分類的誤差評估
誤差分析以及設定誤差度量值非常重要,設定某個實數來評估你的學習算法并衡量它的表現,有了算法的評估和誤差度量值,有一件重要的事情需要注意:就是使用一個合適的誤差度量值有時會對你的學習算法造成非常微妙的影響。這個重要的問題就是偏斜類問題。
正例和負例的比率非常接近于一個極端情況,例子中正樣本的數量與負樣本的數量相比非常非常少,我們把這種情況叫做偏斜類。一個類中的樣本數與另一個類的數據相比多很多。因此使用分類誤差或者分類精確度來作為評估度量可能會產生問題。
因此當出現偏斜類問題時,我們希望有一個不同的誤差度量值或者不同的評估度量值,其中一種誤差度量值叫做查準率和召回率。
查準率和召回率越高越好。通過查準率和召回率我們可以知道分類模型到底好不好。總的來說,即使我們有一個非常偏斜的類,算法也不能夠欺騙我們,僅僅通過預測y總是等于0或者1,它沒辦法得到高的查準率和高的召回率。因此我們能夠肯定擁有高查準率和高召回率的模型是一個好的分類模型。這給予了我們一個更好的評估值,就更直接的方法來評估模型的好壞。
最后記住一件事,在查準率和召回率的定義中,我們總是習慣性的用y = 1,如果這個類出現的非常少,因此如果我們試圖檢測某種稀少的情況,比如患癌癥的概率,我們會把查準率和召回率定義為y = 1。
第九十六課:精確度和召回率的權衡
查準率和召回率作為算法評估度量值更有效方式?
取決于你要什么!
有沒有辦法自動選擇臨界值?
平均值貌似不是一個好主意。F值可以檢測,是因為它要求兩者都需要很大。
通過變動臨界值,你可以控制權衡查準率和召回率,通過F值權衡給你一個評估度量值。
第九十八課:機器學習數據
機器學習系統設計中被訓練的數據有多少?
在有些條件下,得到大量的數據并在某種類型的學習算法中進行訓練,可以是一種有效的方法來獲得一個具有良好性能的學習算法。這種情況往往出現在這些條件對你的問題都成立,并且你能夠得到大量的數據的情況下。這可以是一個很好的方式來獲得非常高性能的學習算法。
并不是擁有最好算法的人能成功,而是擁有最多數據的人能成功。
給定一個輸入特征向量x,給定這些特征值,也給定了相同的可用的信息和學習算法,加入我們去人類專家這個領域,一個人類學家能夠準確或自信的預測出y值么?
假設特征值有足夠的信息來預測y值,假設我們使用一種需要大量參數的學習算法,也許是有很多特征值的邏輯回歸或線性回歸。實際上是在利用許多隱藏單元的神經網絡,它們有很復雜的參數,這些參數可以擬合非常復雜的函數,低偏差算法,我們能夠擬合非常復雜的函數,而且因為我們有非常強大的學習算法,如果我們用數據訓練這些算法,它能很好的擬合訓練集,訓練誤差就會很低。如果訓練集比參數的數量更多,那么這些算法就不太可能會過度擬合。綜合測試集的誤差也會很小。
關鍵的假設是:特征值有足夠的信息量,有一類很好的函數,這是為什么能保證低誤差的關鍵所在,它有大量的訓練數據集,這能保證得到更多的方差值。
如果你有大量的數據,而且你訓練了一種帶有很多參數的學習算法,那么這將會是一個很好的方式來提供一個高性能學習算法。
支持向量機
第一百零一課:優化目標
在監督學習中,很多監督學習算法的性能都非常相似,所以經常要考慮的東西,不是選擇算法,而是更多的去考慮,你構建這些算法時所使用的數據量,這就體現了你使用這些算法的技巧。
特征選擇
正則化參數的選擇
..
支持向量機(SVM),更清晰更強大的算法。
優化目標:
從logistic回歸開始,看看如何作一些小小的改動來得到一個支持向量機。
考慮單獨一項對logistic回歸總體代價函數的貢獻:
畫一條直線,它和logistic代價函數的曲線非常相似,兩端直線組成。它的效果將和logistic回歸非常相似,但是支持向量機將擁有計算上的優勢,并且使得之后的優化問題變得簡單,更容易解決。
有了定義以后,構建支持向量機:
和logistic回歸控制權衡的方式不同,在A前面加上系數C,這是一種不同的參數設置方法,來決定我們是更關心第一項的優化還是第二項的優化,
和logistic回歸不同的是,SVM并不會輸出概率,相對的我們得到的是通過優化這個代價函數,得到一個參數θ,支持向量機所做的是進行了一個直接的預測,預測y = 0/1。這就是支持向量機的假設函數形式:
接下來更直觀的角度看一下支持向量機的優化目標是什么,以及SVM學到的假設函數會是什么樣的?如何進行一些修改以便學習更加復雜的非線性函數?
第一百零二課:直觀上對大間隔的理解
支持向量機:大間距分類器,如何通過直觀的圖像理解SVM假設?
性質:如果你有一個正樣本,比如y = 1,我們只需要使θ的轉置乘以x大于等于0就能正確的進行分類。如果你有一個負樣本,比如y = 0,我們只需要使θ的轉置乘以x小于0就能正確的進行分類。但是支持向量機不是恰好能正確分類就行了,我們需要的是比0/1大很多。這就相當于在SVM中構建了一個安全因子,一個安全間距。在支持向量機中,這個因子會產生什么影響?
當C是一個非常大的數時:
因此你會得到一個很有趣的決策邊界:
黑線看起來是更穩健的決策邊界,能更好的分開正樣本和負樣本。從數學上說,黑色直線擁有更大的距離,這個距離叫做間距,它和訓練樣本的最小距離要更大一些。
支持向量機的間距,這使得支持向量機具有魯棒性。因為它在分離數據時,會盡量用大的間距去分離,因此有時被稱為大間距分類器。
為什么這個優化問題能得到這個大間距分類器?
此外,當你使用大間距分類器的時候,這時你的學習算法對異常點會很敏感。黑線變成粉紅線,這是C非常大的情況。如果c不是非常大,那么會變回黑線(忽略異常點)。
正則化參數的權衡?
第一百零三課:大間隔分類器的數學原理
支持向量機的優化問題和大間距分類器之間的聯系?
用向量內積的形式嘗試理解支持向量機的優化目標函數。
對優化目標函數來說,支持向量機做的就是最小化參數向量θ的范數的平法,或者說是長度的平方。
參數向量θ事實上是與決策邊界90度正交的,令θ = 0,那么決策邊界必須過原點。
支持向量機優化目標函數最終會找到大間距分類器:試圖最大化這些p^(i)的范數,也就是訓練樣本到決策邊界的距離。
第一百零四課:核函數
改造向量機算法來構建復雜的非線性分類器,主要的技巧就是被稱為“核”的東西。核函數是什么以及如何使用它?
對于計算機視覺,輸入是一個由大量像素組成的圖像,我們也見到了高階的多項式,運算量將是非常大的,因為有很多高階多項式,我們是否有不同的或者是更好的特征的選擇,我們可以用來嵌入到假設函數中,有一個可以構造新特征f1、f2、f3的方法:
引入相似度度量similarity,相似度函數similarity就是一個核函數(高斯核函數)。
k(x, l(i))
核函數到底做了什么?
給定一個訓練樣本x,我們可以計算三個新的特征f1、f2、f3(基于之前給的三個標記)。
衡量的是特征變量的值減小的速度。
上圖就是我們如何定義標記點和核函數來訓練出非常復雜的非線性決策邊界的方法。我們是如何使用核函數的呢?我們通過標記點和相似性函數來定義新的特征變量,從而訓練復雜的非線性邊界。
理解核函數的概念以及我們如何使用它在支持向量機中定義新的特征變量。但還有一些問題?其中一個是我們如何得到這些標記點?我們如何選擇標記點?相似度方程可以替代高斯函數么?
支持向量機如何通過核函數來有效的學習復雜非線性函數?
第一百零五課:核函數2
如何在實際中應用這些思想?例如,如何處理支持向量機中的偏差方差折中?
如何選擇標記點?在一些復雜的數學問題中,也許我們需要更多的標記點?
我們擁有的每一個樣本點,只需要直接使用它們,直接將訓練樣本作為標記點。即每一個標記點的位置都與每一個樣本點的位置相對應。這說明特征函數基本上實在描述每一個樣本距離與樣本集中其他樣本的距離。
給定核函數和相似度函數后,我們如何使用更簡單的支持向量機?
通過解決最小化問題,就得到了支持向量機的參數。這就是支持向量機的學習算法。
大多數支持向量機在實現的時候,其實是替換掉θTθ,用θT乘以某個矩陣M,這依賴于你采用的核函數,再乘以θ^T。這其實是另一種略有區別的距離度量方法,我們用一種略有變化的度量來取代θ的模的平方,這意味著我們最小化了一種類似的度量。這是參數向量θ的縮放版本并取決于核函數。這個數學細節,使得支持向量機能夠更有效率的運行。為什么支持向量機做這種修改,這可以使它應用更大的數量集。這個具體的實現細節,盡管略微改變了優化目標,但它主要是為了計算效率。
核函數不太好應用到線性回歸和邏輯回歸上,但是可以和支持向量機相得益彰。
你不需要知道怎么去寫一個軟件來最小化代價函數,因為你可以找到很好的軟件做這些,而應該使用人們開發的成熟的軟件包。這些軟件包已經包含了那些數值優化技巧。
另外一個問題,當你選擇使用支持向量機時,怎么選擇支持向量機中的參數?
偏差方差折中
大C:過擬合
小C:欠擬合
大σ:更平滑,高偏差低方差
大σ:不平滑,低偏差高方差
第一百零六課:使用SVM
為了運行或者運用SVM,你實際上所需要的一些東西?
特別優化問題,不要自己寫代碼求解參數θ...只需要調用相關庫函數實現相應功能。
你需要:
1.參數C的選擇
2.選擇內核函數或你想要使用的相似函數(沒有核函數,即線性核函數,標準的線性分類器)
為什么會選擇使用線性核函數?
如果你有大量的特征,n很大,且m即訓練的樣本數很小,那么你有大量的特征,卻只有很少的訓練數集,那么你只想擬合一個線性的判定邊界,而不去擬合一個非常復雜的非線性函數,因為沒有足夠的數據, 你可能會過度擬合。例如,在一個非常高維的特征空間中嘗試擬合非常復雜的函數,但是如果你的訓練集樣本很小的話,這將變成一個合理的設置。
3.如果選擇高斯函數,選擇參數σ^2
什么時候選擇高斯函數?
如果你忽略了特征值x輸入R^n,如果n值很小,理想情況下,如果m值很大,那么如果我們有,比如一個二維的訓練集,那么n = 2,但是有很多的訓練數據,然后你想用核函數去擬合相當復雜非線性決策邊界,高斯核函數是一個不錯的選擇。
但是如果你決定使用高斯核函數,接下來就是需要根據使用的支持向量機軟件包,需要你實現一個核函數或者實現相似函數,因此如果你用Octave或者matlab來實現支持向量機的話,就需要你提供一個函數來計算核函數的特征值。因此對應一個i,需要計算fi,你需要做的是寫一個核函數,讓它把向量x作為輸入,把輸入作為一種標識,即將x1,x2作為輸入的軟件,并用它們來計算這個相似函數,之后返回一個實數。
因此很多SVM包需要用戶提供一個核函數,能夠實現x1,x2,并返回一個實數,從這里開始,它將自動地生成所有特征變量。自動利用特征向量x并且映射到f1,f2...一直到fm,并且生成所有特征變量,并從這開始訓練支持向量機。但是有些時候你要自己提供這個函數,如果你使用高斯核函數,一些SVM的函數實現也會包括高斯核函數以及其他的核函數。到目前為止,高斯核函數和線性核函數是最為常用的核函數。一個實現函數的注意事項,如果你有大小很不一樣的特征變量,很重要的一件事就是在使用高斯函數之前,將這些特征變量的大小按比例歸一化,就需要進一步的縮放比例,這將會保證SVM能考慮到所有不同的特征向量,而不只是像例子中這樣,房子的大小影響特別大。
警告:不是所有你可能提出來的相似函數都是有效的核函數,高斯核函數、線性核函數以及你有時可能會用到的核函數,這些函數都需要滿足一個技術條件,它叫做默塞爾定理。需要滿足這個條件的原因是因為支持向量機算法或者SVM的實現函數有許多熟練地數值優化技巧。為了有效的求解參數θ,在最初的設想里,這些決策都將我們的注意力僅僅限制在可以滿足默塞爾定理的核函數上。這個定理所做的是確保所有的SVM包,所有的SVM軟件包能夠用大類的優化方法,從而迅速得到參數θ。大多數人最后要做的是用線性核函數或者高斯函數,但是也有滿足默塞爾定理的其他核函數,我個人很少使用。
多項式核函數(常數和指數)
有字符串核函數
卡方核函數
直方相交核函數
...
最后兩個細節:
1.在多類分類中,很多SVM包中已經內置了多分類的函數,因此,如果你使用一個類似于這樣的一個模式,你只是用了這樣的函數,且應該會做的比較好。
除此之外,一個多分類的問題,可以使用one-vs-all方法,我們之前在講邏輯回歸的時候討論過,所以你要做的是訓練KSVM,如果你有k個類別,用以將每個類別從其他類別中區分開來。它會給你k參數的向量,θ1,它會嘗試從所有類別中,識別出y = 1的類別,之后θ2,識別出y = 2作為正類別,參數向量θ(k)是用于識別最后一個類別參數向量。與邏輯回歸中一對多的方法類似,在邏輯回歸中,我們是用最大的θTx來預測類別i。
多分類的范式:對大多數情況來說,無論使用,在軟件包內部已經有實現好的內置多分類函數,不用擔心。
2.我們從邏輯回歸開始創造了SVM,然后更改了一下代價函數,當你要使用兩者之一的算法時,比如n代表特征的數量,m是訓練樣本的數量。如何選擇兩者中的一個呢?
當n的值比訓練樣本個數多,有大量的特征遠大于m。那么就選擇邏輯回歸或者不帶核函數的SVM,因為如果你有比較多的特征變量,而只有相對較小的訓練集,線性函數可能會工作的很好,而且你也沒有足夠的數據來擬合非常復雜的非線性函數。
如果n很少,而m大小適中,這里的n可能是1-1000之間的任何數,那么線性核函數的SVM會工作得很好。
n很小,m很大,現在的帶有高斯函數SVM包,高斯函數的SVM運算速度會很慢,我通常會做的是手動地創建,擁有更多的特征變量,然后用邏輯回歸或者不帶核函數的支持向量機。
邏輯回歸為什么和支持向量機放到一起?
因為邏輯回歸和不帶核函數的支持向量機,它們是非常相似的算法,都會做相似的事情,并給出相似的結果。但是根據實際情況,其中一個可能會比另一個更加有效。但是隨著SVM復雜度的增加,當你使用不同的內核函數來學習復雜的非線性函數時,你特征變量的數量是相當大的,那是一個非常常見的體系,也許在這個體系里,帶有核函數的支持向量機就會表現的相當突出。
什么時候使用神經網絡?
對所有的這些問題,對于不同的設計,設計良好的神經網絡,可能會非常有效,有一個缺點或者說有時可能不會使用神經網絡的原因,對于許多這樣的問題,神經網絡訓練起來可能會特別慢,但是如果你有一個非常好的SVM實現包,可能會運行的很快,比神經網絡快很多。SVM具有的問題是一種凸優化問題,好的SVM軟件包總是會找到全局最小值或者接近它的值。對于SVM,你不需要擔心局部最優,而在神經網絡中,局部最優是一個不大不小的問題。所以這是你在使用SVM的時候不需要太去擔心的一個問題。根據你的問題,神經網絡可能會比SVM慢。
迷茫!該用什么算法???這個沒有太大關系,當我遇到機器學習問題的時候,有時它確實不清楚這是否是最好的算法,但是就如在之前視頻中看到的算法確實很重要,但是更加重要的是你有多少數據, 你有多熟練,是否擅長做誤差分析和排除學習算法,指出如何設定新的特征變量,弄明白你的學習算法輸入哪些特征,通常這些方面會比你使用邏輯回歸還是SVM這方面更加重要。
SVM仍然被廣泛認為是最強大的學習算法之一。這是一個體系,包含了一個有效的方法去學習復雜的非線性函數。實際上,邏輯回歸、神經網絡與SVM一起使用來提高學習算法,創造最新的機器學習系統作為一個非常強大的算法工具,可以應用到很多地方。
高性能的機器學習系統!