機器學習和深度學習相關問題總結

1. 如何解決正負類不平衡問題

類別不均衡時,不能使用accuracy作爲分類器的評價指標。例如:當在對一個類別不均衡的數據集進行分類時得到了90%的準確度(Accuracy)。當你進一步分析發現,數據集的90%的樣本是屬於同一個類,並且分類器將所有的樣本都分類爲該類。在這種情況下,顯然該分類器是無效的。並且這種無效是由於訓練集中類別不均衡而導致的。因此即使分類器將所有的樣本都分類到大類下面時,該指標值仍然會很高。即,該分類器偏向了大類這個類別的數據。
例如下面這個圖:
在這裏插入圖片描述
雖然分類器B的accuracy比A高,但是在實際中顯然A分類器的性能更好。

常見的解決辦法:

  • 擴大數據集
    當遇到類別不均衡問題時,首先應該想到,是否可能再增加數據(一定要有小類樣本數據),更多的數據往往戰勝更好的算法。因爲機器學習是使用現有的數據多整個數據的分佈進行估計,因此更多的數據往往能夠得到更多的分佈信息,以及更好分佈估計。即使再增加小類樣本數據時,又增加了大類樣本數據,也可以使用放棄一部分大類數據(即對大類數據進行欠採樣)來解決。

  • 嘗試其他評價指標
    數據分佈不均衡時,分類器可能並不能起效,甚至進行誤導。因此需要用其他指標來評價。常見的評價指標有:

    • 混淆矩陣(confusion matrix),可分別算出每一類的TP、FN、FP、TN
    • 精確度(precision): 分類器預測出的正樣本中,真正正樣本所佔比例
    • 召回率(recall): 所有正樣本中,分類器能預測正確的比率
    • Fβ_ScoreF_\beta\_{Score}: 綜合了precision和recall,值越高,表示算法性能越好。
    • Kappa曲線:
      k=pope1pe k = \frac{p_o-p_e}{1-p_e}
      kappa是用來進行一致性檢驗,也可以用於衡量分類精度,基於混淆矩陣。其中pop_o爲觀測一致率,pep_e爲期望一致率。計算舉例:
      在這裏插入圖片描述
      在這裏插入圖片描述
    • ROC曲線(ROC Curves):
  • 對數據集重採樣
    可以使用一些策略該減輕數據的不平衡程度。該策略便是採樣(sampling),主要有兩種採樣方法來降低數據的不平衡性。對小類的數據樣本進行採樣來增加小類的數據樣本個數,即過採樣(over-sampling ,採樣的個數大於該類樣本的個數),即刪除部分樣本。對大類的數據樣本進行採樣來減少該類數據樣本的個數,即欠採樣(under-sampling,採樣的次數少於該類樣本的個素),即添加部分樣本的副本。嘗試隨機採樣與非隨機採樣兩種採樣方法,對各類別嘗試不同的採樣比例,比一定是1:1,有時候1:1反而不好,因爲與現實情況相差甚遠。也可以同時使用過採樣與欠採樣。

  • 嘗試產生人工數據樣本
    使用SMOTE(Synthetic Minority Over-sampling Technique)方法來構造樣本。SMOTE是一種過採樣算法,它構造新的小類樣本而不是產生小類中已有的樣本的副本,即該算法構造的數據是新樣本,原數據集中不存在的。
    在這裏插入圖片描述
    具體操作過程爲:

    1. 取所有的minority數據點。
      在這裏插入圖片描述
    2. 以其中某個點爲中心,選取k nearest neighbor
      在這裏插入圖片描述
    3. 從上述鄰居中隨機選取2個點(視增加數據點比例來定)
      在這裏插入圖片描述
    4. 然後分別在連線上產生數據點
      在這裏插入圖片描述
  • 嘗使用不同的分類算法
    不要對待每一個分類都使用自己喜歡而熟悉的分類算法。應該使用不同的算法對其進行比較,因爲不同的算法使用於不同的任務與數據。決策樹往往在類別不均衡數據上表現不錯。它使用基於類變量的劃分規則去創建分類樹,因此可以強制地將不同類別的樣本分開。

  • 嘗試對模型進行懲罰
    可以使用相同的分類算法,但是使用一個不同的角度,比如你的分類任務是識別那些小類,那麼可以對分類器的小類樣本數據增加權值,降低大類樣本的權值(這種方法其實是產生了新的數據分佈,即產生了新的數據集),從而使得分類器將重點集中在小類樣本身上。一個具體做法就是,在訓練分類器時,若分類器將小類樣本分錯時額外增加分類器一個小類樣本分錯代價,這個額外的代價可以使得分類器更加"關心"小類樣本。

  • 使用異常點檢測法
    我們可以從不同於分類的角度去解決數據不均衡性問題,我們可以把那些小類的樣本作爲異常點(outliers),因此該問題便轉化爲異常點檢測(anomaly detection)與變化趨勢檢測問題(change detection)。

  • 其他方法
    設超大類中樣本的個數是極小類中樣本個數的L倍,那麼在隨機梯度下降(SGD,stochastic gradient descent)算法中,每次遇到一個極小類中樣本進行訓練時,訓練L次。

    將大類中樣本劃分到L個聚類中,然後訓練L個分類器,每個分類器使用大類中的一個簇與所有的小類樣本進行訓練得到。最後對這L個分類器採取少數服從多數對未知類別數據進行分類,如果是連續值(預測),那麼採用平均值。

    設小類中有N個樣本。將大類聚類成N個簇,然後使用每個簇的中心組成大類中的N個樣本,加上小類中所有的樣本進行訓練。

    無論你使用前面的何種方法,都對某個或某些類進行了損害。爲了不進行損害,那麼可以使用全部的訓練集採用多種分類方法分別建立分類器而得到多個分類器,採用投票的方式對未知類別的數據進行分類,如果是連續值(預測),那麼採用平均值。

