深度學習基礎(面試題),卷積神經網絡基礎(面試題)

本文內容參考魏秀參《解析卷積神經網絡》
手寫卷積池化代碼
池化層的反向傳播
cnn的反向傳播
 
 
  • 1卷積神經網絡基本操作
  • 2卷積神經網絡的壓縮
  • 3數據擴充
  • 4數據預處理
  • 5網絡參數初始化
  • 6激活函數
  • 7目標函數
  • 8網絡正則化
  • 9超參數設定和網絡訓練
  • 10不平衡樣本的處理
  • 11模型集成方法
 
 
提高泛化能力的方法: 增廣,減小網絡,加正則,dropout,bn
共享特徵有助於減少神經網絡中的參數數量,一定程度上減小了模型的計算複雜度
1.卷積神經網絡基本操作
卷積操作的作用
卷積是一種局部操作,通過一定大小的卷積核作用於局部圖像區域獲得圖像的局部信息。比如邊緣濾波等。
事實上,卷積網絡中的卷積核參數是通過網絡訓練學出的,除了可以學到類似的橫向,縱向邊緣濾波器,還可以學到任意角度的邊緣濾波器。不僅如此,檢測性狀,顏色,紋理等衆多基本模式的濾波器都可以包含在一個足夠複雜的深層卷積神經網絡中。通過組合(池化激活等)這些濾波器以及隨着網絡的後序操作的進行,基本而一般的模式會逐漸被抽象爲具有高層語義的概念表示,並以此對應到具體的樣本類別。
 
池化的作用
池化層不包含可學習的參數。只需要指定赤化類型,池化操作核大小,池化步長等超參數。池化有平均池化,最大池化,隨機池化(對輸入數據中的元素按照一定概率大小隨機選擇,並不像最大池化那樣總是選最大元素,對隨機池化而言,元素值大的響應被選中的概率也大。可以說在全局意義上,隨機池化與平均池化近似,在局部意義上,則服從最大池化的準則)
作用:其實就是降採樣操作,池化層的引入是仿照人的視覺系統對視覺輸入對象進行降維(降採樣)和抽象。研究者認爲池化有三種作用:
  1. 特徵不變性:池化操作讓模型更關注是否存在某些特徵而不是特徵的具體位置。可看做是一種很強的閒言,使特徵學習包含某種程度的自由度,能容忍一些特徵微小的位移
  2. 特徵降維:降採樣,池化結果中一個元素對應於原輸入數據的一個子區域,因此池化相當於在空間範圍內做了維度約檢,從而使模型可以抽取更廣範圍的特徵。同時減小下一層輸入的大小,進而減小計算量和參數個數
  3. 在一定程度上防止過擬合,方便優化
根據相關理論,特徵提取的誤差主要來自兩個方面:
  1. 鄰域大小受限造成的估計值方差增大
  2. 卷積層參數誤差造成估計均值的偏移
  • 平均池化能減小第一種誤差(鄰域大小受限造成的估計值方差增大),更多的保留圖像的背景信息
  • 最大池化能減小第二種誤差(卷積層參數誤差造成估計均值的偏移),更多的保留紋理信息
  • 隨機池化介於兩者之間,通過對像素點按照數值大小賦予概率,再按照概率進行採樣,在平均意義上,與均值近似,在局部意義上,服從最大池化的準則。
平均池化與最大池化分別適用於什麼場景
  • 當map中的信息都應該有所貢獻的時候用avgpool,比如圖像分割中常用global avgpool來獲取全局上下文關係,比如224x224圖像分類將最後的7x7map進行avgpool而不是maxpool。因爲深層高級語義信息一般來說都能夠幫助分類器分類。
  • 反之爲了減少無用信息時候用maxpool,比如淺層網絡常見到maxpool,因爲剛開始幾層對圖像而言包含較多的無關信息,另外avgpool與maxpool輸出值幅度波動大,可以加一些歸一化操作。具體使用場景根據任務來,實際效果煉丹後才知道。
激活函數
引入激活函數的目的是爲了增加整個網絡的表達能力(即非線性)。否則若干現行操作層的堆疊仍然只能起到線性映射的作用,無法形成複雜的函數。
sigmoid
公式圖像,適用範圍,缺點
relu
公式圖像,解決了什麼問題
 
 
2.卷積神經網絡的壓縮
在追求模型高準確率的同時,儘可能的降低其複雜度,以達到性能與開銷(時間計算量)上的平衡。給定一小部分參數子集便能夠完整的重構出剩餘的參數。這種冗餘在訓練階段很必要,因爲DL問題是一個極其複雜的非凸優化問題,對於現有的基於梯度下降的優化算法而言,這種參數冗餘能保證網絡能夠收斂到一個比較好的最優值。因而一定程度上,網絡越深,參數越多,模型越複雜,最終效果往往也越好。
模型壓縮技術主要分爲兩個部分:前端壓縮,後端壓縮
  • 前端壓縮:是指不改變網絡結構的壓縮技術,主要包括知識蒸餾,緊湊模型設計,濾波器層面的剪枝等。可很好匹配深度學習庫
  • 後端壓縮:其目標在於儘可能的減少模型大小,因而會對原始的網絡結構造成極大程度上的改造。這種改造往往不可逆。包括低秩近似,未加限制的剪枝,參數量化以及二值網絡等。
