1. 트레이닝 셋 정확도는 계속 올라가는 걸로 보아 representation capacity가 부족한 것은 아니다.
2. 테스트 셋 정확도는 일정 에폭을 넘어가면 줄어드는 것으로 보아 overfitting이 굉장히 많이 일어나고 있다.
정도입니다. 이제 알아보고 싶은 것은 다음과 같습니다.
1. 단순히 regularization을 더해주기만 하면 성능이 어디까지 개선될까?
2. LeNet, AlexNet, VGG 등등 성공을 거두었던 모델 아키텍쳐를 들고 오면 성능이 개선될까?
3. 어디서 문제가 발생하고 있는지 시각화할 수 있는 방법은 없을까?
등등입니다. 시간을 많이 투자해서 생각해보면 좋을 것들이지만 빠른 캐치업을 위해 논문을 참고하는 것도 방법일 것 같고... 음.. 적당히 배합해서 하고싶은 대로 해볼게요!!ㅋㅋ
현재까지 가장 높은 테스트셋 정확도를 보여준 아키텍쳐는
Conv 32 / Dropout(0.5) / Batch Norm / FC 256 / Dropout(0.5) / FC 100
입니다. 이 모델로는 29.4까지 기록했습니다. 리더보드의 non extra data highest performance인 88.4%와는 엄청난 차이네요...ㅠ 아무튼! 원래 있던 모델에 regularization만 더해도 조금씩이지만 정확도가 올라가기는 하네요. 그렇지만 분명히 한계가 있어보입니다. 데이터의 양이 충분히 많다면 훨씬 테스트셋의 정확도도 올라갈 것 같긴 한데, 목표는 주어진 데이터셋 내에서 최대한 generalization을 잘 하는 모델을 만드는 것입니다. 실전에서는 이런 상황에 많이 부딪힐 테니까요. 제가 가공하고자 하는 금융 데이터도 이런 문제에 정말 많이 맞닥뜨릴 게 분명합니다. 그래서 미리 연습해보고자 합니다.
29.4를 기록한 모델의 마지막 레이어 직전에 Batchnorm을 더해보았는데 오히려 정확도가 미세하게 떨어졌습니다. 단순무식하게 regularization을 더한다고 해서 정확도가 올라가지는 않는 것 같네요.
이번에는 이전에 성공을 거두었던 모델들을 들고 시도해보았습니다. AlexNet / VGG는 input size가 224*224*3이라서 우선 32*32를 사용한 LeNet에서 먼저 차용해보았습니다.
LeNet은 32*32*1데이터를 분류하기 위해 만들어졌는데, 구조를 살펴보면
Conv 6(5*5) / AveragePooling(2*2) / Conv16(5*5) / AveragePooling(2*2) / FC120 / FC 84 / FC10
으로 구성되어 있습니다. 저희는 마지막 출력층이 100인데다가 인풋 채널 수가 3이니까 중간중간 노드 숫자를 올려보았습니다. 대충 어림 잡아 넣어본 값은
Conv 64(5*5) / AvgPool / Conv 128 / AvgPool / FC 512 / FC 256 / FC 100
으로 돌려보았습니다. 파라미터 수는 엄청나게 늘었겠네요...
그래도 AvgPooling이랑 valid padding으로 두었으니 돌려보지 못할 정도는 아닐거라 생각합니다.
코드가 돌아가는 중인데 결과를 보기 전에 예상해보자면 regularization을 넣지 않았으니 overfitting이 심하게 일어날 것 같다는 생각이 듭니다. 음 우선 첫 에폭 이후의 결과를 보았는데 그렇게 좋진 못하네요. 아마도 Batch norm이랑 Dropout을 적당히 섞어야 할 것 같아요. 우선 결과를 보고 생각해보도록 하겠습니다. 대충 테스트셋 정확도는 대충 25 언저리에 마무리가 되네요.
음 BN이랑 Dropout을 어디에 넣을지 고민하다가 Conv랑 AvgPool 사이에 BN하나 DR하나 껴넣었는데 이 위치에 대해서는 좀 살펴봐야 할 것 같아요. 우선 그렇게 넣고 돌려보니 이전 모델보다는 테스트셋 정확도가 상승했습니다. 31.2을 기록했네요. 이전 최고기록인 29.4는 넘긴했는데 그렇게 유의미한 상승은 아닌 것 같습니다. 생각보다 많이 오르지는 않았네요. 좀 아예 구조적으로 다른 모델을 이용해야 할 것 같아요. 최근에 읽었던 책에서 나왔던 말인데, '성능을 10% 향상시키는 것보다 10배 향상시키는 게 더 쉬운 경우가 많다.' 여기에서도 비슷하지 않을까 싶어요. 이 모델 구조를 유지한 채로hyperparameter 튜닝을 해서 어찌저찌 35%까지 올리는 데 드는 노력보다 아예 모델 구조를 바꿔서 성능을 대폭 올릴 수 있기를 기대해봅시다.
이번에는 resnet을 흉내내서, 적당히 코랩으로 돌릴 수 있을 만한 사이즈로 residual을 만들어서 돌려봤습니다. 구조는 다음과 같습니다.
Conv 64(3*3) / Block / Block / AvgPool / FC 256 / FC 100
Block - 1: Conv 64(3*3) / 2: Conv 64(3*3) / 3: Conv 64(3*3) / 0+3 (resnet 흉내낸 부분) / Batch Norm
이렇게 구성해보았는데요, 성능이 올라가긴 했는데 큰 차이는 없는 것 같습니다. 최고 기록으로는 테스트셋 정확도 33.68을 기록했습니다. 돌리는 시간은 굉장히 오래 걸렸는데 생각보다 아쉬운 결과를 얻었습니다.
resnet에서는 residual block 수가 굉장히 많다는 점을 고려해서, 블록수를 늘려서 돌려보았습니다. 많은 수는 아니지만 블록 수를 두 배 늘려서 4개로 돌려보았습니다. 에폭 한번 돌리는데 거의 한 시간 가량이 들어가네요....ㅎㄷㄷ 그런데도 생각보다 성능이 잘 개선되지 않는 것 같아요. 으음 이유가 뭘까요..ㅠ
깊이를 더 깊게 해보려고 했는데 돌리는 데 시간이 너무 오래 걸려서 포기하고, 이젠 그럼 실제 resnet하고 제 모델의 차이점을 분석하면서 왜 제 모델은 안되었는지? 궁극적인 차이는 무엇이었는지 살펴보도록 하겠습니다.
우선 현재 버전은 포기상태 그대로 깃헙에 업로드를 해놓겠습니다....ㅠㅠ(아 박젠가)
깃헙 링크 -
https://github.com/Eternity402/Cylab-Diary/blob/master/CD04~CD07-Study_EX(CNN).ipynb
이번에는 resnet을 흉내내서, 적당히 코랩으로 돌릴 수 있을 만한 사이즈로 residual을 만들어서 돌려봤습니다. 구조는 다음과 같습니다.
Conv 64(3*3) / Block / Block / AvgPool / FC 256 / FC 100
Block - 1: Conv 64(3*3) / 2: Conv 64(3*3) / 3: Conv 64(3*3) / 0+3 (resnet 흉내낸 부분) / Batch Norm
이렇게 구성해보았는데요, 성능이 올라가긴 했는데 큰 차이는 없는 것 같습니다. 최고 기록으로는 테스트셋 정확도 33.68을 기록했습니다. 돌리는 시간은 굉장히 오래 걸렸는데 생각보다 아쉬운 결과를 얻었습니다.
resnet에서는 residual block 수가 굉장히 많다는 점을 고려해서, 블록수를 늘려서 돌려보았습니다. 많은 수는 아니지만 블록 수를 두 배 늘려서 4개로 돌려보았습니다. 에폭 한번 돌리는데 거의 한 시간 가량이 들어가네요....ㅎㄷㄷ 그런데도 생각보다 성능이 잘 개선되지 않는 것 같아요. 으음 이유가 뭘까요..ㅠ
깊이를 더 깊게 해보려고 했는데 돌리는 데 시간이 너무 오래 걸려서 포기하고, 이젠 그럼 실제 resnet하고 제 모델의 차이점을 분석하면서 왜 제 모델은 안되었는지? 궁극적인 차이는 무엇이었는지 살펴보도록 하겠습니다.
우선 현재 버전은 포기상태 그대로 깃헙에 업로드를 해놓겠습니다....ㅠㅠ(아 박젠가)
깃헙 링크 -
https://github.com/Eternity402/Cylab-Diary/blob/master/CD04~CD07-Study_EX(CNN).ipynb
댓글 없음:
댓글 쓰기