1、常見的機器學習優(yōu)化器
1.1 gradient descent
1.1.1 全量梯度下降(Batch gradient descent)
每次使用全量的訓練集樣本來更新模型參數(shù),即θ=θ?η??θJ(θ)。
優(yōu)點:每次更新都會朝著正確的方向進行,最后能夠保證收斂于極值點(凸函數(shù)收斂于全局極值點,非凸函數(shù)可能會收斂于局部極值點),
缺點:在于每次學習時間過長,并且如果訓練集很大以至于需要消耗大量的內存,并且全量梯度下降不能進行在線模型參數(shù)更新。
1.1.2 隨機梯度下降(Stochastic gradient descent)
隨機梯度下降算法每次從訓練集中隨機選擇一個樣本來進行學習,即:θ=θ?η??θJ(θ;xi;yi)
優(yōu)點:隨機梯度下降算法每次只隨機選擇一個樣本來更新模型參數(shù),因此每次的學習是非??焖俚?/strong>,并且可以進行在線更新。
缺點:每次更新可能并不會按照正確的方向進行,因此可以帶來優(yōu)化波動,不過從另一個方面來看,隨機梯度下降所帶來的波動有個好處就是,對于類似盆地區(qū)域(即很多局部極小值點)那么這個波動的特點可能會使得優(yōu)化的方向從當前的局部極小值點跳到另一個更好的局部極小值點,這樣便可能對于非凸函數(shù),最終收斂于一個較好的局部極值點,甚至全局極值點。 由于波動,因此會使得迭代次數(shù)增多,即收斂速度變慢。
1.1.3 小批量梯度下降(Mini-batch gradient descent)
Mini-batch梯度下降綜合了batch梯度下降與stochastic梯度下降,在每次更新速度與更新次數(shù)中間取得一個平衡,其每次更新從訓練集中隨機選擇m,m<<n
個樣本進行學習,即:
θ=θ?η??θJ(θ;xi:i+m;yi:i+m)
優(yōu)點: 相對于隨機梯度下降,Mini-batch梯度下降降低了收斂波動性,即降低了參數(shù)更新的方差,使得更新更加穩(wěn)定。相對于全量梯度下降,其提高了每次學習的速度。并且其不用擔心內存瓶頸從而可以利用矩陣運算進行高效計算。
1.1.4 梯度下降法的問題和挑戰(zhàn)
學習率設定:學習率的設定帶來的挑戰(zhàn)有三方面。首先,選擇一個合理的學習率很難,如果學習速率過小,則會導致收斂速度很慢。如果學習速率過大,那么其會阻礙收斂,即在極值點附近會振蕩。其次,學習速率調整很難,我們一般使用某種事先設定的策略或者在每次迭代中衰減一個較小的閾值。無論哪種調整方法,都需要事先進行固定設置,這邊便無法自適應每次學習的數(shù)據(jù)集特點。最后,模型所有的參數(shù)每次更新都是使用相同的學習速率。如果數(shù)據(jù)特征是稀疏的或者每個特征有著不同的取值統(tǒng)計特征與空間,那么便不能在每次更新中每個參數(shù)使用相同的學習速率,那些很少出現(xiàn)的特征應該使用一個相對較大的學習速率。
局部極小和鞍點:對于非凸目標函數(shù),容易陷入那些次優(yōu)的局部極值點或者鞍點中。
1.2 Momentum
如果在峽谷地區(qū)(某些方向較另一些方向上陡峭得多,常見于局部極值點),SGD會在這些地方附近振蕩,從而導致收斂速度慢。這種情況下,動量(Momentum)便可以解決。動量在參數(shù)更新項中加上一次更新量(即動量項,相當于指數(shù)加權平均),即:
νt=γνt?1+η ?θJ(θ)
θ=θ?νt
其作用如下圖所示:


優(yōu)點:對方向一致的參數(shù)能夠加速學習,對梯度改變方向的參數(shù)能夠減少其更新,因此就是momentum能夠在相關方向上加速學習,抑制振蕩,從而加速收斂。
缺點:比較難學習一個較好的學習率。
1.3 Adagrad
在前面介紹的算法中,每個模型參數(shù)θi使用相同的學習速率η,而Adagrad在每一個更新步驟中對于每一個模型參數(shù)θi使用不同的學習速率ηi。其更新方程為:

其中,Gt∈Rd×d是一個對角矩陣,其中第i行的對角元素eii為過去到當前第i個參數(shù)θi的梯度的平方和,epsilon是一個平滑參數(shù),為了使得分母不為0。
進一步,將所有Gt,ii,gt,i的元素寫成向量Gt,gt,這樣便可以使用向量點乘操作:

優(yōu)點:在于它能夠為每個參數(shù)自適應不同的學習速率,而一般的人工都是設定為0.01。
缺點:在于需要計算參數(shù)梯度序列平方和,并且學習速率趨勢是不斷衰減最終達到一個非常小的值。
1.4 RMSprop
為了降低Adagrad中學習速率衰減過快的問題,RMSprop使用指數(shù)加權平均來代替歷史梯度的平方和:

Rmsprop的的效果如下圖所示,對梯度較大的方向減小其學習速率,相反的,在梯度較小的方向上增加其學習速率。
優(yōu)點:RMSprop改進了Adagrad學習速率衰減過快的問題,同時其適用于處理非平穩(wěn)。
缺點:依然依賴一個全局學習率。
1.5 Adam
Adam 算法結合了 Momentum 和 RMSprop 梯度下降法,并且是一種極其常
用的學習算法,被證明能有效適用于不同神經網(wǎng)絡,適用于廣泛的結構。其計算方式如下:

上式中使用的是經過偏差修正后的指數(shù)加權平均數(shù):


2、常見的過擬合解決方法
2.1 L1和L2正則化
L1和L2正則化來避免過擬合是大家都知道的事情,而且我們都知道L1正則化可以得到稀疏解,L2正則化可以得到平滑解,這是為什么呢?有幾種解釋吧,可以參考文獻8(https://blog.csdn.net/f156207495/article/details/82794151) 。主要有幾個方面:
1)直觀的從圖像上觀察結論
2)通過對梯度的求解進行解釋
3)通過L1正則和L2正則假設的參數(shù)先驗上進行解釋。
2.2 數(shù)據(jù)增強
通俗得講,數(shù)據(jù)增強即需要得到更多的符合要求的數(shù)據(jù),即和已有的數(shù)據(jù)是獨立同分布的,或者近似獨立同分布的。一般有以下方法:
1)從數(shù)據(jù)源頭采集更多數(shù)據(jù)
2)復制原有數(shù)據(jù)并加上隨機噪聲
3)重采樣
4)根據(jù)當前數(shù)據(jù)集估計數(shù)據(jù)分布參數(shù),使用該分布產生更多數(shù)據(jù)等
2.3 Early stopping
Early stopping便是一種迭代次數(shù)截斷的方法來防止過擬合的方法,即在模型對訓練數(shù)據(jù)集迭代收斂之前停止迭代來防止過擬合。
Early stopping可以得到與L2類似的參數(shù)平滑效果,可以通過定性和定量兩個方面進行分析,具體參考文獻10:http://www.friskit.me/2017/03/27/l2-equals-to-stop-early/
2.4 dropout
dropout是指在深度學習網(wǎng)絡的訓練過程中,對于神經網(wǎng)絡單元,按照一定的概率將其暫時從網(wǎng)絡中丟棄。dropout為什么能防止過擬合,可以通過以下幾個方面來解釋:
- 它強迫一個神經單元,和隨機挑選出來的其他神經單元共同工作,達到好的效果。消除減弱了神經元節(jié)點間的聯(lián)合適應性,增強了泛化能力。
- 類似于bagging的集成效果
- 對于每一個dropout后的網(wǎng)絡,進行訓練時,相當于做了Data Augmentation,因為,總可以找到一個樣本,使得在原始的網(wǎng)絡上也能達到dropout單元后的效果。 比如,對于某一層,dropout一些單元后,形成的結果是(1.5,0,2.5,0,1,2,0),其中0是被drop的單元,那么總能找到一個樣本,使得結果也是如此。這樣,每一次dropout其實都相當于增加了樣本。
2.5 交叉驗證
交叉驗證的基本思想就是將原始數(shù)據(jù)(dataset)進行分組,一部分做為訓練集來訓練模型,另一部分做為測試集來評價模型。我們常用的交叉驗證方法有簡單交叉驗證、S折交叉驗證和留一交叉驗證。
2.6 決策樹剪枝
在決策樹學習中將已生成的樹進行簡化的過程稱為剪枝。又分為前剪枝和后剪枝,這里我們就不細細介紹了。
3、CTR預估 & 推薦系統(tǒng)
3.1 FM的原理及化簡
FM的計算公式如下:

化簡過程如下:
求導結果如下:
3.2 FFM的原理
在FFM中,每一維特征 xi,針對其它特征的每一種field fj,都會學習一個隱向量 vi,fj。因此,隱向量不僅與特征相關,也與field相關。
假設樣本的 n個特征屬于f個field,那么FFM的二次項有 nf個隱向量。而在FM模型中,每一維特征的隱向量只有一個。FM可以看作FFM的特例,是把所有特征都歸屬到一個field時的FFM模型。根據(jù)FFM的field敏感特性,可以導出其模型方程。
可以看到,如果隱向量的長度為 k,那么FFM的二次參數(shù)有 nfk 個,遠多于FM模型的 nk個。此外,由于隱向量與field相關,F(xiàn)FM二次項并不能夠化簡,其預測復雜度是 O(kn2)。
FFM將問題定義為分類問題,使用的是logistic loss,同時加入了正則項(這里是分類類別為-1和1時候的log loss)
3.3 wide & deep的原理
wide & deep的結構如下:

Wide Part
Wide Part其實是一個廣義的線性模型,使用特征包括
raw input(原始特征)和cross-product transformation(組合特征)
Deep Part

Deep Part通過學習一個低緯度的dense representation(也叫做embedding vector)對于每一個query和item,來泛化給你推薦一些字符上看起來不那么相關,但是你可能也是需要的。比如說:你想要炸雞,Embedding Space中,炸雞和漢堡很接近,所以也會給你推薦漢堡。
Embedding vectors被隨機初始化,并根據(jù)最終的loss來反向訓練更新。這些低維度的dense embedding vectors被作為第一個隱藏層的輸入。隱藏層的激活函數(shù)通常使用ReLU。
模型的訓練
模型的最終輸出為:

