Lesson 8. 卷積神經網絡(CNN)習題解答

作業的目的,在讓學習者上完課後,了解自己對本章內容的了解程度。透過思考及回答各個問題(再加上找新問題實作練習),會更深入了解本章主題。

強烈建議大家自己以這樣的順序學習課程:

  1. 看書(搭配影片)。

    建議看兩次,第一次讀懂(聽懂)、第二次跟著動手實作。

  2. 自行回答每個問題。

    當你嘗試寫出答案時,你會更清楚知道自己了解的程度有多少。(看起來會了,和能實際動手解決問題,還是有差距)

  3. 你答對了嗎?

    由於課程影片是錄影,學習者可以找到討論的對象很有限(除了共學夥伴,以及 fast ai 論壇),所以將 Claude 的回答列出供大家參考。提醒:Claude 的回答,有可能不完全正確。

  4. 找類似的題目來實作,例如辨識英文字母。

    我常舉的例子:即使你看一百次游泳的影片,如果沒有親自下水練習,是不可能學會游泳的。


Claude 撰寫的答案

本章作業有 40 題,以下是以 Claude 協助撰寫的答案。

由於 Claude chat 目前不支援上網查詢資料,所以像第19題,查看講師 Jeremy 的 Twitter 資料,完全是 Claude 自己胡謅的。

  1. 什麼是「特徵」(What is a “feature”)?

    「特徵」是對數據的轉換,目的是使其更容易建模。在機器學習實踐中,特徵工程是最強大的工具之一。例如,在影像上下文中,特徵是視覺上的獨特屬性。數字7的特徵包括數字頂部附近的水平邊緣,以及其下方從右上到左下的對角線邊緣。數字3的特徵則包括在數字左上和右下的一個方向的對角線邊緣,左下和右上的相反對角線,以及中間、頂部和底部的水平邊緣。

  2. 寫出一個頂部邊緣檢測器的卷積核矩陣(Write out the convolutional kernel matrix for a top edge detector)。

    頂部邊緣檢測器的卷積核矩陣是:

    [[-1, -1, -1],
    [ 0,  0,  0],
     [ 1,  1,  1]]
    

    這個卷積核會檢測從亮區域(頂部)到暗區域(底部)的水平邊緣。

  3. 請寫出3×3卷積核應用於圖像中單個像素時的數學運算(Write out the mathematical operation applied by a 3×3 kernel to a single pixel in an image.)?

    當3×3卷積核應用於圖像中的單個像素時,實際上是對該像素及其周圍的8個相鄰像素(共9個像素)進行操作。如果我們將這9個像素值命名為:

\begin{matrix} a1 & a2 & a3 \\ \ a4 & a5 & a6 \\ \ a7 & a8 & a9 \end{matrix}

而卷積核的9個值分別為對應位置的權重,則卷積運算結果為這9個像素值與對應的卷積核權重相乘後的總和。例如,對於檢測頂部邊緣的卷積核 [[-1,-1,-1], [0,0,0], [1,1,1]],其計算結果為:-a1-a2-a3+a7+a8+a9

