딥러닝의 핵심인 DNN(Deep Neural Networks)은 놀라운 성능을 자랑하지만, 그만큼 고질적인 문제들도 많이 가지고 있습니다. DNN을 무턱대고 깊게 만들다 보면 발생하는 문제들과 그 해결방안들에 대해 친근한 말투로 풀어보겠습니다.
DNN, 무턱대고 깊게 만들면?
Vanishing Gradient 문제
딥러닝 모델이 깊어질수록 자주 마주치는 문제 중 하나가 바로 Vanishing Gradient 문제입니다. 말 그대로 "기울기가 사라지는" 현상인데요, 네트워크의 앞단에서 아무리 신호를 흔들어도 뒤쪽까지 제대로 전달되지 않는 상황입니다. 이는 특히 Sigmoid 함수와 같은 활성화 함수에서 두드러지게 나타납니다.
[그림: Vanishing Gradient 문제 설명]
Sigmoid 함수의 최대 기울기가 1/4밖에 안 되다 보니, 기울기가 앞단에서 소멸해 버리기 쉽습니다. 이렇게 되면 네트워크의 앞단이 업데이트되지 않고, 깊은 구조의 효과를 전혀 볼 수 없게 됩니다. 쉽게 말해, 음식점에서 재료 손질이 엉망이면 아무리 요리를 잘해도 맛이 없을 수밖에 없는 것과 같습니다. 이러한 현상은 오히려 underfitting 문제로 이어질 수 있습니다.
ReLU (Rectified Linear Unit)
Vanishing Gradient 문제를 해결하는 대표적인 방법은 ReLU (Rectified Linear Unit) 함수를 사용하는 것입니다. ReLU 함수는 0 이하의 값을 0으로, 그 이상은 그 값 그대로 반환하여 기울기 소멸 문제를 어느 정도 해결해줍니다.
[그림: ReLU 함수 그래프]
Vanishing Gradient 해결방안들
ReLU로 바꾸자
ReLU 함수를 사용하면 기울기가 0이 아닌 경우가 많아져서 Vanishing Gradient 문제를 완화할 수 있습니다. 하지만 이것만으로는 부족할 수 있습니다.
Batch Normalization, Layer Normalization
Batch Normalization(BN)과 Layer Normalization(LN)도 도움이 됩니다. 이 기법들은 각 레이어의 출력을 정규화하여 학습의 안정성을 높이고 Vanishing Gradient 문제를 완화합니다. 쉽게 말해, 양념을 적절히 뿌려서 재료의 맛을 살리면서도 균형 잡힌 요리를 만드는 것과 비슷합니다.
[그림: Batch Normalization의 동작 방식]
하지만 ReLU와 BN을 사용한다고 해서 무작정 네트워크를 깊게 만들 수 있는 것은 아닙니다. 네트워크가 깊어질수록 Loss Landscape가 복잡해져서 또 다른 underfitting 문제가 생길 수 있기 때문입니다.
Overfitting
: Training 때는 잘하는데 Test 때는 성능이 떨어지는 현상을 Overfitting이라고 합니다. 이는 모델이 학습 데이터에 너무 치중해서 일반화 능력이 떨어지기 때문입니다.
[그림: Overfitting의 예시 (Training Loss와 Test Loss 그래프)]
Overfitting 방지 - 모델 경량화
모델 단순화
입력과 출력 간의 관계를 너무 복잡하게 생각하지 말고, 모델을 단순하게 만들어야 합니다. 이는 복잡한 요리를 단순하게 바꾸는 것과 비슷합니다.
[그림: 복잡한 모델과 단순한 모델 비교]
Overfitting 방지 - Data Augmentation
데이터 증강
Data Augmentation은 학습 데이터를 늘려서 모델이 더 다양한 데이터를 학습하도록 하는 방법입니다. 이는 기존의 데이터를 조금씩 변형하여 새로운 데이터를 만들어내는 것을 의미합니다. 예를 들어, 이미지 데이터라면 회전, 이동, 확대 등의 방법을 사용할 수 있습니다.
[그림: Data Augmentation의 다양한 방법]
Overfitting 방지 - Dropout
랜덤하게 노드 가리기
Dropout은 학습 중에 랜덤하게 일부 노드를 가려서 학습하는 방법입니다. 이렇게 하면 서로 다른 작은 네트워크를 여러 개 학습시키는 효과가 있습니다. 테스트할 때는 이 작은 네트워크들의 출력을 평균내서 사용합니다.
[그림: Dropout의 동작 원리]
특정 레이어에 Dropout을 적용하고, 레이어별로 p 값을 정합니다 (이 값은 하이퍼파라미터입니다).
데이터를 네트워크에 통과시킬 때마다 활성화할 노드를 다시 고릅니다.
쉽게 말해, 팀 프로젝트에서 몇 명이 연차를 써도 일이 잘 돌아가게 훈련시키는 것과 같습니다. 테스트 때는 모두가 출근해서 일을 하게 됩니다. 이 방법은 모델이 특정 노드에 의존하지 않고, 모든 노드가 고루 훈련되도록 합니다.
Dropconnect
Connection 가리기
Dropconnect는 노드의 팔, 다리(연결)를 가리는 방법입니다. 이는 양손잡이 훈련과 비슷합니다. 한쪽 손이 없어도 다른 손으로 일을 잘 할 수 있도록 훈련하는 것이죠.
[그림: Dropconnect의 동작 원리]
Overfitting 방지 - Regularization
Regularization 기법
Regularization은 손실 함수에 가중치의 크기를 더해서 함께 고려하는 방법입니다. 즉, 대신 를 손실 함수로 사용하는 것입니다. 여기서 p가 2면 L2-regularization, p가 1이면 L1-regularization입니다.
가 너무 크면 모델이 너무 단순해지고, 너무 작으면 복잡해집니다. 이 값도 하이퍼파라미터입니다.
L2-regularization은 가중치의 크기를 비슷하게 만들어서 노드들을 골고루 사용하게 합니다.
L1-regularization은 일부 가중치를 0으로 만들어서 중요한 연결만 남기게 합니다.
[그림: L1, L2 Regularization 비교]
Overfitting 방지 방법들 요약
모델을 더 단순하게 (쉬운 문제는 쉽게 해결!)
데이터 더 수집 혹은 데이터 증강 (Data Augmentation)
Validation 데이터 기준, 가장 성능이 좋을 때 모델 저장
Dropout, Dropconnect
Regularization (L2, L1)
DNN을 다룰 때는 이러한 고질적인 문제들을 항상 염두에 두고 모델을 설계하고 학습시켜야 합니다. 이 글이 여러분의 DNN 모델링에 도움이 되길 바랍니다!