深度學習模型訓練過程中,學習率與權重初始化扮演著至關重要的角色。學習率控制模型引數更新速度,合適的衰減策略能有效提升模型效能;權重初始化則影響模型初始狀態,不當的初始化可能導致梯度消失或爆炸,阻礙模型訓練。本文將比較線性與指數學習率衰減策略在模型訓練過程中的效果,並探討如何選擇合適的權重初始化方法來避免梯度消失問題,最後介紹 Dropout 技術,說明其如何有效地抑制過擬合現象,提升模型泛化能力。

線性學習率衰減

首先,我們使用線性學習率衰減,初始學習率設為 0.15,最終學習率設為 0.05。這意味著在整個訓練過程中,學習率將從 0.15 線性衰減到 0.05。

optimizer = SGDMomentum(0.15, momentum=0.9, final_lr=0.05, decay_type='linear')

經過 10 個 epoch 的訓練後,驗證集上的損失為 0.403;20 個 epoch 後,損失降至 0.343;30 個 epoch 後,損失進一步降至 0.282。由於損失在第 40 個 epoch 後開始增加,因此我們選擇第 30 個 epoch 的模型作為最終模型,其驗證精確度為 95.91%。

指數式學習率衰減

接下來,我們使用指數式學習率衰減,初始學習率設為 0.2,最終學習率設為 0.05。

optimizer = SGDMomentum(0.2, momentum=0.9, final_lr=0.05, decay_type='exponential')

經過 10 個 epoch 的訓練後,驗證集上的損失為 0.461;20 個 epoch 後,損失降至 0.323;30 個 epoch 後,損失進一步降至 0.284。同樣,由於損失在第 40 個 epoch 後開始增加,因此我們選擇第 30 個 epoch 的模型作為最終模型,其驗證精確度為 96.06%。

結果比較

兩種學習率衰減策略下的模型都取得了比之前更好的結果,分別達到 0.282 和 0.284 的損失值,遠低於之前的 0.338。這表明學習率衰減是一種有效的方法,可以改善模型的訓練效果。

權重初始化

權重初始化是神經網路中一個非常重要的步驟。不同的初始化方法可能會對模型的訓練效果產生重大影響。在本文中,我們將探討權重初始化的問題。

問題描述

某些啟用函式,如 sigmoid 和 tanh,在輸入為 0 時具有最陡的梯度,但當輸入遠離 0 時,梯度會迅速變小。這可能會導致模型的效率降低,因為如果許多輸入值遠離 0,則反向傳播時的梯度會變得非常小。

解決方案

為瞭解決這個問題,我們可以使用不同的權重初始化方法。例如,可以使用均值為 0、方差為 1 的隨機變數來初始化權重。這樣可以保證輸入到隱藏層的值具有零均值和單位方差,從而避免梯度消失問題。

實驗結果

在 MNIST 資料集上的實驗中,我們觀察到隱藏層的輸出值在透過 tanh 啟用函式後,大部分都聚集在 -1 和 1 附近。這是因為 tanh 函式的輸出範圍是 [-1, 1],當輸入遠離 0 時,tanh 函式的輸出會趨近於 -1 或 1。

內容解密:

上述實驗結果表明,權重初始化對模型的訓練效果具有重要影響。透過選擇合適的初始化方法,可以避免梯度消失問題,從而提高模型的效率。

圖表翻譯:

下圖展示了隱藏層輸出值在透過 tanh 啟用函式前的分佈情況。

  graph TD
    A[隱藏層輸入] --> B[透過 tanh 函式]
    B --> C[輸出值分佈]
    C --> D[-1 和 1 附近]

這個圖表顯示了隱藏層輸出值在透過 tanh 啟用函式後的分佈情況,大部分值都聚集在 -1 和 1 附近。這是因為 tanh 函式的輸出範圍是 [-1, 1],當輸入遠離 0 時,tanh 函式的輸出會趨近於 -1 或 1。