這就是卷積的核心操作:元素間的乘法然後求和,這兩個操作構成了我們在本書中看到的絕大多數深度學習模型的工作。

  1. 卷積核應用於3×3的零矩陣時,其值是多少(What is the value of a convolutional kernel apply to a 3×3 matrix of zeros)?

    當任何卷積核應用於全為零的3×3矩陣時,結果將是0。這是因為卷積操作涉及元素間的乘法和加法,當所有輸入元素都是零時,所有乘法結果也都是零,這些零的總和仍然是零。

  2. 什麼是「填充」(What is “padding”)?

    「填充」(padding)是在原始圖像外部添加額外像素的技術。最常見的做法是添加零值像素(零填充)。填充的主要目的是確保輸出的激活圖與原始圖像大小相同,這可以使架構設計更簡單。適當的填充還允許我們在圖像角落應用卷積核,否則這些區域將無法被完整處理,因為卷積核需要周圍的像素。

  3. 什麼是「步幅」(What is “stride”)?

    「步幅」(stride)定義了卷積核在圖像上移動的像素數。默認情況下,步幅為1,表示卷積核每次移動一個像素。如果步幅為2,則卷積核每次移動2個像素,這稱為「步幅-2卷積」。較大的步幅會減少輸出的尺寸。步幅-2卷積常用於減少輸出的大小,而步幅-1卷積則用於在不改變輸出大小的情況下添加層。

  4. 創建一個嵌套列表推導式來完成任何你選擇的任務(Create a nested list comprehension to complete any task that you choose)。

    我們可以創建一個嵌套列表推導式來生成坐標網格,例如:

    [[(i,j) for j in range(1,5)] for i in range(1,5)]
    

    這會生成一個4×4的坐標網格,結果是:

    [[(1, 1), (1, 2), (1, 3), (1, 4)],
     [(2, 1), (2, 2), (2, 3), (2, 4)],
     [(3, 1), (3, 2), (3, 3), (3, 4)],
     [(4, 1), (4, 2), (4, 3), (4, 4)]]
    

    這種嵌套列表推導式在Python中被廣泛使用,特別是在需要處理二維數據時。

  5. 什麼是PyTorch 2D卷積的「input」和「weight」參數的形狀(What are the shapes of the input and weight parameters to PyTorch’s 2D convolution)?

    在PyTorch的2D卷積(F.conv2d)中:

    • input參數的形狀是(minibatch, in_channels, iH, iW),其中iHiW分別是圖像的高度和寬度。
    • weight參數的形狀是(out_channels, in_channels, kH, kW),其中kHkW分別是卷積核的高度和寬度。

    這些是四維張量,其中第一個維度表示批次大小或輸出通道數,第二個維度表示輸入通道數,最後兩個維度表示高度和寬度。

  6. 什麼是「通道」(What is a “channel”)?

    「通道」(channel)是圖像或特徵圖中的一個基本組成部分。在彩色圖像中,通常有三個通道:紅色、綠色和藍色(RGB)。對於灰度圖像,只有一個通道。在神經網絡的中間層,通道也被稱為「特徵」或「過濾器」,它們代表網絡學習到的不同特徵類型。PyTorch將圖像表示為三維張量,其維度是[channels, rows, columns]。每個通道都包含圖像的一個完整視圖,但對應於不同的顏色或特徵。

  7. 卷積和矩陣乘法之間有什麼關係(What is the relationship between a convolution and a matrix multiplication)?

卷積可以表示為一種特殊的矩陣乘法。在這種表示中,權重矩陣具有兩個特殊屬性:

  1. 部分元素(灰色顯示的零)是不可訓練的,這意味著它們在整個優化過程中保持為零。
  2. 某些權重是相等的,雖然它們是可訓練的(可變的),但它們必須保持相等。這些被稱為「共享權重」。

零對應於過濾器無法觸及的像素。權重矩陣的每一行對應於過濾器的一次應用。這種結構對應了卷積的核心特性:局部連接和權重共享。

  1. 什麼是「卷積神經網絡」(What is a “convolutional neural network”)?

「卷積神經網絡」(Convolutional Neural Network,CNN)是使用卷積層而非(或除了)常規線性層的神經網絡。在卷積神經網絡中,我們利用卷積操作來學習圖像的特徵,而不是手動設計這些特徵。這種網絡通過SGD(隨機梯度下降)學習卷積核的值,從而學習對分類有用的特徵。卷積神經網絡利用了局部連接模式、權重共享和降維操作,使其特別適合處理具有網格狀拓撲的數據,如圖像。

  1. 重構神經網絡定義的部分有什麼好處(What is the benefit of refactoring parts of your neural network definition)?

