01과적합을 막는 방법들
1. 데이터의 양 늘리기
데이터 증식 또는 증강을 사용하기도 함.
2. 모델의 복잡도 줄이기
class Architecture1(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(Architecture1, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
self.relu = nn.ReLU()
self.fc3 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
out = self.relu(out)
out = self.fc3(out)
return out
3개의 선형 레이어를 가진 모델의 과적합 현상이 보인다면 다음과 같이 신경망의 복잡도를 줄일 수 있음.
class Architecture1(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(Architecture1, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out
2개의 선형 레이어를 가지고 있음.
- 인공신경망에서는 모델에 있는 매개변수들의 수를 모델의 수용력이라고 하기도 함.
3. 가중치 규제하기
복잡한 모델을 더 간단하게 하는 방법으로 가중치 규제가 있다.
- L1 규제 : 가중치 w들의 절대값 합계를 비용 함수에 추가. L1 노름이라고도 함
- L2 규제 : 모든 가중치 w들의 제곱합을 비용 함수에 추가. L2 노름이라고도 함
두 식 모두 비용함수가 최소가 되기 위해서 w들의 값이 작아야 함. (규제의 의미)
L1규제는 어떤 특성들이 모델에 영향을 주고 있는지를 정확히 판단할때, L2는 이런 판단이 없을때 더 잘 동작함. L2 규제는 가중치 감소(weight_decay) 라고도 함.
파이토치에서는 옵티마이저의 weight_decay 매개변수를 설정함. weight_decay 매개변수의 기본값은 0
model = Architecture1(10, 20, 1)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4, weight_decay=1e-5)
4. 드롭아웃(Dropout)
학습 과정에서 신경망의 일부를 사용하지 않는 방법.
예를들어 0.5로 설정하면 절반의 뉴런을 사용하지 않는다는 의미
보통 학습스에만 사용하고, 예측 시에는 사용하지 않는 것이 일반적
02기울기 소실(Gradient Vaniching)과 폭주(Exploding)
- 기울기 소실 : 입력층에 가까운 층들에서 가중치들이 업데이트가 제대로 되지 않으면 결국 최적의 모델을 찾을 수 없게 되는것
- 기울기 폭주 : 기울기가 점차 커지더니 가중치들이 비정상적으로 큰 값이 되면서 발산(주로 RNN에서 발생)
1. ReLU와 ReLU의 변형들
- 은닉층에서는 시그모이드 사용 하지 말것
- Leaky ReLU를 사용하면 모든 입력값에 대해서 기울기가 0에 수렴하지 않아 죽은 ReLU 문제를 해결
- 은닉층에서는 ReLU나 Leaky ReLU와 같은 ReLU 함수의 변형들을 사용.
2. 가중치 초기화(Weight initialization)
가중치 초기화만 잘 해줘도 기울기 소실 문제를 해결할 수 있음.
1. 세이비어 초기화(Xavier Initialization)
균등 분포와 정규 분포로 초기화 할 때 두가지 경우로 나눔. 이전층의 뉴런의 개수와 다음층의 뉴런 개수를 가지고 식을 세움.
시그모이드 함수와 같이 사용할 경우에 좋은 성능을 보이지만, ReLU와 함께 사용할 경우에는 성능이 좋지 않음.
2. He 초기화(He initialization)
세이비어 초기화와 다르게 다음 층의 뉴런의 수를 반영하지 않음.
- 시그모이드 함수나 하이퍼볼릭 탄젠트 함수를 사용할 경우에는 세이비어 초기화 방법이 효율적
- ReLU 계열 함수를 사용할 경우 He 초기화 방법이 효율적
- ReLU + He 초기화 방법이 좀 더 보편적.
3. 배치 정규화(Batch Normalization)
인공 신경망의 각 층에 들어가는 입력을 평균과 분산으로 정규화하여 학습을 효율적으로 만듦.
1. 내부 공변량 변화(Internal Covariate Shift)
- 내부 공변량 변화 : 학습 과정에서 층 별로 입력 데이터 분포가 달라지는 현상.
2. 배치 정규화
입력에 대해 평균을 0으로 만들고, 정규화를 함. 정규화된 데이터에 대해서 스케일과 시프트를 수행.
- 배치 정규화를 사용하면 시그모이드 함수나 하이퍼볼릭 탄젠트 함수를 사용하더라도 기울기 소실 문제가 크게 개선됨.
- 가중치 초기화에 훨씬 덜 민감
3. 한계
- 미니 배치 크기에 의존적 (작은 미니배치 보다는 크기가 어느정도 되는 미니 배치에서 하는 것이 좋음.)
- RNN에 적용하기 어렵다. ()
4. 층 정규화(Layer Normalization)
'AI' 카테고리의 다른 글
CNN으로 mnist 분류하기 (0) | 2021.05.02 |
---|---|
CNN (0) | 2021.05.02 |
댓글