訓練神經網絡時,如果數據集比較小,很容易導致過擬合。也就是說,小樣本量所對應的高維的輸入空間比較稀疏,神經網絡很難從中學習映射關係。一種方法是通過添加噪聲使得輸入空間變得平滑,從而有利於神經網絡學習。
1. 小數據集存在的問題
在訓練大型神經網絡時,小型數據集會帶來問題。
第一個問題是網絡可以有效地記憶訓練數據集。該模型可以學習特定的輸入示例及其關聯的輸出,而不是學習從輸入到輸出的一般映射。這將導致模型在訓練數據集上表現良好,而在新數據上表現不佳,即泛化能力很差。
第二個問題是小的數據集提供較少的機會來描述輸入空間的結構及其與輸出的關係。更多的訓練數據爲模型可以學習的問題提供了更豐富的描述。較少的數據意味着震盪和離散的輸入空間而不是平滑的輸入空間,這可能會導致模型學習特徵映射比較困難。
有時候,有些數據的收集比較困難。此外,即使採集了更多的數據,可能仍然無法解決這些問題。一種解決方法是訓練期間添加噪聲。
2. 訓練期間添加噪聲
小數據集在訓練時,會導致比較大的誤差。通過在訓練期間添加噪聲,可以提高模型從輸入空間學習映射規則的能力,提高模型的泛化能力和容錯率。
在神經網絡模型訓練期間添加噪聲具有正則化效果,進而提高了模型的魯棒性。與權重正則化方法一樣,已經證明添加噪聲對損失函數的影響和懲罰項的作用類似。
實際上,添加噪聲會擴大訓練數據集的大小。每次將訓練樣本輸入模型時,都會將隨機噪聲添加到輸入變量,從而使輸入模型的數據每次都不同。將噪聲添加到輸入樣本是數據增強的一種簡單形式。
添加噪聲意味着網絡無法記住訓練樣本,因爲它們一直在變化,從而導致網絡權重更小且網絡更健壯,泛化誤差更低。
噪聲意味着從已知樣本附近的域中抽取新樣本,從而平滑了輸入空間的結構。這種平滑可能意味着映射功能更易於網絡學習,從而導致更好,更快的學習。
3. 如何添加噪聲
高斯噪聲或白噪聲(Gaussian noise, or white noise) 的平均值爲零,標準差(std)爲1,可以根據需要使用僞隨機數生成器生成。在信號處理中,使用高斯噪聲這一術語來指代電路中不相關的隨機噪聲;傳統上,將高斯噪聲添加到神經網絡的輸入中稱爲抖動(jitter) 或隨機抖動。
添加的噪聲量(例如,擴展或標準偏差)是可配置的超參數。噪聲太小沒有影響,而噪聲太大使映射功能難以學習。通常是通過在將輸入數據餵給網絡之前在輸入數據上添加一個隨機向量來完成的,因此,在訓練中同樣的數據在不同訓練批次中,也會添加不同的隨機向量。
隨機噪聲的標準差可以根據每個輸入變量的大小進行調整。如果輸入變量的標度已首先進行標準化,則配置起來會更容易。
噪聲僅在訓練期間添加。在模型評估期間或使用模型對新數據進行預測時,不會添加任何噪聲。
噪聲的添加也是自動特徵學習的重要部分,例如在自動編碼器的情況下,所謂的降噪自動編碼(Denoising Autoencoders)器明確要求模型在存在輸入噪聲的情況下學習魯棒特徵。
儘管在數據中添加噪聲是最常見且最廣泛的方法,但是在訓練過程中可以將隨機噪聲添加到網絡的其它部分。比如:
- 給激活添加噪聲,即每層的輸出。
- 給權重添加噪聲,即迭代輸入。
- 給梯度(即更新權重的方向)添加噪聲。
- 給輸出(即標籤或目標變量)添加噪聲。
在激活中中增加噪聲,從而可以在網絡的任何數據使用噪聲。這對於非常深的網絡可能是有益的。將噪聲添加到層輸出中,很可能是通過使用噪聲激活函數來實現的。
在權重中添加噪聲,可以使該方法以一致的方式在整個網絡中使用,而不是在輸入和層激活中添加噪聲。這在遞歸神經網絡中特別有用。
向梯度添加噪聲,可以使模型更多地集中在提高優化過程本身的魯棒性上,而不是輸入空間的結構上。噪聲的數量可能在訓練開始時就開始很高,並且隨着時間的流逝而降低,這很像學習速率的下降。對於非常深的網絡和各種不同的網絡類型,該方法已被證明是一種有效的方法。
將噪聲添加到激活,權重或梯度都提供了一種更通用的添加噪聲的方法,該噪聲對於提供給模型的輸入變量的類型是不變的。
如果認爲或預期問題域帶有錯誤標記的示例,則在類別標籤上添加噪聲可以提高模型對此類錯誤的魯棒性。但這很容易偏離學習過程。
在迴歸或時間序列預測中,將噪聲添加到連續目標變量中,非常類似於將噪聲添加到輸入變量中,並且可能是更好的方法。
4. 添加噪聲的提示
添加噪聲的方法,主要用於多層感知器,但可以與卷積和遞歸神經網絡一起使用。
重要的是,噪聲的添加對模型具有一致的影響。這就要求對輸入數據進行重新縮放,以使所有變量都具有相同的縮放比例,以便在以固定方差將噪聲添加到輸入時,具有相同的效果。這也適用於在權重和漸變上添加噪聲,因爲它們也受輸入比例的影響。這可以通過輸入變量的標準化或標準化來實現。如果在數據縮放後添加了隨機噪聲,則可能需要對每個批處理再次重新縮放變量。
5. tensorflow.keras API
將噪聲添加到具有少量訓練數據集的神經網絡模型中可以產生正則化效果並減少過擬合。
Keras通過單獨的 GaussianNoise
層添加高斯噪聲。該層可用於向現有模型添加噪聲。
tf.keras.layers.GaussianNoise(
stddev, **kwargs
)
參數說明:
stddev
:float類型,噪聲分佈的標準差。
調用參數說明:
inputs
:輸入張量(任何等級)。training
:bool類型,True指示該層在訓練模式下添加噪聲;False表示不執行任何操作。input_shape
:在將此層用作模型的第一層時,需要指定該關鍵字參數(整數元組,不包括樣本軸)。
示例:
from tensorflow.keras.layers import GaussianNoise
layer = GaussianNoise(0.1)
實例:
1. 在激活之前添加高斯噪聲:
...
model.add(Dense(32))
model.add(GaussianNoise(0.1))
model.add(Activation('relu'))
model.add(Dense(32))
...
2. 在激活之後添加高斯噪聲:
...
model.add(Dense(32, activation='reu'))
model.add(GaussianNoise(0.1))
model.add(Dense(32))
...
可以將標準差作爲超參數,通過網格搜索找出最佳的值。
參考
https://machinelearningmastery.com/train-neural-networks-with-noise-to-reduce-overfitting/
https://machinelearningmastery.com/how-to-improve-deep-learning-model-robustness-by-adding-noise/
https://www.tensorflow.org/api_docs/python/tf/keras/layers/GaussianNoise