1. 程式人生 > >CS231n-課程總結

CS231n-課程總結

來自斯坦福CS231n課程 李飛飛主講 我主要是對Notes部分的小總結 包括影象基礎,神經網路Backprop,卷積層做了基礎的瞭解 還有引數的調整,解決過擬合的問題等等

0_影象基礎 1.k-Nearest-Neighber: 最相似的前k個元素中 找到屬於同一類別最多的label 2.高維資料的PCA降維 再使用KNN 3.引數K值 向量距離的L1(差值Sum) or L2(差值平方和)定義

1_線性分類器 1.1 f(xi,w,b) = W * xi + b; weights_vector(矩陣) and bias_vector(偏差向量,列向量) 1.2 weights_vector每一行就是一個類的分類器 1.3 Xi是列向量(抽象為高維空間的點) 1.4 權重W & 偏差b的合併為一個矩陣的處理 1.5 normalization減去平均值來中心化資料 + 歸一化 2.1 loss function or cost funciotn用來調整Weight矩陣,調整到最後的 評分列向量中的正確分類的評分比其它的類別的評分至少高△ 2.2 正則化懲罰 避免大權重的W的出現 完整Loss = 1/N * Sum(Li)這一項是dataLoss + λ * 正則化損失(所有引數的平方和) 2.3 data_train做出準確分類預測和讓Min loss_funciton這兩件事是等價的 3.1 SVM損失函式 關鍵idea: 正確分類和錯誤分類之間的差值大於某個閾值 3.2 softMax損失函式 關鍵idea: 交叉熵; 得到每一個結果分類正確的概率 如何高效的計算Min_loss的引數呢?

2_最優化 optimization 尋找最優的Weights矩陣 2.1 隨機搜尋 隨機本地搜尋 跟隨梯度(偏導最大的方向) 2.2 有限差值近似計算 、可導微分計算 學習率 learning-rate 10^-5感覺效果比較好 2.3 batchs訓練權重weights evaluate_gradient函式 對於batch究竟是如何處理的? 2.3 核心idea: 計算損失函式關於權重的梯度(=》Min Loss)

3_反向傳播 Backprop 3.1 核心Idea: 分段計算偏導數 損失函式可以拆分成加法門 取最大值門 乘法門等,通過鏈式法則計算區域性偏導數 3.2 例如:給定的X_train,y_train可以通過鏈式法則計算(儲存前向傳播的中間變數) x的偏導數即dfdx = dfdq * dqdx (存在多分支則進行累加) fixme: 如果區域性梯度很小或者很大 會影響相乘的結果 3.3 tips: 矩陣or向量的偏導數 維度和原來的size一定是一樣的 3.4 通過BackProp 來計算NeuralNetWork中的各個節點的損失函式的偏導數了

4_NN基礎I_SetUp Architecture 4.1 例如3層NN s=W3 * max(0,W2 * max(0,W1x))其中W1,W2,W3是需要學習的引數。中間隱藏層的尺寸size是超引數

class Neuron(object):
  # ... 
  def forward(inputs):
    """ 假設輸入和權重是1-D的numpy陣列,偏差是一個數字 """
    cell_body_sum = np.sum(inputs * self.weights) + self.bias
    firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)
) # sigmoid啟用函式 return firing_rate

4.2 forward中啟用函式 非線性函式。sigmod的飽和使得梯度消失,不建議用。學習率較大時,RELU可能遇到較多的死亡神經單元。 tips:設定好LearningRate or 使用Leakly Relu or 使用Maxout效果更好一些 4.3 NN本質是通用的函式近似器理論上可以用來模擬所有連續函式 4.4 確定網路尺寸 weights bias_vector 4.5 更大的網路效果一般更好 ;大網路的overfitting通過正則化強度等等手段加以控制

5_NN基礎II_Data and Loss 1.1 資料預處理:均值減法得到零中心化 =》歸一化資料{-1,1} 常用操作 1.2 PCA;白化Whitening 不常用了 1.3 randn(n)零均值的高斯分佈 n是input資料的數量。 bias一般設定為0 目前認為 RELU的最佳Weights初始化為np.random.randn(n) * sqrt(2.0/n) 含義: 標準差為2/n的高斯分佈 n是輸入層的神經元數目 1.4 batch Normalization批量歸一化 全連線層和啟用函式之間新增BatchNorm層用來歸一化預處理 Regularization損失 通過調整Weights避免overfitting 2.1 L2正則化 w += -lambda * W 2.2 Max norm Constraints最大正規化約束 2.3 Dropout神經元隨機失活 or DropConnect權重向量被隨機設為零

