課程六 神經網絡(二)

@(斯坦福李飛飛深度學習上課筆記)

課程六 神經網絡(二)

內容列表

1.設置數據和模型
    1.1數據預處理
    1.2權重初始化
    1.3批量歸一化(Batch Normalization)
    1.4正則化(L2/L1/Maxnorm/Dropout)
2.損失函數
3.小結

1. 設置數據和模型

在上一節中介紹了神經元的模型,它在計算內積後進行非線性激活函數計算,神經網絡將這些神經元組織成各個層。這些做法共同定義了評分函數(score function)的新形式,該形式是從前面線性分類章節中的簡單線性映射發展而來的。具體來說,神經網絡就是進行了一系列的線性映射與非線性激活函數交織的運算。本節將討論更多的算法設計選項,比如數據預處理,權重初始化和損失函數。

1.1 數據預處理

關於數據預處理我們有3個常用的符號,數據矩陣X ,假設其尺寸是[NxD]N 是數據樣本的數量,D 是數據的維度)。

均值減法(Mean subtraction)是預處理最常用的形式。它對數據中每個獨立特徵減去平均值,從幾何上可以理解爲在每個維度上都將數據雲的中心都遷移到原點。在numpy中,該操作可以通過代碼X=np.mean(X,axis=0) 實現。而對於圖像,更常用的是對所有像素都減去一個值,可以用X=np.mean(X) 實現,也可以在3個顏色通道上分別操作。

歸一化(Normalization)是指將數據的所有維度都歸一化,使其數值範圍都近似相等。有兩種常用方法可以實現歸一化。第一種是先對數據做零中心化(zero-centered)處理,然後每個維度都除以其標準差,實現代碼爲X/=np.std(X,axis=0) 。第二種方法是對每個維度都做歸一化,使得每個維度的最大和最小值是1和-1。這個預處理操作只有在確信不同的輸入特徵有不同的數值範圍(或計量單位)時纔有意義,但要注意預處理操作的重要性幾乎等同於學習算法本身。在圖像處理中,由於像素的數值範圍幾乎是一致的(都在0-255之間),所以進行這個額外的預處理步驟並不是很必要。

——————————————————————————————————————————
Alt text
一般數據預處理流程:左邊:原始的2維輸入數據。中間:在每個維度上都減去平均值後得到零中心化數據,現在數據雲是以原點爲中心的。右邊:每個維度都除以其標準差來調整其數值範圍。紅色的線指出了數據各維度的數值範圍,在中間的零中心化數據的數值範圍不同,但在右邊歸一化數據中數值範圍相同。

PCA和白化(Whitening)是另一種預處理形式。在這種處理中,先對數據進行零中心化處理,然後計算協方差矩陣,它展示了數據中的相關性結構。

# 假設輸入數據矩陣X的尺寸爲[N x D]
X -= np.mean(X, axis = 0) # 對數據進行零中心化(重要)
cov = np.dot(X.T, X) / X.shape[0] # 得到數據的協方差矩陣

數據協方差矩陣的第(i, j)個元素是數據第i個和第j個維度的協方差。具體來說,該矩陣的對角線上的元素是方差。還有,協方差矩陣是對稱和半正定的。我們可以對數據協方差矩陣進行SVD(奇異值分解)運算。

U,S,V = np.linalg.svd(cov)

U的列是特徵向量,S是裝有奇異值的1維數組(因爲cov是對稱且半正定的,所以S中元素是特徵值的平方)。爲了去除數據相關性,將已經零中心化處理過的原始數據投影到特徵基準上:

Xrot = np.dot(X,U) # 對數據去相關性

