【調參03】如何通過激活正則化減少泛化誤差

本文介紹了使用激活正則化(Activity Regularization)的原因和方法。



代碼環境:

python -3.7.6
tensorflow -2.1.0

1. 激活正則化介紹

深度學習模型能夠從原始輸入數據中自動學習豐富的內部表徵,稱爲特徵學習或表示學習(Representation Learning)

有一類模型專注於特徵的高效和有效的自動提取,先通過一個網絡提取輸入數據的特徵,這個提取特徵的網絡稱爲編碼器;然後使用第二個網絡從學習的特徵重建原始輸入,這個提取特徵的網絡稱爲解碼器。這種類型的模型稱爲 自動編碼器(Auto-Encoder)編碼器-解碼器(Encoder-Decoder),它們的已學習特性對於瞭解某些區域的更多信息(例如,通過可視化)和預測模型非常有用。

編碼器的輸出,或者通常是神經網絡中隱藏層的輸出,可以認爲是模型中該點問題的表示。對神經網絡中單元的激活進行懲罰,以使其激活稀疏。這種類型的懲罰稱爲 激活正則化(Activity Regularization)或表示正則化(Representation Regularization)

在特徵學習的過程中,有一個不可忽視的問題就是過擬合,即在訓練集上的表現很好,但在新樣本上的表現並不好。學習的表示中的較大值可能表示表示過擬合。 激活正則化可鼓勵模型學習表示,使得網絡的一個或多個隱藏層的輸出或激活的神經元變得稀疏。總的來說,激活正則化提供了一種鼓勵神經網絡學習稀疏特徵的內部表示的方法。

具有很少激活或激活大多數爲零值也稱爲 稀疏性(sparsity)。這種類型的懲罰也稱爲 稀疏特徵學習(Sparse Feature Learning)。在自動編碼器模型中鼓勵稀疏提取特徵的模型稱爲 稀疏自動編碼器(Sparse Autoencoders)。

稀疏的不完全表示具有許多理論和實踐上的優勢。特別是它們對噪聲具有良好的魯棒性,並提供了位置和頻率聯合空間的良好拼接。另外,它們對於分類器是有利的,因爲在更高維度的空間中分類更容易。


2. 使用激活正則化的經驗

2.1 在所有網絡模型中使用

激活規則化是一種通用方法。它可以與大多數神經網絡模型一起使用,尤其是多層感知器,卷積神經網絡和長短期記憶遞歸神經網絡等最常見的網絡類型。


2.2 在自動編碼器模型中使用

活動正則化可能最適合那些明確尋求有效學習表示的模型。比如自動編碼器(即稀疏自動編碼器)模型,用於序列預測問題的編碼器-解碼器模型,LSTM編碼器-解碼器模型。


2.3 使用不同的正則化方法

最常見的激活正則化方法是L1正則化,因爲它鼓勵稀疏性。可以嘗試使用其他類型的正則化,例如L2正則化或同時使用L1和L2正則化。


2.4 結合ReLU 一起使用

ReLU是目前廣泛使用的激活函數。與經典的激活函數(例如tanh(雙曲正切函數)和Sigmoid(邏輯函數))不同,relu函數每次可保留一半左右的神經元處於激活狀態。當學習稀疏表示時(例如使用L1激活正則化),可以考慮結合 ReLU 一起使用。


3. Keras API

3.1 Keras API

tensorflow.keras 提供了三個正則化關鍵字參數,分別是:

  • kernel_regularizer:正則化器在層的內核上添加懲罰項;
  • bias_regularizer:正則化器對層的偏差添加懲罰項;
  • activity_regularizer:正則化器對層的輸出添加懲罰項。

簡單示例:

from tensorflow.keras import layers
from tensorflow.keras import regularizers

layer = layers.Dense(
    units=64,
    kernel_regularizer=regularizers.l1_l2(l1=1e-5, l2=1e-4),
    bias_regularizer=regularizers.l2(1e-4),
    activity_regularizer=regularizers.l2(1e-5)
)

3.2 L1 正則化

tf.keras.regularizers.l1(l=0.01)

The L1 regularization penalty is computed as: loss = l * reduce_sum(abs(x))

參數說明:

  • l: Float; L1 regularization factor.

3.3 L2 正則化

tf.keras.regularizers.l2(l=0.01)

The L2 regularization penalty is computed as: loss = l * reduce_sum(square(x))

參數說明:

  • l: Float; L2 regularization factor.

3.4 L1L2 正則化

tf.keras.regularizers.l1_l2(l1=0.01, l2=0.01)

3.5 自定義正則化函數 🐟

1.簡單方法

def my_regularizer(x):
    return 1e-3 * tf.reduce_sum(tf.square(x))

2.Regularizer 子類
如果需要通過各種參數(例如l1和中的l2參數l1_l2)配置正則化,則應實現爲tf.keras.regularizers.Regularizer 的子類。

class MyRegularizer(regularizers.Regularizer):

    def __init__(self, strength):
        self.strength = strength

    def __call__(self, x):
        return self.strength * tf.reduce_sum(tf.square(x))

儘管活動正則化最常用於鼓勵自動編碼器和編碼器-解碼器模型中的稀疏學習表示,但也可以將其直接用於常規神經網絡中以達到相同的效果,並改善模型的通用性。


4. 激活正則化應用

通過上面的 Keras API 介紹可知,正則化可以在層中指定。

正則化應該在輸出層使用,需要注意的是,正則化可以在激活之前使用,也可以在激活之後使用。如下例:

激活之後使用正則化

model.add(Dense(32, activation='relu', activity_regularizer=l1(0.001)))

激活之前使用正則化

model.add(Dense(32, activation='linear', activity_regularizer=l1(0.001)))
model.add(Activation('relu'))

一般來說,第二種方式是首選的配置方法。因爲這樣可以是模型能夠結合ReLU激活函數的稀疏特性。


1. MLP 模型

model.add(Dense(32, activity_regularizer=l1(0.001)))

2. CNN 模型

model.add(Conv2D(32, (3,3), activity_regularizer=l1(0.001)))

3. RNN 模型

model.add(LSTM(32, activity_regularizer=l1(0.001)))

參考:
https://machinelearningmastery.com/activation-regularization-for-reducing-generalization-error-in-deep-learning-neural-networks/
https://machinelearningmastery.com/how-to-reduce-generalization-error-in-deep-neural-networks-with-activity-regularization-in-keras/
https://keras.io/getting_started/
https://keras.io/api/layers/regularizers/

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