1. 程式人生 > >機器學習面試系列一

機器學習面試系列一

1.請簡要介紹下SVM

  SVM,全稱是support vector machine,中文名叫支援向量機。SVM是一個面向資料的分類演算法,它的目標是為確定一個分類超平面,從而將不同的資料分隔開。

  擴充套件:這裡有篇文章詳盡介紹了SVM的原理、推導,http://blog.csdn.net/v_july_v/article/details/7624837。

  此外,這裡有個視訊也是關於SVM的推導:http://www.julyedu.com/video/play/18/429

2.請簡要介紹下tensorflow的計算圖

  @寒小陽:Tensorflow是一個通過計算圖的形式來表述計算的程式設計系統,計算圖也叫資料流圖,可以把計算圖看做是一種有向圖,Tensorflow中的每一個計算都是計算圖上的一個節點,而節點之間的邊描述了計算之間的依賴關係。

3.在k-means或kNN,我們常用歐氏距離來計算最近的鄰居之間的距離,有時也用曼哈頓距離,請對比下這兩種距離的差別。

  歐氏距離,最常見的兩點之間或多點之間的距離表示法,又稱之為歐幾里得度量,它定義於歐幾里得空間中,如點 x = (x1,...,xn) 和 y = (y1,...,yn) 之間的距離為:

  曼哈頓距離,我們可以定義曼哈頓距離的正式意義為L1-距離或城市區塊距離,也就是在歐幾里得空間的固定直角座標系上兩點所形成的線段對軸產生的投影的距離總和。例如在平面上,座標(x1, y1)的點P1與座標(x2, y2)的點P2的曼哈頓距離為:,要注意的是,曼哈頓距離依賴座標系統的轉度,而非系統在座標軸上的平移或對映。 

  通俗來講,想象你在曼哈頓要從一個十字路口開車到另外一個十字路口,駕駛距離是兩點間的直線距離嗎?顯然不是,除非你能穿越大樓。而實際駕駛距離就是這個“曼哈頓距離”,這也是曼哈頓距離名稱的來源, 同時,曼哈頓距離也稱為城市街區距離(City Block distance)。

  另,關於各種距離的比較參看http://blog.csdn.net/v_july_v/article/details/8203674

4.百度2015校招機器學習筆試題

參見http://www.itmian4.com/thread-7042-1-1.html

5.關於LR

  @rickjin:把LR從頭到腳都給講一遍。建模,現場數學推導,每種解法的原理,正則化,LR和maxent模型啥關係,lr為啥比線性迴歸好。有不少會背答案的人,問邏輯細節就糊塗了。原理都會? 那就問工程,並行化怎麼做,有幾種並行化方式,讀過哪些開源的實現。還會,那就準備收了吧,順便逼問LR模型發展歷史。

另外,關於答案這篇文章可以做參考:

http://blog.csdn.net/cyh_24/article/details/50359055.html

http://blog.csdn.net/zouxy09/article/details/20319673

6.overfitting怎麼解決?

dropout、regularization、batch normalizatin

7.LR和SVM的聯絡與區別

@朝陽在望,聯絡:

1、LR和SVM都可以處理分類問題,且一般都用於處理線性二分類問題(在改進的情況下可以處理多分類問題) 

2、兩個方法都可以增加不同的正則化項,如l1、l2等等。所以在很多實驗中,兩種演算法的結果是很接近的。 
區別: 1、LR是引數模型,SVM是非引數模型。 
2、從目標函式來看,區別在於邏輯迴歸採用的是logistical loss,SVM採用的是hinge loss.這兩個損失函式的目的都是增加對分類影響較大的資料點的權重,減少與分類關係較小的資料點的權重。 
3、SVM的處理方法是隻考慮support vectors,也就是和分類最相關的少數點,去學習分類器。而邏輯迴歸通過非線性對映,大大減小了離分類平面較遠的點的權重,相對提升了與分類最相關的資料點的權重。 
4、邏輯迴歸相對來說模型更簡單,好理解,特別是大規模線性分類時比較方便。而SVM的理解和優化相對來說複雜一些,SVM轉化為對偶問題後,分類只需要計算與少數幾個支援向量的距離,這個在進行復雜核函式計算時優勢很明顯,能夠大大簡化模型和計算。 
5、logic 能做的 svm能做,但可能在準確率上有問題,svm能做的logic有的做不了。
來源:http://blog.csdn.net/timcompp/article/details/62237986