2. L1和L2正則化的區別

2.1 L1正則化

L1正則化也叫LASSO regularizer,的主要作用是能夠產生一個稀疏的模型,即模型中很多係數的值爲0。這樣的模型有以下幾個好處:

  • 起到簡化壓縮模型的作用,L1正則化產生稀疏權值矩陣,即產生一個稀疏模型,可以用於特徵選擇。
  • 提高模型的可解釋性,比如說,一個病如果依賴於 5 個變量的話,將會更易於醫生理解、描述和總結規律,但是如果依賴於 5000 個變量的話,基本上就超出人肉可處理的範圍了。
  • 防止過擬合:一定程度上能避免過擬合問題。

2.1.1 爲何L1正則化能產生稀疏模型

一般損失函數爲:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ J(w)&=L(w)+\la…
其中L(w)L(w)是原始的損失函數,後面的λΩ(w)\lambda\Omega(w)是正則項。上述對J(w)J(w)的最優化等價於
argminwL(w)s.t.Ω(w)η \arg\min_{w}L(w)\hspace{1.0cm} s.t. \Omega(w)\leq\eta
具體原因爲:
在這裏插入圖片描述
即對一個特定的λ\lambda總存在一個η\eta使得這兩個問題是等價的(這個是優化裏的知識)。根據拉格朗日定理可以知道,當二者相交的時候往往能取得最優值。
在這裏插入圖片描述
以上是隻有兩個參數的優化情況。可以看出最優值的情況下,往往傾向於使得w1w_1或者w2w_2爲0。因此得到的模型爲一個稀疏模型。因此可以起到特徵選擇的作用。

其實後面的正則化項可以使用L0L_0正則化。即:
Ω(w)\Omega(w)表示w\vec w中非0參數的個數。但是這是一個NPHardNP-Hard問題,不易於計算,且L1L_1範數是L0L_0範數的最優凸近似,而且它比L0L_0範數要容易優化求解。因此用L0L_0正則化取而代之。

由於L1L_1正則化具有特徵選擇的作用,因此也能提高模型的可解釋性。

L1L_1正則化求導之後,得到的權重迭代公式爲:
w(t+1)=w(t)ηλsgn(w)ηL(w) w(t+1)=w(t)-\eta\lambda sgn(w)-\eta\frac{\partial L(w)}{\partial}
比原始的更新規則多出了ηλsgn(w)ηλsgn(w)這一項。當ww爲正時,更新後的ww變小。當ww爲負時,更新後的ww變大——因此它的效果就是讓ww00靠,使網絡中的權重儘可能爲00,也就相當於減小了網絡複雜度,防止過擬合。

