神經網絡介紹--數據預處理、權重初始化及正則化

目錄

數據和模型的處理

在前面的章節中,我們介紹了神經元模型,它計算輸入和權重的點積後對其使用非線性函數,以及分層結構的神經網絡。總之,這些選擇定義了“得分函數”的新形式,我們已經擴展了簡單線性映射的形式。 具體而言,神經網絡執行一系列線性映射並交織着非線性函數。 在本節中,我們將討論關於數據預處理,權重初始化和損失函數的選擇。

數據預處理

有三種常見的數據預處理的方式,我們假設數據矩陣X 的大小爲[N×D]N 是數據的數量,D 是它們的維數)。

減去平均值

是最常見的預處理形式。這個方法減數據中每個單獨特徵的平均值,它的幾何解釋是能夠將數據的中心向原點靠近。在numpy中,這個操作可以這樣實現:X -= np.mean(X,axis = 0)。特別是處理圖像數據時,爲了方便,從所有像素中減去單個值是很常用的預處理方式(例如,X -= np.mean(X)),或者也能在三個顏色通道上分別處理。

規範化(normalization)

是指規範化數據分佈範圍,使其具有大致相同的規模。有兩種常見的方法來實現這種處理。一是將每個維度除以它的標準偏差(當數據均值爲0時):(X /= np.std(X,axis = 0))。另一種方式是將每個維度規範化,使每個維度最小值和最大值分別爲-1和1。只有不同的輸入特徵具有不同的尺度時(或單位),應用這種預處理纔有意義,但它們應該對學習算法來說基本上同樣重要。在處理圖像的情況,像素的尺寸已經大致相等(範圍從0到255),因此不必嚴格執行這個預處理步驟。



圖1 常見的數據預處理流水線。 左:原始的2維輸入數據。 中間:通過減去每個維度的平均值,數據以零爲中心。 數據雲現在集中在原點周圍。 右圖:每個維度都是根據其標準差縮放。 紅線表示數據的範圍, 它們在兩個維度的範圍是相等的。

PCA和白化(whiten)

是預處理的另一種形式。在這個過程中,數據首先如上所述居中處理。然後,我們可以計算協方差矩陣,告訴我們關於數據的相關性:

#大小爲[N×D]的輸入數據矩陣X
X - = np.meanX,axis = 0)#零中心數據(重要)
cov = np.dotX.TX)/ X.shape [0]#獲得數據協方差矩陣

數據協方差矩陣的(i,j)元素包含數據的第i維和第j維之間的協方差,這個矩陣的對角線包含了數據的方差。此外,協方差矩陣是對稱的和半正定的。我們可以計算數據協方差矩陣的SVD分解:U,S,V = np.linalg.svd(cov)。U的列是特徵向量,S是奇異值的一維數組。爲去除數據的相關性,我們將原始數據(以零爲中心)投影到特徵向量上:Xrot = np.dot(X,U)#解除關聯數據
注意U的列是一組正交向量(範數爲1,並且彼此正交),所以它們可以被看作是基向量。因此投影相當於數據的旋轉,使得特徵向量作爲新的座標軸。如果我們要計算Xrot的協方差矩陣,我們會發現它是對角的。 np.linalg.svd的很棒的一個特性是在其返回值U中,特徵向量列按其特徵值排序。我們可以通過只使用前幾個特徵向量來減少數據的維度,並丟棄數據方差很小的維度。這有時也被稱爲主成分分析(PCA)降維:

Xrot_reduced = np.dot(X,U [:,:100])#Xrot_reduced變成[N×100]
在這個操作之後,我們可以將大小爲[N×D]的原始數據集縮小到[N×100]的大小,得到包含最多方差的數據的100個維度。通常情況下,您可以通過PCA簡化數據集,從而節省訓練線性分類器或神經網絡的空間和時間。
在實踐中可能用上的最後一個轉換方法是白化。白化操作將基於特徵向量的數據除以每個維度的特徵值以規範化。這種變換的幾何解釋是,如果輸入數據是一個服從高斯分佈的多重變量,那麼白化數據將數據轉化爲具有零均值和單位協方差矩陣的高斯變量。以下代碼可以實現白化:

#白化數據:
#除以特徵值(其是奇異值的平方根)
Xwhite = Xrot / np.sqrt(S + 1e-5)