當然也可以將前端壓縮的輸出作爲後端壓縮的輸入,能夠在最大程度上減少模型的複雜度。
低秩近似
CNN的實現通過矩陣相乘完成,通常權重矩陣往往稠密且巨大,從而帶來巨大計算和存儲開銷。爲解決這個問題直觀想法是,若能將稠密矩陣由若干個小規模矩陣近似重構出來,那麼便能夠有效降低存儲於計算開銷。
  • 這類算法大多采用低秩近似來重構權重矩陣。在小數據集上能夠達到2-3倍的壓縮效果,最終結果甚至可能超過壓縮之前的網絡。
  • 還可以直接使用矩陣分解來降低矩陣權重參數。如用SVD分解。利用矩陣分解能夠將卷積層壓縮2-3倍,全連接壓縮5-13倍,速度提升2倍,精度損失控制在1%之內。
低秩近似在小網絡模型上取得了不錯的效果,但其參數量與網絡層數呈線性變化趨勢,隨着層數增加與模型複雜度提高,其搜索空間急劇增大。
剪枝與稀疏約束
通過剪枝處理,在減小模型複雜度的同時,還能有效防止過擬合,提升模型泛化性。在訓練中,需要一定冗餘的參數數量來保證模型的可塑性與容量,在完成訓練之後,則可以通過剪枝操作來移除這些榮譽參數,使得模型更加成熟。給定一個預訓練好的網絡模型,常用剪枝算法的流程:
  1. 衡量神經元重要程度(剪枝算法最重要的核心步驟)。根據剪枝粒度不同,神經元定義可以是一個權重連接,也可以是整個濾波器。
  2. 移除掉一部分不重要的神經元。可以根據閾值來判斷神經元是否可以被剪除,也可以按照重要程度排序,剪除一定比例的神經元。後者簡單
  3. 對網絡進行微調。剪枝操作不可避免影響網絡精度,爲防止對分類性能造成過大破壞,需要對剪枝後的模型進行微調。
  4. 返回第1步,進行下一輪剪枝。
參數量化
量化是指從權重中歸納出若干“代表”,由這些代表來表示某一類權重的具體數值。代表被存儲在碼本中,而原權重矩陣只需記錄各自代表的索引即可,從而極大降低存儲開銷。即使採用最簡單的標量量化算法,也能在保持網絡性能不受顯著影響的情況下,將模型大小減少8-16倍。不足在於,當壓縮率比較大時容易造成分類精度大幅度下降。
二值網絡
所有參數取值只能是+1或-1。在普通NN中,一個參數由單精度浮點型表示,參數二值化能將存儲開銷降低爲原來的1/32。二值化需要解決兩個基本問題:
  • 如何對權重進行二值化?
    • 直接根據權重正負二值化,x=sign(x)
    • 隨機二值化,對每個權重以一定概率去+1,這個更耗時
  • 如何計算二值權重梯度?二值權重梯度爲0,無法進行參數更新。用符號函數進行放鬆。Htanh(x)=max(-1,min(1,x))代替sign(x)。當x在[-1,1],存在梯度值1,否則梯度值0
知識蒸餾
在不改變模型複雜度情況下,增加監督信息的豐富程度肯定會帶來性能上的提升。知識蒸餾是遷移學習的一種,目的是將龐大複雜模型學到的知識通過一定 的手段遷移到精簡的小模型上,使得小模型能夠獲得與大模型相近的性能。這兩個模型分別扮演老師(大模型)和學生(小模型)角色:讓學生自己學的話,收效甚微;若能經過一個老師的指導,便能夠事半功倍,學生甚至有可能超越老師。
緊湊的網絡結構
設計出很多更加緊湊的網絡結構,將這些新結構運用到神經網絡設計中來,能夠使模型在規模與精度之間達到一個較好的平衡。比如:
  • fire module用在SqueezeNet中
  • MobileNet:Depth-wise conv,深度分離卷積等
 
 
3.數據擴充
數據擴充不僅能夠增加樣本數量,還能增加樣本多樣性。一方面避免過擬合,另一方面會帶來模型性能的提升。
簡單的數據擴充
  • 水平翻轉:使數據集擴充一倍
  • 隨機摳取(random crops):一般用0.8-0.9倍的正方形在原圖的隨機位置處摳取圖像塊,每張圖像隨機摳取的次數決定了數據集擴充的倍數。使用正方形是因爲CNN網絡輸入是正方形,以正方形摳圖避免了矩形摳取後序的圖像拉伸操作帶來的分辨率失真
  • 尺度變換:將圖像分辨率變爲原圖的0.8,0.9,1.1,1.2,1.3等倍數。將尺度變換後的圖像作爲擴充的訓練樣本加入訓練
  • 旋轉:-30,-15,15,30度等
  • 色彩抖動:對原圖或已經變換的圖進行操作。在RGB顏色空間對原有RGB色彩分佈進行輕微擾動,也可以在HSV顏色空間嘗試隨機改變圖像原有飽和度和透明度,或對色調進行微調
  • 實際中,一般對上面方法疊加組合使用,將數據擴增多倍甚至數十倍
特殊的數據擴充方式
  • Fancy PCA
  • 監督式數據擴充:對基於高層語義進行圖像分類任務效果好
 