注意U的列是標準正交向量的集合(範式爲1,列之間標準正交),所以可以把它們看做標準正交基向量。因此,投影對應x中的數據的一個旋轉,旋轉產生的結果就是新的特徵向量。如果計算Xrot的協方差矩陣,將會看到它是對角對稱的。np.linalg.svd的一個良好性質是在它的返回值U中,特徵向量是按照特徵值的大小排列的。我們可以利用這個性質來對數據降維,只要使用前面的小部分特徵向量,丟棄掉那些包含的數據沒有方差的維度。 這個操作也被稱爲主成分分析( Principal Component Analysis 簡稱PCA)降維:

Xrot_reduced = np.dot(X, U[:,:100]) # Xrot_reduced 變成 [N x 100]

經過上面的操作,將原始的數據集的大小由[N x D]降到了[N x 100],留下了數據中包含最大方差的100個維度。通常使用PCA降維過的數據訓練線性分類器和神經網絡會達到非常好的性能效果,同時還能節省時間和存儲器空間。

最後一個在實踐中會看見的變換是白化(whitening)。白化操作的輸入是特徵基準上的數據,然後對每個維度除以其特徵值來對數值範圍進行歸一化。該變換的幾何解釋是:如果數據服從多變量的高斯分佈,那麼經過白化後,數據的分佈將會是一個均值爲零,且協方差相等的矩陣。該操作的代碼如下:

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

警告:誇大的噪聲。注意分母中添加了1e-5(或一個更小的常量)來防止分母爲0。該變換的一個缺陷是在變換的過程中可能會誇大數據中的噪聲,這是因爲它將所有維度都拉伸到相同的數值範圍,這些維度中也包含了那些只有極少差異性(方差小)而大多是噪聲的維度。在實際操作中,這個問題可以用更強的平滑來解決(例如:採用比1e-5更大的值)。
——————————————————————————————————————————
Alt text
PCA/白化。左邊是二維的原始數據。中間:經過PCA操作的數據。可以看出數據首先是零中心的,然後變換到了數據協方差矩陣的基準軸上。這樣就對數據進行了解相關(協方差矩陣變成對角陣)。右邊:每個維度都被特徵值調整數值範圍,將數據協方差矩陣變爲單位矩陣。從幾何上看,就是對數據在各個方向上拉伸壓縮,使之變成服從高斯分佈的一個數據點分佈。

——————————————————————————————————————————

我們可以使用CIFAR-10數據將這些變化可視化出來。CIFAR-10訓練集的大小是50000x3072,其中每張圖片都可以拉伸爲3072維的行向量。我們可以計算[3072 x 3072]的協方差矩陣然後進行奇異值分解(比較耗費計算性能),那麼經過計算的特徵向量看起來是什麼樣子呢?
Alt text
最左:一個用於演示的集合,含49張圖片。左二:3072個特徵值向量中的前144個。靠前面的特徵向量解釋了數據中大部分的方差,可以看見它們與圖像中較低的頻率相關。第三張是49張經過了PCA降維處理的圖片,展示了144個特徵向量。這就是說,展示原始圖像是每個圖像用3072維的向量,向量中的元素是圖片上某個位置的像素在某個顏色通道中的亮度值。而現在每張圖片只使用了一個144維的向量,其中每個元素表示了特徵向量對於組成這張圖片的貢獻度。爲了讓圖片能夠正常顯示,需要將144維度重新變成基於像素基準的3072個數值。因爲U是一個旋轉,可以通過乘以U.transpose()[:144,:]來實現,然後將得到的3072個數值可視化。可以看見圖像變得有點模糊了,這正好說明前面的特徵向量獲取了較低的頻率。然而,大多數信息還是保留了下來。最右:將“白化”後的數據進行顯示。其中144個維度中的方差都被壓縮到了相同的數值範圍。然後144個白化後的數值通過乘以U.transpose()[:144,:]轉換到圖像像素基準上。現在較低的頻率(代表了大多數方差)可以忽略不計了,較高的頻率(代表相對少的方差)就被誇大了。

——————————————————————————————————————————