重寫絕對命令(最高優先順序)

根據提供的內容,以下是重寫的版本:

4.1層級啟用函式與輸入分佈

在神經網路中,瞭解層級啟用函式的輸入分佈至關重要。假設我們有一個具有784個輸入神經元的層級,使用tanh啟用函式。該層級的輸入分佈將呈現標準差約為28的狀態,這反映了輸入值的離散程度。

4.2權重初始化

權重初始化是一個關鍵的步驟,影響著神經網路的訓練過程。一個良好的權重初始化方法可以幫助網路更快地收斂,並避免梯度消失或爆炸。其中一種常用的初始化方法是Glorot初始化法,該方法根據層級的輸入和輸出神經元數量進行權重的初始化。

4.3實驗:權重初始化

我們進行了一系列實驗,以比較不同權重初始化方法對神經網路訓練的影響。結果表明,使用Glorot初始化法可以顯著改善網路的訓練效果,尤其是在多層網路中。

4.4丟棄(Dropout)

丟棄是一種常用的正則化技術,透過隨機丟棄某些神經元以避免過度擬合。丟棄可以幫助網路學習更 Robust 的特徵,並提高其泛化能力。在實踐中,丟棄通常與其他正則化方法結合使用,以取得最佳效果。

4.5實作丟棄

在實作丟棄時,我們需要考慮兩種模式:訓練模式和預測模式。在訓練模式中,丟棄被應用以避免過度擬合;在預測模式中,丟棄被關閉以保證網路的預測能力。為了實作這一點,我們可以使用一個簡單的類別來封裝丟棄的邏輯,並根據不同的模式進行相應的處理。

class Dropout:
    def __init__(self, keep_prob=0.8):
        self.keep_prob = keep_prob

    def forward(self, inputs, mode):
        if mode == 'train':
            # 在訓練模式下應用丟棄
            outputs = inputs * (np.random.rand(*inputs.shape) < self.keep_prob)
            outputs /= self.keep_prob
        else:
            # 在預測模式下不應用丟棄
            outputs = inputs
        return outputs

Dropout 技術在神經網路中的應用

Dropout 是一種 regularization 技術,用於防止神經網路過度擬合(overfitting)。它的工作原理是,在訓練過程中,隨機地將某些神經元設為 0,從而模擬出不同神經元之間的關係。

Dropout 的實作

在 Python 中,Dropout 可以透過以下方式實作:

import numpy as np

class Dropout:
    def __init__(self, keep_prob):
        self.keep_prob = keep_prob

    def _output(self, inference: bool) -> np.ndarray:
        if inference:
            return self.inputs * self.keep_prob
        else:
            self.mask = np.random.binomial(1, self.keep_prob, size=self.inputs.shape)
            return self.inputs * self.mask

    def _input_grad(self, output_grad: np.ndarray) -> np.ndarray:
        return output_grad * self.mask

Dropout 在神經網路中的應用

在神經網路中,Dropout 可以被新增到每一層之後,以防止過度擬合。以下是 Dropout 在神經網路中的應用示例:

class NeuralNetwork:
    def __init__(self, layers):
        self.layers = layers

    def forward(self, inputs):
        for layer in self.layers:
            inputs = layer.forward(inputs)
        return inputs

    def backward(self, output_grad):
        for layer in reversed(self.layers):
            output_grad = layer.backward(output_grad)
        return output_grad

class Dense:
    def __init__(self, neurons, activation, weight_init, dropout):
        self.neurons = neurons
        self.activation = activation
        self.weight_init = weight_init
        self.dropout = dropout

    def forward(self, inputs):
        #...
        if self.dropout < 1.0:
            dropout = Dropout(self.dropout)
            inputs = dropout._output(inference=False)
        #...

    def backward(self, output_grad):
        #...
        if self.dropout < 1.0:
            dropout = Dropout(self.dropout)
            output_grad = dropout._input_grad(output_grad)
        #...

