一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

作者丨清雨盧

編輯丨極市平臺

前言

真的是千呼萬喚始出來emmmm,去年春招結束寫了篇面試的經驗分享。在文中提到和小夥伴整理了演算法崗面試時遇到的常見知識點及回答,本想著授人以漁,但沒想到大家都看上了我家的 !但因本人執行力不足,被大家催到現在才終於想著行動起來分享給大家,筆者在這裡給各位讀者一個大大的抱歉,求原諒嗚嗚~~相信今年參加秋招的小夥伴們一定都拿到理想的offer啦,明年準備找工作的小盆友如果覺得本文還有些用可以收藏哈。

由於篇幅限制,就先發出前半部分,後面等下回筆者得空哈~另外歡迎小夥伴們轉發!轉發!再轉發呀!!

第一章 機器學習

1。Batch Normalization

背景:由於Internal Covariate Shift(Google)效應,即深度神經網路涉及到很多層的疊加,而每一層的引數更新會導致上層的輸入資料分佈發生變化,透過層層疊加,高層的輸入分佈變化會非常劇烈,這就使得高層需要不斷去重新適應底層的引數更新。為了訓好模型,我們需要非常謹慎地去設定學習率、初始化權重、以及儘可能細緻的引數更新策略。也就是隨是著網路加深,引數分佈不斷往啟用函式兩端移動(梯度變小),導致反向傳播出現梯度消失,收斂困難。

原理:可在每層的啟用函式前,加入BN,將引數重新拉回0-1正態分佈,加速收斂。(理想情況下,Normalize的均值和方差應當是整個資料集的,但為了簡化計算,就採用了mini_batch的操作)

機器學習中的白化(eg.PCA)也可以起到規範化分佈的作用,但是計算成本過高。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

BN不是簡單的歸一化,還加入了一個y = γx+β的操作,用於保持模型的表達能力。否則相當於僅使用了啟用函式的線性部分,會降低模型的表達能力。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

訓練與測試:測試時均值和方差不再用每個mini-batch來替代,而是訓練過程中每次都記錄下每個batch的均值和方差,訓練完成後計算整體均值和方差用於測試。

參考:

https://blog。csdn。net/sinat_33741547/article/details/87158830

https://blog。csdn。net/qq_34484472/article/details/77982224

https://zhuanlan。zhihu。com/p/33173246

BN對於Relu是否仍然有效?

有效,學習率稍微設定大一些,ReLU函式就會落入負區間(梯度為0),神經元就會永遠無法啟用,導致dead relu問題。BN可以將資料分佈拉回來。

四種主流規範化方法

Batch Normalization(BN):縱向規範化

Layer Normalization(LN):橫向規範化 對於單個樣本

Weight Normalization(WN):引數規範化 對於引數

Cosine Normalization(CN):餘弦規範化 同時考慮引數和x資料

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

多卡同步

原因

對於BN來說,用Batch的均值和方差來估計全域性的均值和方差,但因此Batch越大越好。但一個卡的容量是有限的,有時可能batch過小,就起不到BN的歸一化效果。

原理

利用多卡同步,單卡進行計算後,多卡之間通訊計算出整體的均值和方差,用於BN計算, 等同於增大batch size 大小。

2次同步? 第一次同步獲得全域性均值,然後第二次計算全域性方差

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

1次同步! 直接傳遞一次X和X2,就可直接計算出全域性均值和方差。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

操作(pytorch)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

注:

對於目標檢測和分類而言,batch size 通常可以設定的比較大,因此不用多卡否則反而會因為卡間通訊,拖慢訓練速度。

對於語義分割這種稠密的問題而言,解析度越高效果越好,因此一張卡上容納的batch size 比較小,需要多卡同步。

資料被可使用的GPU卡分割(通常是均分),因此每張卡上BN層的batch size(批次大小)實際為:Batch Size/nGpu

2。VGG使用使用3*3卷積核的優勢是什麼?

2個3x3的卷積核串聯和一個5x5的卷積核擁有相同的感受野,但是,2個3x3的卷積核擁有更少的引數,對於通道為1的5x5特徵圖得到通道為1的輸出特徵圖,前者有3x3x2=18個引數,後者5x5=25個引數,其次,多個3x3的卷積核比一個較大的尺寸的卷積核加入了更多的非線性函式,增強了模型的非線性表達能力。

1x1卷積核的作用:改變通道數目,保持尺度不變情況下增強非線性表達能力,可以實現跨通道的資訊互動。

VGG:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

ResNet:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

3。邏輯斯蒂迴歸(LR, Logistic Regression)

3。1 模型簡介

分佈函式與機率密度函式:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

其中,μ表示位置引數,γ為形狀引數。在深度學習中常用到的 Sigmoid 函式就是 Logistic 的分佈函式在μ=0,γ=1的特殊形式。

損失函式:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

求解方法:1。隨機梯度下降法 2。牛頓法

參考:https://zhuanlan。zhihu。com/p/74874291

3。2 相關問題

一、LR有什麼特點?

簡單、容易欠擬合、值域為(0,1)、無窮階連續可導。

各feature之間不需要滿足條件獨立假設,但各個feature的貢獻獨立計算

二、Sigmoid變化的理解?

a) sigmoid函式光滑,處處可導,導數還能用自己表示

b) sigmoid能把資料從負無窮到正無窮壓縮到0,1之間,壓縮掉了長尾,擴充套件了核心解析度。

c) sigmoid在有觀測誤差的情況下最優的保證了輸入訊號的資訊。

三、與SVM、線性迴歸等模型對比

參考:https://zhuanlan。zhihu。com/p/74874291

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

因為階躍函式不連續,尋找替代函式如 sigmoid:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

作變換可得到:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

即用線性迴歸的結果去擬合事件發生機率(“機率”是事件發生與不發生的機率比值)的對數,這就是“對數機率迴歸”的名稱來由,其名為迴歸,實際上是做分類任務。

為什麼不用均方誤差作為損失:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

4。卷積

原理:卷積過程就是卷積核行列對稱翻轉後,在影象上滑動,並且依次相乘求和。(與濾波器不同的一點就是多了一個卷積核翻轉的過程)。然後經過池化,啟用後輸入下一層。單個卷積層可以提取特徵,當多個卷積疊加後即可逐步學習出更高語義的抽象特徵。

這裡提到了卷積,池化以及啟用,那麼池化以及啟用的順序如何考慮?

一般來說池化和啟用的順序對計算結果沒有影響(其實是maxpooling無影響,但是如果用avgpooling的話,先後順序還是會影響結果一點的),但先池化可以減小接下來啟用的計算量。

卷積核:

其中卷積核主要有兩類,普通卷積核和1*1的卷積核。

普通卷積核同時改變影象的空間域和通道域,如下圖所示,每個卷積核的通道數與輸入相同,卷積後會得到一個通道為一的特徵圖,我們希望卷積後的通道數有幾個,卷積核就有幾個。

1*1卷積核,視野大小為單個特徵位點,能夠實現在空間域不改變的情況下實現通道域資訊的交流,並且獲得我們想要的通道數量(一般是降維)。

另外,1*1的卷積可以看作全連線。

參考:https://blog。csdn。net/amusi1994/article/details/81091145?depth_1-utm_source=distribute。pc_relevant。none-task&utm_source=distribute。pc_relevant。none-task

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

反捲積:

上取樣有3種常見的方法:雙線性插值(bilinear),反捲積(Transposed Convolution),反池化(Unpooling),我們這裡只討論反捲積。

這裡指的反捲積,也叫轉置卷積,它並不是正向卷積的完全逆過程,用一句話來解釋:反捲積是一種特殊的正向卷積,先按照一定的比例透過補0來擴大輸入影象的尺寸,接著旋轉卷積核,再進行正向卷積。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

https://www。zhihu。com/question/48279880

空洞卷積

誕生背景

在影象分割領域,影象輸入到CNN(典型的網路比如FCN[3])中,FCN先像傳統的CNN那樣對影象做卷積再pooling,降低影象尺寸的同時增大感受野,但是由於影象分割預測是pixel-wise的輸出,所以要將pooling後較小的影象尺寸upsampling到原始的影象尺寸進行預測,在先減小後增大尺寸的過程中,肯定有些資訊損失掉了,如何避免?答案就是空洞卷積。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

(a)圖對應3x3的1-dilated conv,和普通的卷積操作一樣,(b)圖對應3x3的2-dilated conv,實際的卷積kernel size還是3x3,但是空洞為1,也就是對於一個7x7的影象patch,只有9個紅色的點和3x3的kernel發生卷積操作,其餘的點略過。也可以理解為kernel的size為7x7,但是隻有圖中的9個點的權重不為0,其餘都為0。(c)圖是4-dilated conv操作

優點

dilated的好處是不做pooling損失資訊的情況下,加大了感受野,讓每個卷積輸出都包含較大範圍的資訊。在影象需要全域性資訊或者語音文字需要較長的sequence資訊依賴的問題中,都能很好的應用dilated conv,比如影象分割、語音合成WaveNet、機器翻譯ByteNet中。

潛在問題 1:The Gridding Effect

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

我們發現我們的 kernel 並不連續,也就是並不是所有的 pixel 都用來計算了,因此這裡將資訊看做 checker-board 的方式會損失資訊的連續性。這對 pixel-level dense prediction 的任務來說是致命的。

潛在問題 2:Long-ranged information might be not relevant

我們從 dilated convolution 的設計背景來看就能推測出這樣的設計是用來獲取 long-ranged information。然而光采用大 dilation rate 的資訊或許只對一些大物體分割有效果,而對小物體來說可能則有弊無利了。如何同時處理不同大小的物體的關係,則是設計好 dilated convolution 網路的關鍵。