重構神經網絡定義的部分(如創建函數來生成常用的層組合)有以下好處:

  1. 降低出錯概率:通過確保架構的一致性,減少了由於不一致而導致的錯誤。
  2. 增加代碼可讀性:使代碼更簡潔,更容易理解哪些部分實際上在變化。
  3. 簡化修改:當需要更改網絡結構時,只需修改一個地方而不是多個地方。
  4. 促進實驗:更容易嘗試不同的架構變體。

總的來說,這種重構方法使代碼更加模塊化、可維護和可擴展。

  1. 什麼是「Flatten」?它需要在MNIST CNN的哪裡包含?為什麼(What is Flatten? Where does it need to be included in the MNIST CNN? Why)?

Flatten是一個模塊,用於移除多餘的1×1軸。它基本上與PyTorch的squeeze方法相同,但作為一個模塊提供。在MNIST CNN中,它需要包含在最終的Conv2d層之後。這是因為最終卷積層的輸出形狀是[batch_size, num_classes, 1, 1](在我們的例子中是64x2x1x1),但我們需要移除那些額外的1x1軸,得到形狀為[batch_size, num_classes]的張量,以便進行分類。沒有Flatten,我們無法將卷積網絡的輸出用於分類任務。

  1. 「NCHW」是什麼意思(What does “NCHW” mean)?

「NCHW」是表示張量維度排列的縮寫:

  • N:batch size(批次大小)
  • C:channels(通道數)
  • H:height(高度)
  • W:width(寬度)

這是PyTorch中常用的軸順序。相比之下,TensorFlow默認使用「NHWC」軸順序,即通道維度位於最後。NCHW格式在某些GPU操作上可能更有效率,特別是在使用CUDA時。

  1. 為什麼MNIST CNN的第三層有7*7*(1168-16)次乘法運算(Why does the third layer of the MNIST CNN have 7*7*(1168-16) multiplications)?

MNIST CNN的第三層有7*7*(1168-16)次乘法運算是因為:

  • 在第三層,特徵圖的大小是7×7
  • 該層有1168個參數,其中16個是偏置(每個輸出通道一個)
  • 剩下的1168-16=1152個參數是權重
  • 對於7×7特徵圖上的每個位置,我們都需要進行1152次乘法
  • 因此,總共的乘法次數是7×7×1152=56,448

這反映了在步幅-2卷積層中,當網格大小減半時,我們通常會將過濾器數量加倍,以保持計算量大致相同。

  1. 什麼是「感受野」(What is a “receptive field”)?

「感受野」(receptive field)是指對某一層的一個激活值的計算所涉及的輸入圖像區域。較深層的感受野通常較大,這意味著它們可以"看到"更大範圍的輸入圖像。在卷積神經網絡中,較早的層捕捉局部特徵(如邊緣、紋理),而較深的層則能夠感知更複雜的特徵(如眼睛、皮毛),因為它們具有更大的感受野,可以整合更多的低層特徵信息。感受野的大小隨著網絡深度的增加而增加,特別是當網絡包含步幅大於1的卷積層時。

  1. 經過兩次步幅為2的卷積後,一個激活的感受野大小是多少?為什麼(What is the size of the receptive field of an activation after two stride 2 convolutions? Why)?

經過兩次步幅為2的卷積後,一個激活的感受野大小是7×7像素。

原因如下:

  • 第一個卷積層使用3×3的卷積核,其感受野為3×3
  • 由於步幅為2,第二層中相鄰的激活值對應於第一層中間隔2個單位的激活值
  • 第二個卷積層也使用3×3的卷積核,但現在每個位置對應於原始輸入中的2×2區域
  • 因此,第二層的3×3卷積核覆蓋了第一層的5×5區域
  • 這5×5區域在原始輸入中對應於7×7的感受野

簡而言之,每增加一個步幅為2的卷積層,感受野的大小會顯著增加,這使得深層能夠捕捉更全局的特徵。

  1. 自己運行conv-example.xlsx並嘗試使用trace precedents(Run conv-example.xlsx yourself and experiment with trace precedents)。

