logo

정칙화

딥러닝 정칙화

  • 정칙화(regularization): 모델의 과대적합을 막기 위한 방법들
  • Weight decay: 파라미터를 업데이트할 때마다 줄임
  • Dropout: 일부 파라미터를 훈련에서 배제
  • Batch/Layer Normalization: 레이어의 출력값을 정규화
  • Label Smoothing: 모형 출력의 목표값을 줄임

검증 성능을 기준으로 훈련 시점을 선택하는 방법은 조기 종료와 모델 체크포인트에서 학습.

weight decay

  • 원래의 경사하강법:
  • weight decay: 파라미터를 업데이트를 할 때 가중치를 줄이는 것
  • 손실 함수에 L2 노름을 추가하고, SGD로 파라미터를 업데이트 한 것과 동일
  • 경사하강법 알고리즘에 weight_decay 인자
    • 위 수식의 와 같음(클 수록 더 많이 줄임)

노름 Norm

  • 노름(norm): 길이 또는 크기를 일반화한 개념
  • Lp 노름

L1 노름과 L2 노름의 거리 계산 비교

손실 함수에 노름을 추가하면

  • L1 정칙화(LASSO): 파라미터를 0으로
  • L2 정칙화(Ridge): 파라미터를 전반적으로 작게

L1, L2, L1과 L2 노름이 파라미터에 주는 효과 비교

드롭아웃 dropout

  • 학습 과정에서 배치마다 입력층과 은닉층의 출력값을 무작위로 0으로 대체
  • 특정한 특징에 과적합되는 것을 방지하기 위한 정칙화 방법
  • 드롭아웃의 비율은 0~1 사이에서 조정
  • Keras는 훈련 중 남은 출력값을 배로 보정하는 역 드롭아웃을 사용
    • : 드롭아웃 비율
    • 예측 시에는 모든 출력값을 그대로 사용하고 별도로 크기를 줄이지 않음

드롭아웃 전후 신경망 연결 비교

드롭아웃 적용

model = keras.models.Sequential([
    keras.layers.Rescaling(1/255),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.5), # 드롭아웃 비율 50%
    keras.layers.Dense(10)
])

Normalization

  • 넓은 의미로 통계학에서 변수값의 크기를 일정하게 만들어 주는 것
  • 대표적인 예로 표준화(standardization):
  • : 값
  • : 평균
  • : 표준편차
  • 평균 = 0, 표준편차 = 1이 됨
  • 서로 다른 평균과 표준편차를 가진 변수를 비교하기 쉽게 해줌
  • Normalization은 "정규화"로 많이 번역하나, regularization과 혼동
  • 좁은 의미로 0~1 범위로 변환하는 min-max scaling만을 normalization이라고 쓰는 사람들도 있음
    • 이 경우에는 표준화 ≠ normalization

입력 Normalization

  • 이미지 입력도 Normalization을 해주면 성능에 도움
  • 보통 0255 범위의 픽셀 값을 -1 ~ +1 또는 01 범위로 normalize
  • 특징(feature, 이미지의 경우 픽셀값)에 따라 값의 크기가 매우 다른 경우, 특징들의 값의 범위를 비슷하도록 normalize하면 경사하강법에서 진동이 줄어들어 수렴이 더 빨라짐

평균을 빼고 표준편차로 나눠 입력 데이터를 정규화하는 과정

특징 스케일링 전후 경사하강법 경로 비교

Batch Normalization

  • 각 레이어의 입력도 normalize하면 성능이 향상될 수 있음
  • 모형의 입력과 달리 각 레이어의 입력은 학습 과정에서 매번 해줘야 하므로 계산 비용이 높음
  • batch 단위로 normalize 하여 효율을 향상
  • 종류:
    • Batch Norm: 미니배치 전체에 걸쳐 채널별로 normalize
    • Layer Norm : 각 사례의 모든 채널을 normalize
    • Instance Norm : 각 사례를 채널별로 normalize
    • Group Norm : 각 사례의 채널들을 그룹으로 묶어 normalize

Batch Norm, Layer Norm, Instance Norm, Group Norm의 정규화 단위 비교

Covariance Shift

  • 다층신경망에서는 한 은닉층의 출력이 다른 은닉층의 입력이 됨
  • 학습 과정에서 각 층의 출력이 변화 → 다음 층의 입력이 변화
  • 각 층이 받는 입력이 지속적으로 변화하므로 문제가 됨(covariance shift)
  • BN은 이를 방지하여 학습 효율을 높인다는 지적(아니라는 의견도 있음)

Covariance shift로 데이터 분포가 바뀌는 도식

BN의 효과

  • 포화를 억제
    • 신경망의 활성화 함수는 기울기가 0에 가까운 영역이 존재
    • 신경망의 출력을 일정 범위로 제한하여 포화를 억제
  • 학습 속도 향상
    • 높은 학습률에도 학습이 안정적으로 이뤄짐
    • 활성화 함수에서 포화되는 영역에 빠지는 문제를 피할 수 있음
    • 경사가 사라지거나 폭발하는 문제를 완화
  • 정칙화 효과
    • 배치에 따라 평균과 표준편차가 달라지므로 출력값에 일정한 오차가 생김
    • Dropout과 비슷한 효과 → Dropout을 안 써도 된다 → 학습 속도도 빨라짐

Batch Normalization

model = keras.models.Sequential([
    keras.layers.Rescaling(1/255),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(10)
])

one-hot encoding

  • 머신러닝에서 범주형 변수를 표현하는 방법
  • 사례마다 변수의 값을 범주의 개수와 같은 길이의 벡터로 표현
  • 벡터의 다른 모든 원소는 0(cold)
  • 사례의 범주에 해당하는 원소 하나만 1(hot)
  • 예: 신문 기사를 정치, 사회, 경제, 문화 네 가지 범주로 분류하는 경우
    • 정치 → (1, 0, 0, 0)
    • 사회 → (0, 1, 0, 0)
    • 경제 → (0, 0, 1, 0)
    • 문화 → (0, 0, 0, 1)
  • 범주 하나를 제외해서 벡터의 길이를 -1 한 것은 더미 코딩(dummy coding)이라고 함
    • 예) 사회 → (1, 0, 0) # 정치는 표시 제외
  • 머신러닝에서는 잘 사용하지 않고, 주로 통계에서 사용

label smoothing

  • 레이블은 부정확하게 붙어있을 수 있거나 예외적인 사례일 수 있음
  • 이러한 데이터에 과적합될 경우 모형의 예측력이 떨어짐
  • 원-핫 레이블과 모든 클래스가 같은 균등 분포를 섞는 방법
  • 클래스 수가 이고 스무딩 비율이 일 때 변환식:
  • , 인 예:
keras.losses.BinaryCrossentropy(label_smoothing=0.15) # 이항 분류
keras.losses.CategoricalCrossentropy(label_smoothing=0.15) # 다항 분류
  • keras.losses.SparseCategoricalCrossentropy는 지원X
Previous
Neural Architecture Search