【讀書筆記】《深度學習入門——基於python的理論與實現》


提高學習效果tips

集成學習、dropout層、學習衰減率、data augmentation(如圖像的旋轉、平移、crop、flip處理等) 、加深層(Resnet,加深層的網絡可以用更少的參數達到同等水平表現力)都有助於提高識別精度
尤其是data augmentation雖然方法簡單,但是識別精度上效果顯著。
例VGG:
網絡層比簡單CNN,全連接中使用Dropout,基於Adam最優化,He權重初始值


參數

W是和控制輸入信號的重要新的參數, 偏置是調整神經元被激活的容易程度
設置權重參數:權重使用符合高斯分佈的隨機數進行初始化,偏置使用0進行初始化( np.zeros(hidden_size) )

optimizers:尋找最優權重參數最優化方法

  • SGD:簡單易實現,沒效率
  • Momentum:參照小球在碗中滾動的物理規則進行移動,變量v對應物理上速度
  • AdaGrad:學習率衰減,爲參數的每個元素適當地調整學習率(更新步伐)
  • Adam:融合了Momentum和AdaGrad的方法,設置三個超參數:學習率,momentum1, momentum2

權重參數初始值

權值衰減:權值衰減就是一種以減小權重參數的值爲目的進行學習的方法。通過減小權重參數的值來抑制過擬合的發生。

  • 使用由高斯分佈生成的值 * 0.01 後得到的值(標準差爲0.01的高斯分佈),避免梯度消失
  • Xavier初始值——激活函數是線性函數爲前提,如sigmoid, tanh,缺點是隨着層加深偏向會變大(層加深、偏向變大學習時會出現梯度消失問題)
  • He初始值——Relu
  • PS
    加Batch Norm層後可以對權重初始值變得很健壯(不那麼依賴初始值)
    在手頭數據集較少的時候,可以用遷移學習後的權重(的一部分)作爲初始值複製到其他神經網絡在進行學習。

設定超參數

如神經元數量、batch大小、學習率、權值衰減等

  • 驗證集——用於超參數的性能評估,逐漸縮小超參數的“好值”的存在範圍
  • 貝葉斯最優化

過擬合

  • 正則化 權值衰減:對大的權重進行懲罰,來抑制過擬合。L1,L2範數作爲正則化項
  • Dropout:訓練時,隨機選出隱藏層的神經元,然後將其刪除。被刪除的神經元不再進行信號的傳遞(與集成學習相關)

函數

激活函數

階躍函數(感知機),神經網絡的函數如sigmoid函數,Relu函數

  • 激活函數不能使用線性函數。因爲使用線性函數的話,加深神經網絡的層數就沒有意義了
  • 激活函數最好使用關於原點對稱的性質,比如tanh函數關於原點(0,0)對稱,但sigmoid函數關於(0,0.5)對稱

輸出層函數

一般地,迴歸問題可以使用恆等函數、二元分類問題可以使用 sigmoid函數、多元分類問題可以使用 softmax函數。

Softmax函數:
1. 實現的時候 + C'
2. 輸出0.0-1.0之間實數,輸出總和是1,所以輸出解釋爲概率
3. 各個元素之間大小關係不會改變( 因此神經網絡分類問題中輸出層的softmax函數可以省略)

損失函數

以損失函數爲基準,尋找最優權重參數。這個損失函數可以使用任意函數,但一般用均方誤差和交叉熵誤差等。
不用全部的訓練集來計算損失函數,用mini-batch隨機選出一批數據然後求梯度和損失函數(但這個損失函數是對訓練數據的某個mini-batch的損失函數值,光看這個結果不能說明該神經網絡在其他數據集上也能一定有同等程度表現)。
所以損失函數比較的是(y, t),參數就是預測值y和標籤t