這是一個實踐任務,需要下載並運行excel檔案。在該檔案中,你可以看到兩個步幅為2的卷積層對MNIST數字的計算過程。當點擊conv2部分的單元格並點擊trace precedents時,你會看到藍色突出顯示的單元格,這些是用於計算該值的單元格,包括來自輸入層的相應3×3區域和來自過濾器的單元格。再次點擊trace precedents會顯示用於計算這些輸入的單元格,從而展示出7×7區域在輸入層中如何用於計算Conv2層中的單個單元格,這正是感受野的概念。

  1. 查看Jeremy或Sylvain最近在Twitter上的「喜歡」列表,看看是否找到任何有趣的資源或想法(Have a look at Jeremy or Sylvain’s list of recent Twitter "like"s, and see if you find any interesting resources or ideas there)。

這是一個開放性探索任務。Twitter(現在稱為X)是深度學習研究者和實踐者交流的重要平台。作者指出,他們經常通過Twitter了解有趣的論文、軟件發布和其他深度學習新聞。查看他們的「喜歡」列表可以發現他們認為有趣且有用的推文和用戶。此外,作者還推薦同時參與fast.ai論壇和Twitter社區,以與深度學習社區建立聯繫。

  1. 彩色圖像如何表示為張量(How is a color image represented as a tensor)?

彩色圖像表示為三維張量,其維度排列為[通道, 行, 列]。對於標準RGB彩色圖像,通道數為3,分別對應紅色、綠色和藍色。每個通道包含整個圖像的一個視圖,但只顯示相應的顏色分量。例如,在文檔中提到的熊的圖像被表示為形狀為torch.Size([3, 1000, 846])的張量,其中第一個維度3表示RGB三個通道,1000是圖像高度,846是圖像寬度。

  1. 卷積如何處理彩色輸入(How does a convolution work with a color input)?

當卷積應用於彩色輸入(多通道圖像)時:

  1. 卷積核不再是單一的2D矩陣,而是與輸入通道數相匹配的3D張量(對於RGB圖像,是3個2D卷積核)。
  2. 在每個滑動窗口位置,對每個輸入通道應用相應的卷積核。
  3. 然後將這些結果相加(紅色+綠色+藍色),再加上偏置,生成輸出特徵圖中該位置的單一值。
  4. 對於每個輸出通道,都有一組獨立的卷積核(每個輸入通道一個)和一個偏置值。

在PyTorch中,卷積權重的維度順序是[輸出通道數, 輸入通道數, 卷積核高度, 卷積核寬度]。

  1. 我們可以使用什麼方法來查看DataLoaders中的數據(What method can we use to see that data in DataLoaders)?

我們可以使用show_batch方法來查看DataLoaders中的數據。在範例代碼中,這是通過以下方式完成的:

dls.show_batch(max_n=9, figsize=(4,4))

這將顯示批次中的多個樣本(在這個例子中最多9個),並將圖形大小設置為4×4英寸。這是一個可視化數據的好方法,可以在開始訓練模型之前檢查數據是否正確加載和預處理。

  1. 為什麼我們在每個步幅為2的卷積後將過濾器數量加倍(Why do we double the number of filters after each stride-2 conv)?

我們在每個步幅為2的卷積後將過濾器數量加倍有以下原因:

  1. 當使用步幅為2的卷積時,激活圖的大小在每個維度上減半,導致總激活數量減少到原來的1/4。
  2. 如果不增加過濾器數量,網絡的容量(能夠學習和表示複雜特徵的能力)會大幅下降。
  3. 通過將過濾器數量加倍,我們保持了每層的總計算量大致相同。
  4. 從感受野的角度看,較深的層具有更大的感受野,需要更多的權重來處理這種增加的複雜性,因為它們需要表示更豐富的語義特徵。

這種平衡策略有助於保持網絡在變深時的表達能力。

  1. 為什麼在simple_cnn中我們對MNIST的第一層卷積使用更大的卷積核(Why do we use a larger kernel in the first conv with MNIST (with simple_cnn))?