警告:放大噪音。請注意,我們添加1e-5(或一個小常數)以防止被零除。這種轉變的一個弱點是,它可能會放大數據中的噪音,因爲它將所有維度(包括大部分是噪音的不相關維度)延伸到輸入中具有相同大小。實際上,這可以通過更強的平滑(即增大1e-5的值)來緩解。



圖2 PCA /白化。 左:原始2維輸入數據。 中間:執行PCA後。數據以零爲中心,然後旋轉到數據協方差矩陣的特徵基向量中。這使數據去相關(協方差矩陣變成對角線)。 右圖:每個維度都是根據特徵值進行縮放的,將數據協方差矩陣轉換爲單位矩陣。 在幾何上,這對應於將數據拉伸和壓縮成各向同性的高斯斑點。

我們也可以嘗試用CIFAR-10的圖像對這些轉換進行可視化。 CIFAR-10的訓練集大小爲50,000 x 3072,其中每個圖像都被拉伸成3072維的行向量。 然後,我們可以計算[3072 x 3072]協方差矩陣並計算其SVD分解(操作相對費時)。 計算出的特徵向量看起來像什麼? 可視化可能有所幫助:



圖3 左:一組49個圖像。 從左數第二個:3072個特徵向量中的前144個。頂部特徵向量解釋了數據中的大部分變化,我們可以看到它們對應於圖像中的較低頻率。右起第二個:使用之前展示的144個特徵向量,用PCA對49個圖片降維。也就是說,不是將每個圖像表示爲3072維矢量,其中每個元素是某個位置和通道處特定像素的亮度,而是僅用144維矢量表示,每個圖片計算它的144個特徵向量,然後合起來組成圖像。爲了可視化144個數字中保留的圖像信息,我們必須回到基於3072個數字的“像素”中。由於U是一個旋轉,所以可以通過乘以U.transpose()[:144 ,:]來實現,然後將生成的3072個數字可視化爲圖像。您可以看到圖像稍微模糊,反映了頂部特徵向量捕捉較低頻率的事實。但是,大部分信息仍然保留。右圖:“白化”的可視化表示,144個維度的每個維度的變化都被壓縮至相等長度。通過乘以U.transpose()[:144,:],將白化的144個數字旋轉回圖像像素。較低的頻率(佔絕大多數的變化)變得可以忽略不計,而較高的頻率(其原先相對較小的變化)則被放大了。

爲了完整性,我們在這裏提到了PCA和白化,但是在實際中,這些轉化不適用於卷積網絡。然而,將數據轉化爲零中心數據非常重要,每個像素的規範化也很常見。

常見的陷阱

關於預處理的重要一點是任何預處理統計數據(例如數據平均值)只能在訓練數據上計算,然後應用到驗證/測試數據。計算平均值並從整個數據集中的每個圖像中減去平均值,然後將數據分割成train / val/test分割是錯誤的。平均值只能在訓練數據上計算,然後從所有數據(train / val / test)中減去相同的平均值。

權重初始化

我們學會如何構建神經網絡架構,以及如何預處理數據。在我們開始訓練網絡之前,我們必須初始化它的參數。

陷阱:全零初始化

讓我們從不應該做的事開始。請注意,我們不知道在訓練好的網絡中每個權重的最終值應該是多少,但通過正確的數據規範化,大約一半的權重是正數一半是負數的假設是合理的。一個合理的觀點可能是將所有初始權重設置爲零,我們認爲這是期望中的“最佳猜測”。這是錯誤的,因爲如果網絡中的每個神經元計算出相同的輸出,那麼它們也將在反向傳播期間計算相同的梯度並且進行完全一樣的參數更新。換句話說,如果它們的權重被初始化爲相同,那麼神經元之間就不能打破參數的對稱性。

使用小隨機數初始化

我們仍然希望權重非常接近零,但正如我們上面所論述的那樣,不能是相同的零。作爲一種解決方案,通常將神經元的權重初始化爲小數值,並參照這樣做打破對稱性。這個想法是,神經元在開始時都是隨機且獨特的,所以他們將計算不一樣的權重更新,並將自己作爲爲完整網絡的不同部分。一個權重矩陣的實現可能看起來像W=0.01np.random.randnDH ,其中randn是來自零均值、方差爲1的高斯分佈取樣。通過這個公式,每個神經元的權向量被初始化爲從多維高斯向量採樣的一個隨機向量,所以神經元指向輸入空間的隨機方向。取樣也可以是平均分佈的,但這對實踐中的最終表現影響相對較小。