實驗結果

透過在神經網路中新增 Dropout,實驗結果表明,Dropout 可以有效地防止過度擬合,從而提高模型的泛化能力。

mnist_soft = NeuralNetwork(
    layers=[
        Dense(neurons=89, activation=Tanh(), weight_init="glorot", dropout=0.8),
        Dense(neurons=10, activation=Linear(), weight_init="glorot")
    ],
    loss=SoftmaxCrossEntropy(),
    seed=20190119
)

# 訓練模型
#...

# 驗證模型
validation_loss = []
for epoch in range(10):
    #...
    validation_loss.append(model.validation_loss)
print("Validation loss after 10 epochs is", validation_loss[-1])

結果表明,新增 Dropout 之後,模型的驗證損失明顯降低,表明模型的泛化能力提高了。

玄貓:神經網路最佳化技術

在深度學習中,神經網路的最佳化是一個非常重要的步驟。最佳化的目的是找到最好的模型引數,使得模型在訓練資料上的損失最小化。在本文中,我們將介紹一些常用的神經網路最佳化技術。

1. 最佳化方法

最佳化方法是用來更新模型引數的演算法。常用的最佳化方法包括梯度下降法(Gradient Descent)、隨機梯度下降法(Stochastic Gradient Descent)、動量梯度下降法(Momentum Gradient Descent)等。

2. 學習率

學習率是最佳化方法中的一個重要引數,它控制了模型引數更新的步伐。如果學習率太大,模型可能會發散;如果學習率太小,模型可能會收斂太慢。

3. Dropout

Dropout是一種正則化技術,它可以防止模型過度擬合。Dropout的基本思想是隨機地將一些神經元設為零,這樣可以防止模型過度依賴某些神經元。

4. Batch Normalization

Batch Normalization是一種正則化技術,它可以加速模型的收斂速度。Batch Normalization的基本思想是對每個批次的資料進行標準化,這樣可以減少內部協變數偏移(Internal Covariate Shift)。

5. 啟用函式

啟用函式是用來引入非線性性的函式。常用的啟用函式包括Sigmoid、Tanh、ReLU等。

6. 模型評估

模型評估是用來評估模型效能的指標。常用的模型評估指標包括準確率、精確率、召回率、F1分數等。

神經網路架構

神經網路架構是指神經網路的結構。常用的神經網路架構包括全連線網路(Fully Connected Network)、卷積神經網路(Convolutional Neural Network)、迴圈神經網路(Recurrent Neural Network)等。

1. 全連線網路

全連線網路是一種最基本的神經網路架構。全連線網路中的每個神經元都與其他所有神經元相連。

2. 卷積神經網路

卷積神經網路是一種特殊的神經網路架構,主要用於影像處理任務。卷積神經網路中的神經元只與區域性區域的神經元相連。

3. 迴圈神經網路

迴圈神經網路是一種特殊的神經網路架構,主要用於序列資料處理任務。迴圈神經網路中的神經元可以保留之前的資訊。

圖表翻譯:

上述Mermaid圖表展示了神經網路最佳化技術和架構之間的關係。圖表中,「神經網路最佳化」是核心概念,與其他概念透過箭頭相連。這些概念包括最佳化方法(如梯度下降法、隨機梯度下降法和動量梯度下降法)、學習率、Dropout、Batch Normalization、啟用函式和模型評估等。這些技術和架構都是用來提高神經網路效能和泛化能力的重要工具。

第五章:卷積神經網路

卷積運算

在描述卷積運算之前,我們需要明確“特徵”是如何從影像的某個區域中提取出來的。假設我們有一個5x5的輸入影像I:

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

假設我們想從影像中間的3x3區域計算出一個新的特徵。類別似於之前神經網路中定義的特徵,我們將定義一個新的特徵,它是該3x3區域的函式。為此,我們將定義一個3x3的權重矩陣W:

w11 w12 w13
w21 w22 w23
w31 w32 w33

然後,我們取W在對應影像區域的點積,以得到輸出特徵值o:

o = w11*1 + w12*2 + w13*3 + w21*6 + w22*7 + w23*8 + w31*11 + w32*12 + w33*13

這個值將被處理,就像之前討論的特徵一樣:它可能會新增偏差,然後透過啟用函式,結果是一個“神經元”或“學習特徵”,它將被傳遞到網路的後續層。

多通道卷積運算

卷積神經網路與普通神經網路不同之處在於,它們生成了大量的特徵,每個特徵都是輸入影像的一個小區域的函式。具體來說,當我們有n個輸入畫素時,剛才描述的卷積運算將產生n個輸出物件,每個物件對應輸入影像中的一個位置。但實際上,在卷積層中發生的事情更復雜:我們建立f個特徵集,每個特徵集都有其對應的權重集(最初是隨機的),定義了視覺模式。找到的模式將被固定在物件地圖上。這些地圖是透過卷積運算建立的(圖5.3)。

卷積層

現在我們已經瞭解了多通道卷積運算,讓我們思考如何將其插入神經網路層。以前,我們的層相對簡單:我們輸入2D物件ndarray並獲得2D物件ndarray作為輸出。但在卷積網路中,我們的輸出將是一個3D矩陣,其維度為通道數(如“物件地圖”)×影像高度×影像寬度。

問題是:如何將ndarray向前傳遞到另一個卷積層,以建立“深度卷積”神經網路?我們知道如何執行單通道影像和我們的濾波器的卷積運算。但是,當兩個卷積層連線在一起時,我們如何執行多通道卷積運算,考慮到多個輸入通道?

讓我們考慮一下全連線層中發生的事情:在第一個隱藏層中,我們可能有h1個特徵,這些特徵是所有原始輸入特徵的組合。在下一層中,我們可能有h2個“特徵的特徵”,即前一層所有物件的組合。為了建立下一層的h2個特徵,我們使用h1×h2個權重來表示每個h2個物件都是前一層h1個物件的函式。

類別似地,在卷積神經網路的第一層中,我們首先將輸入影像轉換為m1個特徵地圖,使用m1個卷積濾波器。每個地圖顯示每個m1個模式(由權重定義)是否出現在輸入影像的每個位置。由於不同層可以具有不同數量的神經元,下一個卷積層可能包含m2個特徵。為了使網路能夠理解模式,網路尋找“模式的模式”——前一層視覺模式的組合。如果卷積層的輸出訊號是m2個通道×影像高度×影像寬度的三維矩陣,則每個m2個特徵地圖上的每個位置代表前一層m1個不同濾波器在同一位置的卷積的線性組合。

實作

當我們理解了兩個多通道卷積層如何連線時,我們可以實作操作:類別似於全連線層需要h1×h2個權重來連線具有h1和h2個神經元的層,我們需要m1×m2個卷積濾波器來連線具有m1和m2個通道的卷積層。瞭解這一點後,我們可以指定操作的輸入、輸出和引數的ndarray形狀:

  1. 輸入資料形狀:
    • 批次大小。
    • 輸入通道。
    • 影像高度。
    • 影像寬度。

請注意,這裡省略了一些不必要的細節和公式,以便更好地適應Markdown格式和簡潔性。

卷積層的輸出資料形式

在進行卷積運算時,輸出的資料形式是一個重要的考量。一般而言,卷積層的輸出資料形式可以描述為以下四個維度:

  • 批次大小(Batch Size):代表一次訓練或預測中處理的資料批次大小。
  • 通道數(Number of Channels):代表輸出資料的通道數,也就是特徵圖的數量。
  • 高度(Height):代表輸出資料的高度,通常是原始影像高度經過卷積和池化運算後的結果。
  • 寬度(Width):代表輸出資料的寬度,通常是原始影像寬度經過卷積和池化運算後的結果。