simple_cnn中,我們對MNIST的第一層卷積使用更大的卷積核(5×5而不是3×3)是因為:

  1. 為了增加網絡容量,我們將第一層的輸出過濾器從4增加到8。
  2. 如果使用3×3的核(總共9個像素),從9個輸入計算8個輸出意味著每個輸出幾乎直接對應於一個輸入,網絡幾乎沒有學習空間。
  3. 通過使用5×5的核(25個像素),網絡被迫從25個輸入計算8個輸出,必須找到有用的特徵。
  4. 這種方法確保網絡能夠學習有意義的特徵,而不是簡單地傳遞輸入數據。

總的來說,這是為了確保第一層能夠學習到有用的特徵提取能力。

  1. ActivationStats為每一層保存什麼信息(What information does ActivationStats save for each layer)?

ActivationStats回調為每一個可訓練層保存以下信息:

  1. 激活的平均值(mean)
  2. 激活的標準差(standard deviation)
  3. 接近零的激活百分比
  4. 如果啟用了with_hist=True選項,還會保存激活的直方圖

這些統計數據對於診斷訓練問題非常有用,特別是了解每層激活的分佈情況,以及是否存在大量接近零的激活值,這可能表明訓練不穩定。

  1. 訓練後如何訪問學習器的回調(How can we access a learner’s callback after training)?

訓練後,回調會自動作為學習器的屬性提供,使用回調類的名稱,但採用snake_case格式(小寫並用下劃線分隔)。例如:

  • ActivationStats回調可以通過learn.activation_stats訪問
  • Recorder回調可以通過learn.recorder訪問

這使得我們可以輕鬆地使用這些回調提供的功能,如learn.activation_stats.plot_layer_stats(0)來查看第一層的激活統計信息。

  1. plot_layer_stats繪製了哪三種統計數據?x軸代表什麼(What are the three statistics plotted by plot_layer_stats? What does the x-axis represent)?

plot_layer_stats繪製的三種統計數據是:

  1. 激活的平均值(mean)- 藍線
  2. 激活的標準差(standard deviation)- 橙線
  3. 接近零的激活百分比 - 綠線

x軸代表訓練期間的批次數(batches)。這些圖表顯示了這些統計數據如何隨著訓練的進行而變化,幫助我們了解模型訓練的穩定性和效果。理想情況下,平均值和標準差應該保持一致或平滑變化,而接近零的激活百分比應該較低。

  1. 為什麼接近零的激活值有問題(Why are activations near zero problematic)?

接近零的激活值有問題,因為:

  1. 當激活值接近零時,意味著網絡中的計算沒有產生任何效果,因為乘以零得零。
  2. 這種零值會傳播到下一層,進而產生更多的零值,形成惡性循環。
  3. 過多的零值激活意味著網絡的部分容量被浪費了,無法有效學習。
  4. 在訓練的後期階段,零激活的問題會加劇,導致不穩定性。

總的來說,高比例的接近零激活值表明訓練不穩定,模型參數沒有得到有效更新。

  1. 使用更大批次大小的優缺點是什麼(What are the upsides and downsides of training with a larger batch size)?

使用更大批次大小的優點:

  1. 梯度計算更準確,因為它們是從更多數據計算得出的。
  2. 訓練更穩定,波動更小。
  3. 計算效率更高,因為可以更好地利用GPU並行處理能力。

使用更大批次大小的缺點:

  1. 每個epoch的批次數減少,意味著模型權重更新的機會減少。
  2. 可能需要更高的學習率才能達到相同的性能。
  3. 可能導致泛化能力下降,因為較小的批次引入的噪聲有時對避免過擬合有幫助。
  4. 需要更多的GPU內存。

在實踐中,需要根據具體任務和可用資源平衡這些因素。

  1. 為什麼我們應該避免在訓練開始時使用高學習率(Why should we avoid using a high learning rate at the start of training)?