警告:數字越小不一定越好。例如,具有非常小權重的神經網絡層將在反向傳播期間在其數據上計算非常小的梯度(因爲該梯度與權重的值成比例)。這會大大減少通過網絡後向傳播時“梯度信號”,並且可能成爲深度網絡的關注點(譯註???)。

用1 / sqrt(n)標準化方差

上述方法的一個問題是,隨機初始化神經元輸出的方差會隨着輸入數量增長的增長。事實證明,我們可以將每個神經元輸出的方差標準化爲1,方法是將其權重向量乘以輸入數量的平方根。也就是說,推薦的啓發式方法是將每個神經元的權向量初始化爲:w = np.random.randn(n)/ sqrt(n),其中n是其輸入的數量。這確保了網絡中的所有神經元最初具有大致相同的輸出分佈,經驗證明這能提高模型的收斂速度。

推導如下:考慮權重w和輸入x之間的內積s=Σinwixi ,s是非線性激活之前的神經元的原始激活值。我們可以得到s的方差:

Var(s)=Var(Σinwixi)

=ΣinVar(wixi)

=Σin[E(wi)]2Var(xi)+[E(xi)]2Var(wi)+Var(xi)Var(wi)

=ΣinVar(wi)Var(xi)

=(nVar(w))Var(x)

在推導的前兩個步驟中我們使用了方差的性質。第三步中,我們假定輸入和權重的均值爲0,所以E[xi]=E[wi]=0 。需要注意的是,通常實際不是這種情況:例如,ReLU單元具有正的平均值。在最後一步,我們假設所有wi,xi都是獨立分佈的。從這個推導我們可以看出,如果我們想要s具有與其輸入x相同的方差,那麼在初始化期間我們應該確保每個權重的方差w是1/n 。由於VaraX=a2VarX ,對於一個隨機變量X和一個標量a,這意味着我們用a=1/n 縮放變量,就能使其方差爲1 / N。因此,我們初始化w = np.random.randn(n)/ sqrt(n)
在Glorot等人的“Understanding the difficulty of training deep feedforward neural networks”中進行了類似的分析。在文章中,作者建議初始化形式Varw=2/nin+nout ,其中ninnout 是前一層和下一層中的單元數。這是基於對反向傳播梯度的妥協和等效分析。近期關於此主題的論文有“Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification ”,文章推導出專門針對ReLU神經元的初始化,得出網絡中神經元的方差應爲2.0/n 。這給出了初始化 w = np.random.randn(n)* sqrt(2.0 / n),這是現在推薦在採用ReLU神經元的神經網絡的使用的初始化方法。

稀疏初始化

解決未校準方差問題的另一種方法是將所有權重矩陣設置爲零,但是爲了打破對稱性,每個神經元隨機連接(和上文類似,權重從高斯分佈中抽樣)到它下面的固定數量的神經元。連接的神經元數典型的取值爲小於10。

初始化偏差

將偏差初始化爲零是可能的也是常見的,因爲打破不對稱是由權重中的小隨機數完成的。對於ReLU非線性,有些人喜歡對所有偏差初始化爲一小的常數值,例如0.01,因爲這可以確保所有ReLU單位在開始時激活並因此獲得並傳播一些梯度。然而,目前尚不清楚這是否能夠提供一致的改進(實際上有些結果似乎表明這種情況表現較差),僅使用0偏差初始化更爲常見。

在實踐中,目前的建議是使用ReLU單位並使用w = np.random.randn(n)* sqrt(2.0 / n),如He等人所述。

批量標準化