另外,上面沒有提到一個問題,當ww00時怎麼辦?當ww等於00時,W|W|是不可導的,所以我們只能按照原始的未經正則化的方法去更新ww,這就相當於去掉ηλsgn(w)ηλsgn(w)這一項,所以我們可以規定sgn(0)=0sgn(0)=0,這樣就把w=0的情況也統一進來了。(在編程的時候,令sgn(0)=0,sgn(w>0)=1,sgn(w<0)=1sgn(0)=0,sgn(w>0)=1,sgn(w<0)=-1)

2.2 L2正則化

L2正則化也叫ridge regularizer,能傾向於產生norm比較小的權重ww,擬合過程中通常都傾向於讓權值儘可能小,最後構造一個所有參數都比較小的模型。因爲一般認爲參數值小的模型比較簡單,能適應不同的數據集,也在一定程度上避免了過擬合現象。可以設想一下對於一個線性迴歸方程,若參數很大,那麼只要數據偏移一點點,就會對結果造成很大的影響;但如果參數足夠小,數據偏移得多一點也不會對結果造成什麼影響,專業一點的說法是『抗擾動能力強』。如下圖:
在這裏插入圖片描述
其中: λ\lambda和數據集有關,和CC的大小也有關。λ\lambda的選擇要看具體的驗證集。CC越大,λ\lambda就越小。當C無窮大的時候,就相當於沒有正則項,λ=0\lambda=0。當C=0C=0時,λ\lambda無窮大,此時正則化項被無限放大,w=0w=0

加上正則化項之後的損失函數爲:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ J(w)&=L(w)+\la…

求導以後:
L(w)w+λΩ(w)w=0 \frac{\partial L(w)}{\partial w}+\lambda\frac{\partial\Omega(w)}{\partial w}=0
根據拉格朗日定理,一般極值多在取等時得到,可以據此換成上面等價的式子。

2.2.1 爲何L2正則化可以取得比較小的參數

假設需要優化的損失爲:
J(w)=L(w)+λwTw J(w)=L(w)+\lambda w^Tw
根據梯度迭代原理,有:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ w(t+1)&=w(t)-\…
加入沒有正則化項,則上式爲:
w(t+1)=w(t)ηL(w)w w(t+1)=w(t)-\eta\frac{\partial L(w)}{\partial w}
從上式可以看到,與未添加L2L_2正則化的迭代公式相比,每一次迭代,θjθ_j都要先乘以一個小於11的因子,從而使得θjθ_j不斷減小,因此總得來看,θθ是不斷減小的。因此θ\theta的減小幅度也會變小。

2.3 L1和L2正則化的比較

假設費用函數 L 與某個參數 x 的關係如圖所示:
在這裏插入圖片描述
則最優的 x 在綠點處,x 非零。現在施加L2L_2正則化,新的費用函數L+Cx2L + Cx^2如圖中藍線所示:
在這裏插入圖片描述
最優的 x 在黃點處,x 的絕對值減小了,但依然非零。而如果施加L1L1正則化,則新的費用函數L+CxL + C|x|如圖中粉線所示:
在這裏插入圖片描述
最優的 x 就變成了 0。這裏利用的就是絕對值函數的尖峯。兩種 regularization 能不能把最優的 x 變成 0,取決於原先的費用函數在 0 點處的導數。如果本來導數不爲 0,那麼施加 L2 regularization 後導數依然不爲 0,最優的 x 也不會變成 0。而施加 L1 regularization 時,只要 regularization 項的係數 C 大於原先費用函數在 0 點處的導數的絕對值,x = 0 就會變成一個極小值點。

知乎

2.3 L1和L2正則化的適用場合

L1優點是能夠獲得sparse模型,對於large-scale的問題來說這一點很重要,因爲可以減少存儲空間。缺點是加入L1後目標函數在原點不可導,需要做特殊處理。L2優點是實現簡單,能夠起到正則化的作用。缺點就是L1的優點:無法獲得sparse模型。實際上L1也是一種妥協的做法,要獲得真正sparse的模型,要用L0正則化。

那麼如果數據損失項使用L1 Norm,很明顯,L1 Norm對outlier沒有L2 Norm那麼敏感;如果正則化損失項使用L1的話,那麼使學習到的參數傾向於稀疏,使用L2 Norm則沒有這種傾向。

實踐中,根據Quaro的data scientist Xavier Amatriain 的經驗,實際應用過程中,L1 nrom幾乎沒有比L2 norm表現好的時候,優先使用L2 norm是比較好的選擇。

