BAT機器學習面試1000題系列(21-30題)
21.請大致對比下plsa和LDA的區別
pLSA中,主題分布和詞分布確定後,以一定的概率(
、
)分別選取具體的主題和詞項,生成好文檔。而後根據生成好的文檔反推其主題分布、詞分布時,最終用EM演算法(極大似然估計思想)求解出了兩個未知但固定的參數的值:
(由
轉換而來)和
(由
轉換而來)。
文檔d產生主題z的概率,主題z產生單詞w的概率都是兩個固定的值。
舉個文檔d產生主題z的例子。給定一篇文檔d,主題分布是一定的,比如{ P(zi|d), i = 1,2,3 }可能就是{0.4,0.5,0.1},表示z1、z2、z3,這3個主題被文檔d選中的概率都是個固定的值:P(z1|d) = 0.4、P(z2|d) = 0.5、P(z3|d) = 0.1,如下圖所示(圖截取自沈博PPT上):
但在貝葉斯框架下的LDA中,我們不再認為主題分布(各個主題在文檔中出現的概率分布)和詞分布(各個詞語在某個主題下出現的概率分布)是唯一確定的(而是隨機變數),而是有很多種可能。但一篇文檔總得對應一個主題分布和一個詞分布吧,怎麼辦呢?LDA為它們弄了兩個Dirichlet先驗參數,這個Dirichlet先驗為某篇文檔隨機抽取出某個主題分布和詞分布。
文檔d產生主題z(準確的說,其實是Dirichlet先驗為文檔d生成主題分布Θ,然後根據主題分布Θ產生主題z)的概率,主題z產生單詞w的概率都不再是某兩個確定的值,而是隨機變數。
還是再次舉下文檔d具體產生主題z的例子。給定一篇文檔d,現在有多個主題z1、z2、z3,它們的主題分布{ P(zi|d), i = 1,2,3 }可能是{0.4,0.5,0.1},也可能是{0.2,0.2,0.6},即這些主題被d選中的概率都不再認為是確定的值,可能是P(z1|d) = 0.4、P(z2|d) = 0.5、P(z3|d) = 0.1,也有可能是P(z1|d) = 0.2、P(z2|d) = 0.2、P(z3|d) = 0.6等等,而主題分布到底是哪個取值集合我們不確定(為什麼?這就是貝葉斯派的核心思想,把未知參數當作是隨機變數,不再認為是某一個確定的值),但其先驗分布是dirichlet 分布,所以可以從無窮多個主題分布中按照dirichlet 先驗隨機抽取出某個主題分布出來。如下圖所示(圖截取自沈博PPT上):
換言之,LDA在pLSA的基礎上給這兩參數(
、
)加了兩個先驗分布的參數(貝葉斯化):一個主題分布的先驗分布Dirichlet分布
,和一個詞語分布的先驗分布Dirichlet分布
。
綜上,LDA真的只是pLSA的貝葉斯版本,文檔生成後,兩者都要根據文檔去推斷其主題分布和詞語分布,只是用的參數推斷方法不同,在pLSA中用極大似然估計的思想去推斷兩未知的固定參數,而LDA則把這兩參數弄成隨機變數,且加入dirichlet先驗。
更多請參見:http://blog.csdn.net/v_july_v/article/details/41209515
22.請簡要說說EM演算法
@tornadomeet,本題解析來源:http://www.cnblogs.com/tornadomeet/p/3395593.html
有時候因為樣本的產生和隱含變數有關(隱含變數是不能觀察的),而求模型的參數時一般採用最大似然估計,由於含有了隱含變數,所以對似然函數參數求導是求不出來的,這時可以採用EM演算法來求模型的參數的(對應模型參數個數可能有多個),EM演算法一般分為2步:E步:選取一組參數,求出在該參數下隱含變數的條件概率值;
M步:結合E步求出的隱含變數條件概率,求出似然函數下界函數(本質上是某個期望函數)的最大值。
重複上面2步直至收斂。
公式如下所示:
M步公式中下界函數的推導過程:
EM演算法一個常見的例子就是GMM模型,每個樣本都有可能由k個高斯產生,只不過由每個高斯產生的概率不同而已,因此每個樣本都有對應的高斯分布(k個中的某一個),此時的隱含變數就是每個樣本對應的某個高斯分布。
GMM的E步公式如下(計算每個樣本對應每個高斯的概率):
更具體的計算公式為:
M步公式如下(計算每個高斯的比重,均值,方差這3個參數):
23.KNN中的K如何選取的? 關於什麼是KNN,可以查看此文:http://blog.csdn.net/v_july_v/article/details/8203674。KNN中的K值選取對K近鄰演算法的結果會產生重大影響。如李航博士的一書「統計學習方法」上所說:
1.如果選擇較小的K值,就相當於用較小的領域中的訓練實例進行預測,「學習」近似誤差會減小,只有與輸入實例較近或相似的訓練實例才會對預測結果起作用,與此同時帶來的問題是「學習」的估計誤差會增大,換句話說,K值的減小就意味著整體模型變得複雜,容易發生過擬合;
2.如果選擇較大的K值,就相當於用較大領域中的訓練實例進行預測,其優點是可以減少學習的估計誤差,但缺點是學習的近似誤差會增大。這時候,與輸入實例較遠(不相似的)訓練實例也會對預測器作用,使預測發生錯誤,且K值的增大就意味著整體的模型變得簡單。
3.K=N,則完全不足取,因為此時無論輸入實例是什麼,都只是簡單的預測它屬於在訓練實例中最多的累,模型過於簡單,忽略了訓練實例中大量有用信息。
在實際應用中,K值一般取一個比較小的數值,例如採用交叉驗證法(簡單來說,就是一部分樣本做訓練集,一部分做測試集)來選擇最優的K值。
24.防止過擬合的方法
過擬合的原因是演算法的學習能力過強;一些假設條件(如樣本獨立同分布)可能是不成立的;訓練樣本過少不能對整個空間進行分布估計。
處理方法有:- a.早停止:如在訓練中多次迭代後發現模型性能沒有顯著提高就停止訓練
- b.數據集擴增:原有數據增加、原有數據加隨機雜訊、重採樣
- c.正則化
- d.交叉驗證
- e.特徵選擇/特徵降維
25.機器學習中,為何要經常對數據做歸一化
@zhanlijun,本題解析來源:http://www.cnblogs.com/LBSer/p/4440590.html
機器學習模型被互聯網行業廣泛應用,如排序(參見http://www.cnblogs.com/LBSer/p/4439542.html)、推薦、反作弊、定位(參見http://www.cnblogs.com/LBSer/p/4020370.html)等。一般做機器學習應用的時候大部分時間是花費在特徵處理上,其中很關鍵的一步就是對特徵數據進行歸一化,為什麼要歸一化呢?很多同學並未搞清楚,維基百科給出的解釋:1)歸一化後加快了梯度下降求最優解的速度;2)歸一化有可能提高精度。下面再簡單擴展解釋下這兩點。
1) 歸一化為什麼能提高梯度下降法求解最優解的速度?
斯坦福機器學習視頻做了很好的解釋:https://class.coursera.org/ml-003/lecture/21
如下圖所示,藍色的圈圈圖代表的是兩個特徵的等高線。其中左圖兩個特徵X1和X2的區間相差非常大,X1區間是[0,2000],X2區間是[1,5],其所形成的等高線非常尖。當使用梯度下降法尋求最優解時,很有可能走「之字型」路線(垂直等高線走),從而導致需要迭代很多次才能收斂;
而右圖對兩個原始特徵進行了歸一化,其對應的等高線顯得很圓,在梯度下降進行求解時能較快的收斂。
因此如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂。
2) 歸一化有可能提高精度
一些分類器需要計算樣本之間的距離(如歐氏距離),例如KNN。如果一個特徵值域範圍非常大,那麼距離計算就主要取決於這個特徵,從而與實際情況相悖(比如這時實際情況是值域範圍小的特徵更重要)。
3) 歸一化的類型
a. 線性歸一化
這種歸一化方法比較適用在數值比較集中的情況。這種方法有個缺陷,如果max和min不穩定,很容易使得歸一化結果不穩定,使得後續使用效果也不穩定。實際使用中可以用經驗常量值來替代max和min。
b. 標準差標準化
經過處理的數據符合標準正態分布,即均值為0,標準差為1,其轉化函數為:
其中μ為所有樣本數據的均值,σ為所有樣本數據的標準差。
c.非線性歸一化
經常用在數據分化比較大的場景,有些數值很大,有些很小。通過一些數學函數,將原始值進行映射。該方法包括 log、指數,正切等。需要根據數據分布的情況,決定非線性函數的曲線,比如log(V, 2)還是log(V, 10)等。
26.談談深度學習中的歸一化問題
詳情參見此視頻:http://www.julyedu.com/video/play/69/686
27.哪些機器學習演算法不需要做歸一化處理? 概率模型不需要歸一化,因為它們不關心變數的值,而是關心變數的分布和變數之間的條件概率,如決策樹、rf。而像adaboost、svm、lr、KNN、KMeans之類的最優化問題就需要歸一化。
@管博士:我理解歸一化和標準化主要是為了使計算更方便 比如兩個變數的量綱不同 可能一個的數值遠大於另一個那麼他們同時作為變數的時候 可能會造成數值計算的問題,比如說求矩陣的逆可能很不精確 或者梯度下降法的收斂比較困難,還有如果需要計算歐式距離的話可能 量綱也需要調整 所以我估計lr 和 knn 保準話一下應該有好處。至於其他的演算法 我也覺得如果變數量綱差距很大的話 先標準化一下會有好處。 @寒小陽:一般我習慣說樹形模型,這裡說的概率模型可能是差不多的意思。28.對於樹形結構為什麼不需要歸一化? 數值縮放,不影響分裂點位置。因為第一步都是按照特徵值進行排序的,排序的順序不變,那麼所屬的分支以及分裂點就不會有不同。對於線性模型,比如說LR,我有兩個特徵,一個是(0,1)的,一個是(0,10000)的,這樣運用梯度下降時候,損失等高線是一個橢圓的形狀,這樣我想迭代到最優點,就需要很多次迭代,但是如果進行了歸一化,那麼等高線就是圓形的,那麼SGD就會往原點迭代,需要的迭代次數較少。
另外,注意樹模型是不能進行梯度下降的,因為樹模型是階躍的,階躍點是不可導的,並且求導沒意義,所以樹模型(回歸樹)尋找最優點事通過尋找最優分裂點完成的。29.數據歸一化(或者標準化,注意歸一化和標準化不同)的原因 @我愛大泡泡,來源:http://blog.csdn.net/woaidapaopao/article/details/77806273
要強調:能不歸一化最好不歸一化,之所以進行數據歸一化是因為各維度的量綱不相同。而且需要看情況進行歸一化。有些模型在各維度進行了不均勻的伸縮後,最優解與原來不等價(如SVM)需要歸一化。
有些模型伸縮有與原來等價,如:LR則不用歸一化,但是實際中往往通過迭代求解模型參數,如果目標函數太扁(想像一下很扁的高斯模型)迭代演算法會發生不收斂的情況,所以最壞進行數據歸一化。
補充:其實本質是由於loss函數不同造成的,SVM用了歐拉距離,如果一個特徵很大就會把其他的維度dominated。而LR可以通過權重調整使得損失函數不變。
30.請簡要說說一個完整機器學習項目的流程 @寒小陽、龍心塵
1 抽象成數學問題 明確問題是進行機器學習的第一步。機器學習的訓練過程通常都是一件非常耗時的事情,胡亂嘗試時間成本是非常高的。 這裡的抽象成數學問題,指的我們明確我們可以獲得什麼樣的數據,目標是一個分類還是回歸或者是聚類的問題,如果都不是的話,如果劃歸為其中的某類問題。 2 獲取數據 數據決定了機器學習結果的上限,而演算法只是儘可能逼近這個上限。 數據要有代表性,否則必然會過擬合。 而且對於分類問題,數據偏斜不能過於嚴重,不同類別的數據數量不要有數個數量級的差距。 而且還要對數據的量級有一個評估,多少個樣本,多少個特徵,可以估算出其對內存的消耗程度,判斷訓練過程中內存是否能夠放得下。如果放不下就得考慮改進演算法或者使用一些降維的技巧了。如果數據量實在太大,那就要考慮分散式了。 3 特徵預處理與特徵選擇 良好的數據要能夠提取出良好的特徵才能真正發揮效力。特徵預處理、數據清洗是很關鍵的步驟,往往能夠使得演算法的效果和性能得到顯著提高。歸一化、離散化、因子化、缺失值處理、去除共線性等,數據挖掘過程中很多時間就花在它們上面。這些工作簡單可複製,收益穩定可預期,是機器學習的基礎必備步驟。 篩選出顯著特徵、摒棄非顯著特徵,需要機器學習工程師反覆理解業務。這對很多結果有決定性的影響。特徵選擇好了,非常簡單的演算法也能得出良好、穩定的結果。這需要運用特徵有效性分析的相關技術,如相關係數、卡方檢驗、平均互信息、條件熵、後驗概率、邏輯回歸權重等方法。 4 訓練模型與調優 直到這一步才用到我們上面說的演算法進行訓練。現在很多演算法都能夠封裝成黑盒供人使用。但是真正考驗水平的是調整這些演算法的(超)參數,使得結果變得更加優良。這需要我們對演算法的原理有深入的理解。理解越深入,就越能發現問題的癥結,提出良好的調優方案。 5 模型診斷 如何確定模型調優的方向與思路呢?這就需要對模型進行診斷的技術。過擬合、欠擬合 判斷是模型診斷中至關重要的一步。常見的方法如交叉驗證,繪製學習曲線等。過擬合的基本調優思路是增加數據量,降低模型複雜度。欠擬合的基本調優思路是提高特徵數量和質量,增加模型複雜度。 誤差分析 也是機器學習至關重要的步驟。通過觀察誤差樣本,全面分析誤差產生誤差的原因:是參數的問題還是演算法選擇的問題,是特徵的問題還是數據本身的問題……診斷後的模型需要進行調優,調優後的新模型需要重新進行診斷,這是一個反覆迭代不斷逼近的過程,需要不斷地嘗試, 進而達到最優狀態。 6 模型融合 一般來說,模型融合後都能使得效果有一定提升。而且效果很好。工程上,主要提升演算法準確度的方法是分別在模型的前端(特徵清洗和預處理,不同的採樣模式)與後端(模型融合)上下功夫。因為他們比較標準可複製,效果比較穩定。而直接調參的工作不會很多,畢竟大量數據訓練起來太慢了,而且效果難以保證。 7 上線運行 這一部分內容主要跟工程實現的相關性比較大。工程上是結果導向,模型在線上運行的效果直接決定模型的成敗。 不單純包括其準確程度、誤差等情況,還包括其運行的速度(時間複雜度)、資源消耗程度(空間複雜度)、穩定性是否可接受。 這些工作流程主要是工程實踐上總結出的一些經驗。並不是每個項目都包含完整的一個流程。這裡的部分只是一個指導性的說明,只有大家自己多實踐,多積累項目經驗,才會有自己更深刻的認識。 故,基於此,七月在線每一期ML演算法班都特此增加特徵工程、模型調優等相關課。比如,這裡有個公開課視頻http://www.julyedu.com/video/play/18/186推薦閱讀:
※面試結束時,面試官問是否有問題向他諮詢,這時候該問些什麼?
※面試中最常見的27個問題,這裡有一份最全的回答指南
※怎麼看待程序員普遍缺乏數據結構和演算法的知識?
※如何面試運營這個職位能得到面試官的賞識呢?