4.數據預處理
機器學習中,對特徵進行歸一化
實踐中,對每個特徵減去平均值來中心化數據非常重要,這種歸一化處理方式被稱爲“中心式歸一化”。CNN中預處理通常是計算訓練集圖像像素均值,之後再處理訓練集、驗證集和測試集圖像時要減去該均值。減去均值的原理是:默認自然圖像是一種平穩分佈(每個維度的統計都服從相同的分佈),此時在每個樣本上減去平均值可以移除共同部分,凸顯個體差異。注意均值只能通過訓練集計算得到,然後再訓練集驗證集測試集中使用。否則違背ML基本原理:模型訓練過程中只能從訓練數據中獲取信息。
 
5.網絡參數初始化
  • 全零初始化:網絡無能力對此做出改變,從而無法進行模型訓練
  • 隨機初始化:將參數隨機設定爲接近0的一個很小的隨機數(有正有負)。實際中,隨機參數服從高斯分佈或均勻分佈都是較好的初始化方式。
    • 設網絡輸入神經元個數n_in, 輸出神經元個數n_out,服從高斯分佈的參數隨機初始化爲: w=0.001*randn(n_in,n_out),其中高斯分佈均值0,方差爲1的標準高斯分佈,0.001是爲了將參數期望保持在接近0的小範圍。但是這樣會有一個問題,即網絡輸出數據分佈的方差會隨着輸入神經元個數改變。
      • Xavier參數初始化  w=(0.001 * randn(n_in,n_out)) / sqrt(n),其中n=n_in或者n=(n_in+n_out)/2。該方法並未考慮非線性映射函數對輸入的影響
WL = np.random.randn(WL.shape[0],WL.shape[1])* np.sqrt(1/n)
  • He等人將對此改進-將非線性映射造成的影響考慮進初始化中,將Xavier方法中方差規範化的分母應該是  sqrt(n/2),而不是  sqrt(n)
  • 以上是服從高斯分佈,均勻分佈也是一種很好的初始化分佈,當參數初始化服從均勻分佈,由於分佈性質不同,均勻分佈需要制定其取值區間,則Xavier和He初始化方法分別修改爲
    • Xavier
      • low = -sqrt(3/n) ;  high = sqrt(3/n);
      • random_param = a+(b-a).*rand(n_in,n_out);
      • w = 0.001*rand_param
    • He
      • low = -sqrt(6/n) ;   high = sqrt(6/n) ;
      • rand_param = a +(b-a) * rand(n_in, n_out) ;
      • w = 0.001 * rand_param
  • 其他初始化方法:比如利用預訓練模型初始化,預訓練模型已經在原先任務上收斂到理想的局部最優解,加上預訓練模型容易獲得,因此將其作爲新任務的參數初始化無疑是一個優質首選
 
6.激活函數
常用的激活函數,sigmoid, tanh(x), ReLU, Leaky ReLU, 參數化ReLU, 隨機化ReLU和指數化線性單元(ELU)
sigmoid
  • 經過sigmoid函數作用後,輸出響應值被壓縮到[0,1]之間,0對應抑制狀態,1對應興奮狀態,但是存在兩個問題:
    • sigmoid兩端梯度接近於0,這會導致在誤差反向傳播過程中導數處於該區域的誤差很難甚至無法傳遞至前層,進而導致整個網絡無法正常訓練。
    • 而且其在值域的均值非0,而全部是正數,不符合對神經網絡內數值的期望應爲0的假象
tanh(x)
以0爲中心,但是仍然會出現梯度飽和現象

 

ReLU
函數在大於等於0範圍內爲1,否則爲0.
  • 對x大於等於0的部分完全消除了sigmoid函數的梯度飽和效應
  • 計算複雜度也簡單
  • 同時ReLU有助於隨機梯度下降方法收斂
但是缺點:對小於0的卷積結果響應,他們一旦變爲負值將無法再影響網絡響應
 
Leaky ReLU
爲緩解ReLU中小於0部分的死區現象,將x<0部分調整爲f(x) = a*x,其中a爲0.01或者0.001數量級較小正數。a爲超參數,需要人爲設定,但是在實際中並不穩定
 
參數化ReLU
爲解決Leaky ReLU中超參數a不容易設定的問題:直接將a也作爲一個網絡中可學習的變量融入模型的整體訓練過程。
  • 自動學習a的值,分類精度上優於原始ReLU
  • 自由度較大的通道獨享參數的參數化ReLU更優
 
隨機化ReLU與ELU
 