""" 
反向隨機失活: 推薦實現方式.
在訓練的時候drop和調整數值範圍,測試時不做任何事.
"""
p = 0.5 # 啟用神經元的概率. p值更高 = 隨機失活更弱
def train_step(X):
  # 3層neural network的前向傳播
  H1 = np.maximum(0, np.dot(W1, X) + b1)
  U1 = (np.random.rand(*H1.shape) < p) / p # 第一個隨機失活遮罩. 注意/p!
  H1 *= U1 # drop!
  H2 = np.maximum(0, np.dot(W2, H1) + b2)
  U2 = (np.random.rand(*H2.shape) < p) / p # 第二個隨機失活遮罩. 注意/p!
  H2 *= U2 # drop!
  out = np.dot(W3, H2) + b3
  # 反向傳播:計算梯度... (略)
  # 進行引數更新... (略)
def predict(X):
  # 前向傳播時模型整合
  H1 = np.maximum(0, np.dot(W1, X) + b1) # 不用數值範圍調整了
  H2 = np.maximum(0, np.dot(W2, H1) + b2)
  out = np.dot(W3, H2) + b3

dataLoss 3.1分類問題和迴歸問題的Loss; L2損失;softMax損失 預處理資料+初始化模型 下一節進行演算法的學習過程

6_NN基礎III_Learning and Evaluation 1.1 梯度檢查 相對誤差;不要讓正則化Loss吞沒資料;除錯梯度記得關閉dropout隨機失活 1.2 epochs週期 1.3 訓練集準確率和驗證集準確率中間的空隙指明瞭模型過擬合的程度。 Lr設定不恰當;或者正則化懲罰權重較低 2.1 Weight更新方式 TODO 已經通過反向傳播計算得到了所有unit的梯度

負梯度方向最小化LossFunc
2.1.1 普通更新 W += - learning_rate * dw
2.1.2 普通動量更新 Momentum用於深度網路;  v一般初始化為0   mu為0.9
v = mu * v - learning_rate * dw # 與速度融合
w += v # 與位置融合
2.13 Nesterov動量
v_prev = v # 儲存備份
v = mu * v - learning_rate * dx # 速度更新保持不變
x += -mu * v_prev + (1 + mu) * v # 位置更新變了形式

2.2 動態調整learning-rate方法-常用Adam用來更新Weights

m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)
推薦的引數值eps=1e-8, beta1=0.9, beta2=0.999
  1. 超引數調優 3.1 learning-rate初始化 & 週期衰減 3.2 正則化Loss的懲罰(e.g. DropOut) 3.3 隨機搜尋尋找最優超引數優於網格搜尋;其他一些情形的技巧詳細請看Notes

7_CNN基礎 目的: 大尺寸的影象NN全連線層導致Weight過多 1.1 卷積層conv receptive_filed=>計算卷積層中每個神經元的Weights區域大小。同一深度方向的感受野相同。輸出資料體超引數: depth stride zero-padding 1.2 同一個深度切片的使用相同的Weight kernel. 1.3 輸出資料體的空間尺寸: 正方形寬=高=filter濾波器的F,切片的深度=(W-F+2P)/S+1 Winput影象尺寸 F濾波器尺寸 P零填充長度 Stride步長 FIXME:到底怎麼算Filter 怎麼算Weight size

卷積層超引數:
濾波器數量K      //TODO: 輸出actionMap的個數  
濾波器空間尺寸F  
步長Stride  
零填充數量P  

2.1 pooling減少網路間的傳遞引數 downsample 降取樣 一般採用F=2 S=2的濾波器進行Max_pool 相當於丟棄了75%資料(深度切片的個數不變) 2.2 其他思路=拋棄匯聚層:通過在卷積層中使用更大的步長來降低資料體的尺寸 3. 全連線層 和 卷積層的相互轉換 這裡我沒看 4. 卷積層小尺寸filter3 * 3 stride=1 padding=1 或者 filter5 * 5 stride=1,p=2 5. leNet AlexNet ZFNet GoogleNet VGGNet ResNet等等卷積網路 ·