通向標準化設計:Hybrid Dilated Convolution (HDC)

對於上個 section 裡提到的幾個問題,圖森組的文章對其提出了較好的解決的方法。他們設計了一個稱之為 HDC 的設計結構。

第一個特性是,疊加捲積的 dilation rate 不能有大於1的公約數。比如 [2, 4, 6] 則不是一個好的三層卷積,依然會出現 gridding effect。

第二個特性是,我們將 dilation rate 設計成 鋸齒狀結構,例如 [1, 2, 5, 1, 2, 5] 迴圈結構。

第三個特性是,我們需要滿足一下這個式子:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

ri 是i層的dilation rate, Mi是i層的最大dilation rate, 那麼假設總共有n層的話,預設 Mn = rn 。假設我們應用於 kernel 為 k x k 的話,我們的目標則是M2 <= k ,這樣我們至少可以用 dilation rate 1 即 standard convolution 的方式來覆蓋掉所有洞。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

基於港中文和商湯組的 PSPNet 裡的 Pooling module (其網路同樣獲得當年的SOTA結果),ASPP 則在網路 decoder 上對於不同尺度上用不同大小的 dilation rate 來抓去多尺度資訊,每個尺度則為一個獨立的分支,在網路最後把他合併起來再接一個卷積層輸出預測 label。這樣的設計則有效避免了在 encoder 上冗餘的資訊的獲取,直接關注與物體之間之內的相關性。

https://www。zhihu。com/question/54149221

卷積的三種模式:

通常用外部api進行卷積的時候,會面臨mode選擇

其實這三種不同模式是對卷積核移動範圍的不同限制

設image的大小是7x7,filter的大小是3x3

full mode

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

橙色部分為image, 藍色部分為filter。full模式的意思是,從filter和image剛相交開始做卷積,白色部分為填0。filter的運動範圍如圖所示。

same mode

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

當filter的中心(K)與image的邊角重合時,開始做卷積運算,可見filter的運動範圍比full模式小了一圈。注意:這裡的same還有一個意思,卷積之後輸出的feature map尺寸保持不變(相對於輸入圖片)。當然,same模式不代表完全輸入輸出尺寸一樣,也跟卷積核的步長有關係。same模式也是最常見的模式,因為這種模式可以在前向傳播的過程中讓特徵圖的大小保持不變,調參師不需要精準計算其尺寸變化(因為尺寸根本就沒變化)。

valid mode

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

當filter全部在image裡面的時候,進行卷積運算,可見filter的移動範圍較same更小了。

5。交叉熵與softmax

5。1 數學原理

交叉熵刻畫的是實際輸出(機率)與期望輸出(機率)的距離,也就是交叉熵的值越小,兩個機率分佈就越接近。假設機率分佈p為期望輸出(標籤),機率分佈q為實際輸出,H(p,q)為交叉熵。

第一種交叉熵損失函式的形式:

第二種交叉熵損失函式的形式:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

5。2 交叉熵不適用於迴歸問題

當MSE和交叉熵同時應用到多分類場景下時,(標籤的值為1時表示屬於此分類,標籤值為0時表示不屬於此分類),MSE對於每一個輸出的結果都非常看重,而交叉熵只對正確分類的結果看重。例如:在一個三分類模型中,模型的輸出結果為(a,b,c),而真實的輸出結果為(1,0,0),那麼MSE與cross-entropy相對應的損失函式的值如下:

MSE:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

cross-entropy:*8

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

從上述的公式可以看出,交叉熵的損失函式只和分類正確的預測結果有關係,而MSE的損失函式還和錯誤的分類有關係,該分類函式除了讓正確的分類儘量變大,還會讓錯誤的分類變得平均,但實際在分類問題中這個調整是沒有必要的。但是對於迴歸問題來說,這樣的考慮就顯得很重要了。所以,迴歸問題熵使用交叉上並不合適。

5。3 交叉熵與softmax

交叉熵損失函式經常用於分類問題中,特別是神經網路分類問題,由於交叉熵涉及到計算每個類別的機率,所以在神經網路中,交叉熵與softmax函式緊密相關。在神經網路中,Softmax通常作用於分類模型最後的輸出,將分類結果歸一化為(0,1)區間,表示各分類結果的機率。它的函式形式為:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

1)為什麼softmax分母是所有類別的加權和?

歸一化操作,將輸入對映為(0,1)之間的機率值。

2)為什麼要引入指數形式?

如果使用max函式,雖然能完美的進行分類但函式不可微從而無法進行訓練,引入以 e 為底的指數並加權歸一化,一方面指數函式使得結果將分類機率拉開了距離,另一方面函式可微。

3)為什麼不用2、4、10等自然數為底而要以 e 為底呢?

主要是以e為底在求導的時候比較方便。

參考:https://www。jianshu。com/p/1536f98c659c

6。 啟用函式的意義

啟用函式的主要作用是提供網路的非線性建模能力。如果沒有啟用函式,那麼該網路僅能夠表達線性對映,即便有再多的隱藏層,其整個網路跟單層神經網路也是等價的。

Sigmoid

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

可以被表示作機率,或用於輸入的歸一化。

sigmoid函式連續,光滑,嚴格單調,以(0,0。5)中心對稱,是一個非常良好的閾值函式。

Sigmoid函式的導數是其本身的函式,即f′(x)=f(x)(1−f(x)),計算非常方便,也非常節省計算時間。

補充:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

具有這種性質的稱為軟飽和啟用函式。具體的,飽和又可分為左飽和與右飽和。與軟飽和對應的是硬飽和, 即 f′(x)=0,當|x|>c,其中c為常數。f′(x)=0,當|x|>c,其中c為常數。

一旦輸入落入飽和區,f′(x)f′(x) 就會變得接近於0,導致了向底層傳遞的梯度也變得非常小。此時,網路引數很難得到有效訓練。這種現象被稱為梯度消失。

此外,sigmoid函式的輸出均大於0,使得輸出不是0均值,這稱為偏移現象,這會導致後一層的神經元將得到上一層輸出的非0均值的訊號作為輸入。

tanh

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

tanh也是一種非常常見的啟用函式。與sigmoid相比,它的輸出均值是0,使得其收斂速度要比sigmoid快,減少迭代次數。然而,從途中可以看出,tanh一樣具有軟飽和性,從而造成梯度消失。

tanh 的導數為 1-(tanh(x))2

RELU

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

當x<0時,ReLU硬飽和,而當x>0時,則不存在飽和問題。所以,ReLU 能夠在x>0時保持梯度不衰減,從而緩解梯度消失問題。

然而,隨著訓練的推進,部分輸入會落入硬飽和區,導致對應權重無法更新。這種現象被稱為“神經元死亡”。與sigmoid類似,ReLU的輸出均值也大於0,偏移現象和 神經元死亡會共同影響網路的收斂性。針對在x<0的硬飽和問題,Leaky-ReLU對ReLU做出相應的改進,使得

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

7。 pooling有什麼意義,和卷積有什麼區別

降維減少計算量和記憶體消耗

增大深層卷積的感受野

壓縮特徵圖,提取主要特徵

反向傳播

設卷積核尺寸為p x q, 步長為t,為保證整除,填充後的X是m x n 矩陣, 經MaxPooling 卷積得到g x h矩陣Y, 前向傳播得到誤差值error(標量e)。上游的誤差梯度向量

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

已在反向傳播時得到, 求 e 對 X 的梯度。

已知 :

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

e=forward(Y)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

其中:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

其中,

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

由上游計算得出。

參考:https://www。nowcoder。com/discuss/371584

https://www。nowcoder。com/tutorial/95/ea84cef4fb2c4555a7a4c24ea2f6b6e8

https://blog。csdn。net/oBrightLamp/article/details/84635346

8。泛化誤差(過擬合)

訓練誤差與泛化誤差:

訓練誤差:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

泛化誤差:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

泛化誤差表達模型的泛化能力,可以理解為樣本誤差的期望,p(x)為表示全集合X中x出現的機率(x可以是一個樣本,也可以是一個集合)。

訓練誤差只能代表選定的部分資料的誤差,但泛化誤差能考慮到全資料集。

泛化誤差分解:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

即泛化誤差 = 方差 + 偏差 + 噪聲

噪聲是模型訓練的上限,也可以說是誤差的下限,噪聲無法避免。

方差表示不同樣本下模型預測的穩定程度(方差大其實就是過擬合,預測不穩定)

偏差表示模型對訓練資料的擬合程度 (偏差大就是欠擬合,預測效果不好)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

訓練過程中方差和偏差此消彼漲

降低方差的方法:(其實就是防止過擬合)

資料:

增大資料量,進行資料增強

進行資料清洗(糾正錯誤資料)

進行特徵選擇,降低特徵維度

類別平衡(欠取樣、過取樣)

網路結構:

正則化L1,L2, BN

dropout

宏觀:

選擇合適複雜度的模型,或對已有模型進行剪枝、刪減

整合學習(Ensemble)

限制訓練

降低偏差的方法:(防止欠擬合)

輸入:最佳化特徵,檢查特徵工程是否有漏掉的具有預測意義的特徵

網路中間:削弱或者去除已有的正則化約束

宏觀:1,增加模型複雜度, 2,整合學習(Ensemble) 3,增大訓練輪數

*注:整合學習可以同時降低方差與偏差

參考 https://www。sohu。com/a/317862976_654419

https://www。zhihu。com/question/27068705/answer/137487142?utm_source=wechat_session&utm_medium=social&utm_oi=929368776753954816

9。 LR相關

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

手推

zhx:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

最大似然<-> 最小化損失

優缺點

優點:

引數代表每個特徵對輸出的影響,可解釋性強

簡單,計算量小、儲存佔用低,可以在大資料場景中使用

缺點

容易欠擬合,精度不高

對異常值比較敏感

LR如何解決低維不可分:透過核函式將特徵把低維空間轉換到高維空間,在低維空間不可分的資料,到高維空間中線性可分的機率會高一些

怎麼防止過擬合:L1正則與L2正則

10。 SVM

1。 基本原理、意義(4)

SVM需要找到一個超平面,將所有的樣本點都正確分類,並且其與所有樣本點的幾何間隔最大化;透過變換可以將其化為凸二次規劃問題,是一個帶有不等式約束的求最小值的問題。二次規劃問題可以直接解,但通常的做法是利用拉格朗日乘子法去解它的對偶問題,解法如 SMO;而根據其所需滿足的 KKT 條件,可以知道該解僅和幾何間隔最小的那部分樣本有關,這些樣本就叫支援向量。

軟間隔、損失函式(3)

核函式列舉、選擇(3)

為什麼用對偶函式(2)

SVM與LR (2)

基本原理與推導

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

點到超平面的距離:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

令(樣本確定後,最優的r就固定了,可以透過改變分母來調整分子的大小,得出下式) :

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

最大化r,也就是最小化下式 (約束中有不等式,需要滿足KKT條件):

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

KKT條件:乘子、約束、約束*乘子:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

必有:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

前者表明樣本無影響,後者表明樣本是支援向量。

核函式:

當樣本是線性不可分的時候,需要將其特徵對映到高維空間,使其線性可分;而在解對偶問題時涉及到兩個樣本的內積運算,直接在高維空間計算太困難;因此引入核函式,其值等於樣本在高維空間的內積,就能在低維空間計算。

核函式的作用:

將特徵空間從低維對映到高維,使得原本線性不可分的問題變為線性可分。

使用核函式計算,避免了在高維空間中進行復雜計算,且不影響其效果。

常見的核函式如下:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

核函式的選擇:

樣本特徵較多、維數較高、線性可分時,通常採用線性核。

樣本特徵較少,樣本數適中、線性不可分、情況不明時可先嚐試高斯核。高斯核引數較多,結果對引數的敏感性較高,透過交叉驗證可以尋找到合適的引數,但比較耗時

軟間隔與損失函式:

現實任務中很難確定核函式是否使得樣本線性可分了(即便找到了某個核函式使得樣本線性可分,也不能保證它不是過擬合產生的結果。)。

軟間隔意味著SVM允許部分樣本不滿足約束條件,即不要求所有樣本都被正確分類。

此時,最佳化目標為:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

式中的後一項表示被錯誤分類的數目,C是權重,單純的0/1損失顯然不好用,於是引入替代的損失函式,常見如下:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

11。 約束最佳化問題的對偶問題

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

參考連結:https://www。bilibili。com/video/BV1Hs411w7ci

對偶性的幾何解釋:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

d* <= p* (弱對偶性)

凸最佳化+Slater條件 => d* = p*

充分非必要

參考連結https://www。bilibili。com/video/BV1aE411o7qd?p=33

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

凸最佳化(百科):凸最佳化是指一種比較特殊的最佳化,是指求取最小值的目標函式為凸函式的一類最佳化問題。其中,目標函式為凸函式且定義域為凸集的最佳化問題稱為無約束凸最佳化問題。而目標函式和不等式約束函式均為凸函式,等式約束函式為仿射函式,並且定義域為凸集的最佳化問題為約束最佳化問題。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

仿射函式:仿射函式即由由1階多項式構成的函式,一般形式為f(x)=Ax+b,其中的特例是,函式f(x)=ax+b,其中a、x、b都是標量。此時嚴格講,只有b=0時,仿射函式才可以叫“線性函式”(“正比例”關係)。

Slater條件:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

relint:relative interior,除去邊界的定義域

對於大多數凸最佳化,slater條件成立。

有時候在定義域內部求fi(x)是否<0比較困難

放鬆的slater:m中有k個仿射函式,那麼只檢查剩下m-k個是否滿足條件。

SVM天生:凸二次最佳化+slater條件 => 強對偶性(p*=d*) <=> KKT條件

KKT條件:

原問題如下,其最優解p*

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

其對偶問題,最優解d*

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

KKT條件:給定了x*,λ*,η*求解關係。