8.說說你知道的核函式

通常人們會從一些常用的核函式中選擇(根據問題和資料的不同,選擇不同的引數,實際上就是得到了不同的核函式),例如:

多項式核,顯然剛才我們舉的例子是這裡多項式核的一個特例(R = 1,d = 2)。雖然比較麻煩,而且沒有必要,不過這個核所對應的對映實際上是可以寫出來的,該空間的維度是,其中  是原始空間的維度。

高斯核,這個核就是最開始提到過的會將原始空間對映為無窮維空間的那個傢伙。不過,如果選得很大的話,高次特徵上的權重實際上衰減得非常快,所以實際上(數值上近似一下)相當於一個低維的子空間;反過來,如果選得很小,則可以將任意的資料對映為線性可分——當然,這並不一定是好事,因為隨之而來的可能是非常嚴重的過擬合問題。不過,總的來說,通過調控引數,高斯核實際上具有相當高的靈活性,也是使用最廣泛的核函式之一。下圖所示的例子便是把低維線性不可分的資料通過高斯核函式對映到了高維空間:

線性核,這實際上就是原始空間中的內積。這個核存在的主要目的是使得“對映後空間中的問題”和“對映前空間中的問題”兩者在形式上統一起來了(意思是說,咱們有的時候,寫程式碼,或寫公式的時候,只要寫個模板或通用表示式,然後再代入不同的核,便可以了,於此,便在形式上統一了起來,不用再分別寫一個線性的,和一個非線性的)。

9.LR與線性迴歸的區別與聯絡

@nishizhen個人感覺邏輯迴歸和線性迴歸首先都是廣義的線性迴歸,其次經典線性模型的優化目標函式是最小二乘,而邏輯迴歸則是似然函式,另外線性迴歸在整個實數域範圍內進行預測,敏感度一致,而分類範圍,需要在[0,1]。邏輯迴歸就是一種減小預測範圍,將預測值限定為[0,1]間的一種迴歸模型,因而對於這類問題來說,邏輯迴歸的魯棒性比線性迴歸的要好。

@乖乖癩皮狗:邏輯迴歸的模型本質上是一個線性迴歸模型,邏輯迴歸都是以線性迴歸為理論支援的。但線性迴歸模型無法做到sigmoid的非線性形式,sigmoid可以輕鬆處理0/1分類問題。

10.請問(決策樹、Random Forest、Booting、Adaboot)GBDT和XGBoost的區別是什麼?
關於決策樹,這裡有篇《決策樹演算法》。而隨機森林Random Forest是一個包含多個決策樹的分類器。至於AdaBoost,則是英文"Adaptive Boosting"(自適應增強)的縮寫,關於AdaBoost可以看下這篇文章《Adaboost 演算法的原理與推導》。GBDT(Gradient Boosting Decision Tree),即梯度上升決策樹演算法,相當於融合決策樹和梯度上升boosting演算法。
@Xijun LI:xgboost類似於gbdt的優化版,不論是精度還是效率上都有了提升。與gbdt相比,具體的優點有:
1.損失函式是用泰勒展式二項逼近,而不是像gbdt裡的就是一階導數
2.對樹的結構進行了正則化約束,防止模型過度複雜,降低了過擬合的可能性
3.節點分裂的方式不同,gbdt是用的gini係數,xgboost是經過優化推導後的
更多詳見:https://xijunlee.github.io/2017/06/03/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/

11.為什麼xgboost要用泰勒展開,優勢在哪裡?
@AntZ:xgboost使用了一階和二階偏導, 二階導數有利於梯度下降的更快更準. 使用泰勒展開取得二階倒數形式, 可以在不選定損失函式具體形式的情況下用於演算法優化分析.本質上也就把損失函式的選取和模型演算法優化/引數選擇分開了. 這種去耦合增加了xgboost的適用性。