7.目標函數
分類任務的目標函數
  • 交叉熵損失函數
  • 合頁損失函數:對錯誤越大的樣本施加越嚴重的懲罰。合頁損失對噪聲的抵抗能力較差,若某樣本本身標記錯誤或該樣本本身是離羣點,則由於錯分導致該樣本分類誤差變得很大,這樣會影響整個超平面的學習,從而降低模型泛化能力。一般交叉熵損失結果略優於合頁損失結果
  • 當樣本被正確分類且函數間隔大於1時,合頁損失纔是0,否則損失是1-y(wx+b)。這也就是說合頁損失函數不僅要正確分類,而且確信度足夠高時損失纔是0.也就是說合頁損失函數對學習有更高的要求。
  • 坡道損失函數:非凸損失可以很好解決這個問題(分類中坡道,迴歸中Tukey's biweight),他們針對噪聲數據和離羣點具備良好的抗噪特性,因此是魯棒損失函數。其共同特點是在分類(迴歸)誤差較大的區域進行截斷,使得較大誤差不再大程度影響整個誤差函數。公式如上圖,s指定了截斷的位置,坡道損失也就是在s處截斷的合頁損失,也稱爲截斷合頁損失。上圖表示兩種損失函數的對比。在斷點處不可導,但不影響使用。s由分類類別數c決定,一般s=-1/(c-1)
爲了進一步提高學習到的特徵的判別性,研究者基於交叉熵損失函數設計了新型損失函數,比如大間隔交叉熵,中心損失函數。這些損失函數考慮了增加類間距離,減小類內差異等不同要素,進一步提升了網絡學習特徵的判別能力。
  • 大間隔交叉熵損失函數:增大類間距離
  • 中心損失函數:考慮類間距離的同時將一些注意力放在減小類內差異上,其中Cyi爲第yi類所有深度特徵的均值,直觀上,所有屬於yi類的樣本與之中心不要距離過遠,否則將增大懲罰。也可以和考慮類間距離的損失函數配合使用。
迴歸任務目標函數
  • L1損失函數
  • L2損失函數:效果和L1損失函數差不多,但是速度比L1損失函數快
  • Tukey's biweight損失函數:非凸損失函數,可克服在迴歸任務中的離羣點或樣本噪聲對整體迴歸模型的干擾和影響,是迴歸任務中一種魯棒的損失函數。
其他任務目標函數
很多問題不能直接用分類和迴歸來衡量,比如年齡判斷的30歲左右。這種可以用標記分佈來描述,這種分佈明顯區別於分類問題的離散標記,也區別與迴歸問題的連續標記。與迴歸問題區別在於,迴歸問題雖然標記連續,缺不符合一個合法的概率分佈。假設爲網絡模型對於輸入樣本xi的最終輸出結果,利用標記分佈技術解決問題之前,先需要將h轉化爲一個合法分佈。以softmax爲例可將h轉化爲:,其中代表標記向量的第k維。針對預測的標記向量,通常可用KL散度來度量其餘真實標記向量y的誤差,KL散度也稱KL損失。下面兩種寫法等價,通過KL散度可以衡量樣本標記分佈於真實標記分佈之間的差異,並利用該差異指導模型訓練。
 
8.網絡正則化
正則化是機器學習中通過顯式的控制模型複雜度來避免模型過擬合、確保泛化性能的一種有效方式。在此介紹5種常用的CNN網絡正則化方法。
  • L2正則化(權重衰減,嶺迴歸):深度模型常用L2和L1正則對操作層(卷積層,分類層等)進行正則化,約束模型複雜度。假設待正則的網絡層參數爲w,L2正則項形式爲:,λ控制正則項大小,較大λ將較大程度約束模型複雜度。一般將正則項加入目標函數,通過整體目標函數的誤差反向傳播,從而達到正則項影響和指導網絡訓練的目的。
  • L1正則化,L1正則化除了同L2正則化一樣能約束參數量級外,L1正則化還能起到使參數更稀疏的作用。稀疏化的結果使優化後的參數w一部分爲0,另一部分爲非0值。非0值那部分參數可起到選擇重要參數或特徵維度的作用,同時可起到去除噪聲的效果。此外L2和L1正則可以聯合使用
  • 最大範數約束:通過向參數量級的範數設置上限對網絡進行正則化的手段,比如。類似於梯度裁剪
  • 隨機失活(dropout):配備全連接層CNN都在使用的方法,其在約束網絡複雜度同時,還是一種針對深度模型的高效集成學習方法
    • dropout的提出一定程度上緩解了神經元之間複雜的協同適應(由於神經元之間互連,對某個神經元其反向傳播來的梯度信息的同時也受到其他神經元的影響,也就是牽一髮動全身),降低了神經元間以來,避免了過擬合發生。
    • 原理:對某層每個神經元,在訓練階段均以概率p隨機將該神經元權重置0,測試階段所有神經元均呈激活狀態;但訓練時其權重需乘(1-p)以保證訓練和測試階段各自權重擁有相同的期望。
    • 平均集成:失活的神經元無法參與到網絡訓練,因此每次訓練時相當於面對一個全新網絡。以包含2層,每層有3個神經元的NN爲例,若每層隨機失活一個神經元,該網絡共可產生9中子網絡,測試階段相當於9個子網絡的平均集成。對於提升網絡泛華性效果顯著。
    • 缺點:會明顯增加訓練時間,因爲引入dropout之後相當於每次只是訓練的原先網絡的一個子網絡,爲了達到同樣的精度需要的訓練次數會增多。使用dropout大概是沒有使用dropout的2~3倍。
dropout代碼
keep_prob = 0.8  # 設置神經元保留概率
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multiply(a3, d3)
a3 /= keep_prob
  • 驗證集的使用:一般在每輪訓練結束後對驗證集進行前向運算,繪製學習曲線,以此檢驗模型泛化能力。
    • 驗證集準確率一直低於訓練集準確率,但無明顯下降趨勢,---》欠擬合(偏差大)。增加網絡層數,調整網絡結構、調整激活函數增加非線性,減少正則化等方式增大網絡複雜度。
    • 驗證集曲線不僅低於訓練集,且隨着訓練輪數增長有明顯下降趨勢--》過擬合(方差大)。增大模型正則化削弱網絡模型複雜度,使用早停(early stopping)策略,擴充數據等方法。去驗證集準確率最高的那一輪訓練結果作爲最終網絡,用於測試集數據的預測。
 
9.超參數設定和網絡訓練
介紹一些網絡設計過程中超參數設定技巧和訓練技巧,如學習率設定,批規範化操作和網絡優化策略的選擇等。
  • 網絡超參數的設定:輸入圖像像素,卷積層個數,卷積核相關參數等
    • 輸入圖像像素大小:對不同圖像爲了得到同規格的輸出,同時便於gpu設備並行,會同一將圖像壓縮到2^n大小。若不考慮設備限制,更高分辨率作爲輸入一般均有助於網絡性能的提升,特別是注意力模型的深度網絡提升更爲顯著,但是會增加計算消耗,增大訓練時間延長。一般CNN有全連接層爲分類層,若直接改變原始網絡模型的輸入圖像分辨率,會導致原始模型卷積層輸出無法輸入全連接層的狀況(後來一般都用全卷積),此時需重新改變全連接層輸入濾波器大小或重新制定其他相關參數。
    • 卷積層參數的設定:主要包括卷積核大小,卷積步長和卷積核個數。
      • 卷積核大小:小卷積比大卷積優勢:1增強網絡容量和模型複雜度,2.減少卷積參數個數。因此一般使用3x3,5x5的小卷積
      • 步長建議爲1.
      • 卷積操作可搭配填充padding操作,其有兩層功效:1.可充分利用和處理輸入圖像的邊緣信息,2.搭配合適的卷積層參數可保持輸出與輸入同等大小,而避免隨着網絡深度增加,輸入大小的急劇減少。當p=(f-1)/2大小時,可維持輸出與原輸入大小相同。
      • 爲了硬件字節級存儲管理的方便,卷積核個數通常設置爲2的次冪,如64,128,256,512等。這樣設定有利於硬件計算過程中劃分數據矩陣和參數矩陣,尤其在利用顯卡計算時更爲明顯
    • 池化層參數設定:核大小一般設置爲較小值,如2x2,3x3等。常用核大小2x2,步長2.此設定下,輸出結果大小僅爲輸入數據長寬大小的四分之一,也就是75%響應被丟棄,這起到下采樣作用。
  • 訓練技巧
    • 訓練數據隨機打亂:從不相似的事件中學習總是比從相似實踐中學習更具有信息量。訓練CNN時,儘管訓練數據固定,但由於採用了minibatch訓練機制,因此可在模型每輪訓練進行前將訓練數據集隨機打亂,確保模型不同輪數相同批次“看到”的數據是不同的。這樣處理不僅會提高模型收斂速率,同時,相對固定次序訓練的模型,此操作會略微提升模型在測試集上的預測結果。
    • 學習率設定:學習率具體可以參考下圖
      • 1.模型訓練初始學習率不宜過大,0.01或者0.001爲宜,若發現剛開始訓練幾個批次損失急劇增大,說明學習率太大,應該減小學習率從頭學
      • 2.訓練過程中,學習率應該隨輪數增加而減緩。衰減策略有很多,比如:
        • 輪數衰減:每5輪減一半
        • 指數衰減:學習率按訓練輪數增長指數插值遞減,
        • 分數遞減:若原始學習率爲lr0,學習率按照下式遞減, ,其中k爲超參數用來控制學習率減緩幅度,t爲訓練輪數
      • 模型損失在剛開始幾個批次直接爆炸(黃色),則學習率過大,應大幅減少學習率從頭訓練網絡
      • 模型一開始損失下降明顯,但是後勁不足(綠色),此時應使用小學習率從頭訓練,或在後幾輪改小學習率僅重新訓練後幾輪即可
      • 若模型損失下降緩慢(藍色),應稍微加大學習率,然後繼續觀察曲線,直到模型呈現紅色曲線的理想學習率下的訓練曲線爲止。
      • 注意微調(fine-tune)時學習率的設定
  • 批規範化操作(batch normalization,BN):使得網絡每層輸入數據分佈穩定,不僅加快了模型收斂速度,更重要是在一定程度上緩解了深層網絡的梯度消失,從而使訓練深層網絡模型更加穩定容易,也有一定正則效果。BN不僅適合於深層網絡,也適合於淺層網絡。算法流程:在模型每次隨機梯度下降訓練時,通過mini-batch來對相應的網絡響應做規範化操作,使得結果(輸出信號各個維度)的均值爲0,方差爲1. 算法共分爲四步,前兩步分別計算批處理的數據均值和方差,第三步則根據計算的均值方差對該批數據進行規範化。最後尺度變化和偏移操作是爲了讓因訓練所需而刻意加入的BN能夠有可能還原最初的輸入),從而保證整個網絡的容量
    • BN爲什麼效果好:對NN的各層輸出,由於經過了層內操作作用,其分佈顯然與各層對應的輸入信號分佈不同,而且差異會隨着深度增大越來越大,不過label不變,因此就是內部協變量偏移。實驗發現,可通過BN來規範化某些層或所有層的輸入,從而可以固定每層輸入信號的均值與方差。這樣即使網絡模型較深層的響應或梯度很小,也可通過BN的規範化作用將其尺度變大,以此解決深層網絡訓練可能帶來的梯度消失問題。比如一組隨機數很小,然後經過規範化後,原本微小差異被拉大,這樣緩解了梯度消失現象。
    • 作用:BN一般作用在非線性映射函數前。若網絡訓練收斂速率慢或梯度爆炸等無法訓練也可嘗試用BN解決。同時BN可以加快模型訓練速度,甚至提高模型精度。
    • BN在訓練時和測試時差別:BN就是爲了讓網絡在每一層都保持相近的分佈。
      • 訓練時:對每批數據進行歸一化,也就是用每一批數據的均值和方差。對於BN,當模型訓練完之後,所有參數都確定了,包括均值方差,gamma,beta
      • 測試時:比如對某樣本進行預測,沒有batch概念,因此均值和方差是全量訓練數據的均值和方差,這可以通過移動平均法得到。
    • BN計算均值的時候計算多少次:假設[b,c,h,w],計算b*h*w次,因爲是相當於對每個channel計算
    • BN共有多少個參數:2*c個參數
    • BN訓練時爲啥不用全量均值和方差:用全量均值和方差容易過擬合,對於BN,就是對每一批數據歸一化到相同的分佈,而每一批的數據均值和方差肯定是有差別的,而不是用固定值,這個差別能夠增加模型魯棒性,同時也一定程度上減少過擬合。正因如此,一般BN要求數據完全打亂,並用一個較大batch,否則,一個batch無法較好的代表訓練集的分佈,會影響模型的訓練。若batch較小,可以使用GN(group normalization)
    • BN和dropout共同使用出現的問題:存在神經方差不一致行爲。 Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift。解決方法有兩種:1.在BN後使用dropout,2.使用高斯dropout