在訓練開始時避免使用高學習率的原因是:

  1. 初始權重通常不適合要解決的任務,與最優解相距甚遠。
  2. 使用高學習率可能會導致訓練立即發散,損失值急劇增加而不是減少。
  3. 高學習率會導致參數更新過大,可能跳過潛在的良好解決方案。
  4. 大的參數更新可能使模型陷入不穩定狀態,難以恢復。

更好的方法是從低學習率開始,讓模型逐漸適應數據,然後再增加學習率以加速訓練。

  1. 什麼是1cycle訓練(What is 1cycle training)?

1cycle訓練是由Leslie Smith開發的一種學習率調度策略,在論文《Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates》中提出。它包括兩個階段:

  1. 預熱階段(warmup):學習率從最小值逐漸增加到最大值。
  2. 降溫階段(annealing):學習率再從最大值逐漸降回最小值。

在fastai中,這種方法與余弦退火(cosine annealing)結合使用。同時,動量(momentum)也以相反的方向變化:當學習率高時,動量較低;在降溫階段,動量再次增加。

使用fit_one_cycle函數可以實現這種訓練方式,它提供了多個可調整的參數,如最大學習率、學習率分割因子、預熱階段的批次百分比等。

  1. 使用高學習率訓練有什麼好處(What are the benefits of training with a high learning rate)?

使用高學習率訓練的好處包括:

  1. 訓練更快 - Smith稱之為"超級收斂"(super-convergence)。
  2. 泛化能力更好 - 高學習率使模型跳過尖銳的局部最小值,最終落在損失曲面的更平滑區域(這通常意味著更好的泛化能力)。
  3. 避免過擬合 - 大的參數更新產生的噪聲有助於防止模型對訓練數據過度擬合。
  4. 更有效地探索參數空間 - 高學習率允許模型探索更廣泛的參數配置。

然而,高學習率需要謹慎使用,通常結合1cycle訓練策略,從低學習率開始,逐漸增加,再逐漸降低。

  1. 為什麼我們想在訓練結束時使用低學習率(Why do we want to use a low learning rate at the end of training)?

在訓練結束時使用低學習率的原因是:

  1. 在找到參數空間的平滑區域後,我們需要找到該區域內的最佳點。
  2. 低學習率能夠進行精細調整,使模型收斂到局部最小值。
  3. 高學習率可能會使模型在最小值附近來回跳躍,而不是穩定下來。
  4. 訓練末期使用低學習率可以確保模型權重在最有效的配置處穩定下來。

這就是為什麼1cycle訓練在預熱階段後有一個降溫階段,讓學習率逐漸回到低值,以獲得最佳性能。

  1. 什麼是「循環動量」(What is “cyclical momentum”)?

「循環動量」(cyclical momentum)是Leslie Smith在論文《A Disciplined Approach to Neural Network Hyper-Parameters: Part 1》中提出的概念。它的核心思想是:

  1. 動量與學習率按相反方向變化:當學習率高時,動量低;當學習率低時,動量高。
  2. 具體來說,在1cycle訓練的預熱階段,當學習率從低增加到高時,動量從高降低到低。
  3. 在降溫階段,當學習率降回低值時,動量再次增加到高值。

這種方法的理論基礎是,高學習率時我們希望快速探索參數空間,低動量有助於此目的;而低學習率時,高動量可以幫助模型更有效地收斂到局部最小值。

  1. 哪個回調在訓練期間跟踪超參數值(以及其他信息)(What callback tracks hyperparameter values during training (along with other information))?

Recorder回調在訓練期間跟踪超參數值以及其他信息。它記錄訓練過程中的各種數據,包括:

  1. 損失值(訓練集和驗證集)
  2. 指標(如準確率)
  3. 超參數(如學習率和動量)
  4. 梯度統計信息

