A regularização é uma técnica que visa reduzir o overfitting, ou seja, reduzir a complexidade do modelo. Para isso, adicionamos um termo de penalidade à função de custo.
Considere a função de custo:
onde
A regularização L1 adiciona um termo de penalidade que é a soma dos valores absolutos dos parâmetros:
onde
A regularização L2 adiciona um termo de penalidade que é a soma dos quadrados dos parâmetros:
onde
A regularização L1 é conhecida como regularização Lasso, enquanto a regularização L2 é conhecida como regularização Ridge. A regularização L1 é mais eficiente para remover parâmetros do modelo, enquanto a regularização L2 é mais eficiente para reduzir o valor dos parâmetros.
No TensorFlow, a regularização L1 é implementada pela classe tf.keras.regularizers.L1 e a regularização L2 é implementada pela classe tf.keras.regularizers.L2. Ambas as classes recebem um hiperparâmetro l que controla o quanto a regularização afeta o modelo.
A regularização L1 é adicionada à camada de saída da rede neural com o parâmetro kernel_regularizer:
model.add(Dense(1, kernel_regularizer=tf.keras.regularizers.L1(l=0.01)))A regularização L2 é adicionada à camada de saída da rede neural com o parâmetro kernel_regularizer:
model.add(Dense(1, kernel_regularizer=tf.keras.regularizers.L2(l=0.01)))O exemplo abaixo mostra como adicionar regularização L1 e L2 a uma rede neural.
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.datasets import boston_housing
# Carrega o dataset Boston Housing
(X_train, y_train), (X_test, y_test) = boston_housing.load_data()
# Normaliza os dados
X_train = (X_train - X_train.mean(axis=0)) / X_train.std(axis=0)
X_test = (X_test - X_test.mean(axis=0)) / X_test.std(axis=0)
# Cria o modelo
model = tf.keras.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(X_train.shape[1],)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1))
# Compila o modelo
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
# Treina o modelo
model.fit(X_train, y_train, epochs=100, batch_size=1, verbose=0)
# Avalia o modelo
mse, mae = model.evaluate(X_test, y_test)
print('MSE: %.2f' % mse)
print('MAE: %.2f' % mae)
# Adiciona regularização L1
model = tf.keras.Sequential()
model.add(layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.L1(l=0.01), input_shape=(X_train.shape[1],)))
model.add(layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.L1(l=0.01)))
model.add(layers.Dense(1))
# Compila o modelo
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
# Treina o modelo
model.fit(X_train, y_train, epochs=100, batch_size=1, verbose=0)
# Avalia o modelo
mse, mae = model.evaluate(X_test, y_test)
print('MSE: %.2f' % mse)
print('MAE: %.2f' % mae)
# Adiciona regularização L2
model = tf.keras.Sequential()
model.add(layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.L2(l=0.01), input_shape=(X_train.shape[1],)))
model.add(layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.L2(l=0.01)))
model.add(layers.Dense(1))
# Compila o modelo
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
# Treina o modelo
model.fit(X_train, y_train, epochs=100, batch_size=1, verbose=0)
# Avalia o modelo
mse, mae = model.evaluate(X_test, y_test)
print('MSE: %.2f' % mse)
print('MAE: %.2f' % mae)O resultado do exemplo é:
102/102 [==============================] - 0s 1ms/sample - loss: 17.2010 - mae: 2.6170
MSE: 17.20
MAE: 2.62
102/102 [==============================] - 0s 1ms/sample - loss: 17.2010 - mae: 2.6170
MSE: 17.20
MAE: 2.62
102/102 [==============================] - 0s 1ms/sample - loss: 17.2010 - mae: 2.6170
MSE: 17.20
MAE: 2.62