BN:(batchnorm)是在batch上,對NHW做歸一化,對小batchsize效果不好
LN:layernorm在通道方向上,對CHW做歸一化,主要對RNN作用明顯
IN:instancenorm在圖像像素上,對HW做歸一化,用在風格遷移上
GN:(groupnorm)將channel分組,然後再做歸一化
switchableNorm將BN,LN,IN結合,賦予權重,讓網絡自己去學習歸一化層應該使用什麼方法。
BN算法過程
  • 沿着通道計算每個batch的均值u
  • 沿着通道計算每個batch的方差σ^2
  • 對x做歸一化
  • 加入縮放和平移變量γ和β,歸一化後的值,y=γx+β。加入縮放平移變量的原因是:不一定每次都是標準正太分佈,也許需要偏移或者拉伸。保證每一次數據經過歸一化後還保留原有學習來的特徵,同時又能完成歸一化操作,加速訓練。這兩個參數是用來學習的參數
  • 缺點:對batchsize的大小比較敏感,由於每次計算均值和方差是在一個batch上,所以如果batchsize太小,則計算的均值、方差不足以代表整個數據分佈。
BN代碼
BN代碼
import numpy as np
def Batchnorm(x, gamma, beta, bn_param):
    # x_shape:[B, C, H, W]
    running_mean = bn_param['running_mean']
    running_var = bn_param['running_var']
    results = 0.
    eps = 1e-5
    x_mean = np.mean(x, axis=(0, 2, 3), keepdims=True)
    x_var = np.var(x, axis=(0, 2, 3), keepdims=True0)
    x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
    results = gamma * x_normalized + beta
    # 因爲在測試時是單個圖片測試,這裏保留訓練時的均值和方差,用在後面測試時用
    running_mean = momentum * running_mean + (1 - momentum) * x_mean
    running_var = momentum * running_var + (1 - momentum) * x_var
    bn_param['running_mean'] = running_mean
    bn_param['running_var'] = running_var
    return results, bn_param

