32. Dropout 과 앙상블 (lec 10-3)


Deep Learning 잘 하기, 세 번째 시간.


layer가 많아질 때 발생하는 대표적인 문제점은 overfitting. 그림 왼쪽처럼 정확하게 분류하려 하지 말고 어느 정도의 오차를 허용해야 하는데, 그림 오른쪽처럼 선을 지나치게 구불려서 지나치게 잘 분류가 되는 것처럼 보일 때, overfitting이라 한다.


overfitting을 확인할 수 있는 방법이 있을까? 파란색으로 그려진 선은 training set에 대해 동작하는 오차(error)를 나타내고 빨간색으로 그려진 선은 실제 데이터에 대해 동작하는 오차를 나타낸다. 이번 그래프에서 x축은 weight(layer), y축은 error다.

overfitting된 모델은 layer의 갯수가 어느 정도일 때까지는 잘 동작하지만, 그 선을 넘어가는 순간부터는 오히려 오차가 증가하는 모습을 보인다. training에서는 99%의 예측을 하지만, test에서는 85% 정도의 빈약한 모습을 보여주고 있다.


overfitting을 방지하는 3가지 방법.

첫 번째 : training data를 많이 모으는 것이다. 데이터가 많으면 training set, validation set, test set으로 나누어서 진행할 수 있고, 영역별 데이터의 크기도 커지기 때문에 overfitting 확률이 낮아진다. 달리 생각하면 overfitting을 판단하기가 쉬워지기 때문에 정확한 모델을 만들 수 있다고 볼 수도 있다.

두 번째 : feature의 갯수를 줄이는 것이다. 이들 문제는 multinomial classification에서도 다뤘었는데, 서로 비중이 다른 feature가 섞여서 weight에 대해 경합을 하면 오히려 좋지 않은 결과가 나왔었다. 그래서, feature 갯수를 줄이는 것이 중요한데, 이 부분은 deep learning에서는 중요하지 않다고 말씀하셨다. deep learning은 sigmoid 대신 LeRU 함수 계열을 사용하는 것도 있고 바로 뒤에 나오는 dropout을 통해 feature를 스스로 줄일 수 있는 방법도 있기 때문에.

세 번째 : regularization. 앞에서는 weight이 너무 큰 값을 갖지 못하도록 제한하기 위한 방법으로 설명했다. 이 방법을 사용하면 weight이 커지지 않기 때문에 선이 구부러지는 형태를 피할 수 있다.


regularization에서 가장 많이 사용하는 l2reg(엘투 regularization)이라고 부르는 방법을 보여준다. 앞에 있는 람다(λ)의 값을 보통 0.001로 주는데, 중요하게 생각한다면 0.01도 가능하고, 진짜 너무너무 중요하다면 0.1로 줄 수도 있다고 설명하셨다. deep learning에서도 overfitting을 막기 위한 좋은 방법이라고 하셨다.

그런데, 람다의 값을 0.001로 준다면 1/1000만 반영한다는 말인데, weight의 제곱 합계이기 때문에 이 정도만으로도 충분한 영향력을 행사할 수 있다. 0.1을 준다면 얼마나 중요하게 생각하는지 상상할 수도 없다.


deep learning에서 overfitting을 줄이는 두 번째 방법으로 dropout이 있다. dropout을 사전에서 찾아보면 탈락, 낙오라고 되어 있다. 전체 weight을 계산에 참여시키는 것이 아니라 layer에 포함된 weight 중에서 일부만 참여시키는 것이다. 전혀 동작하지 않을 것 같지만, 굉장히 좋은 성능을 낸다.


forward pass로 데이터를 전달할 때, 난수를 사용해서 일부 neuron을 0으로 만드는 방법이라고 설명하고 있다. 특정 neuron을 제외하는 것보다 0으로 만들면 제외한 것과 같은 효과가 난다.


제목을 보면.. 글쓴 이도 놀라고 있다. 어떻게 이게 좋은 생각일 수 있을까?

전문가들이 너무 많다고 가정하자. 귀만 판단하는 전문가, 꼬리만 판단하는 전문가 등등 너무 많은 weight이 있다면, 이들 중 일부만 사용해도 충분히 결과를 낼 수 있다. 오히려 이들 중에서 충분할 만큼의 전문가만 선출해서 반복적으로 결과를 낸다면, 오히려 균형 잡힌 훌륭한 결과가 나올 수도 있다.

한국 속담에 딱 맞는 말이 있다. "사공이 많으면 배가 산으로 간다". 머신러닝을 공부하는 과정에서 많이 듣게 되는 용어가 균형(balance)일 수 있다. 여러 가지 방법 또는 시도를 통한 균형을 잡을 때, 좋은 성능이 난다고 알려져 있다.


tensorflow는 dropout 구현을 이미 해놓았다. relu를 호출한 후에 다음 layer에 전달하기 전에 dropout 함수를 호출하기만 하면 된다.

이번 그림에서 약간 착오가 있는 것이 dropout에 전달되는 값은 0부터 1 사이의 값으로, 사용하려고 하는 비율을 말한다. 전체 weight을 사용할 때 1을 사용한다. 이 말은 dropout을 사용하지 않겠다는 말과 같다. TRAIN 항목에 사용된 0.7은 70%의 weight을 사용하겠다는 뜻이다.


overfitting을 피한다는 말은 무엇을 뜻하는 것일까? 실제 데이터에 대해 좋은 결과를 낸다는 말이다.

데이터가 많고, 컴퓨터도 많다면 앙상블(ensemble) 방법도 가능하다. 데이터를 여러 개의 training set으로 나누어서 동시에 학습을 진행해서, 모든 training set에 대한 학습이 끝나면 결과를 통합하는 방법이다.

ensemble은 여러 전문가들에게 동시에 자문을 받기에 충분히 타당한 방법으로 보인다. 이 방법을 사용하면 최소 2%에서 4~5%까지의 성능이 향상된다고 말씀하셨다. 여러 번의 시도를 거쳐 균형 잡힌 결과를 만들어 낸다는 점에서 dropout과 비슷한 부분이 있다.