3. SVM解決多分類問題

從 SVM的那幾張圖可以看出來,SVM是一種典型的兩類分類器,即它只回答屬於正類還是負類的問題。而現實中要解決的問題,往往是多類的問題(少部分例外,例如垃圾郵件過濾,就只需要確定“是”還是“不是”垃圾郵件),比如文本分類,比如數字識別。如何由兩類分類器得到多類分類器,就是一個值得研究的問題。

還以文本分類爲例,現成的方法有很多,其中一種一勞永逸的方法,就是真的一次性考慮所有樣本,並求解一個多目標函數的優化問題,一次性得到多個分類面,就像下圖這樣:
在這裏插入圖片描述
多個超平面把空間劃分爲多個區域,每個區域對應一個類別,給一篇文章,看它落在哪個區域就知道了它的分類。只可惜這種算法還基本停留在紙面上,因爲一次性求解的方法計算量實在太大,大到無法實用的地步。

稍稍退一步,我們就會想到所謂“一類對其餘”的方法,就是每次仍然解一個兩類分類的問題。比如我們有5個類別,第一次就把類別1的樣本定爲正樣本,其餘2,3,4,5的樣本合起來定爲負樣本,這樣得到一個兩類分類器,它能夠指出一篇文章是還是不是第1類的;第二次我們把類別2 的樣本定爲正樣本,把1,3,4,5的樣本合起來定爲負樣本,得到一個分類器,如此下去,我們可以得到5個這樣的兩類分類器(總是和類別的數目一致)。到了有文章需要分類的時候,我們就拿着這篇文章挨個分類器的問:是屬於你的麼?是屬於你的麼?哪個分類器點頭說是了,文章的類別就確定了。這種方法的好處是每個優化問題的規模比較小,而且分類的時候速度很快(只需要調用5個分類器就知道了結果)。但有時也會出現兩種很尷尬的情況,例如拿一篇文章問了一圈,每一個分類器都說它是屬於它那一類的,或者每一個分類器都說它不是它那一類的,前者叫分類重疊現象,後者叫不可分類現象。分類重疊倒還好辦,隨便選一個結果都不至於太離譜,或者看看這篇文章到各個超平面的距離,哪個遠就判給哪個。不可分類現象就着實難辦了,只能把它分給第6個類別了……更要命的是,本來各個類別的樣本數目是差不多的,但“其餘”的那一類樣本數總是要數倍於正類(因爲它是除正類以外其他類別的樣本之和嘛),這就人爲的造成了上一節所說的“數據集偏斜”問題。

因此我們還得再退一步,還是解兩類分類問題,還是每次選一個類的樣本作正類樣本,而負類樣本則變成只選一個類(稱爲“一對一單挑”的方法,哦,不對,沒有單挑,就是“一對一”的方法,呵呵),這就避免了偏斜。因此過程就是算出這樣一些分類器,第一個只回答“是第1類還是第2類”,第二個只回答“是第1類還是第3類”,第三個只回答“是第1類還是第4類”,如此下去,你也可以馬上得出,這樣的分類器應該有5 X 4/2=10個(通式是,如果有k個類別,則總的兩類分類器數目爲k(k-1)/2)。雖然分類器的數目多了,但是在訓練階段(也就是算出這些分類器的分類平面時)所用的總時間卻比“一類對其餘”方法少很多,在真正用來分類的時候,把一篇文章扔給所有分類器,第一個分類器會投票說它是“1”或者“2”,第二個會說它是“1”或者“3”,讓每一個都投上自己的一票,最後統計票數,如果類別“1”得票最多,就判這篇文章屬於第1類。這種方法顯然也會有分類重疊的現象,但不會有不可分類現象,因爲總不可能所有類別的票數都是0。看起來夠好麼?其實不然,想想分類一篇文章,我們調用了多少個分類器?10個,這還是類別數爲5的時候,類別數如果是1000,要調用的分類器數目會上升至約500,000個(類別數的平方量級)。這如何是好?