12.xgboost如何尋找最優特徵?是又放回還是無放回的呢?
@AntZ:xgboost在訓練的過程中給出各個特徵的評分,從而表明每個特徵對模型訓練的重要性. xgboost利用梯度優化模型演算法, 樣本是不放回的(想象一個樣本連續重複抽出,梯度來回踏步會不會高興). 但xgboost支援子取樣, 也就是每輪計算可以不使用全部樣本。

13.談談判別式模型和生成式模型?
判別方法:由資料直接學習決策函式 Y = f(X),或者由條件分佈概率 P(Y|X)作為預測模型,即判別模型。
生成方法:由資料學習聯合概率密度分佈函式 P(X,Y),然後求出條件概率分佈P(Y|X)作為預測的模型,即生成模型。
由生成模型可以得到判別模型,但由判別模型得不到生成模型。
常見的判別模型有:K近鄰、SVM、決策樹、感知機、線性判別分析(LDA)、線性迴歸、傳統的神經網路、邏輯斯蒂迴歸、boosting、條件隨機場
常見的生成模型有:樸素貝葉斯、隱馬爾可夫模型、高斯混合模型、文件主題生成模型(LDA)、限制玻爾茲曼機

14.L1和L2的區別

L1範數(L1 norm)是指向量中各個元素絕對值之和,也有個美稱叫“稀疏規則運算元”(Lasso regularization)。 
比如 向量A=[1,-1,3], 那麼A的L1範數為 |1|+|-1|+|3|.
簡單總結一下就是: 
L1範數: 為x向量各個元素絕對值之和。 
L2範數: 為x向量各個元素平方和的1/2次方,L2範數又稱Euclidean範數或Frobenius範數 

Lp範數: 為x向量各個元素絕對值p次方和的1/p次方.
在支援向量機學習過程中,L1範數實際是一種對於成本函式求解最優的過程,因此,L1範數正則化通過向成本函式中新增L1範數,使得學習得到的結果滿足稀疏化,從而方便人類提取特徵。 
L1範數可以使權值稀疏,方便特徵提取。 
L2範數可以防止過擬合,提升模型的泛化能力。

15.L1和L2正則先驗分別服從什麼分佈
@齊同學:面試中遇到的,L1和L2正則先驗分別服從什麼分佈,L1是拉普拉斯分佈,L2是高斯分佈。

16.CNN最成功的應用是在CV,那為什麼NLP和Speech的很多問題也可以用CNN解出來?為什麼AlphaGo裡也用了CNN?這幾個不相關的問題的相似性在哪裡?CNN通過什麼手段抓住了這個共性?
@許韓,來源:https://zhuanlan.zhihu.com/p/25005808
Deep Learning -Yann LeCun, Yoshua Bengio & Geoffrey Hinton
Learn TensorFlow and deep learning, without a Ph.D.
The Unreasonable Effectiveness of Deep Learning -LeCun 16 NIPS Keynote
以上幾個不相關問題的相關性在於,都存在區域性與整體的關係,由低層次的特徵經過組合,組成高層次的特徵,並且得到不同特徵之間的空間相關性。如下圖:低層次的直線/曲線等特徵,組合成為不同的形狀,最後得到汽車的表示。

CNN抓住此共性的手段主要有四個:區域性連線/權值共享/池化操作/多層次結構。
區域性連線使網路可以提取資料的區域性特徵;權值共享大大降低了網路的訓練難度,一個Filter只提取一個特徵,在整個圖片(或者語音/文字) 中進行卷積;池化操作與多層次結構一起,實現了資料的降維,將低層次的區域性特徵組合成為較高層次的特徵,從而對整個圖片進行表示。如下圖:

http://blog.csdn.net/v_july_v/article/details/51812459

17.說一下Adaboost,權值更新公式。當弱分類器是Gm時,每個樣本的的權重是w1,w2...,請寫出最終的決策公式。

給定一個訓練資料集T={(x1,y1), (x2,y2)…(xN,yN)},其中例項,而例項空間,yi屬於標記集合{-1,+1},Adaboost的目的就是從訓練資料中學習一系列弱分類器或基本分類器,然後將這些弱分類器組合成一個強分類器。

Adaboost的演算法流程如下:

步驟1. 首先,初始化訓練資料的權值分佈。每一個訓練樣本最開始時都被賦予相同的權值:1/N。

步驟2. 進行多輪迭代,用m = 1,2, ..., M表示迭代的第多少輪