通過聯(lián)合訓練方式進行訓練。之前面試問到兩個部分是否可以用不同的優(yōu)化器,論文中給出的是:Wide組件是用FTRL(Follow-the-regularized-leader) + L1正則化學習。Deep組件是用AdaGrad來學習。
3.4 DeepFM的原理
先來看一下DeepFM的模型結構:
DeepFM包含兩部分:神經網(wǎng)絡部分與因子分解機部分,分別負責低階特征的提取和高階特征的提取。這兩部分共享同樣的輸入。DeepFM的預測結果可以寫為:
FM部分
FM部分的詳細結構如下:
FM的輸出公式為:
深度部分
深度部分是一個前饋神經網(wǎng)絡。與圖像或者語音這類輸入不同,圖像語音的輸入一般是連續(xù)而且密集的,然而用于CTR的輸入一般是及其稀疏的。因此需要重新設計網(wǎng)絡結構。具體實現(xiàn)中為,在第一層隱含層之前,引入一個嵌入層來完成將輸入向量壓縮到低維稠密向量。
嵌入層(embedding layer)的結構如上圖所示。當前網(wǎng)絡結構有兩個有趣的特性,1)盡管不同field的輸入長度不同,但是embedding之后向量的長度均為K。2)在FM里得到的隱變量Vik現(xiàn)在作為了嵌入層網(wǎng)絡的權重。
4、Batch Normalization
4.1 為什么要做BN
我們首先來思考一個問題,為什么神經網(wǎng)絡需要對輸入做標準化處理?原因在于神經網(wǎng)絡本身就是為了學習數(shù)據(jù)的分布,如果訓練集和測試集的分布不同,那么導致學習的神經網(wǎng)絡泛化性能大大降低。同時,我們在使用mini-batch對神經網(wǎng)絡進行訓練時,不同的batch的數(shù)據(jù)的分布也有可能不同,那么網(wǎng)絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網(wǎng)絡的訓練速度。因此我們需要對輸入數(shù)據(jù)進行標準化處理。
對于深度網(wǎng)絡的訓練是一個復雜的過程,只要網(wǎng)絡的前面幾層發(fā)生微小的改變,那么后面幾層就會被累積放大下去。一旦網(wǎng)絡某一層的輸入數(shù)據(jù)的分布發(fā)生改變,那么這一層網(wǎng)絡就需要去適應學習這個新的數(shù)據(jù)分布,所以如果訓練過程中,訓練數(shù)據(jù)的分布一直在發(fā)生變化,那么將會影響網(wǎng)絡的訓練速度。
我們知道網(wǎng)絡一旦train起來,那么參數(shù)就要發(fā)生更新,除了輸入層的數(shù)據(jù)外(因為輸入層數(shù)據(jù),我們已經人為的為每個樣本歸一化),后面網(wǎng)絡每一層的輸入數(shù)據(jù)分布是一直在發(fā)生變化的,因為在訓練的時候,前面層訓練參數(shù)的更新將導致后面層輸入數(shù)據(jù)分布的變化。我們把網(wǎng)絡中間層在訓練過程中,數(shù)據(jù)分布的改變稱之為:Internal Covariate Shift。為了解決Internal Covariate Shift,便有了Batch Normalization的誕生。
4.2 如何做BN(訓練和預測)
訓練階段
訓練階段對每一層,BN的計算過程如下:

可以看到,在BN的計算過程中,不僅僅有標準化的操作,還有最后一步,被稱為變換重構。為什么要增加這一步呢?其實如果是僅僅使用上面的歸一化公式,對網(wǎng)絡某一層A的輸出數(shù)據(jù)做歸一化,然后送入網(wǎng)絡下一層B,這樣是會影響到本層網(wǎng)絡A所學習到的特征的。打個比方,比如我網(wǎng)絡中間某一層學習到特征數(shù)據(jù)本身就分布在S型激活函數(shù)的兩側,你強制把它給我歸一化處理、標準差也限制在了1,把數(shù)據(jù)變換成分布于s函數(shù)的中間部分,這樣就相當于我這一層網(wǎng)絡所學習到的特征分布被你搞壞了。于是我們增加了變換重構,保留了網(wǎng)絡所學習到的特征。
預測階段
一個網(wǎng)絡一旦訓練完了,就沒有了min-batch這個概念了。測試階段我們一般只輸入一個測試樣本,看看結果而已。因此測試樣本,前向傳導的時候,上面的均值u、標準差σ 要哪里來?其實網(wǎng)絡一旦訓練完畢,參數(shù)都是固定的,這個時候即使是每批訓練樣本進入網(wǎng)絡,那么BN層計算的均值u、和標準差都是固定不變的。
因此在預測階段,對于均值來說直接計算所有訓練batch u值的平均值;然后對于標準偏差采用訓練階段每個batch σB的無偏估計,過程如下:

5、集成學習
5.1 Bagging
Bagging即套袋法,其算法過程如下:
1、從原始樣本集中抽取訓練集.每輪從原始樣本集中使用Bootstraping的方法抽取n個訓練樣本(在訓練集中,有些樣本可能被多次抽取到,而有些樣本可能一次都沒有被抽中).共進行k輪抽取,得到k個訓練集.(k個訓練集相互獨立)
2、每次使用一個訓練集得到一個模型,k個訓練集共得到k個模型.(注:根據(jù)具體問題采用不同的分類或回歸方法,如決策樹、神經網(wǎng)絡等)
3、對分類問題:將上步得到的k個模型采用投票的方式得到分類結果;對回歸問題,計算上述模型的均值作為最后的結果.
5.2 Boosting
Boosting是一族可將弱學習器提升為強學習器的算法。關于Boosting的兩個核心問題:
1、在每一輪如何改變訓練數(shù)據(jù)的權值或概率分布?
通過提高那些在前一輪被弱分類器分錯樣例的權值,減小前一輪分對樣本的權值,而誤分的樣本在后續(xù)受到更多的關注.
2、通過什么方式來組合弱分類器?
通過加法模型將弱分類器進行線性組合,比如AdaBoost通過加權多數(shù)表決的方式,即增大錯誤率小的分類器的權值,同時減小錯誤率較大的分類器的權值。而提升樹通過擬合殘差的方式逐步減小殘差,將每一步生成的模型疊加得到最終模型。
5.3 Bagging和Boosting的方差-偏差分析
我們都知道,Bagging主要降低的是模型的方差,而Boosting主要減小的是模型的偏差,這是為什么呢?
這里我們主要引用參考文獻13中的解釋:

5.4 Stacking
stacking 就是當用初始訓練數(shù)據(jù)學習出若干個基學習器后,將這幾個學習器的預測結果作為新的訓練集,來學習一個新的學習器。
在stacking的模型訓練階段,二級模型的訓練集是使用一級模型產生的,如果直接使用一級模型對初始的訓練集樣本進行預測來產生二級模型的訓練集,這樣會有極大的過擬合的風險,因此一般是用訓練一級模型未使用的樣本來產生二級模型的訓練集,交叉驗證方法是比較常用的方法。
Stacking的二級模型的訓練樣本的shape應該是訓練集長度 * 基分類器個數(shù),因此對于每個一級模型來說的,通過下面的圖示來產生部分該模型對應的部分,最后進行橫向拼接:
而對于二級模型的測試集來說,由于每次交叉驗證的過程中都要進行一次預測,假設我們是5折交叉驗證,那么對于每個一級模型來說,得到的shape是測試集行數(shù) * 交叉驗證折數(shù),此時的做法是,對axis=1方向取平均值,以得到測試集行數(shù) * 1 的測試數(shù)據(jù),最后將每個一級模型的結果進行橫向拼接,得到二級模型的測試樣本的shape是測試集行數(shù) * 基分類器個數(shù),可以跟訓練集保持一致:
6、梯度消失、爆炸及解決方案
想必大家對梯度消失和梯度爆炸的概念都很了解了,這里我們只談一談如何避免梯度消失和爆炸。
6.1 預訓練加微調
該方案的基本思想是每次訓練一層隱節(jié)點,訓練時將上一層隱節(jié)點的輸出作為輸入,而本層隱節(jié)點的輸出作為下一層隱節(jié)點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成后,再對整個網(wǎng)絡進行“微調”(fine-tunning)。此思想相當于是先尋找局部最優(yōu),然后整合起來尋找全局最優(yōu),此方法有一定的好處,但是目前應用的不是很多了。
6.2 梯度裁切
梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然后更新梯度的時候,如果梯度超過這個閾值,那么就將其強制限制在這個范圍之內。這可以防止梯度爆炸。
6.3 正則化
正則化在一定程度上也可以避免梯度爆炸的問題,比較常見的是l1
正則和l2正則。
6.4 relu、leakrelu、elu等激活函數(shù)
relu
relu的數(shù)學表達式為f(x) = max(0, x),圖像如下:

我們可以很容易看出,relu函數(shù)的導數(shù)在正數(shù)部分是恒等于1的,因此在深層網(wǎng)絡中使用relu激活函數(shù)就不會導致梯度消失和爆炸的問題。但由于負數(shù)部分恒為0,會導致一些神經元無法激活。
leak relu
leakrelu就是為了解決relu的0區(qū)間帶來的影響,其數(shù)學表達為:f(x)=max(k?x,x)。其中k是leak系數(shù),一般選擇0.01或者0.02,或者通過學習而來,其圖像如下:

elu
elu激活函數(shù)也是為了解決relu的0區(qū)間帶來的影響,其表達式為:

其圖像如下:

6.5 batch normalization
有關batch normalization內容,可以參考本文的第四部分。多說一句,我們可以理解BN將輸出從飽和區(qū)拉倒了非飽和區(qū)。 尤其在使用sigmoid激活函數(shù)或者tanh激活函數(shù)時,這個作用更加明顯。
6.6 殘差結構
在一定深度下,深層網(wǎng)絡的訓練誤差大于淺層網(wǎng)絡的訓練誤差,我們稱之為網(wǎng)絡退化問題。而殘差結構有效的解決了這個問題,使得深層網(wǎng)絡的訓練效果好于淺層網(wǎng)絡。
ResNet中的殘差塊如下圖所示:

我們可以看出此時將A網(wǎng)絡的輸出誤差應該與B網(wǎng)絡相同(暫時不考慮網(wǎng)絡中的維度大小的細節(jié)),因為殘差塊的輸出為F(x) + x,如果將網(wǎng)絡中的參數(shù)置為0,則F(x)=0,因此得到的輸出為0+x=x。因此使用ResNet結構搭建的深度網(wǎng)絡至少與淺層網(wǎng)絡具有相同的擬合能力,不會出現(xiàn)之前的網(wǎng)絡退化問題。
6.7 LSTM
LSTM主要解決的是循環(huán)神經網(wǎng)絡中的梯度消失問題,傳統(tǒng)RNN中為什么會出現(xiàn)梯度消失或爆炸,以及LSTM是如何解決的,參考文獻14 和 15.
RNN梯度消失和爆炸的原因:https://zhuanlan.zhihu.com/p/28687529
LSTM如何解決梯度消失問題:https://zhuanlan.zhihu.com/p/28749444
另外還有一個常見的問題就是,LSTM和RNN中為什么選擇tanh作為激活函數(shù),而非relu??梢詤⒖嘉墨I16。
參考文獻
1、梯度下降優(yōu)化算法綜述:https://blog.csdn.net/heyongluoyao8/article/details/52478715
2、各優(yōu)化算法的優(yōu)缺點整理:https://blog.csdn.net/zhouhong0284/article/details/80232412
3、詳解機器學習中的梯度消失、爆炸原因及其解決方法:https://blog.csdn.net/qq_25737169/article/details/78847691
4、深度學習(二十九)Batch Normalization 學習筆記:https://blog.csdn.net/hjimce/article/details/50866313
5、基礎 | batchnorm原理及代碼詳解:https://blog.csdn.net/qq_25737169/article/details/79048516
6、BN論文:https://arxiv.org/abs/1502.03167
7、ResNet學習筆記:https://zhuanlan.zhihu.com/p/32085715
8、為什么L1稀疏,L2平滑?::https://blog.csdn.net/f156207495/article/details/82794151
9、l1 相比于 l2 為什么容易獲得稀疏解?:https://www.zhihu.com/question/37096933
10、http://www.friskit.me/2017/03/27/l2-equals-to-stop-early/:http://www.friskit.me/2017/03/27/l2-equals-to-stop-early/
11、CNN中的dropout理解:https://blog.csdn.net/dod_jdi/article/details/78379781
12、整理一份萬字機器學習資料?。?a href="http://www.itdecent.cn/p/70e04c02985c" target="_blank">http://www.itdecent.cn/p/70e04c02985c
13、bagging與boosting兩種集成模型的偏差bias以及方差variance 的理解:https://blog.csdn.net/shenxiaoming77/article/details/53894973
14、RNN梯度消失和爆炸的原因:https://zhuanlan.zhihu.com/p/28687529
15、LSTM如何解決梯度消失問題:https://zhuanlan.zhihu.com/p/28749444
16、RNN中為什么要采用tanh而不是ReLu作為激活函數(shù)?:https://www.zhihu.com/question/61265076
17、ResNet學習筆記:https://zhuanlan.zhihu.com/p/32085715