본문 바로가기
컴퓨터 사이언스/딥러닝

[딥러닝 뉴비의 좌충우돌 일기] 작은 데이터셋과 augmentation

by 제크와 죠세핀 2020. 11. 10.
반응형

딥러닝 모델들을 학습시키다보면 데이터가 적은 상황에서 학습 성능이 와리가리하는 경우가 종종 발생한다. 예전에 회사에서 몇 안되는 의료 이미지를 학습시켰을 때도 그렇게 느꼈고, 이번에 수업 과제로 음악 장르 맞추기를 하면서 또다시 느꼈다. 모델의 구조를 바꾸든, 하이퍼 파라미터를 바꾸든, 옵티마이저를 바꾸든 성능 향상이 있나? 해서 여러번 실험을 돌려보면 매번 초기화되는 seed 값에 따라서 성능이 휙휙 바뀌었다. 작은 데이터셋(내 기준으로는 augmentation 제외하고 1000개 정도의 이미지)의 경우에는 특히나 그런 게 더 심했다. 이번에 사용했던 GTZAN이라는 음악 장르 데이터셋은 train + val + test해서 730개 정도밖에 되지 않았다. 그러다보니 weight initialization이 어떻게 얻어 걸리냐에 따라 성능이 평균적으로 40~50점 정도 되던 baseline 코드가 다시 돌려보면, 갑자기 60점이 되기도 했다.

 

작은 데이터셋은, 다음과 같은 좋지 않은 학습 플로우를 가진다.

1. 학습 데이터셋이 적어서, general한 패턴을 잘 학습하지 못하고, overfitting한다.

2. 그런데 test set 개수 마저도 적다. -> 한 두개 더 맞고 틀리면 점수 변동이 크다. 즉, 성능이 와리가리한다.

 

그래서 해결방법으로, 모두들 잘 아는 augmentation이 있고, 정말 실제로 이 경우에는 데이터가 2배로 불어나기만 해도, 학습 성능이 많이 올라간다. 적은 데이터셋을 가지고 있으니 offline data augmentation(augmentation을 미리 진행해서 파일로 저장해서 읽는다)도 가능하고, online data augmentation을 하는 것도 가능하다. 딥러닝에서 쓰는 학습 데이터셋이 대체로 GB, 혹은 그 이상의 큼직한 단위가 많아서 offline augmentation을 진행하는 것은 거의 불가능한 것 같긴 하다.

 

offline augmentation이 코드 구현하기에 좀 더 편리한 점도 있지만, 좀 더 augmentation에 랜덤성을 더 넣어주고, 더 많은 데이터를 보여준 효과를 내기 위해서는 online augmentation이 유리하다. 하지만, 수많은 장점(용량을 많이 차지하지 않음 + 좀 더 효과가 좋음)에도 불구하고 online data augmentation을 한다면, 심각한 경우에는 데이터 전처리 + augmentation에 시간이 오래걸려서 너무 고통스럽다. 매 epoch마다 전처리에만 몇시간씩 쓴다면 눈물이 난다. (feat. Music Transformer) 대체로 audio domain이 전처리가 많고 오래걸리는 것 같긴 하고 이미지에서는 별 문제가 안되는 것 같은데, 그래도 비디오는 좀 더 다른 이야기이지 않을까..? 아무튼 이 부분은 memory와 time 간의 trade-off가 극명하게 드러나는 지점이다.

 

그러나, 이상하게도 augmentation에 대해서 구글링을 하면, 상대적으로 모델 구조나 알고리즘보다는 덜 주목을 받아서 그런지 잘 설명되어 있는 글을 찾기 힘들다. 개인적인 직관으로는 augmentation에 대해서 설명하는 부분에서 데이터가 부족하니까 늘이고 줄이고 회전하고 필터도 씌우고 노이즈도 넣고 그러는 거다~라고 할 때 막연하게 모든 파일을 저장해서 진행하는 건가?라는 느낌을 받았다. 현실에서는 dataloader에서 real time으로 Transform()하는 거니까 Transform=True이렇게만 해도 된다. 이미 누가 예쁘게 잘 만들어뒀으니까 그냥 아무 의심없이 그냥 쓰면 되는 느낌이다. 그러나 custom dataset을 다뤄야 한다면 그런 것은 이제 스스로 직접 해야하는 그런 느낌. 커스텀이 어려운 것이 당연한 것에 대해 나만 아쉬워 하는 것 같기도 하지만, 그래서 개인적으로는 처음에 딥러닝 코드를 구현할 때, augmentation에 대해서는 그냥 다들 누가 설명하지 않아도 알아서 잘하는 그런 것(?) 같은 분위기가 풍겨져서 힘들었다. 실무적인 면에서는 굉장히 중요한 이슈인 것 같은데 그런 면에서 좀 신기했던 것 같기도 하고.

 

내 입장에서는, 딥러닝 코드를 짜고 있을 때 나는 항상 뭘 하든 전처리에서 상당히 많은 시간을 소비하고 있다고 느낀다. 모델 아키텍쳐를 어떻게 짜면 좋을까에 대한 이슈는 Attention이 나와버리고 나서 상당히 많이 줄어들었다. 그래서 모델이 성능이 잘 나오지 않으면, 오히려 input 측면에서 적절한 feature를 어떻게 뽑아야 모델이 잘 학습할까를 더 고민하게 된다. 물론 이건 내가 audio domain을 공부하고 있어서, 많이 치중된 고민인 것 같기도 하다. 이 분야에서는 raw data를 쓰기보다는 가공을 해서 쓰는 경우가 많아서, 전처리가 많이 많이 중요하니까. 이런 부분에서 딥러닝을 공부하는 입장에서 도메인마다 바라보는 관점이 많이 차이가 나겠단 생각이 든다. 그래서 domain에 대한 지식이 필요하다고 많이 느낀다. 그리고 한계점이 있을 때 그 domain에 대한 지식으로부터 insight를 얻어낼 수 있다는 것도 흥미롭다. 그래서 더더욱 그 분야에 대한 애정이 많이 필요한 것 같기도 하다.

 

쨋든, augmentation을 하면 성능이 상당히 좋아진다. 가끔 augmentation을 진행했음에도, 성능이 안나오거나 오히려 떨어지는 경우가 있는데, 그 경우에는 내가 augmentation을 과하게 걸진 않았는지 직접 확인해보고, 코드를 잘못 짠 경우가 대부분이니 열심히 디버깅해주면 된다. 아무리 생각해도 계산이 이상하다면 accuracy를 잘못 계산한 경우일 수도 있다.(내 경우가 그랬다 ㅠㅠ)

반응형

댓글