LN:LN針對深度網絡某一層的所有神經元的輸入進行normalize操作。LN中同層神經元輸入擁有相同的均值和方差,不同的輸入樣本有不同的均值和方差。LN用於RNN效果比較明顯,但是在CNN上,不如BN。

def Layernorm(x, gamma, beta):
    # x_shape:[B, C, H, W]
    results = 0.
    eps = 1e-5
    x_mean = np.mean(x, axis=(1, 2, 3), keepdims=True)
    x_var = np.var(x, axis=(1, 2, 3), keepdims=True0)
    x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
    results = gamma * x_normalized + beta
    return results

IN,instance normalization:在圖像風格化中,生成結果主要依賴於某個圖像實例,所以對整個batch歸一化不適合圖像風格化中,因而對HW做歸一化。可以加速模型收斂,並且保持每個圖像實例之間的獨立。

def Instancenorm(x, gamma, beta):
   # x_shape:[B, C, H, W]
    results = 0.
    eps = 1e-5
    x_mean = np.mean(x, axis=(2, 3), keepdims=True)
    x_var = np.var(x, axis=(2, 3), keepdims=True0)
    x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
    results = gamma * x_normalized + beta
    return results

GN,Group normalization:主要針對bn對小batchsize效果差,GN將channel方向分group,然後每個group內做歸一化,算(C//G)HW的均值,這樣與batchsize無關,不受其約束

def GroupNorm(x, gamma, beta, G=16):
    # x_shape:[B, C, H, W]
    results = 0.
    eps = 1e-5
    x = np.reshape(x, (x.shape[0], G, x.shape[1]/16, x.shape[2], x.shape[3]))
    x_mean = np.mean(x, axis=(2, 3, 4), keepdims=True)
    x_var = np.var(x, axis=(2, 3, 4), keepdims=True0)
    x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
    results = gamma * x_normalized + beta
    return results
  • 梯度消失的解決方法:
    • 將sigmoid換爲relu等
    • 使用BN
    • 梯度裁剪
    • 更好的初始化方式(He 初始化)
    • 正則(梯度爆炸)
    • 變網絡結構(比如將vgg變爲resnet,加入殘差結構)
    • 循環網絡可以考慮用lstm
  • 網絡模型優化算法選擇:假設待學習參數爲w,學習率(或步長)爲n,一階梯度值爲g,t表示第t輪訓練。
    • 隨機梯度下降法SGD:每次批處理訓練時計算網絡誤差並作誤差的反向傳播,後根據一階梯度信息對參數進行更新,更新策略可表示爲:一階梯度信息g完全依賴於當前批數據在網絡目標函數上的誤差,可將學習率n理解爲當前批的梯度對網絡整體參數更新的影響程度。收斂效果穩定,但是收斂速度慢
    • 基於動量的隨機梯度下降法momentum:用於改善SGD更新時可能產生的震盪現象,通過積累前幾輪的動量信息輔助參數更新,更新表達式爲:,其中u爲動量因子,控制動量信息對整體梯度更新的影響程度,一般設置爲0.9. 除了可以抑制震盪,還可以在網絡訓練中後期趨於收斂,網絡參數在局部最小值附近來回震盪時跳出局部限制,找到最好的網絡參數。動量因子u可以動態設置,0.5爲初值,之後隨着輪數增長逐漸變爲0.9或者0.99
    • Nesterov型動量隨機下降法:在動量梯度下降法更新梯度時加入對當前梯度的矯正。其對凸函數在收斂性證明上有更強的理論保證,實際中也有更好的表現。
    • 無論以上三種方法哪種都是爲了使梯度更新更加靈活,對非凸且複雜函數空間學習更重要。但其也有自身侷限,一般小學習率更加合適網絡後期的優化,但這些方法學習率n卻一直不變,並未將學習率的自適應性考慮進去。
    • Adagrad法:針對學習率自適應問題,Adagrad法根據訓練輪數不同,對學習率進行動態調整,e是很小的數防止分母爲0.。不過其需要人爲指定一個全局學習率uglobal,同時網絡訓練到一定輪數後,分母上的梯度累加過大會使得學習率爲0而導致訓練過早結束。
    • Adadelta法:引入衰減因子p消除Adagrad法對全局學習率的依賴
    • RMSProp法:可以認爲是Adadelta法的一個特例,依然使用全局學習率替換掉Adadelta法中的St
    • Adam:本質上是帶有動量項的RMSProp,他利用梯度的一階矩估計和二階矩估計動態調整參數的學習率。主要優點在於經過偏置矯正後,每次迭代學習率都有一個範圍,這樣使得參數更新比較平穩。Adam仍然需要指定基本學習率n
  • 優化算法(吳恩達):
    • momentum,動量梯度下降算法,速度比隨機梯度下降快很多。在每次訓練時,對其梯度做指數加權平均處理,然後用得到的梯度值更新權重w和常數項b。原始的梯度下降方法如上圖藍色折線所示。在梯度下降過程中,梯度下降的震盪較大,尤其對於w,b之間的數值範圍差別較大的情況。此時每一點處的梯度只與當前的方向有關,產生類似折現的效果,前進緩慢。而如果對梯度進行指數加權平均,這樣使當前梯度不僅與當前方向有關,還與之前的方向有關,這樣處理讓梯度前進方向更加平滑,減少震盪,能夠更快的到達最小值處。從動量的角度看,以權重w爲例,Vdw可以看成速度v,dW可以看成加速度a。指數加權平均實際上是計算當前的速度,當前速度由之前的速度和現在的加速度共同影響。β<1,又能限制速度Vdw過大。也就是說當前的速度是漸變的,而不是瞬變的,是動量的過程。這保證了梯度下降的平穩性和準確性,減少震盪,較快的達到最小值
    • 初始時令Vdw=0,Vdb=0, 一般設置β=0.9. 即指數加權平均前10天的
    • RMSProp:每次訓練過程中,其權重w和常數項b的更新表達式爲(下面):以下圖爲例分析RMSProp的原理,令水平方向爲w的方向,垂直方向爲b的方向。從圖中可以看出,梯度下降(藍色折線)在垂直方向(b)上震盪較大,在水平方向上(w)震盪較小,表示在b方向上梯度較大,即db較大,而在w方向上梯度較小,即dw較小。因此下面表達式中Sb較大,而Sw較小。在更新w和b的表達式中,。也就使得w變化的多一點,b變化的少一點。即加快了w方向的速度,減小了b方向的速度,減小震盪,實現快速梯度下降算法,其梯度也就是綠色線所示。總的來說,就是如果哪個方向震盪大,就減小該方向的更新速度,從而減小震盪。通常爲了避免分母爲0,可以在分母增加一個極小的常數e,其中e=10^(-8)或者較小值。
    • AdamAdaptive Moment Estimation,自適應矩估計):結合了動量梯度下降算法和RMSProp算法,其算法流程爲:
    • Adam算法包含了幾個超參數:。其中β1通常設置爲0.9,β2通常設置爲0.999,e設置爲10^(-8),一般只需要對β1和β2調整。實際應用中,Adam算法結合了動量梯度下降和RMSProp算法的優點,使得神經網絡訓練速度大大提高。
  • 微調神經網絡finetune:由於網絡在原數據上已經收斂,因此設置較小的學習率在目標數據上微調,10^(-4)以下
    • 在新數據上微調時泛化特徵更新可能或程度小,高層語義特徵更新可能程度大,因此對不同深度層使用不同學習率:網絡深層學習率稍大於淺層學習率
    • 若目標數據極少,同時與原始數據有較大差異情況:一種有效方式是藉助部分原始數據與目標數據協同訓練。因爲與訓練模型的淺層網絡特徵更具有泛化性,故可在淺層特徵空間選擇目標數據的近鄰作爲原始數據的子集。之後將微調階段改造爲多目標學習任務:一者將目標任務基於原始數據子集,二者將目標任務基於全部目標數據。實驗證明這樣可大幅提高這種情況下的微調結果
 