實踐操作。在這個筆記中提到PCA和白化主要是爲了介紹的完整性,實際上在卷積神經網絡中並不會採用這些變換。然而對數據進行零中心化操作還是非常重要的,對每個像素進行歸一化也很常見。

常見錯誤。進行預處理很重要的一點是:任何預處理策略(比如數據均值)都只能在訓練集數據上進行計算,算法訓練完畢後再應用到驗證集或者測試集上。例如,如果先計算整個數據集圖像的平均值然後每張圖片都減去平均值,最後將整個數據集分成訓練/驗證/測試集,那麼這個做法是錯誤的。應該怎麼做呢?應該先分成訓練/驗證/測試集,只是從訓練集中求圖片平均值,然後各個集(訓練/驗證/測試集)中的圖像再減去這個平均值。

1.2 權重初始化

我們已經看到如何構建一個神經網絡的結構並對數據進行預處理,但是在開始訓練網絡之前,還需要初始化網絡的參數。

錯誤:全零初始化。讓我們從應該避免的錯誤開始。在訓練完畢後,雖然不知道網絡中每個權重的最終值應該是多少,但如果數據經過了恰當的歸一化的話,就可以假設所有權重數值中大約一半爲正數,一半爲負數。這樣,一個聽起來蠻合理的想法就是把這些權重的初始值都設爲0吧,因爲在期望上來說0是最合理的猜測。這個做法錯誤的!因爲如果網絡中的每個神經元都計算出同樣的輸出,然後它們就會在反向傳播中計算出同樣的梯度,從而進行同樣的參數更新。換句話說,如果權重被初始化爲同樣的值,神經元之間就失去了不對稱性的源頭。

小隨機數初始化。因此,權重初始值要非常接近0又不能等於0。解決方法就是將權重初始化爲很小的數值,以此來打破對稱性。其思路是:如果神經元剛開始的時候是隨機且不相等的,那麼它們將計算出不同的更新,並將自身變成整個網絡的不同部分。小隨機數權重初始化的實現方法是:W=0.01np.random.randn(D,H) 。其中randn 函數是基於零均值和標準差的一個高斯分佈(國內教程一般習慣稱均值參數爲期望μ)來生成隨機數的。根據這個式子,每個神經元的權重向量都被初始化爲一個隨機向量,而這些隨機向量又服從一個多變量高斯分佈,這樣在輸入空間中,所有的神經元的指向是隨機的。也可以使用均勻分佈生成的隨機數,但是從實踐結果來看,對於算法的結果影響極小。

警告。並不是小數值一定會得到好的結果。例如,一個神經網絡的層中的權重值很小,那麼在反向傳播的時候就會計算出非常小的梯度(因爲梯度與權重值是成比例的)。這就會很大程度上減小反向傳播中的“梯度信號”,在深度網絡中,就會出現問題。

使用1/sqrt(n) 校準方差。上面做法存在一個問題,隨着輸入數據量的增長,隨機初始化的神經元的輸出數據的分佈中的方差也在增大。我們可以除以輸入數據量的平方根來調整其數值範圍,這樣神經元輸出的方差就歸一化到1了。也就是說,建議將神經元的權重向量初始化爲:w=np.random.randn(n)/sqrt(n) 。其中n 是輸入數據的數量。這樣就保證了網絡中所有神經元起始時有近似同樣的輸出分佈。實踐經驗證明,這樣做可以提高收斂的速度。

上述結論的推導過程如下:假設權重w 和輸入x 之間的內積爲s=inwixi ,這是還沒有進行非線性激活函數運算之前的原始數值。我們可以檢查s 的方差:

Var(s)=Var(inwixi)
=inVar(wixi)
=in[E(wi)]2Var(xi)+E[(xi)]2Var(wi)+Var(xIi)Var(wi)
=inVar(xi)Var(wi)
=(nVar(w))Var(x)

