1. 程式人生 > >5、神經網絡靜態部分:數據預處理等

5、神經網絡靜態部分:數據預處理等

維度 rop 結果 激活 net 普通 此外 進行 and

一、疑問

二、知識點

1. 白化

? 白化操作的輸入是特征基準上的數據,然後對每個維度除以其特征值來對數值範圍進行歸一化。該變換的幾何解釋是:如果數據服從多變量的高斯分布,那麽經過白化後,數據的分布將會是一個均值為零,且協方差相等的矩陣。該操作的代碼如下:

# 對數據進行白化操作:
# 除以特征值 
Xwhite = Xrot / np.sqrt(S + 1e-5)

? 警告:誇大的噪聲。註意分母中添加了1e-5(或一個更小的常量)來防止分母為0。該變換的一個缺陷是在變換的過程中可能會誇大數據中的噪聲,這是因為它將所有維度都拉伸到相同的數值範圍,這些維度中也包含了那些只有極少差異性(方差小)而大多是噪聲的維度。在實際操作中,這個問題可以用更強的平滑來解決(例如:采用比1e-5更大的值)。

2. 預處理註意

? 任何預處理策略(比如數據均值)都只能在訓練集數據上進行計算,算法訓練完畢後再應用到驗證集或者測試集上。(避免過擬合等)

3.權重初始化

  • 錯誤:全零初始化。 權重全零,會導致每個神經元都計算出同樣的輸出,在BP時也會計算出同樣的梯度,從而進行同樣的參數更新。****
  • 小隨機數初始化: W = 0.01 * np.random.randn(D,H)。並不是數值越小結果越好,要控制在一定的量級內才不會導致BP時梯度信號過小。
  • 使用$1/sqrt(n)$校準方差。隨著輸入數據量的增長,隨機初始化的神經元的輸出數據的分布中的方差也在增大。公式如下: w = np.random.randn(n) / sqrt(n)
    . 此外,基於BP時梯度的分析,神經網絡算法使用ReLU神經元時的當前最佳推薦形式為: w = np.random.randn(n) / sqrt(2.0/n)
  • 批量歸一化。讓激活數據在訓練開始前通過一個網絡,網絡處理數據使其服從標準高斯分布。使用了批量歸一化的網絡對於不好的初始值有更強的魯棒性。

4. 正則化

  • L2正則化。 L2正則化可以直觀理解為它對於大數值的權重向量進行嚴厲懲罰,使網絡更傾向於使用所有輸入特征,而不是嚴重依賴輸入特征中某些小部分特征。

  • L1正則化。 讓權重向量在最優化的過程中變得稀疏(即非常接近0)。即使用L1正則化的神經元最後使用的是它們最重要的輸入數據的稀疏子集,同時對於噪音輸入則幾乎是不變的了。

  • 隨機失活。 在訓練的時候,隨機失活的實現方法是讓神經元以超參數$p$的概率被激活或者被設置為0。隨機失活可以被認為是對完整的神經網絡抽樣出一些子集,每次基於輸入數據只更新子網絡的參數。註意:predict函數中不進行隨機失活,但是對於兩個隱層的輸出都要乘以技術分享圖片,調整其數值範圍。

  """ 普通版隨機失活: 不推薦實現 (看下面筆記) """

  p = 0.5 # 激活神經元的概率. p值更高 = 隨機失活更弱

  def train_step(X):
    """ X中是輸入數據 """
    
    # 3層neural network的前向傳播
    H1 = np.maximum(0, np.dot(W1, X) + b1)
    U1 = np.random.rand(*H1.shape) < p # 第一個隨機失活遮罩
    H1 *= U1 # drop!
    H2 = np.maximum(0, np.dot(W2, H1) + b2)
    U2 = np.random.rand(*H2.shape) < p # 第二個隨機失活遮罩
    H2 *= U2 # drop!
    out = np.dot(W3, H2) + b3
    
    # 反向傳播:計算梯度... (略)
    # 進行參數更新... (略)
    
  def predict(X):
    # 前向傳播時模型集成
    H1 = np.maximum(0, np.dot(W1, X) + b1) * p # 註意:激活數據要乘以p
    H2 = np.maximum(0, np.dot(W2, H1) + b2) * p # 註意:激活數據要乘以p
    out = np.dot(W3, H2) + b3
  • 反向隨機失活。在訓練時就進行數值範圍調整,從而讓前向傳播在測試時保持不變。這樣做還有一個好處,無論你決定是否使用隨機失活,預測方法的代碼可以保持不變。
  """ 
  反向隨機失活: 推薦實現方式.
  在訓練的時候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
  • 隨機失活的解釋。

1、使用許多小的模型集成的一個大模型。假設某些神經元被隨機失活了,那麽在BP中,與這些神經元相連的上一層的權重也不會更新,那麽就相當於只對整個大模型的子網絡進行了訓練。

2、假設我們使用神經網絡對貓這個類別進行檢測,在神經網絡中我們用到的特征可能有:耳朵、尾巴、眼睛等等,在標準的神經網絡中,我們需要考慮每一個特征因素才能對貓進行得分計算。但是在測試集中,貓的圖片是多種多樣的,可能有時看不到尾巴或則耳朵,這就會影響了模型的泛化能力。而利用了隨機失活,即在訓練時我們隨機得不考慮一些特征(例如耳朵)來訓練模型,這樣模型在測試集上一般能得到更好的泛化能力。

5. 分類問題

當面對一個回歸任務,首先考慮是不是必須使用回歸模型。一般而言,盡量把你的輸出變成二分類,然後對它們進行分類,從而變成一個分類問題。

5、神經網絡靜態部分:數據預處理等