Ioffe和Szegedy最近開發的稱爲批量標準化(Batch Normalization)的技術通過在訓練開始時強制整個網絡中的參數使用單位高斯分佈來初始化神經網絡,從而減少了許多麻煩。仔細觀察發現這是有可能的,因爲標準化是一個簡單可微的操作。在實現中,應用這種技術通常相當於在完全連接的層(或卷積層,我們很快就會看到)之後,在非線性之前插入BatchNorm 層。我們不在這裏展開這種技術,它在相關文章中有很好的描述。但請注意,在神經網絡中使用批量標準化已經成爲一種非常普遍的做法。在實踐中,使用批量標準化的網絡比不好的初始化的具有更好的魯棒性。此外,批量標準化可以解釋爲在網絡的每一層進行預處理,但是以可微的方式集成到網絡本身中。

正則化

有幾種方法可以控制神經網絡防止過擬合的能力:

L2正則化

也許是正則化最常見的形式。它可以通過直接在目標中懲罰所有參數的平方來實現。也就是說,對於網絡中的每個權重w ,我們將12λw2 添加到目標中,其中λ是正則化強度。通常在前面看到12 的因子,因爲這樣做的話,參數w的這個項的梯度就是λw而不是2λw。 L2規則化的直觀解釋是嚴重懲罰峯值大的權重,而偏向於比較均勻的權重。正如我們在線性分類部分所討論的那樣,由於權重和輸入之間的乘法交互作用,L2正則化具有很好的特性,即鼓勵網絡對所有輸入都使用一些,而不是過度使用某些輸入。最後,請注意,在梯度下降參數更新時,使用L2正則化最終意味着每個權重都線性衰減至0:W+=λW

L1正則化

是另一種相對常見的正則化形式,其中對於每個權重w,我們將λ|w|添加到目標中。也可以將L1正則化與L2正則化結合起來:λ1|w|+λ2w2(這被稱爲Elastic net regularization)。 L1正則化具有令人感興趣的性質,它導致權重向量在優化期間變稀疏(即非常接近零)。換句話說,具有L1正則化的神經元最終只使用其最重要輸入的稀疏子集,並且對“噪聲”輸入幾乎不變。相比之下,來自L2正則化的最終權重向量通常是彌散的,權重值較小。在實踐中,如果你不關心特徵的選擇,那麼L2正則化可以比L1提供更好的性能。

最大範數約束

正則化的另一種相對常見的形式,它對每個神經元的權重執行絕對上限,並使用投影梯度下降來實現這種約束。在實踐中,這相應於正常執行參數更新,然後強制每個神經元的權向量||w||2<c 。 c的典型值約爲3或4,有人在使用這種形式的正則化時稱其是有效的。其吸引人的特性之一是,即使學習率設置得太高,網絡也不會“爆炸”,因爲更新總是有界的。

Dropout

是Srivastava等人最近引入的非常簡單有效的正則化技術。:Dropout: A Simple Way to Prevent Neural Networks from Overfitting(pdf)。訓練時,Dropout讓神經元以概率p(超參數)爲活動的,否則將其設置爲0來實現的,如圖3所示。



圖3 從Dropout報告中摘取的圖表說明了這個想法。 在訓練期間,丟失可以被解釋爲在完整的神經網絡中對神經網絡進行採樣,並且僅更新採樣網絡的參數。(然而,可能採樣網絡的參數並不是獨立的,因爲它們可能共享參數)。在測試時不使用Dropout,因爲預測結果爲所有子網絡整體的平均預測(後文介紹集成模型時會提到)。

示例中的3層神經網絡Dropout的普通實現如下:

"""Dropout: 不推薦的實現 """

p = 0.5 # 丟棄神經元的概率

def train_step(X):
  """ X contains the data """

  # 前向傳播
  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

在train_step函數中,在第一個隱藏層和第二個隱藏層上執行了兩次Dropout操作。我們也可以在輸入層執行Dropout操作,這樣就需要給輸入X創建一個二進制掩碼。反向傳播則必須考慮生成的掩碼U1,U2。

至關重要的是,在predict函數中,我們不使用Dropout,但是我們對兩個隱藏層得出輸出都要執行一個p的縮放。這一點很重要,因爲在測試時所有神經元都被激活,但是我們希望測試時神經元的輸出與訓練時期的輸出期望相同。例如,在p=0.5 的情況下,神經元在測試時必須將他們的輸出減半,使得其輸出期望與訓練時相同。考慮神經元x的輸出(在Dropout之前),執行Dropout時,因爲神經元的輸出將以概率1-p被設置爲零,因此這個神經元的期望輸出將變成px+1p0 。在測試時,當我們保持神經元始終處於活動狀態時,我們必須調整xpx 以保持相同的期望輸出。可以看出,在測試時執行這種衰減類似於遍歷所有可能的子網絡(指數級),並計算集成模型的預測結果。