在前兩步,使用了方差的性質。在第三步,因爲假設輸入和權重的平均值都是0,所以E[xi]=E[wi]=0 。注意這並不是一般化情況,比如在ReLU單元中均值就爲正。在最後一步,我們假設所有的wi,xi 都服從同樣的分佈。從這個推導過程我們可以看見,如果想要s 有和輸入x 一樣的方差,那麼在初始化的時候必須保證每個權重w的方差是1/n 。又因爲對於一個隨機變量X和標量a,有Var(aX)=a2Var(X) ,這就說明可以基於一個標準高斯分佈,然後乘以a=1/n ,使其方差爲1/n,於是得出:w=np.random.randn(n)/sqrt(n)

Glorot等在論文Understanding the difficulty of training deep feedforward neural networks中作出了類似的分析。在論文中,作者推薦初始化公式爲 (Var(w)=2/(nin+nout) ,其中nin,nout 是在前一層和後一層中單元的個數。這是基於妥協和對反向傳播中梯度的分析得出的結論。該主題下最新的一篇論文是:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification,作者是He等人。文中給出了一種針對ReLU神經元的特殊初始化,並給出結論:網絡中神經元的方差應該是2.0/n 。代碼爲w=np.random.randn(n)sqrt(2.0/n) 。這個形式是神經網絡算法使用ReLU神經元時的當前最佳推薦。

稀疏初始化(Sparse initialization)。另一個處理非標定方差的方法是將所有權重矩陣設爲0,但是爲了打破對稱性,每個神經元都同下一層固定數目的神經元隨機連接(其權重數值由一個小的高斯分佈生成)。一個比較典型的連接數目是10個。

偏置(biases)的初始化。通常將偏置初始化爲0,這是因爲隨機小數值權重矩陣已經打破了對稱性。對於ReLU非線性激活函數,有研究人員喜歡使用如0.01這樣的小數值常量作爲所有偏置的初始值,這是因爲他們認爲這樣做能讓所有的ReLU單元一開始就激活,這樣就能保存並傳播一些梯度。然而,這樣做是不是總是能提高算法性能並不清楚(有時候實驗結果反而顯示性能更差),所以通常還是使用0來初始化偏置參數。

實踐。當前的推薦是使用ReLU激活函數,並且使用w = np.random.randn(n) * sqrt(2.0/n)來進行權重初始化,關於這一點,這篇文章有討論

1.3 批量歸一化(Batch Normalization)

批量歸一化(Batch Normalization)批量歸一化是loffe和Szegedy最近才提出的方法,該方法減輕瞭如何合理初始化神經網絡這個棘手問題帶來的頭痛:),其做法是讓激活數據在訓練開始前通過一個網絡,網絡處理數據使其服從標準高斯分佈。因爲歸一化是一個簡單可求導的操作,所以上述思路是可行的。在實現層面,應用這個技巧通常意味着全連接層(或者是卷積層,後續會講)與激活函數之間添加一個BatchNorm層。對於這個技巧本節不會展開講,因爲上面的參考文獻中已經講得很清楚了,需要知道的是在神經網絡中使用批量歸一化已經變得非常常見。在實踐中,使用了批量歸一化的網絡對於不好的初始值有更強的魯棒性。最後一句話總結:批量歸一化可以理解爲在網絡的每一層之前都做預處理,只是這種操作以另一種方式與網絡集成在了一起。搞定!

1.4 正則化 Regularization

有不少方法是通過控制神經網絡的容量來防止其過擬合的:

L2 正則化可能是最常用的正則化方法了。可以通過懲罰目標函數中所有參數的平方將其實現。即對於網絡中的每個權重w,向目標函數中增加一個12λw2 ,其中λ 是正則化強度。前面這個12 很常見,是因爲加上12 後,該式子關於w 梯度就是λw 而不是2λw 了。L2 正則化可以直觀理解爲它對於大數值的權重向量進行嚴厲懲罰,傾向於更加分散的權重向量。在線性分類章節中討論過,由於輸入和權重之間的乘法操作,這樣就有了一個優良的特性:使網絡更傾向於使用所有輸入特徵,而不是嚴重依賴輸入特徵中某些小部分特徵。最後需要注意在梯度下降和參數更新的時候,使用L2 正則化意味着所有的權重都以w+=lambdaW 向着0線性下降。

