본문 바로가기
DNN with Keras/Regularization and Dropout

과적합을 줄이기 위한 L1 및 L2 정규화

by goatlab 2023. 7. 24.
728x90
반응형
SMALL

L1 and L2 Regularization to Decrease Overfitting

 

 

L1과 L2 정규화는 과적합 효과를 줄일 수 있는 두 가지 일반적인 정규화 기법이다. 이러한 알고리즘은 목적 함수와 함께 작동하거나 역전파 알고리즘의 일부로 작동할 수 있다. 두 경우 모두 정규화 알고리즘은 목표를 추가하여 훈련 알고리즘에 첨부된다.

 

이러한 알고리즘은 신경망 훈련에 가중치를 추가함으로써 작동한다. 이 페널티는 신경망이 가중치를 작은 값으로 유지하도록 장려한다. L1과 L2 모두 이 패널티를 다르게 계산한다. 이 패널티 계산을 역 전파와 같은 경사 강하 기반 알고리즘의 계산된 그레디언트에 추가할 수 있다. 페널티는 시뮬레이션 annealing과 같은 목적 함수 기반 훈련의 목표 점수와 부정적으로 결합된다.

 

L1과 L2는 모두 무게의 크기를 제한한다는 점에서 다르게 작동한다. L2는 가중치를 가우스 분포와 유사한 패턴으로 강제 적용한다. L1은 가중치를 라플라스 분포와 유사한 패턴으로 강제 적용한다. L1 알고리즘은 0부터 가중치에 대한 내성이 높은 반면 L2 알고리즘은 내성이 낮다.

 

import pandas as pd
import os
import numpy as np
from sklearn import metrics
from scipy.stats import zscore
from sklearn.model_selection import KFold
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras import regularizers

EPOCHS = 500
kf = KFold(5 , shuffle = True , random_state = 42)
oos_y = [ ]
oos_pred = [ ]

fold = 0
for train, test in kf.split(x):
  fold += 1
  print(f"Fold #{fold}")

  x_train = x[train]
  y_train = y[train]
  x_test = x[test]
  y_test = y[test]

  model = Sequential()
  
  # Hidden 1
  model.add(Dense(50, input_dim = x.shape[1], activation = 'relu', activity_regularizer = regularizers.l1(1e−4)))
  
  # Hidden 2
  model.add(Dense(25, activation = 'relu', activity_regularizer = regularizers.l1(1e−4)))
  
  # Output
  model.add(Dense(y.shape[1], activation = 'softmax'))
  model.compile(loss = 'categorical_crossentropy', optimizer = 'adam')
  model.fit(x_train, y_train, validation_data = (x_test, y_test), verbose= 0, epochs= EPOCHS)
  pred = model.predict(x_test)
  
  oos_y.append(y_test)
  oos_pred.append(pred)
  
  score = np.sqrt(metrics.mean_squared_error(pred, y_test))
  print(f"Fold score (RMSE) : {score}")

oos_y = np.concatenate(oos_y)
oos_pred = np.concatenate(oos_pred)
score = np.sqrt(metrics.mean_squared_error(oos_pred, oos_y))
print(f"Final, out of sample score (RMSE) : {score}")

oos_y = pd.DataFrame(oos_y)
oos_pred = pd.DataFrame(oos_pred)
oosDF = pd.concat([df, oos_y, oos_pred], axis = 1)

oosDF.to_csv(filename_write, index = False)
728x90
반응형
LIST

'DNN with Keras > Regularization and Dropout' 카테고리의 다른 글

정규화 기술 벤치마킹 (1) (회귀)  (0) 2023.07.24
과적합을 줄이기 위한 드롭아웃  (0) 2023.07.24
홀드아웃 (Holdout) 방법  (0) 2023.07.24
K-Fold Cross-validation  (0) 2023.07.24
L1 / L2 정규화  (0) 2023.07.24