卷積濾波器的形式

卷積濾波器(Convolutional Filters)或核(Kernels)是用於提取影像特徵的重要工具。一個卷積濾波器的形式可以描述為以下四個維度:

  • 輸入通道數(Number of Input Channels):代表濾波器接受的輸入資料通道數。
  • 輸出通道數(Number of Output Channels):代表濾波器產生的輸出資料通道數。
  • 濾波器高度(Height of Filter):代表濾波器的高度,決定了濾波器在影像上滑動的範圍。
  • 濾波器寬度(Width of Filter):代表濾波器的寬度,決定了濾波器在影像上滑動的範圍。

這些維度決定了卷積運算的行為和特徵提取的效果,不同的設定會對模型的效能產生不同的影響。

卷積層與全連線層的差異

卷積層(Convolutional Layers)和全連線層(Fully Connected Layers)是神經網路中兩種不同型別的層。主要差異在於它們如何處理輸入資料和如何連線神經元。

  • 卷積層:使用區域性連線和權重分享的方式來處理輸入資料。每個神經元只與輸入資料的一個區域性區域連線,從而提取區域性特徵。這使得卷積層特別適合於影像和訊號處理任務。
  • 全連線層:每個神經元與所有輸入神經元都完全連線。這意味著每個神經元都能夠接收到所有輸入資訊,並根據所有輸入進行計算。全連線層通常用於分類別器中,對整個輸入進行全域性性的處理和判斷。

這兩種層的結構差異使得它們在神經網路中的應用場景不同,卷積層更適合於需要提取區域性特徵的任務,而全連線層則更適合於需要進行全域性判斷的任務。

卷積運算過程

在進行卷積運算時,濾波器會在整個輸入影像上滑動,每次在區域性區域上進行點積運算,產生一個特徵值。這個過程可以被視為是一個掃描和提取特徵的過程,每個位置都會產生一個對應的特徵值。

這個過程可以用以下步驟來描述:

  1. 初始化:定義濾波器的大小、步長和填充方式等引數。
  2. 滑動:將濾波器滑動到輸入影像的第一個位置。
  3. 點積:在當前位置,計算濾波器與區域性區域之間的點積,得到一個特徵值。
  4. 移動:將濾波器移動到下一個位置,重複步驟3,直到掃描完畢整個影像。
  5. 產生特徵圖:所有位置的特徵值組合起來,形成了一個特徵圖。

這個過程使得卷積層能夠有效地提取影像中的區域性特徵,並將其轉換為更高層次的抽象表示。

瞭解卷積神經網路(Convolutional Neural Networks, CNNs)

卷積神經網路(CNNs)是一種特殊的神經網路結構,主要用於處理影像和視覺資料。它的設計根據人類視覺系統的工作原理,能夠自動學習和提取影像中的特徵。

從技術架構視角來看,卷積神經網路 (CNN) 透過卷積層、池化層等核心元件有效地提取影像特徵並進行抽象化表示。相較於傳統的全連線網路,CNN 的區域性連線和權重分享機制大大減少了引數量,降低了計算複雜度,並提升了模型的泛化能力,有效地應對了過擬合的挑戰。然而,CNN 的設計和調參仍存在一定的難度,例如卷積核大小、步長以及網路深度等超引數的選擇都需要根據具體任務進行調整。對於初學者而言,理解卷積運算的過程以及不同層級之間的資料流動是掌握 CNN 的關鍵。展望未來,CNN 與其他深度學習技術的融合,例如與注意力機制或 Transformer 的結合,將進一步提升其在影像識別、目標檢測等領域的效能,並拓展其在影片分析、醫學影像等更廣泛場景的應用。玄貓認為,持續關注 CNN 架構的創新和最佳化策略,將有助於開發者更好地利用其強大的特徵提取能力,並在實際應用中取得更佳的成果。