看來我們必須再退一步,在分類的時候下功夫,我們還是像一對一方法那樣來訓練,只是在對一篇文章進行分類之前,我們先按照下面圖的樣子來組織分類器(如你所見,這是一個有向無環圖,因此這種方法也叫做DAG SVM)。
在這裏插入圖片描述
這在分類時,我們就可以先問分類器“1對5”(意思是它能夠回答“是第1類還是第5類”),如果它回答5,我們就往左走,再問“2對5”這個分類器,如果它還說是“5”,我們就繼續往左走,這樣一直問下去,就可以得到分類結果。好處在哪?我們其實只調用了4個分類器(如果類別數是k,則只調用k-1個),分類速度飛快,且沒有分類重疊和不可分類現象!缺點在哪?假如最一開始的分類器回答錯誤(明明是類別1的文章,它說成了5),那麼後面的分類器是無論如何也無法糾正它的錯誤的(因爲後面的分類器壓根沒有出現“1”這個類別標籤),其實對下面每一層的分類器都存在這種錯誤向下累積的現象。。

不過不要被DAG方法的錯誤累積嚇倒,錯誤累積在一對其餘和一對一方法中也都存在,DAG方法好於它們的地方就在於,累積的上限,不管是大是小,總是有定論的,有理論證明。而一對其餘和一對一方法中,儘管每一個兩類分類器的泛化誤差限是知道的,但是合起來做多類分類的時候,誤差上界是多少,沒人知道,這意味着準確率低到0也是有可能的,這多讓人鬱悶。

而且現在DAG方法根節點的選取(也就是如何選第一個參與分類的分類器),也有一些方法可以改善整體效果,我們總希望根節點少犯錯誤爲好,因此參與第一次分類的兩個類別,最好是差別特別特別大,大到以至於不太可能把他們分錯;或者我們就總取在兩類分類中正確率最高的那個分類器作根節點,或者我們讓兩類分類器在分類的時候,不光輸出類別的標籤,還輸出一個類似“置信度”的東東,當它對自己的結果不太自信的時候,我們就不光按照它的輸出走,把它旁邊的那條路也走一走,等等。

3.1 時間複雜度

在這裏插入圖片描述
總結:one VS All: 存在分類重疊現象和不可分類現象。分類重疊倒還好辦,隨便選一個結果都不至於太離譜,或者看看這篇文章到各個超平面的距離,哪個遠就判給哪個。不可分類現象就着實難辦了。還會產生數據傾斜問題。

All VS ALL(one Vs one, all-pairs):需要構建多個分類器,如果類別比較多,則構建的分類器也多。但是單個分類器構建的時間比較短。通常情況下,ALL VS ALL效果較好。

DAG: 需要解決誤差累積問題。

還有一種error correct output codes的方法,後期有時間補充。

4. 梯度消失和梯度爆炸

由於深度學習一般認爲是層數越多越好。但是由於BP通過鏈式求導來更新權值,如果其中很多項大於1,則產生梯度爆炸,導致權值更新太大,產生震盪。如果很多項小於1,則權值基本沒什麼更新,會產生梯度消失現象。一般靠近輸出的層學習會很好,靠近輸入的層學習效果不好。如果激活函數選的不好,更會加劇這個過程:
在這裏插入圖片描述
在這裏插入圖片描述