10.不平衡樣本的處理
不平衡的訓練樣本會導致訓練模型側重樣本數目較多的類別,而輕視樣本數目較少的類別,這樣模型在測試數據上的泛華能力就會受到影響。在分類、迴歸、語義分割、圖像深度估計等任務重經常出現。主要從數據層面和算法層面介紹不平衡樣本問題的處理方法。
  • 數據層面:藉助數據採樣使整體訓練集樣本趨於平衡。
    • 數據重採樣:對數據少的類上採樣或擴充、樣本多的類下采樣。下采樣不是扔掉一部分數據,而是在每個batch控制樣本類較多的數量。只使用上採樣可能造成過擬合。一般上採樣與下采樣結合使用
    • 類別平衡採樣:把樣本按類別分組,每個類別生成一個樣本列表。訓練過程線隨機選擇1個或幾個類別,然後從各個類別所對應的樣本中隨機選擇樣本。這樣可以保證每個類別參與訓練的機會均等。可以使用類別重組法(海康威視研究院提出)
  • 算法層面:對樣本數目少的類別欠學習的現象,很自然的解決辦法是增加小樣本錯分的“懲罰代價”並將懲罰代價直接體現在目標函數中,這就是代價敏感方法。這樣通過優化目標函數就可以調整模型在小樣本上的“注意力”。算法層面處理不平衡樣本問題的方法也多從代價敏感角度出發。
    • 代價敏感方法:
      • 基於代價敏感矩陣的代價敏感
      • 基於代價敏感向量的代價敏感
    • 代價敏感法中的權重指定方式
      • 按照樣本比例指定
      • 根據混淆矩陣指定
 
 
