드럽아웃(dropout)은 토론토 대한의 제프리 힌튼과 그의 학생들이 개발했습니다. 신경망을 위해 사용되는 규제 기법 중에 가장 효과적이고 널리 사용되는 방법 중 하나입니다. 네트워크 층에 드롭아웃을 적용하면 훈련하는 동안 무작위로 층의 일부 출력 특성을 제외시킵니다(0으로 만든빈다). 한 층이 정상적으로 훈련하는 동안에는 어떤 입력 샘플에 대해 [0.2, 0.5, 1.3, 0.8, 1.1] 백터를 출력한다고 가정합시다. 드롭아웃을 적용하면 이 벡터의 일부가 무작위로 0으로 바뀝니다. 예를 들어 [0, 0.5, 1.3, 0, 1.1]이 됩니다. 드롭아웃 비율은 0이 될 특성의 비율입니다. 봍농 0.2에서 0.5 사이로 지정됩니다. 테스트 단계에선느 어떤 유닛도 드롭아웃되지 않습니다. 그 대신에 층의 출력을 드롭아웃 비율에 비례하여 줄여 줍니다. 훈련할 때보다 더 많은 유닛이 활성화되기 때문입니다.
크기가 (batch_size, features)인 한 층의 출력을 담고 있는 넘파이 행렬을 생각해 보겠습니다. 훈련할 때는 이 행렬 값의 일부가 랜덤하게 0이 됩니다.
layer_output *= np.ramdom.randint(0, high=2, size=layer_output.shape)..훈련할 때 유닛의 출력중
50%를 버립니다.
테스트 할 때는 드롭아웃 비율로 출력을 낮추어 주어야 합니다. 여기에서는 0.5배만큼 스케일을 조정했습니다(앞에서 절반의 유닛을 드롭아웃했으므로).
layer_output *= 0.5 ....테스트 단계
훈련 단계에 이 두 연산을 포함시켜 테스트 단계에는 출력을 그대로 두도록 구현할 수 있습니다. 실제로 종종 이런 방식으로 구현합니다(그림 4-8 참고).
layer_output *= np.random.randint(0, high=2, size=layer_output.shape) ..훈련단계
layer_output /= 0.5 .........여기에서 스케일을 낮추는 대신 높입니다.
이 기업이 이상하고 무 계획으로 보일 수 있습니다. 왜 드롭아웃이 과대 적합을 줄이는 데 도움이 될까요? 힌튼은 은행에서 사용하는 부정 방지 매커니즘에서 착안했다고 합니다. 그의 말을 빌리면 "은행에 갔을 때 행원들이 계속 바뀌길래 왜 그런지를 물었습니다. 자신들도 이유는 모르지만 자주 업무가 바뀐다고 했습니다. 나는 은행에서 부정 행위를 하려면 직원들 사이의 유대가 필요하기 때문이라 판단했습니다. 각 샘플에 대해 뉴런의 일부를 무작위하게 제거하면 뉴런의 부정한 협업을 방지하고 결국 과대 적합을 감소시킨다는 것을 깨달았습니다." 핵심 아이디어는 층의 출력 값에 노이즈를 추가하여 중요하지 않은 우연한 패턴(힌튼이 이야기한 부정한 협업)을 깨뜨리는 것입니다. 노이즈가 없다면 네트워크가 이 패턴을 기억하기 시작할 것입니다.
케라스에서는 층의 출려 바로 뒤에 Dropout 층을 추가하여 네트워크에 드롭아웃을 적용할 수 있습니다.
model.add(layers.Dropout(0.5))
IMDB 네트워크에 2개의 Dropout 층을 추가하고 과대적합을 얼마나 줄여 주는지 확인해 보겠습니다.
model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape(1000, )))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16, activastion='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))
정리하면 신경망에서 과대적합을 방지하기 위해 가장 널리 사용하는 방법은 다음과 같습니다.
1) 훈련 데이터를 더 모읍니다.
2) 네트워크의 용량을 감소시킵니다.
3) 가중치 규제를 추가합니다.
4) 드롭아웃을 추가합니다.
댓글 없음:
댓글 쓰기