본문 바로가기

Data Science/Deep Learning

딥러닝 모델 개선 | 4.Batch Normalization (배치정규화)

딥러닝 모델 개선 방법

  1. Epoch 수와 과적합
  2. DNN 모델 크기 변경
  3. Dropout Layer 추가를 통한 Overfitting 규제
  4. Batch Normalization (배치정규화)
  5. Optimizer의 Learning rate(학습율) 조정을 통한 성능 향상
  6. Hyper parameter tuning

Batch Normalization (배치정규화)

  • 각 Layer에서 출력된 값을 평균 = 0 ,표준편차 =1 로 정규화하여 각 Layer의 입력 분포를 균일하게 만들어 준다.
  • 적용 방식 :배치정규화는 입력 데이터와 파라미터의 가중합을 구한 결과에 적용한 뒤 그 결과를 Activation 함수에 전달한다. 가중합 결과에 대해서 -> 미니배치의 평균과 분산을 구한 다음-> 감마를 곱하고 베타를 더해서 정규화를 진행해 입력 분포를 (평균:0, 표준편차:1)상태로 유지한다.

감마(scale)와 베타(shift) 값은 학습과정에서 최적화 되는 값이다. 즉, Backpropagation을 통해서 학습이 된다.

 

 

Internal Covariate Shift(내부 공변량 변화) 문제

  • 학습 과정에서 각 층을 통과할 때마다 입력 데이터 분포가 달라지는 현상
  • 입력 데이터의 분포가 정규푼포여도 레이어를 통과하면서 그 분포가 바뀌어 성능이 떨어진다
    배치정규화로 해결 : 각 레이어에서 입력 분포를 정규분포의 평균과 표준편차로 정규화 : 입력 분포를 안정화시켜 성능 향상
  • 레이어가 많아질 수록 내부 공변량 변화문제가 커지므로, 레이어가 많은 모델에서 효과적이다(최근모델)

효과

  • 랜덤하게 생성되는 초기가중치에 대한 영향력을 줄임
  • 과대적합에 대한 규제 효과를 줌
  • Gradient Vanishing, Gradient Exploding을 막아줌

 

 

Batch nomalization 예제

- Linear함수의 출력값에 BatchNorm을 통해 정규화를 진행한 후 Activation함수에 전달
+ Dropout layer를 추가하면 성능 향상

 
1. 모델 정의 2. 모델 객체 생성 → 3. 손실함수 정의+ 최적화 함수 정의4. 학습(module.fit) 
 
1. 모델정의  Linear -> BatchNorm -> Activation (-> Dropout)
 
class BNModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.b1 = nn.Sequential(nn.Linear(784, 256),
                                nn.BatchNorm1d(256), # 입력: 1차원 -> feature수
                                nn.ReLU()
                               )
        self.b2 = nn.Sequential(nn.Linear(256, 128),
                                nn.BatchNorm1d(128),
                                nn.ReLU())
        self.b3 = nn.Sequential(nn.Linear(128, 64),
                                nn.BatchNorm1d(64),
                                nn.ReLU())
        self.output = nn.Linear(64, 10)
       
    def forward(self, X):
        out = nn.Flatten()(X)
        out = self.b1(out)
        out = self.b2(out)
        out = self.b3(out)
        out = self.output(out)
        return out
 
 
2. 모델 객체 생성
 
bn_model = BNModel().to(device)
torchinfo.summary(bn_model, (BATCH_SIZE, 1, 28, 28))
 
3. 손실함수, 최적화함수 설정 -> 4. 모델 학습
 
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(bn_model.parameters(), lr=LR)

result_bn = train.fit(train_loader, test_loader, bn_model, loss_fn, optimizer,
                     N_EPOCH, save_best_model=False, early_stopping=False,
                     device=device, mode='multi')