深度學習最基礎理論知識總結 (CS231課程總結,持續更新)
因為有在看CS231學習深度學習的簡單知識,所以打算整理成blog,持續更新中。。。
一、損失函式loss function
1、SVM:最簡單的loss function
其中為真實label對應的分數,為label j對應的分數,Li為每個樣本的分類損失,目的是最大化真實label對應分數。
在初始化時,Li的初始值接近於C-1,其中C為分類的個數,因為所有的分數都接近於0,對應為(C-1)個1相加。
所有樣本的loss表示為:
2、softmax
二、模型正則項
通常為了防止模型過擬合,使得模型在效果和複雜度之間達到平衡,常常引入正則項。不同的正則項都是為了模型簡單化,但是對簡單的定義各異。
1) L1正規化:鼓勵稀疏,也就是鼓勵權重向量中0的個數,從而使得模型簡單化
2) L2正規化:魯棒性更好,控制向量中的整體分佈,各個位置的數值均影響模型更好,即各個位置的數值較為平均。
3) dropout:隨機將每一層上的一些神經元設為0,常在全連線層使用。訓練時間加長,但訓練後魯棒性增強。
4) bach normalization:見下
5) dropconnect:和3不同,不是丟棄神經元,而是丟棄一些權重矩陣
6) stochastic depth:隨機丟棄一些層。
三、Bach Normalization
深度學習中,通常為了能讓啟用函式更好地啟用,防止梯度消失或者梯度爆炸 (後面會有解釋),需要對特徵進行歸一化,將特徵向量變成均值為0,方差為1的向量
通常在全連線層和卷積層之後使用,每一層保證高斯分佈,對向量的每個維度進行歸一化。
四、正向傳播與反向傳播
神經網路中最主要的操作就是正向傳播與反向傳播。
正向傳播:值,從輸入層開始計算各個層的值,依次向後傳播直至輸出層;
反向傳播:從輸出層將損失進行反向傳播,傳播的是梯度,基於鏈式法則。
五、卷積神經網路 convolutional neural network (CNN)
全連線層:整圖input x,經過權重矩陣W,進行矩陣相乘Wx得到輸出
卷積層:對於一個矩陣x(N*N*depth),使用一個卷積核 (filter) w (F*F*depth),在x上按行向下滾動點乘 (將對應位置上的元素相乘),通常會有滾動的間隔stride,以下圖為例,對應卷積操作為:
1) 從第一行開始,在對應位置使用卷積核點乘;
2) 將卷積核向右移動一個stride,得到第二幅圖,進行點乘;
3) 一直向右以stride為間隔移動,直至到達最右端。然後從第二行開始繼續執行1、2步。
所以在經過一次卷及操作後,輸出的尺寸大小為s= (N-F)/stride+1,其中F為卷積核的尺寸,N為原始尺寸,輸出的大小為s*s*1。通常每一個卷積層會有k個不同的卷積核,所以得到的輸出層尺寸為s*s*k。
處理邊角位置:使用zero pad在外圍一層填空,或是複製邊緣值。 目的:在stride=1時保證輸出和原始尺寸相同,減少資訊損失 (圖片尺寸快速減小),減小邊角資訊損失。
常用的卷積核大小:3*3,5*5,7*7。使用不同的卷積核,為了使輸出尺寸保持不變,zero pad的寬度會隨之變化。
對於n個m*m的卷積核,對應的引數個數為(m*m*3+1)*n,其中3為depth的值,通常為RGB三通道;1為偏差項;n通常設定為2的次方(32,64,……)。
池化層 pooling layer:不改變深度,只改變尺寸。
max pooling: 使用m*m的filter,stride=m (沒有重疊區域,降取樣),每一個小塊取其中的最大值。
採用max而不是mean的原因:為了表示對應區域的受激程度。
通常的深度網路結構:((CONV-RELU)*N-POOL)*M-(FC-RELU)*K,SOFTMAX
其中RELU為啟用函式,下面會講到。通常。
六、啟用函式activation function
1、sigmoid
其中第二個分段函式是感知機。
存在的問題:
- 飽和神經元使梯度消失:x很大/很小時,梯度變為0,傳遞到下游節點,梯度消失;
- 非零中心函式:當輸入wx+b,x均為正值時,梯度均為正或者均為負,在引數更新時只朝一個方向移動,無法得到理想引數,更新效率低;
- exp(-x)的計算代價較高。
2、Relu
優點:
- 不會飽和,避免梯度消失;
- 計算成本小;
- 收斂速度快;
- 更具有生物合理性。
缺點:
- 非零中心函式;
- x<0時會出現梯度消失的問題,dead relu
- 不適用較大梯度,引數更新後不再啟用,梯度為0。
3、Leaky-Relu
4、PRelu
5、tanh
優點:零中心
缺點:仍有梯度消失問題
6、Maxout
優點:不飽和,no die
缺點:引數數量翻倍
7、ELU
七、資料預處理 data preprocessing
1、zero-centered: x-=np.mean
1) 對所有通道取均值 AlexNet
2) 對每個channel取均值 VGGNet
2、normalized data: x/=np.std(X,axis=0)
八、權重初始化 weight initialization
初始化時可能面臨的問題:
- 如果將w均初始化為0,則所有神經元都在做相同的事情。
- 權值設定過小 (0.01),不斷傳播後數值變得過小
- 權值設定過大,飽和,梯度變為0
所以常使用Xavier initialization:
np.random.randn(in,out)/np.sqrt(in)或者
np.random.randn(in,out)/np.sqrt(in/2) 解決Relu每次有一般不會被啟用的問題 (x<0)。
九、babysitting引數監控
- 如果loss為NaN,說明學習速率設定過大
- 如果loss值下降很緩慢,說明學習速率過小
- 交叉驗證,如果訓練集的accuracy不斷增加,而測試集不變,說明可能過擬合,需要調整正則化項
十、隨機梯度下降 stochasitc gradient decent (SGD)
梯度:沿著梯度方向函式值上升最快
梯度更新:計算好當前狀態下損失函式在每個引數下的梯度後,再更新每個引數;而不是計算一個引數就更新一個引數,然後再計算一個引數,因為這時第一個引數已經改變。 這裡提到的是同步更新的概念。
缺點:
- 在某個方向loss下降很快,某個方向loss下降很慢
- 區域性最小點:如下所示紅點位置
- 鞍點:saddle point,一個方向上梯度大於0,一個方向上梯度小於0。在高維資料上容易發生
- stochastic:曲折著走向optimal,耗時。
十一、學習率learning rate decay method
1、exponential decay
2、 1/t decay
十二、VGG Net
1) smaller filter:3*3卷積核
引數量較小,可以使用更多的filters來增加深度
2) same effective field
使用3層,3*3 C個filters,對應的視野域和7*7的相同,但是引數遠遠小,3*(3*3*C*C)<(7*7*C*C)。
effective field:第一層3*3;第二層也是3*3,但其中每個點都對應第一層中的一個3*3區域,按照stride=1滾動,所以第二層中的3*3實際對應了原始中5*5的區域;同理,第三層對應到的實際是7*7的區域。
所以視野域和直接使用7*7的卷積核是一樣的,但是引數變少了,減少了計算負擔。
十三、GoogleNet
無全連線層,含有一個inception layer, 包含了3個conv層和1個pooling層,最終結果將4個輸出串聯為最終輸出,每個conv層,pooling層尺寸相同,深度 (通道數)不同。
但是這種方法,計算量大。解決方案:加入bottleneck層,使用1*1 conv先降低輸入深度。
例如,m*m*256經過1*1 filter後,變成m*m*32,這樣再傳入conv層能夠減少運算。
十四、ResNet
Hypothsis: the problem is an optimization problem, deeper models are harder t optimize. 所以並不是越深的網路就一定越好。