a. 使用具有權值分佈Dm的訓練資料集學習,得到基本分類器(選取讓誤差率最低的閾值來設計基本分類器):

b. 計算Gm(x)在訓練資料集上的分類誤差率

由上述式子可知,Gm(x)在訓練資料集上的誤差率em就是被Gm(x)誤分類樣本的權值之和。

c. 計算Gm(x)的係數,am表示Gm(x)在最終分類器中的重要程度(目的:得到基本分類器在最終分類器中所佔的權重):

由上述式子可知,em <= 1/2時,am >= 0,且am隨著em的減小而增大,意味著分類誤差率越小的基本分類器在最終分類器中的作用越大。

d. 更新訓練資料集的權值分佈(目的:得到樣本的新的權值分佈),用於下一輪迭代

使得被基本分類器Gm(x)誤分類樣本的權值增大,而被正確分類樣本的權值減小。就這樣,通過這樣的方式,AdaBoost方法能“重點關注”或“聚焦於”那些較難分的樣本上。

其中,Zm是規範化因子,使得Dm+1成為一個概率分佈:

步驟3. 組合各個弱分類器

從而得到最終分類器,如下:

更多請檢視此文:http://blog.csdn.net/v_july_v/article/details/40718799

18.LSTM結構推導,為什麼比RNN好?
推導forget gate,input gate,cell state, hidden information等的變化;因為LSTM有進有出且當前的cell informaton是通過input gate控制之後疊加的,RNN是疊乘,因此LSTM可以防止梯度消失或者爆炸

19.經常在網上搜索東西的朋友知道,當你不小心輸入一個不存在的單詞時,搜尋引擎會提示你是不是要輸入某一個正確的單詞,比如當你在Google中輸入“Julw”時,系統會猜測你的意圖:是不是要搜尋“July”,如下圖所示:

這叫做拼寫檢查。根據谷歌一員工寫的文章(http://norvig.com/spell-correct.html)顯示,Google的拼寫檢查基於貝葉斯方法。請說說的你的理解,具體Google是怎麼利用貝葉斯方法,實現"拼寫檢查"的功能。

使用者輸入一個單詞時,可能拼寫正確,也可能拼寫錯誤。如果把拼寫正確的情況記做c(代表correct),拼寫錯誤的情況記做w(代表wrong),那麼"拼寫檢查"要做的事情就是:在發生w的情況下,試圖推斷出c。換言之:已知w,然後在若干個備選方案中,找出可能性最大的那個c,也就是求的最大值。
而根據貝葉斯定理,有:

由於對於所有備選的c來說,對應的都是同一個w,所以它們的P(w)是相同的,因此我們只要最大化即可。其中:

P(c)表示某個正確的詞的出現"概率",它可以用"頻率"代替。如果我們有一個足夠大的文字庫,那麼這個文字庫中每個單詞的出現頻率,就相當於它的發生概率。某個詞的出現頻率越高,P(c)就越大。比如在你輸入一個錯誤的詞“Julw”時,系統更傾向於去猜測你可能想輸入的詞是“July”,而不是“Jult”,因為“July”更常見。

P(w|c)表示在試圖拼寫c的情況下,出現拼寫錯誤w的概率。為了簡化問題,假定兩個單詞在字形上越接近,就有越可能拼錯,P(w|c)就越大。舉例來說,相差一個字母的拼法,就比相差兩個字母的拼法,發生概率更高。你想拼寫單詞July,那麼錯誤拼成Julw(相差一個字母)的可能性,就比拼成Jullw高(相差兩個字母)。值得一提的是,一般把這種問題稱為“編輯距離”,參見http://blog.csdn.net/v_july_v/article/details/8701148#t4

所以,我們比較所有拼寫相近的詞在文字庫中的出現頻率,再從中挑出出現頻率最高的一個,即是使用者最想輸入的那個詞。具體的計算過程及此方法的缺陷請參見http://norvig.com/spell-correct.html

20.為什麼樸素貝葉斯如此“樸素”?
因為它假定所有的特徵在資料集中的作用是同樣重要和獨立的。正如我們所知,這個假設在現實世界中是很不真實的,因此,說樸素貝葉斯真的很“樸素”。