11.模型集成方法
  • 數據層面的集成方法
    • 測試階段數據擴充:圖像多尺度,隨機抽取等。比如隨機抽取,對某張測試圖像可得到n張隨機抽取圖像,測試階段只需要用訓練好的網絡對n張圖片分別預測,將結果置信度平均作爲該圖片的結果。
    • 簡易集成法:對於樣本較多的類採用降採樣,每次採樣數依照樣本數目最少的類別而定,這樣每類取到的樣本數可保持均等。採樣結束後,針對每次採樣得到的子數據集訓練模型,如此訓練採樣反覆多次。最後對測試數據的預測依據訓練得到的若干個模型的結果取平均或投票獲得。這樣,在模型集成的同時,還能夠緩解數據不平衡帶來的問題。
  • 模型層面的集成方法
    • 單模型集成
      • 多層特徵融合:深度CNN具有層次性的特點,不同層特徵包含的語義特徵可以互補。一般多層特徵融合操作時可直接將不同層網絡特徵級聯。對於特徵融合應該選擇哪些網絡層,實踐經驗:最好使用靠近目標函數的幾層卷積特徵,因爲越深層特徵包含的高層語義性越強,分辨能力越強。低層特徵較普適,用於特徵融合可能起不到作用甚至會起到相反作用。
      • 網絡快照集成法:NN存在許多局部最優解,經典的minibatchSGD只能讓網絡模型收斂到其中一個局部最優解。快照法利用這些局部最優解對單個網絡模型集成。通過循環調整網絡學習率可使網絡依次收斂到不同的局部最優解處。
    • 多模型集成:
      • 多模型生成策略:
        • 同一模型不同初始化:特別對小樣本學習場景,先對同一模型不同初始化,之後將得到的網絡模型進行結果集成會緩解其隨機性,提升最終結果的預測任務。
        • 同一模型不同訓練輪數:可降低隨機誤差,也避免了訓練輪數過多帶來的過擬合風險。
        • 不同目標函數:交叉熵損失,合頁損失,大間隔交叉熵損失,中心損失等作爲目標函數訓練模型。預測時可對不同模型置信度級別進行平均或者投票。也可以做特徵級別模型集成:將不同網絡得到的深度特徵抽出級聯後作爲最終特徵,最後離線訓練淺層分類器完成預測任務。
        • 不同網絡結構:vgg,resnet等不同模型集成
      • 多模型集成方法:
        • 直接平均法
        • 加權平均法
        • 投票法
        • 堆疊法stacking:以一階學習過程的輸出作爲輸入開展二階學習的過程,也成爲元學習(meta learning)。學習器可以使任何學習算法模型,svm,rf,nn等。但堆疊法有過擬合風險。
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章