梯度為0,L`=0

原問題可行條件, mi(x)<=0, nj(x)=0

對偶問題可行,λi>=0

互補鬆弛條件:λi * mi=0

互補鬆弛條件和梯度=0條件推導。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

參考資料:https://zhuanlan。zhihu。com/p/58064316

https://www。bilibili。com/video/BV1aE411o7qd?p=34

https://blog。csdn。net/feilong_csdn/article/details/62427148

11。Dropout

背景:

為了減輕過擬合問題,2012年Hintion在論文中提出Dropout方法。

原理:

前向傳播時按機率p隨機關閉神經元(每個neuron, 有p%的可能性被去除;(注意不是去除p比例的神經元),本次反向傳播時,只更新未關閉的神經元

下一次訓練時,恢復上一輪被更新的神經元,然後重複操作1

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

其中,Bernoulli函式是為了生成機率r向量,也就是隨機生成一個0、1的向量

訓練與測試:

測試時需要關閉dropout,否則仍然按機率拋棄神經元會導致網路不穩定,即同一樣本多次預測結果不同。

但若什麼處理都不做,會導致訓練與測試結果不同。

為了平衡訓練與測試的差異,可以採取使得訓練與測試的輸出期望值相等的操作:

[補]:

訓練時除以p:假設一個神經元的輸出啟用值為a,在不使用dropout的情況下,其輸出期望值為a,如果使用了dropout,神經元就可能有保留和關閉兩種狀態,把它看作一個離散型隨機變數,它就符合機率論中的0-1分佈,其輸出啟用值的期望變為 p*a+(1-p)*0=pa,此時若要保持期望和不使用dropout時一致,就要除以 p

2,。 測試時乘p

為什麼可以減輕過擬合?

ensemble效果:訓練過程中每次隨機關閉不同的神經元,網路結構已經發生了改變,整個dropout的訓練過程就相當於很多個不同的網路取平均,進而達到ensemble的效果。

減少神經元之間複雜的共適應關係:dropout導致每兩個神經元不一定每一次都在網路中出現,減輕神經元之間的依賴關係。阻止了某些特徵僅僅在其它特定特徵下才有效果的情況,從而迫使網路無法關注特殊情況,而只能去學習一些更加魯棒的特徵。

BN和Dropout共同使用出現的問題

Dropout為了平衡訓練和測試的差異,會透過隨機失活的機率來對神經元進行放縮,進而會改變其方差。如果再加一層BN,又會將方差拉回至(0-1)分佈,進而產生方差衝突。

處理方法:

始終將Dropout放在BN後

使用高斯Dropout

參考

https://zhuanlan。zhihu。com/p/38200980

https://blog。csdn。net/songyunli1111/article/details/89071021

12。 評價指標

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

1 準確率和召回率(虛警和漏報)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

準確率為預測陽性的病人中真正為陽性的機率

召回率等價于敏感度,即有病的人中被檢測到有病的機率(有病且被召回的機率)

2 PR曲線與F1值:縱軸為精確率P,橫軸為召回率R

PR曲線圍成面積越大越好,但:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

3 ROC曲線與AUC值:縱軸為真陽性率TPR,橫軸為假陽性率FPR

真陽性率(true positive rate,TPR),又稱敏感度 正樣本被預測為正樣本的機率。

假陽性率:無病,但根據篩檢被判為有病的百分比。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

4 怎麼形成曲線:分類閾值α的調整形成

5 PR和ROC曲線應用場景對比:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

13。正則化L1,L2

1、什麼是正則化

正則化就是一類透過顯式設計降低泛化誤差,以提升演算法通用性的策略的統稱。從機率論角度看,許多正則化技術對應的是在模型引數上施加一定的先驗分佈,其作用是改變泛化誤差的結構。正則化在經驗風險最小化的基礎上(也就是訓練誤差最小化),儘可能採用簡單的模型,可以有效提高泛化預測精度。如果模型過於複雜,變數值稍微有點變動,就會引起預測精度問題。正則化之所以有效,就是因為其降低了特徵的權重,使得模型更為簡單。

2、L1正則化

而L1正則項就是一個L1範數,即相當於為模型添加了這樣一個先驗知識:w 服從零均值拉普拉斯分佈。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

由於引入了先驗知識,所以似然函式這樣寫:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

取 log 再取負,得到目標函式:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

3、L2正則化

L2正則項就是一個L2範數,即Ridge 迴歸,相當於為模型添加了這樣一個先驗知識:w 服從零均值正態分佈。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

類似的,似然函式為:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

目標函式為:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

即L2範數

4、L1和L2正則化的區別

L1 正則化增加了所有權重 w 引數的絕對值之和逼迫更多 w 為零,也就是變稀疏,L2 正則化中增加所有權重 w 引數的平方之和,逼迫所有 w 儘可能趨向零但不為零(L2 的導數趨於零)。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

5、總結

給 loss function 加上正則化項,能使新得到的最佳化目標函式 h=f+||w|| ,需要在 f 和 ||w|| 中做一個權衡,如果還像原來只最佳化 f 的情況下,那可能得到一組解比較複雜,使得正則項 ||w|| 比較大,那麼 h 就不是最優的,因此可以看出加正則項能讓解更加簡單,符合奧卡姆剃刀理論,同時也比較符合在偏差和方差(方差表示模型的複雜度)分析中,透過降低模型複雜度,得到更小的泛化誤差,降低過擬合程度。

L1 正則化就是在 loss function 後邊所加正則項為 L1 範數,加上 L1 範數容易得到稀疏解(0 比較多)。L2 正則化就是 loss function 後邊所加正則項為 L2 範數的平方,加上 L2 正則相比於 L1 正則來說,得到的解比較平滑(不是稀疏),但是同樣能夠保證解中接近於 0(但不是等於 0,所以相對平滑)的維度比較多,降低模型的複雜度。

縮小引數空間

防止過擬合

加先驗知識

使得求解變得可行(比如樣本較少時候OLS的逆矩陣求解)

不用L0正則化的原因

根據上面的討論,稀疏的引數可以防止過擬合,因此用L0範數(非零引數的個數)來做正則化項是可以防止過擬合的。

從直觀上看,利用非零引數的個數,可以很好的來選擇特徵,實現特徵稀疏的效果,具體操作時選擇引數非零的特徵即可。但因為L0正則化很難求解,是個NP難問題,因此一般採用L1正則化。L1正則化是L0正則化的最優凸近似,比L0容易求解,並且也可以實現稀疏的效果。

不正則化引數b的原因

如果對||b||進行懲罰,其實是沒有作用的,因為在對輸出結果的貢獻中,引數b對於輸入的改變是不敏感的,不管輸入改變是大還是小,引數b的貢獻就只是加個偏置而已。舉個例子,如果你在訓練集中,w和b都表現得很好,但是在測試集上發生了過擬合,b是不背這個鍋的,因為它對於所有的資料都是一視同仁的(都只是給它們加個偏置),要背鍋的是w,因為它會對不同的資料產生不一樣的加權。

6、稀疏與平滑

f(x) = b + w1x1+w2x2+w3x3+。。。

稀疏

對於模型而言,稀疏指的是模型中的引數有較少的非零值,其作用有:

去掉冗餘特徵,使模型更簡單,防止過擬合

降低運算量,防止維度爆炸

L1正則化 與 Relu 都能帶來稀疏性。

對於樣本而言,稀疏指的是樣本中存在較多的特徵值缺失或為零(文字資料通常是稀疏表示的),也叫作樣本的稀疏表示。

稀疏表示的樣本可以使得其資料集線性可分,使用SVM方法時能夠有很好的效能,並且稀疏矩陣的已經有高效的儲存方式,並不會帶來額外的負擔。

Adagrad 適合處理稀疏資料的原因:

Adagrad 中每個引數的學習率:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

假設有10000個樣本,其中有9900個樣本的特徵 x1 的值為0,這就是稀疏的資料。

那麼在更新時,x1 的引數 w1 有 9900 次其更新梯度都是 0,僅有 100 次更新梯度非零。假如沒有使用 Adagrad,其學習率沒有針對過往梯度和做比例調整,那麼10000個樣本中僅有這100次更新是有效的,相對於非稀疏特徵,其收斂速度大減,而使用 Adagrad 後,學習率會被放大,雖然僅有100次更新,但是能夠大大加快收斂速度。

平滑

平滑是指模型中的引數都比較小,其函式影象看起來比較平滑,而非陡峭,作用是使模型對樣本特徵值(也就是 x)的變化不敏感,防止過擬合。

7、使用場景:

需要對特徵進行篩選的場景,那我們可以選擇L1正則

L2可讓所有特徵的係數都縮小,但是不會變成零,會使得優 求解穩定快速;

有些應用場景,也會把L1和L2聯合起來使用

8、如何解決L1求導困難:座標下降法

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

9、座標下降法缺點:

可能會調到區域性最優而不是全域性最優

14。權重初始化

是否可以將權重初始化為0?

背景:對於簡單的網路可以直接隨機初始化。但對於深層網路而言,引數如果初始化不合適,就有可能導致輸出結果分佈在梯度過大或過小的位置,那麼經過層層疊加之後就容易發生梯度消失或梯度爆炸的問題。

幾種初始化:

pretraining

raddom initialization, 但若所選分佈不當,也會影響收斂

eg,10層網路,啟用函式為tanh

a,隨機初始化為均值為0,方差為0。1

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

b,隨機初始化為均值0,方差1

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

Xavier Initialization(其實就是rescale 標準0,1正態分佈)

2010年Xavier Glorot提出一般情況下,啟用值的方差是逐層衰減的,反向傳播梯度也逐層遞減。要避免梯度消失,就是要避免啟用值方差的衰減。如果能保證每層網路的輸入和輸出分佈保持一致,就perfect了,

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

推導:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

Kaiming Initialization

但Xavier假設網路中沒有啟用函式,或者為線性啟用函式,若使用Relu,輸出值依舊會跑偏。

對於Relu函式,若啟用前均值為0,那麼啟用後拋棄掉小於0的值,均值會增大,進而不滿足Xavier關於均值為0的前提。

何凱明經過推導得出rescale係數應改成

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

15。 決策樹

15。1 原理

決策樹(decision tree) 是一類常見的機器學習方法。一般的,一棵決策樹包含一個根結點、若干個內部結點和若干個葉結點,葉結點對應於決策結果,其他每個結點則對應一個屬性測試;每個結點包含的樣本集合根據屬性測試的結果被劃分到子結點中;根結點包含樣本全集。從根結點到每個葉結點的路徑對應了一個判定測試序列。

根據不同的劃分方式,衍生出多種不同型別的決策樹方法。

15。2 ID3

資訊熵:“資訊熵” (information entropy)是度量樣本集合純度最常用的一種指標。假定當前樣本集合D 中第k 類樣本所佔的比例為Pk (k = 1, 2,。 。 。 , |Y|) ,則D資訊熵定義為

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

Ent(D) 的值越小,則D 的純度越高。

資訊增益:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一般而言,資訊增益越大,則意味著使用屬性a來進行劃分所獲得的“純度提升”越大。

15。3 C4。5

增益率:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

需注意的是,增益率準則對可取值數目較少的屬性有所偏好,因此,C4。5演算法並不是直接選擇增益率最大的候選劃分屬性,而是使用了一個啟發式:先從候選劃分屬性中找出資訊增益高於平均水平的屬性,再從中選擇增益率最高的。

15。4 CART決策樹

“基尼指數” (Gini index):

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

我們在候選屬性集合A 中,選擇那個使得劃分後基尼指數最小的屬性作為最優劃分屬性

15。5 剪枝處理o

預剪枝:生成樹時對某一節點的劃分用驗證集對比精度,沒提高則剪枝。預剪枝降低了過擬合,但基於貪心的本質禁止這些分支展開,有欠擬合的風險。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

後剪枝:生成完整決策樹後,自底向上判斷結點剪枝與否在驗證集精度是否提高。

一般情形下,後剪枝決策樹的欠擬合風險很小,泛化效能往往優於預剪枝決策樹,但後剪枝過程是在生成完全決策樹之後進行的,並且要自底向上地對樹中的所有非葉結點進行逐一考察,因此其訓練時間開銷比未剪枝決策樹和預剪枝決策樹都要大得多。

15。6 連續值處理(迴歸樹)

一般選用相鄰連續值的中點作為候選劃分點,判斷最優點進行劃分。且與離散屬性不同,若當前結點劃分屬性為連續屬性,該屬性還可作為其後代結點的劃分屬性。

15。7 缺失值處理

如何在屬性值缺失的情況F進行劃分屬性選擇?

推廣的資訊增益公式:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

給定劃分屬性?若樣本在該屬性上的值缺失,如何對樣本進行劃分?

若樣本x劃分屬性a上的取值己知,則將x劃入與其取值對應的子結點,且樣本權值在於結點中保持為ω。 若樣本x在劃分屬性a上的取值未知,則將x同時劃入所有子結點,且樣本權值在與屬性值a_v對應的子結點中調整為凡ω·r_v。

15。8 多變數決策樹

使用多變數將每一個非葉結點用一個線性分類器進行劃分。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

15。9 LR、決策樹、SVM的選擇與對比

邏輯迴歸的優點:

便利的觀測樣本機率分數;

已有工具的高效實現;

對邏輯迴歸而言,多重共線性並不是問題,它可以結合L2正則化來解決;

邏輯迴歸廣泛的應用於工業問題上(這一點很重要)。

邏輯迴歸的缺點:

當特徵空間很大時,邏輯迴歸的效能不是很好;

不能很好地處理大量多類特徵或變數;

對於非線性特徵,需要進行轉換;

依賴於全部的資料(個人覺得這並不是一個很嚴重的缺點)。

決策樹的優點:

直觀的決策規則

可以處理非線性特徵

考慮了變數之間的相互作用

決策樹的缺點:

訓練集上的效果高度優於測試集,即過擬合[隨機森林克服了此缺點]

沒有將排名分數作為直接結果

SVM的優點:

能夠處理大型特徵空間

能夠處理非線性特徵之間的相互作用

無需依賴整個資料

SVM的缺點:

當觀測樣本很多時,效率並不是很高

有時候很難找到一個合適的核函式

何時選擇這三種演算法

流程如下:

首當其衝應該選擇的就是邏輯迴歸,如果它的效果不怎麼樣,那麼可以將它的結果作為基準來參考;然後試試決策樹(隨機森林)是否可以大幅度提升模型效能。即使你並沒有把它當做最終模型,你也可以使用隨機森林來移除噪聲變數;如果特徵的數量和觀測樣本特別多,那麼當資源和時間充足時,使用SVM不失為一種選擇。

參考:機器學習,第四章 周志華 (本節1-8點)

https://blog。csdn。net/weixin_41712499/article/details/88149170 (本節9點)

16。 Boosting vs Bagging

1。 Boosting vs Bagging (3)

Bagging和Boosting的區別:

1)樣本選擇上:Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。Boosting:每一輪的訓練集不變,只是訓練集中每個樣例在分類器中的權重發生變化。而權值是根據上一輪的分類結果進行調整。

2)樣例權重:Bagging:使用均勻取樣,每個樣例的權重相等。Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大。

3)預測函式:Bagging:所有預測函式的權重相等。Boosting:每個弱分類器都有相應的權重,對於分類誤差小的分類器會有更大的權重。

4)平行計算:Bagging:各個預測函式可以並行生成。Boosting:各個預測函式只能順序生成,因為後一個模型引數需要前一輪模型的結果。

XGBoost、AdaBoost、 GBDT (2)

決策樹、GBDT、XGBoost 區別與聯絡

https://blog。csdn。net/quiet_girl/article/details/88756843

XGBoost (5)

16。1 整合學習

結合多個“好而不同”的學習器,來獲得優於單一學習器的泛化效能。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

學習器之間應“好而不同”,“好而同”則整合不起作用,“壞而不同”則起副作用。(“好”可以理解為至少優於隨機瞎猜)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

16。2 Boosting

個體學習器之間存在強依賴關係,序列生成。

主要關注減低偏差,可以將弱分類器提升為強分類器。

先從原始訓練集訓練得到一個基學習器,再提高對錯誤樣本的權重比例,使用新的樣本分佈來重新訓練學習器,重複進行T次,最終將T個學習器加權結合。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

AdaBoost

16。3 Bagging

透過自助取樣法得到T個互有交集的訓練集,基於每個訓練集訓練出基學習器,最後結合。Bagging在最後結合時,通常對分類任務做簡單投票法,對迴歸任務做簡單平均法。

由於每個學習器使用的樣本都只是原始訓練集的一個子集(約有63。2% 的樣本),所以剩下的樣本可以用作驗證集,來對泛化效能做“包外估計”。

Bagging的複雜度與訓練一個學習器的複雜度同階(可以簡單看做O(Tn),T是一個不大的常數)

主要關注降低方差,在不剪枝決策樹、神經網路等易受樣本擾動的學習器上效用明顯。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

16。4 從減小偏差和方差來解釋Boosting和Bagging

Bagging:減小方差

Bagging就是對資料隨機取樣,訓練若干基分類器,對所有基分類器取平均。

假設n個基分類器,方差為σ2,若兩兩相互獨立,則取平均後的方差為σ2/n。但模型之間不可能完全獨立,假設模型之間的相關性為p,則取平均後的方差為:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

可以看出,相關性越低,方差越小。

因此,bagging時要儘可能降低模型之間的相關性:

隨機森林演算法中,每次選取節點分裂屬性時,會隨機抽取一 個屬性子集,而不是從所有屬性中選取最優屬性

訓練集的重取樣

Boosting:減小偏差

Boosting在訓練好一個弱分類器後,我們需要計算弱分類器的錯誤或者殘差,作為下一個分類器的輸入。學習過程中不斷減小損失函式,使模型不斷逼近靶心。

可以看出,此時基分類器之間強相關,所以不會顯著降低方差。

16。5 隨機森林(RF)

隨機選取樣本+特徵是Bagging的擴充套件變體,在以決策樹為基學習器的Bagging整合上,在決策樹的訓練過程中引入隨機屬性選擇(原本是選擇最優的屬性,改為先隨機選擇k個屬性,再從中選擇最優屬性,推薦值 k=log2d, d為屬性數)。

相比Bagging的多樣性僅來自於樣本擾動,RF還增加了屬性擾動,進一步提升學習器之間的差異性,從而提升泛化效能。

隨機森林簡單、易實現、計算開銷小,實現效率比Bagging還低(每次屬性選擇時只考慮了子集,而非全集。)

17。最佳化演算法

在機器學習演算法中,對於很多監督學習模型,需要對原始的模型構建損失函式,之後透過最佳化演算法對損失函式進行最佳化,尋找到最優的引數。求解機器學習引數的最佳化演算法中,使用較多的是基於梯度下降的最佳化演算法(Gradient Descent, GD)。

梯度下降法的含義是通過當前點的梯度方向尋找到新的迭代點。

基本思想可以這樣理解:我們從山上的某一點出發,找一個最陡的坡走一步(也就是找梯度方向),到達一個點之後,再找最陡的坡,再走一步,直到我們不斷的這麼走,走到最“低”點(最小花費函式收斂點)。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

梯度下降法的變形形式

批次梯度下降法 (Batch Gradient Descent)

批梯度下降法(Batch Gradient Descent)針對的是整個資料集,透過對所有的樣本的計算來求解梯度的方向。

梯度和引數更新公式如下:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

其中,是η學習率,是g_t梯度。

每迭代一步,都要用到訓練集所有的資料,如果樣本數目很大,這種方法的迭代速度很慢!

優點:理論上講,可以得到全域性最優解,引數更新比較穩定,收斂方向穩定;可以並行實現;

缺點:計算量大,引數更新慢,對記憶體的要求很高,不能以線上的形式訓練模型,也就是執行時不能加入新樣本。

從迭代的次數上來看,批次梯度下降法迭代的次數相對較少。其迭代的收斂曲線示意圖可以表示如下:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

隨機梯度下降(Stochastic Gradient Descent)

為了加快收斂速度,並且解決大資料量無法一次性塞入記憶體(視訊記憶體)的問題,每次只訓練一個樣本去更新引數,這就是隨機梯度下降法。

如果我們的資料集很大,比如幾億條資料, 基本上設定1,2,(10以內的就足夠了)就可以。但是SGD也有缺點,因為每次只用一個樣本來更新引數,會導致不穩定性大些,每次更新的方向,不像batch gradient descent那樣每次都朝著最優點的方向逼近,會在最優點附近震盪)。因為每次訓練的都是隨機的一個樣本,會導致導致梯度的方向不會像BGD那樣朝著最優點。

在程式碼中的隨機把資料打亂很重要,因為這個隨機性相當於引入了“噪音”,正是因為這個噪音,使得SGD可能會避免陷入區域性最優解中。

優點:訓練速度快;同時能夠線上學習。

缺點:

1、引數更新的過程震盪很大,目標函式波動劇烈,引數更新方向有很大的波動。

2、其較大的波動可能收斂到比批次梯度下降更小的區域性極小值,因為會從一個極小值跳出來

3、不易並行實現。

從迭代的次數上來看,SGD迭代的次數較多,在解空間的搜尋過程看起來很盲目。其迭代的收斂曲線示意圖可以表示如下:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

下面來對比下SGD和BGD的代價函式隨著迭代次數的變化圖:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

可以看到SGD的代價函式隨著迭代次數是震盪式的下降的(因為每次用一個樣本,有可能方向是背離最優點的)

小批次梯度下降(Mini-Batch Gradient Descent)

在上述的批梯度的方式中每次迭代都要使用到所有的樣本,對於資料量特別大的情況,如大規模的機器學習應用,每次迭代求解所有樣本需要花費大量的計算成本。所以出現了mini-batch梯度下降,其思想是:可以在每次的迭代過程中利用部分樣本代替所有的樣本。batch通常設定為2的冪次方,通常設定(很少設定大於512)。因為設定成2的冪次方,更有利於GPU加速。現在深度學習中,基本上都是用 mini-batch gradient descent,(在深度學習中,很多直接把mini-batch gradient descent(a。k。a stochastic mini-batch gradient descent)簡稱為SGD,所以當你看到深度學習中的SGD,一般指的就是mini-batch gradient descent)。

假設每個batch有64個樣本,如下圖所示:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

mini-batch gradient descent 和 stochastic gradient descent 在下降時的對比圖:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

mini-batch gradient descent的代價函式隨著迭代次數的變化圖:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

mini-batch gradient descent 相對SGD在下降的時候,相對平滑些。不像SGD那樣震盪的比較厲害。mini-batch gradient descent的一個缺點是增加了一個超引數。

優點:

1、降低了更新引數的方差,使得收斂過程更加的穩定

2、能夠利用高度最佳化的矩陣運算,很高效的求得每小批資料的梯度

SGD容易收斂到區域性最優,並且在某些情況下可能被困在鞍點,【在合適的初始化和step size的情況下,鞍點的影響不是很大。】

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

【上述梯度下降法方法面臨的主要挑戰】:

選擇合適的學習率較為困難,太小的學習率會導致收斂緩慢,太大的學習率導致波動較大,可能跳出區域性最小值。目前可採用的方法是在訓練過程中調整學習率的大小,例如模擬退火法:預定義一個迭代次數m,每次執行完m次訓練便減小學習率,或者當損失函式的值低於一個閾值時,減小學習率,迭代次數和損失函式的閾值必須訓練前先定義好。

上述方法中,每個引數的學習率都是相同的,但這種方法是不合理的,如果訓練資料是稀疏的,並且不同特徵的出現頻率差異較大,那麼比較合理的做法是對於出現頻率較低的特徵設定較大的學習率,對於出現頻率較大的特徵設定較小的學習率。

近期研究表明[1],深層網路之所以比較難以訓練,並不是因為容易進入區域性最優,因為網路結構十分複雜,即使進入了局部最優也可以得到很好的效果,難以訓練的原因在於學習的過程很容易落入鞍點,也就是在一個維度是極小值,另一個維度卻是極大值的點,而這種情況比較容易出現在平坦區域,在這種區域中,所有方向的梯度幾乎都是0,但有的方向的二階導小於0,即出現極大值。

動量法(Momentum)

SGD(一般指小批次梯度下降)的一個缺點在於,其更新的方向完全依賴於當前batch計算出的梯度,因而十分不穩定。

Momentum演算法借用了物理中的動量的概念,模擬物體運動時候的慣性,即在更新的時候在一定程度上保留之前更新的方向,同時利用當前batch的梯度對之前的梯度進行微調,這樣一來,可以在一定程度上增加穩定性,從而學習的更快,並且有一定的擺脫區域性最優的能力。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

更新後的梯度 = 動量項(折損係數(gamma)) x 更新前的梯度+當前的梯度

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

注意:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

表示之前所有步驟所累積的動量和,而不僅僅是上一個更新梯度。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

紅色為SGD+momentum,黑色為SGD

【注意】:

動量項是表示在多大程度上保留原來的更新方向,值在0~1之間,是自己設定的超引數,訓練開始時,由於梯度可能會很大,所以初始值一般選為0。5,當梯度慢慢減小的時候,改為0。9。

剛開始的時候,梯度方向變化很大,原始梯度起的作用較小,當前時刻的梯度方向減弱,則動量項較小,動量小則步長小

xwn:SGD其實就是摸著石頭下山,動量項越大,則越難轉向。初始時尚在找路階段,原始梯度方向借鑑意義比較小,所以可以動量項設定小一些,後期經過積累基本已鎖定正確最佳化方向,則動量項可以設定大一些,使得每次的當前梯度只是使總方向微調而已。

後面的時候,梯度方向變化較小了,原始梯度起的作用大,當前時刻的梯度方向增強,則動量項較大,動量大則步長大

動量項的解釋:物體運動都是有慣性的,隨機梯度下降和批次梯度下降的梯度之和本時刻的梯度有關,可以立刻改變方向,但如果加上動量的話,方向不可能驟轉。

當動量項分別設定為0。5,0。9,0。99的時候,分別表示最大速度2倍、10倍、100倍於SGD的演算法

xwn: pytorch 中用的SGD其實為加入動量的mini-batch SGD

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

Nesterov Momentum(Nesterov Accelerated Gradient)

在預測引數下一次的位置之前,我們已有當前的引數和動量項,先用

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

作為引數下一次出現位置的預測值,雖然不準確,但是大體方向是對的,之後用我們預測到的下一時刻的值來求偏導,讓最佳化器高效的前進並收斂。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

其中:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

表示之前所有步驟所累積的動量和,θ表示引數,一般 γ 仍取值 0。9 左右。

【注意】:在計算梯度時,不是在當前位置,而是未來的位置上NAG 可以使 RNN 在很多工上有更好的表現。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

【自適應學習率的方法】

Adagrad法[2]

該方法是基於梯度的最佳化方法,其主要功能是:對於不同的引數使用不同的學習率,頻繁變化的引數以更小的步長進行更新,而稀疏的引數以更大的步長進行更新,

適合於處理稀疏資料。

對g_叢1到t進行一個遞推形成一個對學習率約束項, 用來保證分母非 0 ,

xwn:不同引數的梯度不同,但之前的方法所有引數的學習率是相同的。

對於稀疏資料而言,每當該引數所對應的特徵缺失或者為0時,其基本就不更新了,所以稀疏的那部分特徵所對應引數更新頻率較低,收斂較慢。(累積的梯度也較小)

此方法透過學習率除以累積梯度的方法,增大稀疏引數的學習率,降低稠密的

超引數設定值:一般η選取0。01

直觀感受AdaGrad:

假設我們現在採用的最佳化演算法是最普通的梯度下降法mini-batch。它的移動方向如下面藍色所示:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

假設我們現在就只有兩個引數w,b,我們從圖中可以看到在b方向走的比較陡峭,這影響了最佳化速度。

而我們採取AdaGrad演算法之後,我們在演算法中使用了累積平方梯度n_t=n_(t-1)+g2。

從上圖可以看出在b方向上的梯度g要大於在w方向上的梯度。

那麼在下次計算更新的時候,r是作為分母出現的,越大的反而更新越小,越小的值反而更新越大,那麼後面的更新則會像下面綠色線更新一樣,明顯就會好於藍色更新曲線。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

結論:在引數空間更為平緩的方向,會取得更大的進步(因為平緩,所以歷史梯度平方和較小,對應學習下降的幅度較小),並且能夠使得陡峭的方向變得平緩,從而加快訓練速度。

特點:

前期較小的時候, 學習率約束項較大,能夠放大梯度

後期較大的時候,學習率約束項較小,能夠約束梯度

缺點:

由公式可以看出,仍依賴於人工設定一個全域性學習率

設定過大的話,會使學習率約束項過於敏感,對梯度的調節太大

中後期,分母上梯度平方的累加將會越來越大,使引數更新梯度區域0,使得訓練提前結束

【補充】:

It adapts the learning rate to the parameters, performing smaller updates (i。e。 low learning rates) for parameters associated with frequently occurring features, and larger updates (i。e。 high learning rates) for parameters associated with infrequent features。 For this reason, it is well-suited for dealing with sparse data。

高頻出現特徵的相關引數有較小的更新,低頻出現特徵的相關引數有較大的更新,適合處理稀疏資料。

原論文對稀疏資料的解釋:sparse data (input sequences where g_t has many zeros)

網上對於適合稀疏資料的解釋:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

Adadelta/RMSprop

Adadetla是Adagrad的一個延伸,它旨在解決Adagrad學習率不斷急劇單調下降的問題,Adagrad是利用之前所有梯度的平方和,Adadelta法僅計算在一個時間區間內的梯度值的累積和。

此處的梯度累積和定義為:關於過去梯度值的指數衰減均值,當前時間的梯度均值是基於過去梯度的均值和當前梯度值平方的加權平均,γ是權重。

xwn:每一次都會在之前的梯度積累值上乘γ,越久遠的梯度值,被乘γ的次數就越大,被遺忘的就越多。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

這個分母相當於梯度的均方根 root mean squared (RMS),在資料統計分析中,將所有值平方求和,求其均值,再開平方,就得到均方根值 ,所以可以用 RMS 簡寫:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

RMSprop可以算作Adadelta的一個特例,γ=0。9

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

RMSprop提出者Hinton 建議設定γ為0。9, 學習率η為 0。001。

RMSprop和Adadelta都是大約在同一時間獨立開發的,它們都是為了解決Adagrad的學習率急劇下降的問題。

總體演算法圖,可能會對全域性有把握:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

RMSProp演算法不是像AdaGrad演算法那樣直接暴力地累加平方梯度,而是加了一個衰減係數來控制歷史資訊的獲取多少。見公式7。1。γ作用相當於加了一個指數衰減係數來控制歷史資訊的獲取多少,通俗理解,見https://zhuanlan。zhihu。com/p/29895933

優點:

1、RMSprop算是Adagrad的一種發展,和Adadelta的變體,效果趨於二者之間

2、適合處理非平穩目標-對於RNN效果很好

Adam:Adaptive Moment Estimation自適應矩估計

矩估計

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

二階矩估計:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每個引數的學習率。Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定範圍,使得引數比較平穩。公式如下:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

特點:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

參考:

[1] Adolphs, Leonard, Hadi Daneshmand, Aurelien Lucchi, and Thomas Hofmann。 “Local Saddle Point Optimization: A Curvature Exploitation Approach。” ArXiv:1805。05751 [Cs, Math, Stat], February 14, 2019。 http://arxiv。org/abs/1805。05751。

[2] Duchi, J。, Hazan, E。, & Singer, Y。 (2011)。 Adaptive Subgradient Methods for Online Learning and Stochastic Optimization。 Journal of Machine Learning Research, 12, 2121–2159。 Retrieved from http://jmlr。org/papers/v12/duchi11a。html

https://blog。csdn。net/u012328159/article/details/80252012

https://blog。csdn。net/cs24k1993/article/details/79120579

https://zhuanlan。zhihu。com/p/22252270

https://blog。csdn。net/jiaoyangwm/article/details/81457623

https://www。jiqizhixin。com/graph/technologies/f41c192d-9c93-4306-8c47-ce4bf10030dd Adam

18。 線性判別分析

線性判別分析(linear discriminant analysis,LDA)是對fisher的線性鑑別方法的歸納,這種方法使用統計學,模式識別和機器學習方法,試圖找到兩類物體或事件的特徵的一個線性組合,以能夠特徵化或區分它們。所得的組合可用來作為一個線性分類器,或者,更常見的是,為後續的分類做降維處理。

線性判別分析是特徵抽取的一種方法。

特徵抽取又可以分為監督和無監督的方法。監督的特徵學習的目標是抽取對一個特定的預測任務最有用的特徵,比如線性判別分析(Linear Discriminant Analysis, LDA)。而無監督的特徵學習和具體任務無關,其目標通常是減少冗餘資訊和噪聲,比如主成分分析(Principle Components Analysis, PCA)、獨立成分分析、流形學習、自編碼器。

線性判別分析可以用於降維。

在實際應用中,資料是多個類別的,我們的原始資料一般也是超過二維的,投影后的也一般不是直線,而是一個低維的超平面。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

LDA與PCA 異同點:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

某些某些資料分佈下PCA比LDA降維較優,如下圖所示:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

LDA優缺點:

LDA演算法既可以用來降維,又可以用來分類,但是目前來說,主要還是用於降維。在進行影象識別相關的資料分析時,LDA是一個有力的工具。下面總結下LDA演算法的優缺點。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

參考:

https://zhuanlan。zhihu。com/p/27899927

https://www。cnblogs。com/jiangkejie/p/11153555。html

https://www。cnblogs。com/jerrylead/archive/2011/04/21/2024384。html

19。樸素貝葉斯

為什麼“樸素”:條件獨立性假設

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

推導:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

在計算條件機率P(x|y)時出現機率為0的情況怎麼辦:

拉普拉斯平滑

優缺點:

優點:

對小規模的資料表現很好

面對孤立的噪聲點,樸素貝葉斯分類器是健壯的

可解釋性高

缺點:輸入變數必須都是條件獨立的

20。梯度提升決策樹GBDT/MART (Gradient Boosting Decision Tree)

Decision Tree:GBDT中使用的決策樹一般為CART

Gradient Boosting:每次沿著損失函式的梯度下降(負梯度)的方向訓練基分類器,最後將所有基分類器結果加和作為預測結果。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

梯度提升與梯度下降關係:

兩者都是沿著梯度下降的方向對模型進行最佳化。

梯度下降是LR或神經網路中使用,梯度最佳化是針對模型引數的,每次迭代過程都是對引數的更新。

梯度提升是直接對函式的更新,這樣和使用什麼模型無關,擴充套件了使用模型的種類

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

優點:

預測的時候基分類器可以平行計算,預測速度快

對於分佈稠密的資料,泛化能力和表達能力都很好

採用決策樹作為基分類器,可解釋性高,能自動發現特徵之間的高階關係,也不需要對資料進行歸一化等預處理

缺點:

高維稀疏資料,不如svm和神經網路

處理文字分類的時候,沒有像處理數值特徵的時候那麼有優勢

序列訓練,訓練過程慢

21。KMeans

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

優點:相對是高效的,它的計算複雜度是O(NKt)接近於線性,其中N是資料物件的數目,K是聚類的簇數,t是迭代的輪數

缺點:

(1)受初始點、初始K值的影響每次的結果不穩定;

(2)結果通常不是全域性最優而是區域性最優解

K值的選擇:一般基於經驗和多次實驗結果。例如採用手肘法,我們可以嘗試不同的K值:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

由圖可見,K值越大,距離和越小;並且,當K=3時,存在一個拐點,就像人

的肘部一樣;當K (1,3)時,曲線急速下降;當K>3時,曲線趨於平穩。手肘法認

為拐點就是K的最佳值

K-means++演算法:最佳化K-means“初始點”缺點 :

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

二分K-Means演算法:

將所有樣本資料作為一個簇放到一個佇列中。

從佇列中選擇一個簇進行K-means演算法劃分,劃分為兩個子簇,並將子簇新增到佇列中。

迴圈迭代第二步操作,直到中止條件達到(聚簇數量、最小平方誤差、迭代次數等)。

佇列中的簇就是最終的分類簇集合。

從佇列中選擇劃分聚簇的規則一般有兩種方式,分別如下:

對所有簇計算誤差和SSE(SSE也可以認為是距離函式的一種變種),選擇SSE最大的聚簇進行劃分操作(優選這種策略)。

選擇樣本資料量最多的簇進行劃分操作

22。 牛頓法

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

xwn:牛頓法解決的問題:a,求解函式的根 b,求解函式極值

eg:求函式的根, 影象理解

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

首先得明確,牛頓法是為了求解函式值為零的時候變數的取值問題的,具體地,當要求解 f(x)=0時,如果 f可導,那麼將 f(x)展開:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

求區域性最優點(極值點)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

透過比較牛頓法和梯度下降法的迭代公式,可以發現兩者極其相似。海森矩陣的逆就好比梯度下降法的學習率引數alpha。牛頓法收斂速度相比梯度下降法很快,而且由於海森矩陣的的逆在迭代中不斷減小,起到逐漸縮小步長的效果。

海森矩陣:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

牛頓法的優缺點總結:

優點:二階收斂,收斂速度快;

缺點:牛頓法是一種迭代演算法,每一步都需要求解目標函式的Hessian矩陣的逆矩陣,計算比較複雜,尤其是在高維情況下。(擬牛頓法就是以較低的計算代價求海森矩陣的近似逆矩陣)

參考:

https://www。youtube。com/watch?v=FQN0-KHAgRw

https://zhuanlan。zhihu。com/p/37588590

http://sofasofa。io/forum_main_post。php?postid=1000966

23。 缺失值的處理

缺失值的原因:

資訊暫時無法獲取。如商品售後評價、雙十一的退貨商品數量和價格等具有滯後效應。

資訊被遺漏。可能是因為輸入時認為不重要、忘記填寫了或對資料理解錯誤而遺漏,也可能是由於資料採集裝置的故障

獲取這些資訊的代價太大。如統計某校所有學生每個月的生活費,家庭實際收入等等。

有些物件的某個或某些屬性是不可用的。如一個未婚者的配偶姓名、一個兒童的固定收入狀況等

_缺失值較多:_直接捨棄該特徵

缺失值較少

(<10%):填充處理

異常值填充:將缺失值作為一種情況處理0

均值/條件均值填充:

均值:對於數值型別屬性,可採用所有樣本的該屬性均值,

非數值型別,可採用所有樣本的眾數

其條件均值指的是與缺失值所屬標籤相同的所有資料的均值

最近距離法K-means:先根據歐式距離或相關分析來確定距離具有缺失資料樣本最近的K個樣本,將這K個值加權平均來估計該樣本的缺失資料

插值

演算法擬合填充:對有值的資料採用隨機森林等方法擬合,然後對有缺失值的資料進行預測,用預測的值來填充

具體演算法的缺失值處理:

LR:如上所述

決策樹:詳見第15點

XGBoost:將樣本分別分配到左孩子和右孩子,選擇增益大的方向分裂即可;如果在訓練中沒有缺失值而在預測中出現缺失,那麼會自動將缺失值的劃分方向放到右子樹

參考連結

https://zhuanlan。zhihu。com/p/33996846

24。 模型評估中常用的驗證方法

在機器學習中,我們通常把樣本分為訓練集和測試集,訓練集用於訓練模型,測試集用於評估模型。在樣本劃分和模型驗證的過程中,存在著不同的抽樣方法和驗證方法。

1)Holdout檢驗

Holdout 檢驗是最簡單也是最直接的驗證方法,它將原始的樣本集合隨機劃分成訓練集和驗證集兩部分。比方說,對於一個點選率預測模型,我們把樣本按照70%~30% 的比例分成兩部分,70% 的樣本用於模型訓練;30% 的樣本用於模型驗證,包括繪製ROC曲線、計算精確率和召回率等指標來評估模型效能。

缺點:在驗證集上計算出來的最後評估指標與原始分組有很大關係。

2)交叉檢驗

k-fold交叉驗證:首先將全部樣本劃分成k個大小相等的樣本子集;依次遍歷這k個子集,每次把當前子集作為驗證集,其餘所有子集作為訓練集,進行模型的訓練和評估;最後把k次評估指標的平均值作為最終的評估指標。在實際實驗中,k經常取10。

留一驗證:每次留下1個樣本作為驗證集,其餘所有樣本作為測試集。樣本總數為n,依次對n個樣本進行遍歷,進行n次驗證,再將評估指標求平均值得到最終的評估指標。在樣本總數較多的情況下,留一驗證法的時間開銷極大。事實上,留一驗證是留p驗證的特例。

留p驗證:每次留下p個樣本作為驗證集,而從n個元素中選擇p個元素有C(p,n)種可能,因此它的時間開銷更是遠遠高於留一驗證,故而很少在實際工程中被應用。

3) 自助法:

不管是Holdout檢驗還是交叉檢驗,都是基於劃分訓練集和測試集的方法進行模型評估的。然而,當樣本規模比較小時,將樣本集進行劃分會讓訓練集進一步減小,這可能會影響模型訓練效果。有沒有能維持訓練集樣本規模的驗證方法呢?自助法可以比較好地解決這個問題。

自助法是基於自助取樣法的檢驗方法。對於總數為n的樣本集合,進行n次有放回的隨機抽樣,得到大小為n的訓練集。n次取樣過程中,有的樣本會被重複取樣,有的樣本沒有被抽出過,將這些沒有被抽出的樣本作為驗證集,進行模型驗證,這就是自助法的驗證過程。

當樣本無窮大時,使用自助法有多少樣本未被選擇:

一個樣本一次抽中機率為1-1/n,n次未抽中的機率為(1-1/n)^n,

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

25。 主成分分析

主成分分析是一種降維的方法,目的是找到一個超平面,將原有樣本投射在該超平面上,原則則是樣本經過投射後損失的資訊儘量的少。

PCA 對該超平面有兩種解釋:

最近重構性:樣本點到該超平面的距離都足夠近。

最大可分性:樣本點到該超平面的投影都儘量可分。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

用最大可分性來推導,就是使得投影后的樣本的方差儘可能大,兩種方式都可以得到下式:(tr表示矩陣的跡,即矩陣主對角線元素的和,也等於矩陣所有特徵值的和)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

對其使用拉格朗日乘子法得到:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

對XXT做特徵值分解,取最大的d‘(d’為降維後的維數)個特徵值對應的特徵向量作為W,即得到PCA的解。

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

d‘的選取:

使用者事先指定。

用其它開銷較小的學習器先進行交叉驗證選取。

從重構的角度出發,設定一個重構閾值,如t=95%:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

降維的作用:

增大樣本取樣密度。

去除噪聲。

26。Softmax函式的特點和作用是什麼

我們知道max,假如說我有兩個數,a和b,並且a>b,如果取max,那麼就直接取a,沒有第二種可能。

但有的時候我們不想這樣,因為這樣會造成分值小的那個飢餓。所以我希望分值大的那一項經常取到,分值小的那一項也偶爾可以取到,那麼我用softmax就可以了。

現在還是a和b,a>b,如果我們取按照softmax來計算取a和b的機率,那a的softmax值大於b的,所以a會經常取到,而b也會偶爾取到,機率跟它們本來的大小有關。所以說不是max,而是Softmax那各自的機率究竟是多少呢,我們下面就來具體看一下

定義:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

1、計算與標註樣本的差距

在神經網路的計算當中,我們經常需要計算按照神經網路的正向傳播計算的分數S1,和按照正確標註計算的分數S2,之間的差距,計算Loss,才能應用反向傳播。

Loss定義為交叉熵

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

樣本中正確的那個分類的對數值。

取log裡面的值就是這組資料正確分類的Softmax值,它佔的比重越大,這個樣本的Loss也就越小,這種定義符合我們的要求。

2、計算上非常方便

當我們對分類的Loss進行改進的時候,我們要透過梯度下降,每次最佳化一個step大小的梯度。我們定義選到yi的機率是

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

然後我們求Loss對每個權重矩陣的偏導,應用鏈式法則

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

27。樣本不均衡

導致模型效能降低的本質原因

模型訓練時最佳化的目標函式和人們在測試時的評價標準不同:

分佈:在訓練時最佳化的是整個訓練集(正負樣本比例可能是1∶99)的正確率 而測試時可能想要模型在正樣本和負樣本上的平均正確率儘可能大(實際上是期望正負樣本比例為 1∶1)

權重(重要性):訓練時認為所有樣本的貢獻是相等的,而測試時假陽性樣本(False Positive) 和偽陰性樣本(False Negative)有著不同的代價

解決辦法

基於資料

a)隨機取樣:欠取樣(有放回)+過取樣(放不放回都可以)

欠取樣對少數樣本進行多次複製,擴大了資料規模,但容易造成過擬合。

欠取樣丟棄部分樣本,有可能會丟失部分有用資訊,導致模型只學到了整體模式的部分。

b)SMOTE演算法(針對過取樣)不再簡單的複製樣本,而是生成新樣本,降低過擬

對少數類的資料集的每一個樣本x,從其k近鄰中隨機選取一個樣本y,在其連線上隨機選取一點,作為新合成的樣本。

根據取樣倍率重複操作

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

每個少數類樣本合成相同數量的新樣本,這可能會增大類間重疊度,並且會生成一些不能提供有益資訊的樣本

i)Borderline-SMOTE:只給那些處在分類邊界上的少數類樣本 合成新樣本

ii)ADASYN: 給不同的少數類樣本合成不同個數的新樣本

iii)資料清理方法:進一步降低合成樣本帶來的類間重疊

資料擴充方法也是一種過取樣,對少數類樣本進行一些噪聲擾動或變換(如影象資料集中對圖片進行裁剪、翻轉、旋轉、加光照等)以構造出新的樣本

c)Informed Undersampling(欠取樣):解決資料丟失問題

i)easy ensemble

從多數類中隨機抽取子集E,與所有少數類訓練基分類器。重複操作後,基分類器融合

ii)Balance Cascade

從多數類中隨機抽取子集E,與所有少數類訓練基分類器。從多數類中剔除被分類正確的樣本,繼續重複操作融合基分類器。

基於演算法

改變損失函式,不同類別不同權重 ————不平衡

轉化為單類學習(one-class learning)——-極度不平衡

異常檢測(anormaly detection)

28。損失函式

迴歸

MSE loss/均方誤差--L2損失

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

MAE loss/平均絕對誤差--L1損失

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

MSE VS MAE

MSE易求解,但對異常值敏感, 得到觀測值的均值

MAE對於異常值更加穩健, 得到觀測值的中值

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

對於誤差較大的異常樣本,MSE損失遠大於MAE,使用MSE的話,模型會給予異常值更大的權重,全力減小異常值造成的誤差,導致模型整體表現下降。因此,訓練資料中異常值較多時,MAE較好。

但MAE在極值點梯度會發生躍遷,即使很小的損失也會造成較大的誤差,為解決這一問題,可以在極值附近動態減小學習率

總結:MAE對異常值更加魯棒,但導數的不連續導致找最優解過程中低效

MSE對異常值敏感,但最佳化過程更加穩定和準確

問題:例如某個任務中90%的資料都符合目標值——150,而其餘的10%資料取值則在0-30之間,那麼利用MAE最佳化的模型將會得到150的預測值而忽略的剩下的10%(傾向於中值);

而對於MSE來說由於異常值會帶來很大的損失,將使得模型傾向於在0-30的方向取值。

Huber loss/平滑平均絕對誤差

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

對異常值不敏感,且可微

使用超引數δ來調節這一誤差的閾值。當δ趨向於0時它就退化成了MAE,而當δ趨向於無窮時則退化為了MSE

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

Log-Cosh loss

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

擁有Huber的所有優點,並且在每一個點都是二次可導的。二次可導在很多機器學習模型中是十分必要的

Quantile loss/分位數損失

參考:https://www。jianshu。com/p/b715888f079b

分類

0-1 loss(很少使用)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

對每個錯分類點都施以相同的懲罰

不連續、非凸、不可導,難以使用梯度最佳化演算法

Cross Entropy Loss/交叉熵損失

Hinge Loss

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一般多用於支援向量機(SVM)

ys > 1 的樣本損失皆為 0,由此帶來了稀疏解,使得 SVM 僅透過少量的支援向量就能確定最終超平面

Exponential loss/指數損失

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一般多用於AdaBoost 中。因為使用 Exponential Loss 能比較方便地利用加法模型推匯出 AdaBoost演算法。該損失函式對異常點較為敏感,相對於其他損失函式robust性較差

Modified Huber loss

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

結合了 Hinge Loss 和 交叉熵 Loss 的優點。一方面能在 ys > 1 時產生稀疏解提高訓練效率;另一方面對於 ys < −1 樣本的懲罰以線性增加,這意味著受異常點的干擾較少

Softmax loss

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

當 s << 0 時,Softmax 近似線性;當 s>>0 時,Softmax 趨向於零。Softmax 同樣受異常點的干擾較小,多用於神經網路多分類問題中

注:相比 Exponential Loss,其它四個 Loss,包括 Softmax Loss,都對離群點有較好的“容忍性”,受異常點的干擾較小,模型較為健壯

參考:https://blog。csdn。net/weixin_41065383/article/details/89413819

focal loss

背景:

one-stage網路因為正負樣本嚴重不均衡,且負樣本中還有很多易區分的原因,精度一般低於two-stage 網路(two-stage 利用RPN網路,將正負樣本控制在1:3左右)

原理:

1,解決正負樣本不均衡問題:新增權重控制,增大少數類樣本權重

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

2,解決難易樣本問題:Pt越大說明該樣本易區分,應當降低容易區分樣本的權重。也就是說希望增加一個係數,機率越大的樣本,權重係數越小。

另,為提高可控性,引入係數γ

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

綜合:兩個引數α和γ協調來控制,本文作者採用α=0。25,γ=2效果最好

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

參考:https://blog。csdn。net/wfei101/article/details/79477303

29。貝葉斯決策論

機率框架下實施決策的基本方法

以多分類舉例:

共 N 種類別,λij 為將 j 類樣本誤分類為 i 類樣本所產生的損失。

那麼,給定樣本 x,將其分類為 i 類樣本所產生的期望損失為:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

任務目標為找到分類器 h:X→Y ,使總體損失最小:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

最好的 h 顯然是對每個樣本 x,都選擇期望損失最小的類別:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

h* 就叫貝葉斯最優分類器,R(h*)叫貝葉斯風險,1-R(h*) 是分類器所能達到的最優效能,即透過機器學習所能產生的模型精度的理論上限。

比如,目標是最小化誤分類率,那麼:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

判別式 vs 生成式

兩者的本質區別在於建模物件不同。

判別式

直接對 P(c|x) 建模:給定 x,使用模型預測其類別 c,透過各種方法來選擇最好的模型。

生成式

對 P(c,x) 建模,再計算 P(c|x):

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

P(c)好得,P(x)無所謂,重點在如何獲取 P(x|c)。

極大似然估計

假設 P(x|c) 滿足某種分佈(分佈引數為 θ),再用極大似然估計找出 θ。

樸素貝葉斯

假設 x 中所有屬性相互獨立:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

生成式模型理解 LR:

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

常見的判別式與生成式模型:

判別式:線性迴歸、邏輯迴歸、線性判別分析、SVM、神經網路

生成式:隱馬爾科夫模型HMM、樸素貝葉斯、高斯混合模型GMM、LDA、KNN

優缺點:

生成式模型最終得到的錯誤率會比判別式模型高,但是收斂所需的訓練樣本數會比較少。

生成式模型更容易擬合,比如在樸素貝葉斯中只需要計數即可,而判別式模型通常都需要解決凸最佳化問題。

生成式模型可以更好地利用無標籤資料。

生成式模型可以用來生成樣本 x。

生成式模型可以用來檢測異常值。

30。取樣

實現均勻分佈的隨機數生成器

計算機程式都是確定性的,因此並不能產生真正意義上的完全均勻分佈隨機數,只能產生偽隨機數。

計算機 的儲存和計算單元只能處理離散狀態值,因此也不能產生連續均勻分佈隨機數,只能透過離散分佈來逼近連續分佈(用很大的離散空間來提供足夠的精度)

線性同餘法:根據當前生成的隨機數xt來進行適當變換,進而產生下一次的隨機數xt+1 。初始值x0稱為隨機種子

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

得到的是區間[0,m−1]上的隨機整數,如果想要得到區間[0,1]上的連續均勻分佈隨機數,用xt除以m即可。

實際上對於特定的種子,很多數無法取到,迴圈週期基本達不到m。進行多次操作,得到的隨機數序列會進入迴圈週期gcc中的設定

一位演算法工程師 6 萬字總結演算法面試中的深度學習基礎問題(上)

種子seed應該是隨機選取的,可以將時間戳作為種子