主要看y的維度
若y是一維,則比如y.shape==(1,10)(表示一張圖預測的概率值),求單個數據的交叉熵誤差要改變形狀,那麼t也要變成一維(1, t_size)
若y是二維(mini-batch批量預測  y.shape ==(batch_size,10), 則t和y同維,後面除以batch_size計算得到單個數據的平均損失函數就可以了

爲了找到使損失函數最小的值儘可能小的地方,需要計算參數的導數(梯度),然後以這個導數爲指引逐步更新參數的值。
對權重參數的損失函數求導,表示“如果稍微改變這個權重參數的值,損失函數的值會如果變化”。
如果導數的值爲負,通過使該權重參數向正方向改變,可以減小損失函數的值;反過來,如果導數的值爲正,則通過使該權重參數向負方向改變,可以減小損失函數的值。

梯度
由全部變量的偏導數彙總而成的向量稱爲梯度(gradient)

grads={}這個字典裏就是保存各個權重參數的偏導數,梯度表示的是各點處的函數值減小最多的方向,因此以梯度的信息爲線索決定前進方向。
數值微分法求偏導數的函數gradient(or  numerical_gradient)值需要用到的參數是:( f, x );
f是函數,x是權重參數,以numpy數組形式保存。通常後面調用用到loss(x,t)作爲函數f, 用各個權重參數如w1,b2等來計算梯度。(誤差反向傳播法不用f做參數)

神經網絡的梯度

損失函數用L表示,梯度見下圖
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

im2col函數

將輸入數據展開以適合濾波器(權重)

對3維的輸入數據應用im2col後,數據轉換爲2維矩陣(正確地講,是把包含批數量的4維數據轉換成了2維數據)。也就是將3維方塊展開爲1列。
im2col可以將卷積層進行的運算轉換爲大型矩陣的乘積,這個方式的實現對GPU來說是非常方便的實現方式。

im2col會考慮濾波器大小、步幅、填充:m2col (input_data, filter_h, filter_w, stride=1, pad=0)

在這裏插入圖片描述
在這裏插入圖片描述


簡單層:relu層、sigmoid層

Affine層

實現矩陣的乘積運算(仿射變換),仿射變換的處理實現。如 Y = X*W = B
反向傳播:
在這裏插入圖片描述
批版本Affine層
在這裏插入圖片描述
全連接層需要將3維數據拉平爲1維數據。全連接層會忽略形狀,將全部都是輸入數據作爲統一維度的神經元處理

Softmax-with-loss層

神經網絡學習階段要softmax層
交叉熵誤差是cross entropy error層
softmax-with-loss層也就是softmax和cross entropy error層的組合
在這裏插入圖片描述
使用交叉熵誤差作爲 softmax函數的損失函數後,反向傳播得到(y1 − t1, y2 − t2, y3 − t3)這樣“漂亮”的結果。然後神經網絡的反向傳播會把這個差分表示的誤差傳遞給前面的層(傳遞給前面層的是單個數據的誤差,也就是說如果是mini-batch的話要除以批的大小batch_size),這是神經網絡學習中的重要性質。

Batch Norm層

調整各層的激活值分佈使其擁有適當的廣度。爲此,要向神經網絡中插入對數據分佈進行正規化的層,即Batch Normalization層(下文簡稱Batch Norm層),
在這裏插入圖片描述
Batch Norm,顧名思義,以進行學習時的mini-batch爲單位,按mini-batch進行正規化。插入到激活函數的前面(或者後面),可以減少數據分佈的偏向

CNN

卷積層

能保持輸入形狀不變,比如保持輸入的三維圖像
卷積運算——濾波器運算;濾波器就是權重,在CNN的實現裏是權重參數
增大步幅後,輸出大小會變小。而增大填充後,輸出大小會變大。
在這裏插入圖片描述
在3維數據的卷積運算中,輸入數據和濾波器的通道數要設爲相同的值。(C相同)
如果要在通道方向上也擁有多個卷積運算的輸出,要用多個濾波器(權重)。下圖中的濾波器就是四維數據。
在這裏插入圖片描述

批處理:
批處理的話要各層見傳遞的數據保存爲4維數據(batch_num, C,H,W) 順序保存數據
在這裏插入圖片描述
如果堆疊多層卷積層,隨着層次加深,提取的信息也越抽象、越複雜。

池化層

一般來說,池化的窗口大小會和步幅設定成相同的值,池化層應用區域按通道單獨展開
在這裏插入圖片描述

簡單CNN

在這裏插入圖片描述

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