計算機視覺教程核心版(六)數據預處理、初始化和分類與迴歸

warming up

在之間的章節中。我們介紹了神經元的模型,其計算點乘後跟着一個非線性化,而神經元排列成層。合併起來,不同的層數、每層不同神經元的個數以及不同的激活函數定義了新型的得分函數(從線性映射擴展得來)。在本節中,我們將討論其他針對數據預處理、權重初始化和損失函數的設計選擇。

在這裏插入圖片描述
在這裏插入圖片描述
在實際中並不常用標準化方差,PCA或者白化。另外預處理操作僅僅作用於訓練數據,之後運用於驗證集和測試集合,即均值必須現在整個訓練集上計算出來,之後被訓練集、驗證集和測試集減去。

數據預處理

我們假設輸入矩陣的size[N*D],N是數據的數量,D是它們的維度。
均值相減是最常用的預處理方法。操作方法是將數據集上的每個特徵值減去均值,其幾何解釋是將數據雲在每一個維度都以原點爲中心。在numpy中這個操作的執行代碼如下:

x -= np.mean(x, axis = 0)

特別地,對於圖像爲了方便經常將所有的像素值減去均值(AlexNet),或者將圖像通道分離,減去每個通道的均值(VGGNet)

權重初始化

我們已經學習瞭如何構建一個神經網絡,和如何預處理數據。在我們開始訓練神經網絡之前,我們還必須初始化參數。
注意
不要將所有的權重初始化爲零。如果這樣做,將導致所有的神經元計算同樣的輸出,之後他們將計算出同樣的梯度,所有的神經元將經手相同的梯度更新。換句話說,神經元的之間的權重對稱行沒有解決。
如果你觀察損失函數如圖示例:
在這裏插入圖片描述
在上圖中,損失函數在初期幾乎沒有變化,之後一段時間開始下降,這表明在初期權重初始化並不好。
小而隨機的數字:一般情況下,我們希望權重接近於零,但是又不是完全是零。因此,常用的一種做法是使用較小的數字初始化神經元權重,以此對稱破碎。這樣做的思想是,神經元全初始都是隨機和獨立,因此它們將計算獨立的更新並且最終作爲給的不同的部分混入神經網絡中。
注意,不一定越小的初始權重就越好。例如較小的權重初始化可能會導致反向傳播時候,有很小的梯度,進而導致梯度消失問題。

使用1/sqrt(n)校準方差。上述問題的一個建議是零w=np.random.rand(n)/sqrt(n)
更多相關內容
properties of variance
Understanding the difficulty of training deep feedforward neural networks
Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
實際中常用w = np.random.randn(n) * sqrt(2.0/n)和Relu參見 He et al…
批標準化(batch normalization)是在神經網路的每一層的預處理。它在神經網絡中的使用很常見,一般用於全連接層和卷積層之後。更多Batch Normalization

學習率初始化

對於學習率的設置一般初始設置爲[1e-3,1e-5]之間,具體視情況而定。如果你發現該訓練中的損失幾乎不改變,則可能是學習率設置太低的原因進而導致梯度幾乎不更新。然而在損失幾乎不變的情況下,依然可以出現準確率提升的現象,這表明權重參數正在朝正確的方向前進。如果你的訓練中出現了損失Nan,這表明你的學習率太大,需要降低學習率。
示例如下在這裏插入圖片描述

正則化

控制神經網絡過擬合有多種方法
常見的添加項的正則化方法有L2 regularization、L1 regulization,對於它們的作用由很多爭議。一種更爲常見的方法是Dropout方法。Dropout方法通過隨機概率僅僅保留一部分神經元出於激活狀態。如圖

在這裏插入圖片描述
香草型Dropout代碼

""" Vanilla Dropout: Not recommended implementation (see notes below) """

p = 0.5 # probability of keeping a unit active. higher = less dropout

def train_step(X):
  """ X contains the data """
  
  # forward pass for example 3-layer neural network
  H1 = np.maximum(0, np.dot(W1, X) + b1)
  U1 = np.random.rand(*H1.shape) < p # first dropout mask
  H1 *= U1 # drop!
  H2 = np.maximum(0, np.dot(W2, H1) + b2)
  U2 = np.random.rand(*H2.shape) < p # second dropout mask
  H2 *= U2 # drop!
  out = np.dot(W3, H2) + b3
  
  # backward pass: compute gradients... (not shown)
  # perform parameter update... (not shown)
  
def predict(X):
  # ensembled forward pass
  H1 = np.maximum(0, np.dot(W1, X) + b1) * p # NOTE: scale the activations
  H2 = np.maximum(0, np.dot(W2, H1) + b2) * p # NOTE: scale the activations
  out = np.dot(W3, H2) + b3

Dropout方法一般在訓練時候使用,由於測試時候的表現非常重要,通常更傾向於使用翻版的Dropout,代碼如下

""" 
Inverted Dropout: Recommended implementation example.
We drop and scale at train time and don't do anything at test time.
"""

p = 0.5 # probability of keeping a unit active. higher = less dropout

def train_step(X):
  # forward pass for example 3-layer neural network
  H1 = np.maximum(0, np.dot(W1, X) + b1)
  U1 = (np.random.rand(*H1.shape) < p) / p # first dropout mask. Notice /p!
  H1 *= U1 # drop!
  H2 = np.maximum(0, np.dot(W2, H1) + b2)
  U2 = (np.random.rand(*H2.shape) < p) / p # second dropout mask. Notice /p!
  H2 *= U2 # drop!
  out = np.dot(W3, H2) + b3
  
  # backward pass: compute gradients... (not shown)
  # perform parameter update... (not shown)
  
def predict(X):
  # ensembled forward pass
  H1 = np.maximum(0, np.dot(W1, X) + b1)  # no scaling necessary
  H2 = np.maximum(0, np.dot(W2, H1) + b2) 
  out = np.dot(W3, H2) + b3

更多關於Dropout參見Dropout Training as Adaptive Regularization
分類與迴歸
迴歸問題:輸出連續,常用來預測真實的值,例如房價。對於這樣的任務,常用L2平方標準化作爲損失函數。然而L2損失更加難以優化並且更加脆弱。在面對一個迴歸問題時候,判斷是否絕對無法量化輸出爲多個空間,如果不是,就用分類方法。且L2損失函數的網絡中並不適合用Dropout.
分類問題:輸出離散。對於分類問題,大小合適即可,不必那麼精確,且分類問題常用sorfmax損失,具體相關公式如下
在這裏插入圖片描述

總結

  1. 推薦的處理過程是使得數據有零均值,且歸一化每一個特徵值範圍在[-1,1]之間。

  2. 通過帶有標準差的高斯分佈初始化權重,n是輸入的個數,w = np.random.randn(n) * sqrt(2.0/n)
    -如果 使用L2正則化加使用Dropout(翻版)

  3. 使用batch normalization ,如果無法滿足條件,再使用其他技術

  4. 每種類型任務最常見的損失函數介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章