通過learn.recorder可以訪問這些記錄的數據,並使用方法如plot_sched()來可視化學習率和動量的變化。這對於理解訓練動態和診斷問題非常有用。

  1. color_dim圖中的一列像素代表什麼(What does one column of pixels in the color_dim plot represent)?

color_dim圖中的一列像素代表單個批次中激活值的直方圖。具體來說:

  1. 每個垂直切片表示單個批次的激活直方圖。
  2. 顏色強度對應於直方圖的高度,即落入每個直方圖區間的激活數量。
  3. 通常使用對數刻度來顯示直方圖值,使分佈更清晰。
  4. 圖的底部明亮的黃色通常表示接近零的激活值。

通過查看這些垂直切片隨時間的變化,我們可以了解激活分佈如何在訓練過程中演變,這對診斷網絡行為非常有用。

  1. color_dim中的"不良訓練"是什麼樣的?為什麼(What does “bad training” look like in color_dim? Why)?

color_dim中,"不良訓練"通常表現為:

  1. 開始時幾乎所有激活值都接近零,圖表左側底部呈現明亮的黃色,上部呈現深藍色。
  2. 然後非零激活值呈指數增長,但隨後崩潰,回到幾乎全零的狀態。
  3. 這種增長-崩潰的模式重複出現,像循環一樣。
  4. 每次崩潰後,底部再次變成明亮的黃色(表示大量接近零的激活值)。

這種模式不理想,因為:

  1. 反覆的崩潰導致大量接近零的激活值,使得訓練效率低下。
  2. 網絡無法保持學到的特徵,而是不斷"重啟"。
  3. 這種不穩定性通常導致訓練緩慢和最終結果較差。

更理想的情況是激活值從一開始就分佈均勻,並在整個訓練過程中保持平滑演變。

  1. 批量正規化層包含哪些可訓練參數(What trainable parameters does a batch normalization layer contain)?

批量正規化層包含兩個可訓練參數:

  1. gamma(γ):用於縮放正規化後的激活值。
  2. beta(β):用於平移正規化後的激活值。

批量正規化的工作方式是先將激活值正規化為均值為0、標準差為1的分佈,然後應用這些可訓練的參數:y = γ * (normalized_activation) + β。

這些參數允許網絡學習每個特徵的最佳縮放和平移因子,使批量正規化層能夠適應網絡的需求,而不是強制所有激活都有特定的統計特性。

  1. 訓練期間批量正規化使用哪些統計信息來正規化?驗證期間呢(What statistics are used to normalize in batch normalization during training? How about during validation)?

批量正規化在不同階段使用不同的統計信息:

訓練期間:

  1. 使用當前批次的均值(mean)和標準差(standard deviation)來正規化數據。
  2. 每個批次的統計數據各不相同,引入一定的隨機性。
  3. 同時,還會更新運行均值(running mean)和運行方差(running variance)的估計值。

驗證期間:

  1. 使用訓練期間計算的運行均值和運行方差來正規化數據。
  2. 這確保了驗證結果的一致性和確定性。

這種設計使得模型在訓練時能夠適應不同批次的統計特性,同時在推理時提供穩定的結果。

  1. 為什麼包含批量正規化層的模型泛化能力更好(Why do models with batch normalization layers generalize better)?

包含批量正規化層的模型泛化能力更好,主要原因是:

  1. 批量正規化在訓練過程中增加了額外的隨機性:
  • 每個小批次的均值和標準差都略有不同
  • 這導致激活值在每次迭代中都以不同的方式被正規化
  1. 為了使模型做出準確預測,它必須學會對這些變化保持穩健性。
  2. 這種隨機性類似於正則化技術(如dropout),有助於防止過擬合。
  3. 批量正規化還有助於平滑損失曲面,使優化過程更加穩定。
  4. 它允許使用更高的學習率,這通常與更好的泛化相關。

雖然我們還沒有完全理解所有機制,但大多數研究者認為,批量正規化的這種"正則化效應"是其提高泛化能力的主要原因。