4.1 梯度消失和梯度爆炸的解決方案

  • 預訓練加微調
    此方法來自Hinton在2006年發表的一篇論文,Hinton爲了解決梯度的問題,提出採取無監督逐層訓練方法,其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出作爲輸入,而本層隱節點的輸出作爲下一層隱節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成後,再對整個網絡進行“微調”(fine-tunning)。Hinton在訓練深度信念網絡(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP算法對整個網絡進行訓練。此思想相當於是先尋找局部最優,然後整合起來尋找全局最優,此方法有一定的好處,但是目前應用的不是很多了。(主要是費時費力)

  • 梯度剪切、正則
    梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然後更新梯度的時候,如果梯度超過這個閾值,那麼就將其強制限制在這個範圍之內。這可以防止梯度爆炸。

    正則化是通過對網絡權重做正則限制過擬合,如果發生梯度爆炸,權值的範數就會變的非常大,通過正則化項,可以部分限制梯度爆炸的發生。

事實上,在深度神經網絡中,往往是梯度消失出現的更多一些。

  • relu、leakrelu、elu等激活函數
    relu函數的導數在正數部分是恆等於1的,因此在深層網絡中使用relu激活函數就不會導致梯度消失和爆炸的問題。

    relu的優點:

    • 解決了梯度消失、爆炸的問題
    • 計算方便,計算速度快
    • 加速了網絡的訓練
      relu的缺點:
    • 由於負數部分恆爲0,會導致一些神經元無法激活(可通過設置小學習率部分解決)
    • 輸出不是以0爲中心的

    儘管relu也有缺點,但是仍然是目前使用最多的激活函數。可以使用leak-relu或者elu來代替。

  • 使用batchnorm

  • 使用殘差結構

  • 使用LSTM

5. CNN在NLP、Speech、AlphaGo上的應用

爲什麼CNN用在CV上更得心應手,卻不一定適合NLP?要看清這點就要理解CNN的原理。CNN有兩個主要特點,區域不變性(location invariance)和組合性(Compositionality)。1. 區域不變性:濾波器在每層的輸入向量(圖像)上滑動,檢測的是局部信息,然後通過pooling取最大值或均值。pooling這步綜合了局部特徵,失去了每個特徵的位置信息。這很適合基於圖像的任務,比如要判斷一幅圖裏有沒有貓這種生物,你可能不會去關心這隻貓出現在圖像的哪個區域。但是在NLP裏,詞語在句子或是段落裏出現的位置,順序,都是很重要的信息。2. 局部組合性:CNN中,每個濾波器都把較低層的局部特徵組合生成較高層的更全局化的特徵。這在CV裏很好理解,像素組合成邊緣,邊緣生成形狀,最後把各種形狀組合起來得到複雜的物體表達。在語言裏,當然也有類似的組合關係,但是遠不如圖像來的直接。而且在圖像裏,相鄰像素必須是相關的,相鄰的詞語卻未必相關。當然,還有些技術細節,CNN具體應用在CV和NLP上會有些不同,就不贅述了。比如,濾波器的大小,在CV裏濾波器一般覆蓋一個局部的小區域,NLP會覆蓋整個詞彙向量的寬度,等等。。

圖片/語音這類感知問題中, 輸入的都是裸的信號, 這一點的好處在於, 輸入數據具有連續性:一個蘋果, 它稍微胖一點瘦一點紅一點, 點幾個噪點上去, 對於人類來說仍然是蘋果.一句話, 稍微大聲一點尖銳一點卡頓一點加點噪聲變點音色, 對於人類來說仍然是這句話.也即: 輸入數據可以在它的小鄰域內做連續變化而不改變自身意義, 或者說輸入點可以做小的擾動而不改變自身意義然而對於其他問題, 如NLP, 推薦系統, 亂七八糟的DM問題, 輸入數據不再是裸的信號了, 人類還沒有找到很好對這些問題的輸入數據的描述方式, 也即feature, 使得這種描述的信息損失很小, 且具有連續變化, 或者說抗擾動的能力, 同時這種描述最好別在輸入空間中太sparse…比如說, NLP 裏如果要給document分類, 或者識別’情緒’什麼的, 還是有解決的比較好的…因爲這個問題抗擾動: document裏多幾個詞少幾個詞不影響分類. 同時對於人類來說, 它比很多問題更像一個感知問題: 掃一眼文章就可以大致知道它的類別. 最近比較火的image description, 也比較類似於這種.

部連接/權值共享/池化操作/多層次結構。局部連接使網絡可以提取數據的局部特徵;權值共享大大降低了網絡的訓練難度,一個Filter只提取一個特徵,在整個圖片(或者語音/文本) 中進行卷積;池化操作與多層次結構一起,實現了數據的降維,將低層次的局部特徵組合成爲較高層次的特徵,從而對整個圖片進行表示。

最主要的原因是因爲數據之間存在着局部相關性,空間位置的不變性。如果特徵之間的位置可以改變,則不能使用CNN。

5.1 哪些數據不適合用深度學習

  • 數據集太小,數據樣本不足時,深度學習相對其它機器學習算法,沒有明顯優勢。
  • 數據集沒有局部相關特性,目前深度學習表現比較好的領域主要是圖像/語音/自然語言處理等領域,這些領域的一個共性是局部相關性。圖像中像素組成物體,語音信號中音位組合成單詞,文本數據中單詞組合成句子,這些特徵元素的組合一旦被打亂,表示的含義同時也被改變。對於沒有這樣的局部相關性的數據集,不適於使用深度學習算法進行處理。

6. 深度學習調參技巧

6.1 初始化

使用多種不同的初始化方法。

  • 隨機的比較小的數據
    在這裏插入圖片描述
    對於小的網絡勉強還可以,但是對於比較大的網絡就有很多問題了。
    如果初始化的時候取比價小的值,則會出現下面的情況
    在這裏插入圖片描述
    如果初始時WW值比較大,則會出現下面的情況
    在這裏插入圖片描述
    因爲tanh在兩端的輸出值多爲1或-1。但是這時輸出值雖然不是0,但是其梯度仍然是0。因此在反向傳播的時候,對WW求解梯度時,計算的結果仍然是0。依然會造成梯度消失問題。
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    另外的推倒過程爲:
    在這裏插入圖片描述
    在這裏插入圖片描述
    XAvier(sa wei er)初始化效果如下:
    在這裏插入圖片描述
    由於保證了輸入和輸出的均值均爲00,方差相同,因此效果較好。
    XAvier滿足的權重服從下面的均勻分佈,爲:
    WU[6nj+nj+1,6nj+nj+1] W\thicksim U[-\frac{\sqrt{6}}{\sqrt{n_j+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_j+n_{j+1}}}]
    推倒:
    爲了保持前向傳播和反向傳播每一層方差一致,應滿足:
    i,niVar[Wi]=1i,ni+1Var[Wi+1]=1 \forall i, n_iVar[W^i]=1\\ \forall i, n_{i+1}Var[W^{i+1}]=1
    但是,實際當中輸入與輸出的個數往往不相等,於是爲了均衡考量,最終我們的權重方差應滿足:
    i,Var[Wi]=2ni+ni+1 \forall i, Var[W^i]=\frac{2}{n_i+n_{i+1}}
    對於服從[a,b]之間均勻分佈的方差爲:
    var=(ba)212 var=\frac{(b-a)^2}{12}
    因此Xavier初始化的實現就是滿足下面的均勻分佈:
    WU[6nj+nj+1,6nj+nj+1] W\thicksim U[-\frac{\sqrt{6}}{\sqrt{n_j+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_j+n_{j+1}}}]
    在這裏插入圖片描述
    總之就是一句話:隨機高斯分佈初始化,會造成在前向和後向傳播時梯度消失。
  • Xavier的問題
    Xavier initialization是在線性函數上推導得出,這說明它對非線性函數並不具有普適性,所以這個例子僅僅說明它對tanh很有效,那麼對於目前最常用的ReLU神經元呢?
    在這裏插入圖片描述
    Xavier的推導過程是基於幾個假設的,其中一個是激活函數是線性的。這並不適用於ReLU激活函數。另一個是激活值關於0對稱,這個不適用於sigmoid函數和ReLU函數。

由於Relu函數會將一般的輸入變成0,因此越到後面,輸出爲0的越多(Dead Unit)。如果層數太多,最後也會導致梯度變成0.

He initialization的思想是:在ReLU網絡中,假定每一層有一半的神經元被激活,另一半爲0,所以,要保持variance不變,只需要在Xavier的基礎上再除以2:
在這裏插入圖片描述
因此此時高斯分佈的方差爲:
std=2nini std=\sqrt{\frac{2}{n_i}}\hspace{1.0cm}其中n_i爲輸入神經元的個數
因此此時可以做到網絡的輸出與與網絡的層數無關。

6.2 激活函數

  • 使用Relu,但要注意初始化和學習率的選取
  • 可以嘗試Leaky Relu和Elu
  • 可以嘗試tanh
  • 不要使用sigmoid

6.3 數據預處理

  • 減去整個圖像的均值
  • 減去各個通道的均值

6.4 網絡的訓練

採用逐層訓練法。缺點是耗時耗力。

6.4 學習率

剛開始選擇大一點的學習率,當loss變化出現震盪時減小學習率。

6.5 Batch size選取技巧

無論是CPU還是GPU,內存管理仍然以字節爲基本單元做硬件優化。因此將batch size設置成2的指數倍,如64、128、256等,將有效提高矩陣分片、張量計算等操作的硬件處理效率。

6.6 正則優化

添加L2正則優化,dropout設置爲0.5.

6.7 其他方法

k折交叉驗證。每次交叉都打亂數據排序。遷移學習。

7. Batch Normalization

7.1 選擇batch的好處

使用mini-batch而不是一個樣本的好處是作爲全部樣本的採樣,一個mini-batch的"隨機"梯度和batch的梯度方向更接近。即batch的梯度相對於單個樣本更接近總體,更能夠模擬總體的梯度方向,從而加快收斂。另一個好處能夠利用硬件的數據並行能力。

7.2 使用normalization的好處

以前要想收斂,選擇合適的learning_rate和初始化參數非常重要,如果選擇不合適,可能無法收斂。對於很深的網絡,層次越多,error往前傳播的就越小,而且很多神經元會飽和。飽和之後,梯度會變得很小,從而參數的Δ\Delta就非常小。使用Relu能緩解飽和問題,但是依然會有internal covariate shift問題。而Batch normalization能解決飽和問題,也能解決internal covariate shift問題。

7.2.1 Internal covariate shift

如果訓練和測試時輸入的分佈發生變化,會給模型帶來問題。應爲模型就是根據訓練數據擬合出一個模型,然後用這個模型去預測測試集。因此假設的前提是訓練集和測試集的數據分佈是一致的。否則訓練數據無法使用。現實生活中不會有太大差異。但小的差異還是會存在的。在比較深的網絡裏,小的差異也會帶來一些問題。因爲前面的結果會傳遞到後面的層,而且層次越多,前面的細微變化就會帶來後面的巨大變化。如果某一層的輸入分佈總是變化的話就會無所適從,參數很難調整好。因此可以對輸入進行白化處理。但是之後的層就不好保證了。比較壞的情況是,比如最後一層,經過一個mini-batch,把參數調整的比以前好一些了,但是它之前的所有層的參數都變化了,從而導致下一輪訓練的時候輸入範圍也發生變化,就很難正確分類。這就是internal covariate shift。其中的internal指的就是中間的隱藏層。

7.2.2 Batch Normalization的解決方案

如果我們能保證每次mini-batch的每個層的輸入數據都是均值0方差1,那麼就可以解決Internal covariate shift問題。因此可以加上一個batch normalization來對這個mini-batch進行處理。但是也會帶來一個問題。這樣會對原有數據進行強行更改。
在這裏插入圖片描述
參數更改和求導過程爲:
在這裏插入圖片描述

7.2.3 測試過程

在訓練的最後一個epoch時,要對這一epoch所有的訓練樣本的均值和標準差進行統計,這樣在一張測試圖片進來時,使用訓練樣本中的標準差的期望和均值的期望(好繞口)對測試數據進行歸一化,注意這裏標準差使用的期望是其無偏估計:
在這裏插入圖片描述

7.3 BN的優缺點

  • 提高學習效率。允許使用更高的學習率。如果每層的scale不一致,實際上每層需要的學習率是不一樣的,同一層不同維度的scale往往也需要不同大小的學習率。通常需要使用最小的學習率才能保證損失函數有效下降。Batch Normalization將每層、每維的scale保持一致,那麼我們就可以使用較高的學習率進行優化。
  • 改善流經網絡的梯度
  • 減少對初始化的強烈依賴
  • 改善正則化策略:作爲正則化的一種形式,輕微減少了對dropout的需求
    你再也不用去理會過擬閤中drop out、L2正則項參數的選擇問題,採用BN算法後,你可以移除這兩項了參數,或者可以選擇更小的L2正則約束參數了,因爲BN具有提高網絡泛化能力的特性。
  • 不需要使用LRN了。因爲BN本身就是一個歸一化網絡層。
  • 緩解梯度消失:所以BN的提出者就想能否將每層的激活值都進行歸一化,將它們拉到均值爲0方差爲1的區域,這樣大部分數據都從梯度趨於0的區域變換至激活函數中間梯度較大的區域,從而解決了梯度消失的問題。這樣梯度變大了,網絡更新快,訓練變快了。具體表現就是達到相同的正確率迭代次數更少,迭代相同次數時正確率會高。

8. 卷積神經網絡中1×11\times 1卷積的作用

  • 降維:不考慮像素與周邊像素的關係。但卷積的輸入是長方體,所以1×11\times 1卷積實際上是對每個像素點在不同的channels上進行線性組合,且保留了圖片原有的平面結構,調控depth,從而完成升維或者降維功能,減少網絡參數。
  • 實現跨通道的信息交互和整合
    1×11\times 1就是多個feature channels線性疊加,從而實現誇通道信息交互。
  • 增加模型的非線性
    卷積之後有激勵層。1×11\times 1的卷積在前一層的學習表示上添加了非線性激勵,提升了網絡的表達能力。

9. Tensorflow計算圖譜總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章