文章目錄
- what(是什么)
- where(用在哪)
- How(如何用&&原理)
- 歸一化
- 實現方式
- 原理
- 示例說明
- 標準化
- 實現方式
- 原理
- 示例說明
- 正則化
- 實現方式
- 原理
- 作用
- Batch Normalization
- pytorch中的batch normalization
- 原理
- BN的作用
歸一化、標準化、正則化、以及深度學習種經常看到的Batch Normalization分別是什么?用在哪?怎么用,以及各自的原理分別是什么?本文針對這些問題,進行對比分析,整體解析。
what(是什么)
- 歸一化,是對數據進行歸一處理,處理的結果,從數據上看,會使得數據全部落在[0,1]的范圍;從應用角度看,能夠消除量綱的影響,也就是說,歸一化在不同的特征之間進行,但可能涉及到一些反歸一化的操作。
- 標準化,主要改變數據的分布,處理結果,從數據上看,會使得數據服從標準正態分布;從應用的角度看,這種標準的正態分布能夠加速模型訓練,主要用在同一特征的特征數據上。
- 正則化,是在機器學習中的損失函數中添加懲罰項,從數據上看,這種懲罰項會減小模型權重,通過減小權重,在應用中,能夠降低有效防止過擬合。
- 而深度學習中常說的Batch Normalization層則是數據標準化的一個更高級的具體實現。具體地,在標準化的基礎上,對數據進一步的進行一個縮放和拉伸,以達到學習數據真實分布的目的。從數據上看,經過Batch Normalization層的后的數據,會呈現正態分布;從應用角度,該分布可以有效加速模型模型、防止梯度消失、防止過擬合的作用。
where(用在哪)
- 歸一化,主要用在存在多個特征,且多個特征之間量綱不一致的情況下,需要對數據進行歸一化,以消除量綱帶來的影響,尤其,當特征的數值范圍變化較大時,或者算法對輸入數據的數值范圍敏感時,可以考慮歸一化。
- 標準化,主要在模型訓練階段,尤其當特征的分布偏差大或者算法對數據的分布敏感時,可以考慮標準化。
- 正則化,主要用在機器學習的損失函數上。通過在損失函數上施加懲罰項,來降低模型復雜度,特別是在數據量不足或者特征數目較多時。
How(如何用&&原理)
歸一化
實現方式
- 最大最小歸一化
將數據縮放到一個固定的范圍,通常是[0, 1]或者[-1, 1]。
## 在 python 中實現最大最小歸一化的操作import numpy as npdef min_max_normalize(data):min_val = np.min(data)max_val = np.max(data)normalized_data = (data - min_val) / (max_val - min_val)return normalized_data
原理
公式為: x ′ = x ? m i n ( x ) m a x ( x ) ? m i n ( x ) x'=\frac{x-min(x)}{max(x)-min(x)} x′=max(x)?min(x)x?min(x)?, 其中, ( x ) (x) (x) 是原始數據, ( x ′ ) (x') (x′) 是歸一化后的數據, m i n ( x ) min(x) min(x) 和 m a x ( x ) max(x) max(x) 分別是數據集 X X X 的最小值和最大值。
示例說明
在許多機器學習算法中,如支持向量機(SVM)、k近鄰(k-NN)等,距離度量是一個重要的因素。如果特征未經過歸一化,具有較大范圍值的特征可能會主導距離計算,導致模型偏向于某些特征而忽略其他特征。通過歸一化,可以避免這種情況,確保每個特征對模型的貢獻相對平等。
例子:
假設我們有一個數據集,包含兩個特征:身高(單位:厘米)和體重(單位:千克)。身高的范圍可能在150到190厘米之間,而體重的范圍可能在50到100千克之間。如果我們不對這些特征進行歸一化,身高和體重的值范圍差異很大,可能導致機器學習模型在訓練過程中對于體重的變化更為敏感,而對身高的變化不敏感。
通過歸一化,我們可以將身高和體重都映射到 [0, 1] 的范圍內,使得這兩個特征的尺度相似。這樣模型在訓練時能夠更平衡地考慮身高和體重對輸出(比如預測健康狀況)的影響,而不會被特征尺度的差異所影響。
標準化
實現方式
- Z-score方法
調整數據分布,將數據拉到均值為0,方差為1的標準正態分布。
import numpy as npdef calculate_z_scores(data):"""計算給定數據集的Z-Scores(標準化)。參數:data: numpy數組,包含要標準化的數據集。返回:Z-Scores的numpy數組,與輸入數據形狀相同。"""mean_data = np.mean(data)std_data = np.std(data)z_scores = (data - mean_data) / std_datareturn z_scores# 示例用法
X = np.array([1, 2, 3, 4, 5])
Z_scores = calculate_z_scores(X)
print("原始數據 X:", X)
print("Z-Scores:", Z_scores)
原理
公式為: x ′ = x ? m e a n ( x ) s t d ( x ) x'=\frac{x-mean(x)}{std(x)} x′=std(x)x?mean(x)?,其中, x ′ x' x′為處理后的數據, m e a n ( x ) mean(x) mean(x)為數據的均值, s t d ( x ) std(x) std(x)為數據方差。經過處理,數據服從標準正態分布。
示例說明
假設我們的數據集如下:
特征1 | 特征2 |
---|---|
10 | 200 |
20 | 800 |
30 | 600 |
40 | 400 |
標準化后的數據集如下(保留一位小數):
特征1 | 特征2 |
---|---|
-1.3 | -1.3 |
-0.5 | 1.3 |
0.5 | 0.5 |
1.3 | -0.5 |
通過這種標準化,我們可以看到原始數據的不同尺度被調整到了相似的范圍內,這樣在進一步的分析和建模中,特征的權重和貢獻度更容易理解和比較
正則化
實現方式
在損失函數中添加正則項,其中L1正則添加 λ ∑ i = 1 n ∣ w i ∣ \lambda \sum_{i=1}^{n} |w_i| λ∑i=1n?∣wi?∣,L2正則添加 λ ∑ i = 1 n w i 2 \lambda \sum_{i=1}^{n} w_i^2 λ∑i=1n?wi2?
原理
-
L1正則化(Lasso正則化): 添加參數向量的L1范數作為懲罰項。它傾向于使得部分參數為零,從而實現特征選擇的效果,減少不重要特征對模型的影響。
Lossregularized = Lossoriginal + λ ∑ i = 1 n ∣ w i ∣ \text{Loss}{\text{regularized}} = \text{Loss}{\text{original}} + \lambda \sum_{i=1}^{n} |w_i| Lossregularized=Lossoriginal+λi=1∑n?∣wi?∣
其中, ( λ ) ( \lambda ) (λ) 是正則化強度參數,控制正則化項對總損失的貢獻程度。 -
L2正則化(Ridge正則化): 添加參數向量的L2范數平方作為懲罰項。它通過懲罰參數的大小來控制模型的復雜度,避免參數值過大。
Lossregularized = Lossoriginal + λ ∑ i = 1 n w i 2 \text{Loss}{\text{regularized}} = \text{Loss}{\text{original}} + \lambda \sum_{i=1}^{n} w_i^2 Lossregularized=Lossoriginal+λi=1∑n?wi2?
類似地, ( λ ) ( \lambda ) (λ) 是正則化強度參數。
作用
此處,引用大神深入理解L1、L2正則的博客中的圖,進一步說明L1和L2正則。
-
L1正則
在考慮二維特征的情況下,L1正則的圖像應該為一個規則矩形,將正則項記為 J J J,若把正則項 J J J、原始損失函數 L o s s o r i g i n a l Lossoriginal Lossoriginal繪制在同一個坐標下,應該為:
將帶有正則的損失函數記為 L o s s r e g u l a r i z e d Lossregularized Lossregularized,那么 L o s s r e g u l a r i z e d Lossregularized Lossregularized在取到最小值時,應該在 L o s s o r i g i n a l Lossoriginal Lossoriginal、 J J J的交點處(原因以及具體推導,見大神的博客,主要是一個帶約束的優化問題,使用KKT條件求解)。從圖像直觀理解,損失函數與正則項圖像的交點,更容易落在坐標軸而非坐標平面上(高維特征空間會更加明顯),在二維空間,就意味著有一維的特征數據為0,也就是說有一個維度的特征沒有對損失函數起到作用。從而得出,L1正則具有使得模型更加稀疏的作用,也可以說,起到了一定的特征選擇的作用。 -
L2正則
同樣的,將 L 2 L2 L2正則項 J J J以及原始損失函數 L o s s o r i g i n a l Lossoriginal Lossoriginal的等值線繪制在同一個坐標系下。
從圖中可以看出,帶正則的損失函數 L o s s r e g u l a r i z e d Lossregularized Lossregularized的最小值更多的出現在坐標平面中,因此L2正則是不具有使得模型更加稀疏的能力的。
Batch Normalization
pytorch中的batch normalization
BatchNorm層通常在激活函數之前應用。它會自動計算每個特征的均值和方差,并根據小批量數據的統計信息進行歸一化處理,在使用時,需要注意訓練與評估模式的切換,訓練階段,使用mini-batch的均值和方差,評估模式(推理模式)下,會默認使用整個批次的均值和方差。
對于全連接層(線性層),可以使用 torch.nn.BatchNorm1d(num_features)
。
對于2維卷積層,可以使用 torch.nn.BatchNorm2d(num_features)
。
對于3維卷積層(如視頻處理),可以使用 torch.nn.BatchNorm3d(num_features)
。
import torch
import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc1 = nn.Linear(784, 256)self.bn1 = nn.BatchNorm1d(256) # BatchNorm1d應用于全連接層輸出self.fc2 = nn.Linear(256, 10)def forward(self, x):x = torch.flatten(x, 1)x = self.fc1(x)x = self.bn1(x)x = torch.relu(x)x = self.fc2(x)return x
原理
Batch Normalization由google在2015年提出,主要是為了解決深度神經網絡訓練過程中的內部協變量偏移(Internal Covariate Shift,在深度神經網絡中,每一層的輸入數據分布隨著網絡的訓練而發生變化,這被稱為內部協變量偏移。這種變化可能導致每層需要不斷適應前一層輸出的分布變化,使得網絡訓練過程變得復雜和緩慢)問題,同時有助于加速網絡的收斂過程。
- 算法步驟
摘自于Batch Normalization論文
BN在減均值除方差后,將數據分布調整為標準的正態分布。此外,額外增加一個縮放和平移的操作,也即增加兩個需要學習的參數,分別為 β \beta β、 γ \gamma γ。這兩個參數的引入是為了恢復數據本身的表達能力,對規范化后的數據進行線性變換。
BN的作用
主要有三個作用,首先,通過將特征數據的分布調整到標準正態分布,而在這分布下,激活函數的梯度比較大,能夠完美解決梯度消失的問題;其次,由于存在較大的梯度,能夠加速模型的訓練;最后,由于數據被調整為比較標準的正態分布,模型能夠學習到比較通用化的特征,屏蔽了距離正態分布中心較遠的特征,避免了對離群特征點的使用,能夠在一定程度上減弱過擬合。
附上對BN非常詳細的一個解讀,有需要的同學可以仔細研讀。BN論文的詳細解讀,該文章通過作圖,詳細的說明了,在標準正態分布中,激活函數的梯度變化。