관리 메뉴

개발자의 스터디 노트

MLP로 성씨 분류하기 (4) : MLP 규제 적용하기 본문

파이썬/파이토치 자연어처리

MLP로 성씨 분류하기 (4) : MLP 규제 적용하기

박개발씨 2022. 2. 19. 00:51

심층 신경망 모델(즉 층이 여럿인 모델)에서는 드롭아웃(dropout)이라고 하는 구조적인 규제 방법이 매우 중요합니다.

드롭아웃이란 무엇일까요?

https://heytech.tistory.com/127

 

[딥러닝] Drop-out(드롭아웃)은 무엇이고 왜 사용할까?

안녕하세요, 오늘은 딥러닝에 있어서 Generalization 기법 중 하나인 Drop-out(드롭아웃)에 대해 알아봅니다. 그럼 바로 시작하죠! 학습목표 💡 드롭아웃(Drop-out)이 무엇이고, 왜 사용하는지에 대해 이

heytech.tistory.com

위 포스팅을 참고하면 드롭아웃을 사용함으로써 정규화가 잘된 특정 Feature만을 과도하게 학습함으로써 발생할수 있는 과대적합(Overfitting)을 방지하여 훈련의 안정성을 기대할 수 있습니다.

 

앞서 성씨 분류 MLP 모델에 드롭아웃을 적용해 봅시다.

class MultilayerPerceptron(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        """
        매개변수 :
            input_dim(int): 입력 벡터 크기
            hidden_dim(int) : 첫 번째 Linear 층의 출력 크기
            output_dim(int) : 두 번째 Linear 층의 출력 크기
        """
        super(MultilayerPerceptron, self).__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.fc2 = nn.Linear(hidden_dim, output_dim)
    
    def forward(self, x_in, apply_softmax=False):
        """MLP의 정방향 계산
        
        매개변수:
            x_in (torch.Tensor): 입력 데이터 텐서
                x_in.shape는 (batch, input_dim)입니다.
            apply_softmax (bool): 소프트맥스 활성화 함수를 위한 플래그
                크로스-엔트로피 손실을 사용하려면 False로 지정해야 합니다.
        반환값:
            결과 텐서. tensor.shape은 (batch, output_dim)입니다.
        """
        intermediate_vector = F.relu(self.fc1(x_in))
        prediction_vector = self.fc2(F.dropout(intermediate_vector, p=0.5))

        if apply_softmax:
            prediction_vector = F.softmax(prediction_vector, dim=1)

        return prediction_vector

 

훈련의 정확도를 보면 드롭아웃을 적용하기 전보다 훈련 정확도는 조금 낮아졌지만 훈련 데이터와 시험 데이터에 대한 정확도 차이가 줄어드는것을 확인할 수 있습니다.