딥러닝의 고질병, Overfitting(과적합) 해결 팁!
네이버 블로그에 포스팅한 글 중 가장 조회수가 높았던, 끊임없이 검색 유입되었던 글이다. 딥러닝을 접하는 누구라도 꼭 한 번은 만나게 될 과적합 문제. 2020년도 1학기 통계학과 딥러닝 전공수업을 수강하면서 얻은 팁들을 이곳에도 공유하고자 한다.
딥러닝 모델을 돌리다보면 필연적으로 만나게 되는 과적합. 오버피팅. overfitting.
좋은 모델을 만드는건 모델의 성능을 높이는 것이고, 이는 과적합을 해결하는 것과 상당한 연관성을 가진다. 과적합 없이 성능을 높이는게 핵심이기 때문이다. 하지만, 모델의 층을 늘릴수록, 즉 더욱 깊은 모델을 구성할수록 필요한 Stop Loss 조정 파라미터(모수)의 개수가 늘어나고, 이렇게 되면 train data에만 딱 들어맞지, 처음 보는 test data를 집어넣었을 땐 엉망진창인 모델이 될 가능성이 커진다.
일반적으로 과적합은 모델 학습과정에서 valid loss가 지속적으로 감소하다가 증가하는 지점부터 발생한다고 정의된다. 과적합 없이 모델의 성능을 높이는건 상당히 어려운 일이다. 하이퍼파라미터(초모수)를 조정하며 지속적으로 train과 valid loss, accuracy를 점검해야하는데, 말이 쉽지 하이퍼파라미터 조정하는게 특히 처음 접하는 입장에선 어디부터 어떻게 손을 대야할지 막막한 부분이다.
통계학을 전공하시는 교수님(열정 of 열정맨)은 딥러닝의 고질병 overfitting 문제를 통계학의 관점에서 풀고자 여러 방면으로 고민을 하셨고, 이를 매주 제출하는 과제에 피드백으로 제시해주셨다. 따라서, 이제 언급할 해결책 중 몇 가지는 중요한 통계학적 의미를 내포하고 있다.
그래서 과적합을 어떻게 해결하느냐.
물론! 가장 좋은 방법은 train data의 양을 늘리는 것!
그러나 우리가 데이터를 늘리고 싶다해서 늘릴 수 있는게 아니겠지요. data augmentation(데이터 증식) 방법도 있긴 하지만 이건 순수 데이터를 늘리는게 아니라 train 데이터를 가공해서 새로운 버전을 만드는 방법이기 때문에 논외로 두겠다.
과적합은 모수가 Stop Loss 조정 많아질수록 심화된다. 층이 깊어질 수록(layer 가 늘어날 수록) 모수가 늘어날 수 밖에 없는데.. 그럼 1개의 layer로만 모델을 구성해야하는건가. 그건 "Deep" learning이라고 할 수 없는데? 적게는 3~4개, 많게는 수십개의 층을 쌓아야 하기 때문에 여러가지 규제 기법들을 활용하여 과적합을 해소하고자 하는 것이다. 차례로 만나보도록 하자.
2.1. Dropout (드롭아웃)
랜덤으로 노드를 꺼버리자. 파라미터(모수) 무시해버리기~
학회강의에서 말하기로는 뉴럴넷이 알코올을 먹은 것 마냥 중간 노드 학습을 Stop Loss 조정 끊어버리는 방법이다. 입력값의 일부를 0으로 두기 때문에 역전파시 파라미터 업데이트가 되지 않고, 이는 모형의 불확실성을 증가시켜 과적합 해결에 기여한다.
드롭아웃 비율은 경험적으로 판단할 일, 과적합이 심하지 않다면 0.2~0.5 사이를 추천하고 너무 심하다 싶으면 과감하게 0.8로 설정해보자.
층마다 비율을 얼마나 다르게 해야할지에 대해서도 고민이 될 수 있는데, 나의 경우에는 노드 수가 많은 층의 드롭아웃 비율을 우선적으로 높여준다. 노드 수가 많다는 것은 그만큼 생겨나는 모수가 많아진다는 것이고 이는 과적합을 심화시킬 수 있기 때문이다.
물론 드롭아웃만 한다고 해서 과적합을 해결할 수 있는건 아니다. 아래 등장할 regularization 등의 방법과 같이 적절하게 써야한다. stackoverflow 사이트에 여러 사람들의 경험치가 묻어난 질문과 답변이 많으니 이 부분은 끊임없이 구글링하며 공부하는것이 좋겠다.
2.2. L1(Lasso)/L2(Ridge) Regularization
학습에 기여하지 못하는 모수를 0으로 만들어버리자~
아래 수식과 같이 손실함수에 람다항을 추가해서 일종의 페널티를 주는 방법이다.
L1 Regularization(절댓값)
L2 Regularization(제곱)
자세한 증명은 이 블로그를 참고하길 바란다.
내가 기록하고 싶은 내용은 regularization을 가급적 출력층에 사용하는 것이 좋다는 것이다. 교수님께서는 regularization이 통계학의 가설검정과 유사하다고 하셨는데, 가설검정 시 t값이나 F값, 혹은 p-value를 통해 유의미한 변수인지 아닌지를 판단하는 것처럼 regularization은 loss를 줄이는데 기여하지 못하는 모수를 0(L1) 또는 0에 가까운(L2) 값으로 제한하는 기능을 한다. 보통 L2 regularization이 L1보다 더 많이 쓰인다. 실제로 적용해봤을 때 효과가 두드러지게 나타난 규제기법이었다.
- 교수님: 두 기법은 상호보완관계, 하나만 쓰면 안되고 둘 다 써야한다.
- 구글링: 두 기법은 상호보완 관계, 보통 둘 다 쓰는게 성능이 더 높은데 하나만 쓸지 둘 다 쓸지는 경험적으로 판단할 문제다. 즉, 케바케! 데바데!
2.3. 출력층 직전 은닉층의 노드 수를 줄여라.
출력직전 모수를 줄이는게 가장 효과가 좋다. 왜냐구?
통계학에서 오버피팅을 해결하는 방법은 쓸데없는 변수를 제거해서 입력변수 x의 수를 줄이는 것인데(t-test 등을 통해 significant하지 않은 변수를 제거한다) 통계학의 관점에서 출력층 직전 은닉층 노드 수는 설명변수의 수가 된다. 따라서 의미있는 설명변수들을 남기기 위해/생성하기 위해 출력직전 노드 수를 확 줄여버리는 것이다.
교수님이 고안해내신 교수님만의 방법이라고 하시길래, 상당히 신빙성 있어서 실제로 써봤는데 대체로 잘 먹힌다!
나는 주로 출력 범주의 수가 20이하인 경우, FCL(Fully Connected Layer) 마지막 층의 노드 수를 32로 줄인다. 만약 출력 범주의 수가 100 이상으로 넘어갈 경우엔 그에 맞춰서 마지막 층 노드 수를 결정한다.
cf) 비슷한 이야기로 과적합을 막으려면 모수(parameter)의 수를 줄여야 하는데, 은닉층 자체를 줄이거나 은닉층 노드 수를 줄이면 된다. 이때 터무니없이 막 줄이면 안되고, 조절해보면서 적당한 선을 찾아야 한다. CNN에서는 kernel size, pooling size, filter 수를 줄이면 된다.
2.4. Batch Normalization(배치정규화)
뉴럴넷에서 각 활성함수의 미분값은 역전파 과정에서 계속 곱해지기 때문에 굉장히 중요하다. 시그모이드 함수의 경우 일정수준 이상 혹은 이하의 값이 입력되었을때 미분값이 0에 가깝게 되는데, 이때 파라미터 업데이트과정에서 0에 가까운 값이 지속적으로 곱해지면 vanishing gradient(기울기 소실) 문제가 발생한다. 이렇게 되면 파라미터 업데이트가 거의 일어나지 않고 수렴 속도도 아주 느리게 되어 최적화에 실패하게 되는데, 이 문제를 해결하는 방법으로는 배치정규화 외에도 relu 등의 활성함수를 사용하거나 가중치 초기화(weight initialization)을 적용하는 방법이 있다.
배치정규화는 mini batch 별로 분산과 표준편차를 구해 분포를 조정한다. 역전파시 파라미터 크기에 영향을 받지 않기 때문에 좋다고 한다.
배치정규화는 각 은닉층에서 활성함수 적용 직전에 사용되어야한다. 일반적으로 선형결합-배치정규화-활성함수-드롭아웃 순으로 은닉층 연산이 진행된다.
2.5. 그 외 참고하면 좋을 사항들
1. epoch의 증가는 과적합 해결을 위한 수단이 아니라 모니터링 수단이다.
단순하게 epoch만 늘려주면 train data의 loss는 줄고 accuracy는 높아지기 때문에 train data의 loss와 accuracy는 valid 결과와 비교하기 위한 참고사항일 뿐이다. epoch 수를 늘리면 valid와 train loss가 교차하는 지점이 발생한다. 일반적으로 valid loss가 감소하다가 증가하는 시점을 과적합으로 정의하기 때문에 이 지점에서 적당한 epoch을 결정한다. 이는 early stopping과도 관련이 있다.
2. epoch이 증가하면서 train loss 와 valid loss가 수렴해야 가장 좋다.
교차점에서 epoch을 결정하더라도 train과 최종 test loss와 accuracy를 비교해야한다. 이러한 점검은 cross-validation으로 진행해야한다.
3. batch_size는 과적합과 관련이 없다. 모수의 수렴 문제와 관련이 있다.
배치사이즈가 작을 수록 수렴속도는 느리지만 local minimum에 빠질 가능성은 줄어든다. 반면 배치사이즈가 클 수록 학습진행속도와 수렴속도가 빨라지지만 항상 빨리 수렴하는 것은 아니다. 작은 데이터셋이라면 32가 적당하다고 하는데 이 역시도 구글링하다보면 수많은 의견들이 존재한다. 적당히 참고해가면서 실험해보면 좋겠다.
대부분의 규제 기법들은 모형의 불확실성을 증가시켜 일반화에 용이하도록 만드는 것이었다. 이 원리를 이해하면 흩어져있던 개념들이 한 데 모을 수 있을 것이다.
위 방법들을 사용하면 과적합은 해소되는데 문제는 모델의 전체적인 성능이 상당히 하락하는 경우가 있다. 1학기에 수행했던 과제 기준으로는 코랩에서 10 에폭까지만 학습시키기 때문에 이 문제가 더 두드러지는데, 사실 에폭을 상당히 많이 늘린다면, 즉 학습을 더 오래 시키면 성능이 더 오를 것이라 생각한다. 그리고 실제 모델 학습시킬때 10 에폭은 터무니 없이 작은 수치다..ㅎ 하지만 코랩의 gpu 사양으로 에폭을 크게 두는건. 무리이긴 하다.
딥러닝은 명확한 정답이 없어서 더 어렵게 느껴지지만 과적합에 지지 않도록 다양한 방법을 시도해보도록 하자! 화이팅!
저도 공부하고 있는 입장이라 피드백은 언제나 환영입니다. 혹여 제가 잘못 이해하고 있는 부분이 있다면 지적해주세요.
자연침해조정 (자연자원총량보존)
국내에서 자연자원 총량보존으로 통용되고 있는 개념은 유럽 연합의 NO NET LOSS 에서 유래한다.
NO NET LOSS 는 유럽위원회에서 비교적 최근에 도입한 개념으로서 종다양성 “총량의 손실이 없는 상태”를 추구하는 것이다. 유럽위원회는 늦어도 2020년까지는 더 이상 종 다양성의 손실이 없는 상태에 도달하는 것을 목표로 설정했다. 원칙적으로 NO NET LOSS는 유럽공동체의 환경 목표를 뜻하는 것이며 제도를 말하는 것은 아니다.
즉, 보호지역이나 생물종의 손실을 막고, 손실이 불가피한 경우, 손실되는 만큼의 공간과 생물종을 보충하여 간접적으로 총량을 유지하는 것이다. 여기서 총량보존의 대상이 되는 것은 서식공간 (보호지역)과 생물종 다양성이다. 총량관리의 목표에 도달하기 위해 손실을 멈추는 방법을 취한다. (목표: 2020년 “손실 스톱”)
그러므로 프로젝트나 사업 단위로 총량을 관리한다. 즉 사업이 실시되어 실 훼손이 발생할 때, 그 훼손 분량만큼 다시 채워 넣자는 것이 기본 원리이다. 물론 그 보다 더 우선시 되는 것은 손실 그 자체를 회피하는 것이다.
유럽연합의 자연자원 총량관리 목표, 즉 NO NET LOSS는 독일에서 1976년부터 실시되고 있는 자연침해조정의 기본 이념을 수렴한 것이다. 총량관리는 자연침해조정 외에도 서식지와 생물종 영향평가를 통해 이루어지고 있다.
자연침해조정
자연침해조정이란 공간계획, 개발계획, 사업계획 등의 결과로 자연이 훼손되거나 침해될 것이 예상되는 경우 이를 미연에 방지, 회피하고 회피가 불가능할 경우 침해한만큼 질적, 양적으로 상쇄, 대체 내지는 보상하는 것을 말한다. 독일 자연보호법의 제정과 함께 1976년 처음으로 도입되었다.
자연침해조정은 의 개념이 아니라 의 원칙에 의거한다. 그러므로 계획단계에서 조정하고 사업이 실시되기 이전에 먼저 보상하는 것을 원칙으로 한다. 환경영향평가 등의 도구와 구분되는 점은 자연침해와 이에 대한 상쇄, 대체 내지는 보상의 내용을 정량적으로 산출해야 한다는 데 있다.
자연환경보호와 지속가능한 도시개발을 위해 가장 핵심적인 도구로서 1976년 도입이래 지속적으로 방법론이 개선되었으며 2009년 이후 사업계획 Stop Loss 조정 이전 단계인 건설기본계획, 즉 지구단위계획(B-Plan)에서 이미 실시하도록 규정되었다.
법적 근거
자연침해와 이의 조정원칙 및 방법은 연방자연보호법 13~19조에서 세부적으로 규정하고 있으며 건설법전 1a조와 35조에서도 수렴했다.
2009년 자연보호법이 개정되어 사업계획에 따른 자연침해조정보고서는 자연보호기관의 별도의 승인을 필요로 한다.
자연침해의 범위
어떤 경우 자연침해라 하는지는 연방자연보호법 제 14조에 정의되었다.
(1) 자연과 경관의 침해란 토양이용의 유형이나 토양구조가 변하는 경우, 혹은 토양층과 연결되어 있는 지하수면의 변화를 초래하여 공간의 생태기능이 감소되거나 경관의 아름다움이 훼손되는 경우를 말한다.
(2) 농업, 임업과 어업/수산업의 토지이용의 경우 자연보호와 경관관리의 목표를 존중하는 경우에 한해서 자연침해로 간주하지 않는다. 농업, 임업과 어업/수산업이 본법 5조 2~4항의 규정을 준수하는 경우, 연방토양보호법 17조 2항을 준수하는 경우, 또한 농업, 임업, 수산업의 전문분야에서 통용되는 모범적인 실무원칙을 준수하는 경우 자연보호법의 목표에 어긋나지 않는 것으로 간주한다.
(3) 농업, 임업과 어업/수산업을 아래와 같은 이유로 일시적으로 중단 혹은 축소되었다가 다시 시작하는 경우에도 자연침해로 간주하지 않는다.
1. 관청과의 계약에 의해 사업을 중단했다가 계약이 만료된 후 10년 이내에 다시 시작하는 경우.
2. 환경침해에 대한 대체방안 환경영향이나 자연침해에 대한 보상책은 상쇄, 대체 및 보상의 세 가지 유형이 있다. 상세한 것은 뒤에 별도로 서술하였다.
을 미리 수행하기 위해 중단했으나 대체방안이 실현되지 않은 경우.
위는 원칙적인 정의에 불과하고 각 연방주에서 주의 자연환경적 사회문화적 성격에 따라 구체적으로 정의하고 있다. 즉 각 연방주의 자연보호법에서 어떤 경우에 자연침해가 되는지에 대한 정의를 내리고 있으며 이를 통상 라고 한다. 사례: ⇒ 베를린 주의 자연침해
자연침해조정을 위해 필요한 공간환경정보
침해 내용이나 상쇄, 대체, 보상의 내용을 정량적으로 산출하기 위해서는 침해된 자연에 대한 세부적인 정보가 필요하다. 독일의 경우 기본적으로 많은 자료가 준비되어 있다. 가장 널리 적용되는 것은 비오톱 가치이다.
Stop Loss 조정
요즘 주식하시는 여러분들도 'gme', '게임스탑'이라는 말을 많이 들어보셨을 겁니다.
주가가 엄청나게 폭등하고 있는 주식중에 하나이죠.
raddit이란느 사이트에서 공매도를 혼내주자고 하고 로빈후드들이 공매도 맞은 주식을 역으로 엄청나게 사버려서 주식을 폭등시킨뒤에 공매도를 오히려 숏스퀴즈가 나게 해버리는 것이죠.
일단 주식이 거래량도 엄청나게 많고 시총도 크다면 이런 행동들이 씨알도 안먹히겠지만 덩치가 작은 게임스탑은 로빈후드들이 단합을 하게 된다면 혼내주기에는 충분하다는 것이죠.
공매도는 이익은 한정되어 있지만 손해는 무한정이기 때문에 보통 stop loss를 걸어놓고선 일정주가 이상으로 올라가면 자동으로 팔리고 사진다고 알 고 있습니다. 그런데 시트론이라는 공매도 회사가 공매도를 치고나서 이런 소식으로 한입 하려는 헷지펀드들이 모여서 같이 공매도를 쳤는데 정말 많은 숫자의 로빈후드들이 다 역으로 사버려서 이번에 헷지펀더들의 손해액이 무려 30B$(한화 약3조3535억원) 이라고 합니다.
현재 high short interest.com에 들어가면 가장 공매도 많이 맞은 주식들이 순서대로 나와 있습니다. 얼마나 gme가 공매도를 많이 맞았는지 볼 수 있겠죠.
따라서 증거금을 넣어놔서 다시 공매도에 실패해서 손실을 본 금액을 갚아야하는데 3조3535억원을 마련하기 위해서는 헷지펀더들이 가진 기존의 주식들을 팔아서 현금을 마련해야겠죠. 이런 상황으로 인해서 주가가 폭락했다는 얘기 입니다.
기존 공매도에 필요한 증거금이 20달러라면 그 회사의 주가가 300달러가 될시에 15배의 손실이 발생했기 때문에 기존 증거금의 15배를 다시 마련해야 한다. 만일 증거금을 마련 못할시에는 call이 들어와서 기존에 가지고 있던 주식이 자동으로 팔리고 증거금에 채워진다.
미국증시가 폭락할때 gme나 공매도 맞은 회사들은 폭등해서 어느정도 상관관계가 있는것 같다고 한다.(27일날 gme,amc가 폭등할때 미국증시가 폭락하고 28일날 로빈후드들이 gme,amc를 못팔게해서 폭락하고 29일날 다시 로빈후드들이 거래가 되자 gme,amc가 다시 폭등했다.)
하지만 현재 차매스나 일론머스크 는 28일날 로빈후드들이 거래를 하지 못하게 막은것은 불법이고 있어서는 안될일 이라고 나섰습니다.
간단하게 설명하겠습니다 현재 게임스탑의 시장에 발행되어 있는 주식의 숫자는 6975만개 이다.
gme의 핵시정보
그런데 시장에 돌아다니고 있는 주식의 수는 5103만개인데 나머지는 insider holder인 ceo가 가지고 있어야 하는 숫자이고 거래가 안된다고 보시면 됩니다. 그런데 현재 시장에 공매도 된 주식의 숫자가 6178만개 입니다. (이중에서 1000만개 이상이 무차입 공매도 라는 뜻이다.)그래서 reddit에서 세운 계획은 시장에 돌아다는 주식의 수보다도 훨씬 더 많은 공매도가 들어와 있는데 만일 숏스퀴즈가 난다면 로빈후드들은 엄청난 이득이기 때문입니다.
공매도를 친 헷지펀더들이 부족한 주식을 마련하기 위해서(공매도를 치기위해서 빌린 주식을 되돌려주기 위해서) 더 비싼 가격을 주고서라도 주식을 마련해야 합니다. 이런 상황이 숏스퀴즈로 연결되는 것이죠.
한국에서는 무차입 공매도라고 하는데 차입 공매도는 주식을 빌려서 파는 것이기 때문에 공매도가 안되면 바로 주식을 마련해서 갚으면 되지만 무차입 공매도는 주식을 빌리지도 않고 팔기 때문에 나중에 실물을 마련하기 위해서 고군분투해야 하고 불법이다.
따라서 미국에서 현재 이러한 무차입 공매도에대한 이슈로 법을 고치자고 많은 얘기가 나오고 있는것이다. 우리는 이런 투기의 현장에 뛰어들지 말아야 합니다. 주식은 실적이 기반이 되어야 하는 투자의 영역인데 이런 투기의 영역으로 뛰어든다면 도박과 다를것이 없기 때문이죠. 만일 돈을 잃게 된다면 엄청난 손실을 보실 수도 있을것입니다.
현재 미국에서는 기관과의 전투로 생각하시고 뛰어드시는 분들도 많은데 위험한 싸움이 될것 같습니다. 아마 한쪽은 많은 손실을 보겠죠. 그리고 이 전투가 끝나고 나면 회사의 원래 펀더멘탈과 주가대로 언젠가는 되돌아올 주식입니다.
그리고 미국에서 공매도 비중이 높은 회사는 건들지 말아야한다. 애초에 공매도를 많이 치는 회사는 무슨 이유가 됐건간에 펀더멘털,재정,위험한 요소가 있기에 공매도를 치는것이다.
공매도를 맞는 회사들은 주가가 잠시 오를지라도 조금 지나고 보면 주가가 결국엔 하향곡선을 그리는 경우가 많다.(공매도를 치는 회사들이 뭔가 정보나 주가가 하락할만한 무언가를 알고 있거나 이유가 있어서 노리는 것이다.) 따라서 우리는 차트가 우상향하고 건강한 Stop Loss 조정 회사들을 위주로 거래해야한다.(아마존,애플 과 같은 회사들은 공매도 비중이 1%도 안된다)
1월4일에 18달러 하던 주식이 현재 3주정도만에 20배가량 폭등했다.
가격이 올라가면 올라갈 수록 점점 증가하는 공매도의 비율을 아래 차트에서 볼 수 있다.(왜냐하면 언젠가는 꺼질 거품이고 고점에서 공매도를 치게 되서 다시 18달러로 돌아오게 된다면 얻는 이익이 몇십배이다.)
현재 이러한 게입스탑 현상으로 인해서 월가에는 web-crawling company thinknum에서 reddit과 같은 포럼에서 많이 언급되는 종목을 알려주는것이다. 월가에서 이제 이렇게 많이 거론되는 주식은 피하기 위해서 위와 같은 프로그램도 사고 있는것이다.
따라서 현재 상황은 공매도 치는 회사들이 예전에는 언론플레이를 통해서 겁을주고 다 도망가게 만들었는데 지금은 개미들이 오히려 달려들어서 언론플레이 같은것은 불가능하고 뒤에서 조심히 공매도를 치게 된것이다.(개미들의 승리. )
0 개 댓글