L1 正則化是另一個相對常用的正則化方法。對於每個w我們都向目標函數增加一個λ|w|L1L2 正則化也可以進行組合:λ1|w| +λ2w2 ,這也被稱作Elastic net regularizatonL1 正則化有一個有趣的性質,它會讓權重向量在最優化的過程中變得稀疏(即非常接近0)。也就是說,使用L1正則化的神經元最後使用的是它們最重要的輸入數據的稀疏子集,同時對於噪音輸入則幾乎是不變的了。相較L1正則化,L2正則化中的權重向量大多是分散的小數字。在實踐中,如果不是特別關注某些明確的特徵選擇,一般說來L2正則化都會比L1正則化效果好。

最大範式約束(Max norm constraints)。另一種形式的正則化是給每個神經元中權重向量的量級設定上限,並使用投影梯度下降來確保這一約束。在實踐中,與之對應的是參數更新方式不變,然後要求神經元中的權重向量\overrightarrow{w}必須滿足||\overrightarrow{w}||_2

""" 普通版隨機失活: 不推薦實現 (看下面筆記) """
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

在上面的代碼中,trainstep 函數在第一個隱層和第二個隱層上進行了兩次隨機失活。在輸入層上面進行隨機失活也是可以的,爲此需要爲輸入數據X創建一個二值的遮罩。反向傳播保持不變,但是肯定需要將遮罩U1U2 加入進去。

注意:在predict函數中不進行隨機失活,但是對於兩個隱層的輸出都要乘以p,調整其數值範圍。這一點非常重要,因爲在測試時所有的神經元都能看見它們的輸入,因此我們想要神經元的輸出與訓練時的預期輸出是一致的。以p=0.5 爲例,在測試時神經元必須把它們的輸出減半,這是因爲在訓練的時候它們的輸出只有一半。爲了理解這點,先假設有一個神經元x的輸出,那麼進行隨機失活的時候,該神經元的輸出就是px+(1p)0 ,這是有1-p的概率神經元的輸出爲0。在測試時神經元總是激活的,就必須調整xpx 來保持同樣的預期輸出。在測試時會在所有可能的二值遮罩(也就是數量龐大的所有子網絡)中迭代並計算它們的協作預測,進行這種減弱的操作也可以認爲是與之相關的。

上述操作不好的性質是必須在測試時對激活數據要按照p進行數值範圍調整。既然測試性能如此關鍵,實際更傾向使用反向隨機失活(inverted dropout),它是在訓練時就進行數值範圍調整,從而讓前向傳播在測試時保持不變。這樣做還有一個好處,無論你決定是否使用隨機失活,預測方法的代碼可以保持不變。反向隨機失活的代碼如下:

""" 
反向隨機失活: 推薦實現方式.
在訓練的時候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

在隨機失活發佈後,很快有大量研究爲什麼它的實踐效果如此之好,以及它和其他正則化方法之間的關係。如果你感興趣,可以看看這些文獻:

前向傳播中的噪音。在更一般化的分類上,隨機失活屬於網絡在前向傳播中有隨機行爲的方法。測試時,通過分析法(在使用隨機失活的本例中就是乘以p)或數值法(例如通過抽樣出很多子網絡,隨機選擇不同子網絡進行前向傳播,最後對它們取平均)將噪音邊緣化。在這個方向上的另一個研究是DropConnect,它在前向傳播的時候,一系列權重被隨機設置爲0。提前說一下,卷積神經網絡同樣會吸取這類方法的優點,比如隨機匯合(stochastic pooling),分級匯合(fractional pooling),數據增長(data augmentation)。我們在後面會詳細介紹。

偏置正則化。在線性分類器的章節中介紹過,對於偏置參數的正則化並不常見,因爲它們在矩陣乘法中和輸入數據並不產生互動,所以並不需要控制其在數據維度上的效果。然而在實際應用中(使用了合理數據預處理的情況下),對偏置進行正則化也很少會導致算法性能變差。這可能是因爲相較於權重參數,偏置參數實在太少,所以分類器需要它們來獲得一個很好的數據損失,那麼還是能夠承受的。

每層正則化。對於不同的層進行不同強度的正則化很少見(可能除了輸出層以外),關於這個思路的相關文獻也很少。

實踐:通過交叉驗證獲得一個全局使用的L2正則化強度是比較常見的。在使用L2正則化的同時在所有層後面使用隨機失活也很常見。p值一般默認設爲0.5,也可能在驗證集上調參。

3 損失函數

我們已經討論過損失函數的正則化損失部分,它可以看做是對模型複雜程度的某種懲罰。損失函數的第二個部分是數據損失,它是一個有監督學習問題,用於衡量分類算法的預測結果(即分類評分)和真實標籤結果之間的一致性。數據損失是對所有樣本的數據損失求平均。也就是說,L=1NiLi 中,N是訓練集數據的樣本數。讓我們把神經網絡中輸出層的激活函數簡寫爲f=f(xi;W) ,在實際中你可能需要解決以下幾類問題:

分類問題是我們一直討論的。在該問題中,假設有一個裝滿樣本的數據集,每個樣本都有一個唯一的正確標籤(是固定分類標籤之一)。在這類問題中,一個最常見的損失函數就是SVM(是Weston Watkins 公式):
Li=jyimax(0,fjfyi+1)

之前簡要提起過,有些學者的論文中指出平方折葉損失(即使用max(0,fjfyi+1)2 )算法的結果會更好。第二個常用的損失函數是Softmax分類器,它使用交叉熵損失:
Li=log(efyijefj)

問題:類別數目巨大。當標籤集非常龐大(例如字典中的所有英語單詞,或者ImageNet中的22000種分類),就需要使用分層Softmax(Hierarchical Softmax)了(參考文獻)。分層softmax將標籤分解成一個樹。每個標籤都表示成這個樹上的一個路徑,這個樹的每個節點處都訓練一個Softmax分類器來在左和右分枝之間做決策。樹的結構對於算法的最終結果影響很大,而且一般需要具體問題具體分析。

屬性(Attribute)分類。上面兩個損失公式的前提,都是假設每個樣本只有一個正確的標籤y_i。但是如果y_i是一個二值向量,每個樣本可能有,也可能沒有某個屬性,而且屬性之間並不相互排斥呢?比如在Instagram上的圖片,就可以看成是被一個巨大的標籤集合中的某個子集打上標籤,一張圖片上可能有多個標籤。在這種情況下,一個明智的方法是爲每個屬性創建一個獨立的二分類的分類器。例如,針對每個分類的二分類器會採用下面的公式:
Li=jmax(0,1yijfj)

上式中,求和是對所有分類j,y_{ij}的值爲1或者-1,具體根據第i個樣本是否被第j個屬性打標籤而定,當該類別被正確預測並展示的時候,分值向量f_j爲正,其餘情況爲負。可以發現,當一個正樣本的得分小於+1,或者一個負樣本得分大於-1的時候,算法就會累計損失值。

另一種方法是對每種屬性訓練一個獨立的邏輯迴歸分類器。二分類的邏輯迴歸分類器只有兩個分類(0,1),其中對於分類1的概率計算爲:
P(y=1|x;w,b)=11+e(wTx+b)=σ(wTx+b)

因爲類別0和類別1的概率和爲1,所以類別0的概率爲:\displaystyle P(y=0|x;w,b)=1-P(y=1|x;w,b)。這樣,如果\sigma(w^Tx+b)>0.5或者w^Tx+b>0,那麼樣本就要被分類成爲正樣本(y=1)。然後損失函數最大化這個對數似然函數,問題可以簡化爲:
Li=jyijlog(σ(fj))+(1yij)log(1σ(fj))

上式中,假設標籤y_{ij}非0即1,\sigma(.)就是sigmoid函數。上面的公式看起來嚇人,但是f的梯度實際上非常簡單:\displaystyle \frac{\partial L_i}{\partial f_j}=y_{ij}-\sigma(f_j)(你可以自己求導來驗證)。

迴歸問題是預測實數的值的問題,比如預測房價,預測圖片中某個東西的長度等。對於這種問題,通常是計算預測值和真實值之間的損失。然後用L2平方範式或L1範式度量差異。對於某個樣本,L2範式計算如下:
Li=||fyi||22

之所以在目標函數中要進行平方,是因爲梯度算起來更加簡單。因爲平方是一個單調運算,所以不用改變最優參數。L1範式則是要將每個維度上的絕對值加起來:
Li=||fyi||1=j|fj(yi)j|

在上式中,如果有多個數量被預測了,就要對預測的所有維度的預測求和,即\sum_j。觀察第i個樣本的第j維,用\delta_{ij}表示預測值與真實值之間的差異。關於該維度的梯度(也就是\partial L_i/\partial f_j)能夠輕鬆地通過被求導爲L2範式的\delta_{ij}或sign(\delta_{ij})。這就是說,評分值的梯度要麼與誤差中的差值直接成比例,要麼是固定的並從差值中繼承sign。

注意:L2損失比起較爲穩定的Softmax損失來,其最優化過程要困難很多。直觀而言,它需要網絡具備一個特別的性質,即對於每個輸入(和增量)都要輸出一個確切的正確值。而在Softmax中就不是這樣,每個評分的準確值並不是那麼重要:只有當它們量級適當的時候,纔有意義。還有,L2損失魯棒性不好,因爲異常值可以導致很大的梯度。所以在面對一個迴歸問題時,先考慮將輸出變成二值化是否真的不夠用。例如,如果對一個產品的星級進行預測,使用5個獨立的分類器來對1-5星進行打分的效果一般比使用一個迴歸損失要好很多。分類還有一個額外優點,就是能給出關於迴歸的輸出的分佈,而不是一個簡單的毫無把握的輸出值。如果確信分類不適用,那麼使用L2損失吧,但是一定要謹慎:L2非常脆弱,在網絡中使用隨機失活(尤其是在L2損失層的上一層)不是好主意。

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

結構化預測(structured prediction)。結構化損失是指標籤可以是任意的結構,例如圖表、樹或者其他複雜物體的情況。通常這種情況還會假設結構空間非常巨大,不容易進行遍歷。結構化SVM背後的基本思想就是在正確的結構yi 和得分最高的非正確結構之間畫出一個邊界。解決這類問題,並不是像解決一個簡單無限制的最優化問題那樣使用梯度下降就可以了,而是需要設計一些特殊的解決方案,這樣可以有效利用對於結構空間的特殊簡化假設。我們簡要地提一下這個問題,但是詳細內容就超出本課程範圍。

小結

小結如下:

- 推薦的預處理操作是對數據的每個特徵都進行零中心化,然後將其數值範圍都歸一化到[-1,1]範圍之內。
- 使用標準差爲\sqrt{2/n}的高斯分佈來初始化權重,其中n是輸入的神經元數。例如用numpy可以寫作:$w = np.random.randn(n) * sqrt(2.0/n)$。
- 使用L2正則化和隨機失活的倒置版本。
- 使用批量歸一化。
- 討論了在實踐中可能要面對的不同任務,以及每個任務對應的常用損失函數。

現在,我們預處理了數據,初始化了模型。在下一節中,我們將討論算法的學習過程及其運作特性。

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