1. 程式人生 > >機器學習總結(十一):深度學習演算法(CNN,SAE,等)及常見問題總結

機器學習總結(十一):深度學習演算法(CNN,SAE,等)及常見問題總結

(1)CNN

層級結構:輸入層->卷積層->激勵層->卷積層->激勵層。。。

資料輸入層(資料預處理):三種方法:去均值(即0均值化,CNN常用,訓練集所有畫素值減去均值,把輸入資料各個維度中心化到0,測試集也減相同的均值);歸一化(幅度歸一化到同樣的範圍);PCA/白化(降維,白化是對資料每個特徵軸上的幅度歸一化)。

去均值的目的:(1)資料有過大的均值可能導致引數的梯度過大,在梯度回傳時會有一些影響;(2)如果有後續的處理,可能要求資料0均值,比如PCA。

歸一化的目的:為了讓不同維度的資料具有相同的分佈規模,方便操作,影象一般不需要。

白化的目的:相當於在零均值化和歸一化操作之間插入一個旋轉操作,將資料投影在主軸上。影象一般不需要,因為影象的資訊本來就是依靠畫素之間的相對差異來體現的。

引數初始化:隨機初始化,給每個引數隨機賦予一個接近0的值(不可0初始化)。

卷積計算層/CONV layer:引數共享機制。(跟過濾好像);作用:提取特徵,通過BP誤差的傳播,可以得到對於這個任務最好的卷積核。

激勵層(把卷積層輸出結果做非線性對映):

Sigmoid,tanh,ReLU

Leaky ReLU:f(x)=max(0.01x,x),Maxout。

池化層/Pooling layer:夾在連續的卷積層中間。作用:1.具有壓縮資料和引數的量,減小過擬合的作用。包括Max pooling 和average pooling;2.引入不變性,包括平移、旋轉、尺度不變性。

全連線層/FC layer:通常在卷積神經網路尾部

訓練演算法:

(1)     先定義Loss function,衡量和實際結果之間的差距;交叉熵

(2)     找到最小化損失函式的w和b,CNN中用的演算法是隨機梯度下降SGD;

(3)     BP演算法利用鏈式求導法則,逐級相乘直到求解出dW和db.

為什麼用SGD:(1)資料量龐大,直接梯度很慢;(2)代價函式非凸,容易陷入區域性極值。

CNN為什麼這麼好用?區域性連接獲得區域性資訊,權值共享減少了引數,保證高效。

與DNN的區別?全連線DNN上下層神經元都形成連結,帶來引數數量的膨脹,而卷積核在所有影象是共享的。

RNN的特點?DNN無法對時間序列上的變化進行建模,RNN中,神經元的輸出可以在下一個時間戳直接作用到自身。

RNN的梯度消失?原理和DNN一樣,採用長短時記憶單元LSTM,通過門的開關實現時間上的幾億功能,門關閉,當前資訊不需要,只有歷史依賴;門開啟,歷史和當前加權平均。

(2)AutoEncoder自動編碼器

基本思想:一種儘可能復現輸入訊號的神經網路。由編碼器Encoder和解碼器Decoder兩部分組成,本質上都是對輸入訊號做某種變換。學習處理x→h→x的能力。

兩種情況:假設資料維度為n,隱層維度為p

       1.n>p,相當於一種降維操作。與PCA的關係:當每兩層之間的變換均為線性,且監督訓練的誤差是二次型誤差時,該網路等價於PCA

       2.n<p,同時約束好h的表達儘量稀疏(有大量維度為0,未被啟用),此時就為“稀疏自編碼器”。為什麼稀疏的表達就是好的?稀疏的表達意味著系統在嘗試取特徵選擇,找出大量維度中真正重要的若干維。

堆疊自編碼器訓練過程:1.逐層訓練先訓練網路n→m→n,得到n→m的變換,然後在訓練m→k→m,得到m→k的變換,最終堆疊成SAE,即為n→m→k的結果。2.微調:可以只調整分類層的引數(此時相當於把整個SAE當作一個特徵提取),也可以調整整個網路的引數(適合訓練資料量較大的情況)。

稀疏自編碼器訓練過程:核心思想:高維而稀疏的表達是好的。1.指定一個稀疏性引數p,代表隱藏神經元的平均活躍程度(在訓練集上取平均);2.引入一個度量,來衡量神經元的實際啟用度與期望啟用度p之間的差異即可,然後把此度量新增到目標函式作為正則(相對熵,也就是KL散度,交叉熵),訓練整個網路。

降噪自編碼器訓練過程:核心思想:一個能夠從中恢復原始訊號的表達未必是最好的,能夠對“被汙染/破壞”的原始資料編碼解碼,然後還能恢復真正的原始資料,這樣的特徵才是好的,關注的是魯棒性。訓練過程:1.在原始資料中加入噪聲或部分資料缺失;2.計算誤差時用原始完好資料。

(3)調參優化方法

1.訓練資料預處理:移除不良資料(噪聲,空值等),去均值等。自動編碼器要對資料進行歸一化,因為啟用函式如果sigmoid的話要用輸出0~1與輸出比較;

2.權值初始化(很重要,初始化好的話可以不需要調參):多次隨機生成初始化,但不能全為0,根據目前最新的實驗結果,權重的均勻初始化是一個不錯的選擇。高斯分佈。

3.學習率的選取:一般從0.1開始,逐漸減小,如果在驗證集上效能不再增加就讓學習率除以2或者5,然後繼續。所以要使用驗證集,可以知道什麼時候開始降低學習率,什麼時候停止訓練。

4.網路結構的構建(逐層訓練):a.儘量選擇更多的隱層單元和隱層數量,因為可以通過正則化的方法避免過擬合;b.合適的啟用函式;c.正則優化:正則項L1,L2,Dropout,初始預設的是0.5,如果模型不是很複雜,可以設定為0.2.

5.Batchnormalization:大大加快訓練速度和模型效能。本質原理就是在網路的每一層輸入的時候,又插入了一個可學習,有引數的歸一化層,並且為每一層的神經元引入了變換重構,可以恢復出原始網路所學習的特徵分佈。在神經網路訓練時遇到收斂速度慢或爆炸時可以嘗試BN解決。

6.優化方法:不僅有BP,還有adagrad優化方法,Bp學習速率都一樣,但是同一個更新速率並不一定適合所有引數,因此ada就是對於每個引數分配不同的學習率,但是隨著更新距離的增多,學習速率也會變慢。

(4)神經網路歸一化的目的

神經網路學習過程的本質就是為了學習資料分佈,一旦訓練資料與測試資料的分佈不同,那麼網路的泛化能力也大大降低;另一方面,一旦每批訓練資料的分佈各不相同,那麼網路就要在每次迭代都去學習適應不同的分佈,這樣會大大降低網路的訓練速度。

(5)深度學習如何過擬合?

資料集擴充:在源資料上做些改動,比如說圖片資料集,可以將原始圖片旋轉一個小角度、新增隨機噪聲、加入一些有彈性的畸變、擷取原始圖片的一小部分等;

Dropout:相當於訓練了很多個只有半數隱層單元的神經網路,每一個這樣的半數網路都可以給出一個分類結果,這些結果有的是正確的,有的是錯誤的,隨著訓練的進行,大部分網路都可以給出正確的分類結果,少數的錯誤不會造成太大影響。

正則化!!