這個方法的缺點在於我們必須在測試時間通過p來縮放激活值。由於測試時對性能要求很高,因此最好使用反向Dropout(inverted Dropout),它在訓練時執行縮放,而在測試時間不做任何縮放。此外,當你調整在哪些神經元中應用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的概念後,人們進行了大量的研究,試圖瞭解它在實踐中的如此有效的原因,以及它與其他正則化技術的關係。有興趣的讀者可以進一步閱讀:

Srivastava等人的Dropout論文。
Dropout Training as Adaptive Regularization :“研究表明,將輸入數據根據Fisher information matrix 的估計縮放後,Dropout一階等價於L2 正則化”。
前向傳播的噪音。更廣泛的來說,Dropout屬於在前向傳播中引入隨機行爲的一種方法。理論分析中,噪音的作用會減小(比如Dropout測試時乘以p),通過採樣,隨機執行多個前向傳播然後對它們的結果進行平均,同樣也減小了噪音。在這個方向上的其他研究有DropConnect,文中將一個隨機權重的子集在正向傳遞期間設置爲0。劇透一下,卷積神經網絡還利用了stochastic pooling, fractional pooling, and data augmentation等方法。稍後我們將詳細介紹這些方法。

偏差正則化。正如我們在“線性分類”部分中已經提到的那樣,偏差參數正則化並不常見,因爲它們不和數據通過乘法產生相互作用。但是,在實際應用中(並且具有適當的數據預處理),正則化偏差很少會導致性能顯著變差。這很可能是因爲與所有權重相比,偏差項的數量非常少,所以如果分類器需要正則化偏差來獲得更優的數據損失,那麼對偏差正則化也是能夠接受的。

逐層正則化。對不同的層採用不同的正則化強度(除了輸出層)不太常見。關於這個想法的結果的文獻也不多。

在實踐中:使用交叉驗證的全局L2正則化是最常見的。將其與在所有層之後應用Dropout相結合也很常見。 p = 0.5是一個合理的默認值,但可以根據交叉驗證進行調整。

損失函數

我們已經討論了正則化損失,這可以當作對模型複雜性的一種懲罰。目標函數的第二部分是數據損失(data loss),數據損失在監督學習問題中用來衡量預測結果(例如分類中的類別分數)和樣本實際標籤之間的一致性。數據損失取爲每個樣本數據損失的平均值。也就是說,L=1NΣiNLi 其中N是訓練數據的數量。讓我們縮寫f=fxi;W 作爲神經網絡中輸出層的激活函數。在實踐中可能需要解決幾種類型的問題:

分類問題

是我們迄今爲止詳細討論過的問題。在這裏,我們假設每個樣本都有一個樣本數據集和一個正確的標籤。在這種情況下,最常見的兩種損失函數之一是SVM:

Li=Σjy,imax0fjfyi+1

有些人研究表明,用平方hind損失獲得了更好的性能(即使用max0fjfyi+1)2 )。第二個常見選擇是使用交叉熵損失的Softmax分類器:

Li=logefyiΣjefj

當樣本類別數量非常多時,這種損失函數就會出現問題。因此,當標籤集非常大時(例如英文字典中的單詞或包含22000個類別的ImageNet),使用Hierarchical Softmax可能會有所幫助。Hierarchical softmax將標籤分解成樹。每個標籤可以表示爲沿着樹的路徑,在樹的每個節點處訓練Softmax分類器來消除左右分支之間的歧義(譯註:???)。分類器的性能受樹的結構影響很大,而這通常又與具體問題相關。

屬性分類

上述兩種損失都假定只有一個正確的標籤yi 。但是如果yi 是一個二元向量,那麼每個樣本都可能有或沒有某一特定屬性,而且這些屬性不是唯一的。例如,Instagram上的圖片可以被認爲是來自所有主題標籤中的特定標籤子集,而圖像可能包含多個標籤。在這種情況下,一個好方法是爲每個屬性單獨構建一個二元分類器。例如,每個類別的二元分類器將獨立採用以下形式:

Li=Σjmax0,1yijfj

求和遍歷所有類別j,yij 是+1或-1取決於第i個示例是否標記有第j個屬性,當類別被預測爲是時,向量fj 將是正的,否則爲負。請注意,如果正樣本的分數低於+1,或者負數示例的分數高於-1,則累計損失。

這種損失的替代方法是獨立訓練每個屬性的邏輯迴歸分類器。二元邏輯迴歸分類器只有兩個類(0,1),並計算類1的概率爲:

Py=1|x;w,b=11+ewTx+b=σwTx+b

由於類1和0的概率總和爲1,所以類0的概率是
Py=0|x;w,b=1Py=1|x;w,b
。因此,如果σwTx+b>0.5 ,則將例子分類爲正例(y = 1),或者等價地如果wTx + b> 0,則將例子分類爲正例。損失函數使這個概率的對數似然最大化。簡化爲:

Li=Σjyijlog(σ(fj))+1yij)log(1σ(fj))

其中標籤yij 被假定爲1(正)或0(負),σ 是sigmoid函數。上面的表達式可能看起來很可怕,但f上的梯度實際上非常簡單直觀:Li/fj=yijσfj

迴歸

是預測實值的任務,例如房屋價格或圖像中某物的長度。對於這項任務,計算預測值與真實值之間的損失是很常見的,L2範數或L1範數也同樣常見。 計算單個樣本損失的L2範數的平方將有如下的形式:

Li=||fyi||22

L2範數取平方的原因是爲了在不改變最優參數結果的情況下,讓梯度變得更簡單,因爲平方是單調操作。 L1範數則將每個維度的絕對值相加:

Li=||fyi||1=Σj|fj(yi)j|

其中Σj 是所需預測的所有維度的總和(如果有多於一個的預測量)。以第i個例子的第j個維度爲例,δij 表示真實值和預測值之間的差值,這個維度的梯度(即Li/fj ),求導很容易就能得到其結果,對於L2結果爲δij ,L1則爲sign(δij) (符號)。也就是說,梯度將直接與誤差成比例,或者它將是僅繼承誤差的符號。

注意事項:要注意,L2損失比Softmax等更加穩定的損失更難優化。直觀地說,它需要網絡爲每個輸入(及其增量)準確輸出一個正確的值。請注意,Softmax並非如此,每個分數的精確值並不重要:只要它們的大小是匹配的就行(例如,二分類問題中,評分[1,2]與評分[0.1,0.2]是一樣的)。此外,L2損失魯棒性較弱,因爲異常值可能會產生很大的梯度。當面臨迴歸問題時,首先考慮是不是絕對不能將問題轉化爲分類問題。例如,如果您要預測某個產品的星級評分,那麼使用5個獨立分類器評估1-5星而非迴歸可能會更好。分類有很多額外的好處,它可以給你一個迴歸輸出的分佈,而不僅僅是單一的輸出,而不輸出其置信程度。如果您確定分類是不合適的,請使用L2,但要小心:L2更脆弱,並且在網絡中使用Dropout(特別是在L2之前的層中)並不是一個好主意。

結構化預測

結構化損失是指標籤可以是任意結構(如圖形,樹或其他複雜對象)的情況。通常還假定結構的空間非常大,並且不易枚舉。結構化支持向量機損失背後的基本思想是要求在正確的結構yi 和得分最高的不正確結構之間有一個間隔。這個問題一般無法作爲梯度下降的簡單無約束優化問題來解決。相反,通常需要設計特殊求解方法,以便可以利用結構空間的特定條件。我們簡要地提一下這個問題,但這些細節超出了課堂範圍。

小結

綜上所述:

  • 我們推薦的預處理方式是將數據居中使其具有零均值,並將每個特徵歸一化爲[-1,1]範圍
  • 用標準差爲2N 的高斯分佈來初始化權重,其中n是神經元輸入的數量。 在numpy中: w = np.random.randn(n)* sqrt(2.0 / n)

  • 使用L2正則化和Dropout(反轉版本)

  • 使用批量標準化
  • 我們討論了可能在實踐中執行的不同任務,以及每項任務最常見的損失函數
    我們現在學會了如何預處理數據並初始化模型。在下一節中,我們將學習如何監控學習過程及其動態。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章