Batch_Normalization詳解

Batch_Normalization,簡稱BN,是一種針對神經網路中分布不穩定的提出的正則化手段。在深度學習中,BN是十分重要的一個模塊,它可以在訓練過程中加速網路收斂,同時增加了模型的泛化能力。在本文中,我們將對BN進行詳細的介紹。

一、batchnorm的方差shape

對於輸入的$N\times C \times H \times W$的四維數據,BN中對於每個channel需要統計出其平均值和方差。具體來說,如下:

// 計算每個channel的均值和方差
mean = sum(x, (0, 2, 3), keepdim=True) / (x.shape[0] * x.shape[2] * x.shape[3])
variance = sum((x - mean) ** 2, axis=(0, 2, 3), keepdim=True) / (x.shape[0] * x.shape[2] * x.shape[3])

對於計算出的均值和方差,可以使用以下公式對BN進行標準化:

y = (x - mean) / sqrt(variance + eps)

其中eps為一個較小的數,用來避免分母為零的情況。最後加入了權重和偏置項,以得到最終標準化結果。

二、BatchNormalizationLayer Matlab

在Matlab中,可以很方便地使用BatchNormalizationLayer層來進行BN。

% 創建一層batchnorm,inputSize為輸入數據的size
batchnormLayer = batchNormalizationLayer('Name','bn','Epsilon',0.001,'Offset',zeros(1,inputSize(3),'single'),'Scale',ones(1,inputSize(3),'single'));

% 前向傳播
bn_res = predict(batchnormLayer, x);

三、Normalization

除了BN,還有一種正則化方法叫做Normalization。Normalization是對於某一層的所有輸入數據進行正則化,而BN是對於每個channel進行標準化,因此Normalization所需要的參數要比BN多,更難訓練。但是Normalization在某些情況下可能表現更好,比如處理非常稀疏的數據。

四、Layer Normalization

BN在處理圖像分類等場景表現比較好,但是對於RNN等序列問題表現較差,這時候可以使用Layer Normalization。它與BN的區別在於:BN是在數據在$N\times C \times H \times W$的四個維度上進行標準化,而LayerNorm是在$N\times L \times C$的三個維度上進行標準化,即一個batch的所有樣本都共用一組mean和variance。LayerNormalization的具體公式如下:

z = (x - mean) / sqrt(variance + eps)
y = gamma * z + beta

五、Batchnorm的原理和作用

BN是一種歸一化方法,其主要原理就是讓每一層的輸入數據分布盡量接近於標準正態分布。在深度神經網路中,隨著層數的增加,輸入數據的分布越來越偏離標準正態分布,容易出現梯度消失和梯度爆炸等問題,影響網路的訓練效果。而BN可以通過標準化來解決這個問題,並且在訓練過程中動態調整輸入數據的均值和方差,降低了網路對初始化的依賴,加速了網路訓練的收斂速度。此外,BN還可以起到正則化的作用,避免過擬合。

六、Batchnorm會造成illegal memory

在某些情況下,BN可能會導致illegal memory訪問錯誤,這是由於batch size過小,導致方差為0。此時,可以在BN的代碼中增加一定的容錯機制,比如將eps設置成一個較小的數(如$1e-5$),即可解決該問題。

七、Batchnormalization層的作用

BN層是深度學習中很重要的一層,主要作用如下:

  • 加速網路訓練:
  • 減少了網路對參數初始化的依賴,加速了網路收斂的速度。

  • 提高網路泛化能力:
  • 在訓練過程中動態調整輸入數據的均值和方差使得網路更加魯棒,具有更好的泛化能力。

  • 正則化:
  • 通過對輸入數據進行標準化來避免過擬合。

八、Batchnormalization和Layer選取

在選擇使用哪一種歸一化方法時,需要考慮輸入數據的性質和具體的任務。如果是圖像分類等場景,可以優先選擇BN。如果是序列問題,可以選擇LN。 在實際應用中,也可以同時使用BN和LN,進一步提高泛化性。

代碼示例

以下是tensorflow中BN的具體代碼,以MNIST數據集為例。

import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)

在上面的代碼中,使用了Sequential模型,加入了一個BN層以及兩個全聯接層。代碼簡單易懂,並且有了BN層的加入,模型的準確率會更高。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/195443.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 20:34
下一篇 2024-12-02 20:34

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和演算法 C語言貪吃蛇主要運用了以下數據結構和演算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25

發表回復

登錄後才能評論