【調參18】如何對數據進行標準化(standardization)和歸一化(normalization)



深度學習神經網絡學習如何將訓練數據集中的樣本從輸入映射到輸出。其模型的權重被初始化爲較小的隨機值,並根據訓練數據集上的誤差估計值通過優化算法進行更新。

考慮到在模型中使用小的權重以及在預測值和期望值之間使用誤差,用於訓練模型的輸入和輸出是一個重要因素。未縮放的輸入變量可能導致學習過程緩慢或不穩定,迴歸問題上未縮放的變量可能導致梯度爆炸,從而導致學習過程失敗。

數據準備涉及在訓練神經網絡模型之前,使用標準化(standardization)和歸一化(normalization)來重新縮放輸入和輸出變量。


1. 基本知識

1.1 標準化(Standardization)和歸一化(Normalization)

  • 標準化(Standardization)是指對具有高斯分佈的變量進行縮放,以使其均值爲零,標準差爲1
  • 歸一化(Normalization)是指縮放具有任何分佈的變量,以使所有值都在零和一之間

在標準化變量後可以進行歸一化。


1.2 原始輸入數據的問題

深度學習神經網絡模型學習從輸入變量到輸出變量的映射。對於每個變量,從輸入空間中提取的數據的規模和分佈可能會有所不同。輸入變量可能具有不同的單位(例如,英尺,公里和小時),這意味着變量具有不同的比例。

輸入變量之間的比例差異可能會增加建模問題的難度。較大的輸入值可以導致學習較大權重值的模型。具有較大權重值的模型通常是不穩定的,這意味着它可能會在學習過程中表現不佳,並且對輸入值的敏感性會導致較高的泛化誤差

具有較大值分佈的目標變量可能會導致較大的誤差梯度值,從而導致權重值急劇變化,從而使學習過程不穩定。縮放輸入和輸出變量是使用神經網絡模型的關鍵步驟。


1.3 輸入變量的縮放方法

輸入變量是網絡在輸入或可見層上進行預測的變量。一個好的經驗法則是,輸入變量應該是較小的值,可能在0-1的範圍內,或者以均值爲0、標準差爲1進行標準化。輸入變量是否需要縮放取決於問題和每個變量的具體情況。

如果數量分佈是正態的(高斯分佈),則應將其標準化,否則應將數據歸一化。如果數量值的範圍較大(10s,100s等)或較小(0.01、0.0001),則適用。如果數量值很小(接近0-1)並且分佈有限(例如,標準偏差接近1),則可能無需進行數據縮放。

如果輸入變量是線性組合的(例如在MLP中),那麼至少從理論上講,幾乎沒有必要對輸入進行標準化。[…]但是,出於各種實際原因,標準化輸入可以使訓練更快並減少陷入局部最優的可能


1.4 輸出變量是否應該縮放

輸出變量是網絡預測的變量。如果輸出激活函數的範圍爲[0,1],那麼顯然必須確保目標值在該範圍內。但是,通常最好選擇適合目標分佈的輸出激活函數,而不是強制數據遵循輸出激活函數。

如果是迴歸問題,那麼輸出將是實際值,最好用線性激活函數進行建模。如果值的分佈是正態的,則可以標準化輸出變量。否則,可以將輸出變量歸一化。


2. 數據縮放方法

2.1 數據歸一化(Normalization)

數據歸一化是對原始範圍內的數據進行重新縮放,以使所有值都在0到1的範圍內。標準化要求能夠準確估計觀察值的最小值和最大值。歸一化公式如下:

y = (x - min) / (max - min)

比如最大觀察值和最小觀察值分別爲30和-10的數據集,可以將任何值歸一化,對於數據18.8,經過歸一化後變爲0.72。

y = (x - min) / (max - min)
y = (18.8 - (-10)) / (30 - (-10))
y = 28.8 / 40
y = 0.72

可以使用scikit-learn的 MinMaxScaler 標準化數據集。【API

MinMaxScaler和其它類似方法的用法和優勢主要有以下三點:

  • 通過訓練數據來學習縮放規則:對於歸一化來說,這意味着訓練數據將被用來估計觀察值的最大值和最小值,在該API中,通過 fit() 方法實現。
  • 將縮放規則應用於訓練數據:在該API中,使用transform()方法實現將縮放規則應用於訓練數據,從而使用縮放後的數據訓練模型。
  • 將縮放規則應用於預測數據:可以將模型預測輸出通過反變換,變爲未經縮放之前所對應的數據。

該API基本用法如下:

from sklearn.preprocessing import MinMaxScaler
# load data
data = ...
# create scaler
scaler = MinMaxScaler()

# fit scaler on data
scaler.fit(data)
# apply transform
normalized = scaler.transform(data)

#--------------------------------------
# fit and transform in one step
normalized = scaler.fit_transform(data)
#--------------------------------------

# inverse transform
inverse = scaler.inverse_transform(normalized)

2.2 數據標準化(Standardization)

標準化數據集涉及重新縮放值的分佈,以使觀測值的平均值爲0,標準偏差爲1。有時將其稱爲白化(whitening)。

與歸一化類似,當數據具有不同比例的輸入值時,標準化可能會有用,甚至在某些機器學習算法中也是必需的。標準化假設觀測值符合高斯分佈,且均值和標準差表現良好。如果不滿足此期望,仍然可以標準化數據,但可能無法獲得可靠的結果。標準化要求能夠準確估計可觀察值的平均值和標準差,可以從訓練數據中估計這些值。

標準化公式如下:

mean = sum(x) / count(x)
standard_deviation = sqrt( sum( (x - mean)^2 ) / count(x))
y = (x - mean) / standard_deviation

例如平均值爲10、標準差爲5的數據集,對於數據20.7,歸一化後的值爲2.14。

y = (x - mean) / standard_deviation
y = (20.7 - 10) / 5
y = (10.7) / 5
y = 2.14

數據集的均值和標準差估計值對新數據的可靠性可能比最小和最大值更高。

可以使用scikit-learn的 StandardScaler 來標準化數據集。【API

該API基本用法如下:

from sklearn.preprocessing import StandardScaler
# load data
data = ...

# create scaler
scaler = StandardScaler()

# fit scaler on data
scaler.fit(data)
# apply transform
standardized = scaler.transform(data)

# ---------------------------------------
# fit and transform in one step
standardized = scaler.fit_transform(data)
# ---------------------------------------

# inverse transform
inverse = scaler.inverse_transform(standardized)

參考:
https://machinelearningmastery.com/how-to-improve-neural-network-stability-and-modeling-performance-with-data-scaling/

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