본문 바로가기

트렌드 한눈에 보기/학계 트렌드

[딥러닝] 마구잡이 개발에 지쳤다면... Google, EfficientNet (2019)

딥러닝은 참 묘하다. 똑똑한 것 같으면서도 단순해서, 더 많은 정답을 알려주기만 해도 (더 많은 데이터 확보), 학습 기간을 늘리기만 해도 (레이어 더 많이 쌓기) 성능이 좋아진다. 그 과정에서 더 많은 데이터를 확보하고, 레이어를 깊이 만들며 성능을 테스트 하는 것은 온전히 개발자의 몫이다. 그러다보니, 이것 조금 바꾸고 저것 조금 바꾸면서 성능을 확인해봐야 하는 것이 여간 번거로운 일이 아닐 수가 없다. 어느 정도 데이터 확보/레이어 변형을 해야 개선이 어느 정도 이뤄지는지 정량 모델이라도 있으면 좋으련만!

 

 

구글에서 2019년 발표한 EfficientNet은 그런 답답함을 어느 정도 해소해줄 수 있는 논문이다. 저자인 Mingxing Tan과 Quoc Le는 현재 모두 구글 브레인 소속 연구원인데, Mingxing Tan의 경우 Waymo에서 자율주행과 관련한 연구들을 진행 중인 것으로 보인다. Quoc Le의 경우 2022년 한 해에만 60건의 연구 발표를 했을 정도로 (patent 포함) 다작왕인데, 사실 감이 잘 오지 않는다. 평균 한 달 다섯 건의 연구를 병행한 셈인데 (일주일에 한 건의 연구 완성이 이뤄진 셈이다), 이럴 수가 있나? 난 일주일간 뭘했을까? 내가 블로그에 똥글 싸지른 것보다도 많은 연구발표를 했네 이 사람은.

 

 

충격은 뒤로 하고, EfficientNet의 내용을 살펴보자면 내가 궁금하던 그 질문을 정확히 타겟하고 있다. "모델이 복잡해지면 정확도가 높아지는 것은 알겠는데, 뭐 어디까지 복잡하게 해야 하는가?" 하지만 조금만 더 읽다보면 그 해결책을 찾는데 있어서 상당한 타협을 했다는 것을 알 수 있다. 

 

 

본 논문에서 해결책을 제시하는 과정은 다음과 같다. 정확도를 높이기 위해 모델을 복잡하게 만드는 세 가지 대표적인 방법은 1) 레이어 너비를 넓히고, 2) 깊이를 늘리고, 3) 해상도를 늘리는 것이다. 이 과정에서 7 가지의 조합 방법이 발생하고, 각 조합 방법 별로 파라미터 변경은 수도 없이 할 수 있으니 실험해볼 가지 수는 엄청나게 늘어난다. 본 논문은 세 가지를 모두 변경하면서 일정한 비율로만 늘려나간다는 방법을 차용한 것이다. 레이어 너비가 30% 증가했으면 깊이도 30% 늘리고, 해상도도 30% 늘리는 방식이다. 

 

 

세 가지 파라미터의 정확한 비율은 위 식과 같다. 위 관계식을 만족하는 alpha, beta, gamma 중에서 가장 성능이 좋은 조합을 1차적으로 찾아낸 뒤에, phi를 변화시키면서 성능을 향상시키는 방식이다. phi는 모델을 사용하는 하드웨어 환경에 따라서 최고의 값을 선택하면 된다. alpha beta gamma가 저런 꼴의 비율을 유지하는 이유는, 깊이가 2배 깊어지면 모델의 복잡도가 두 배 커지는 반면, 너비나 해상도가 두 배 커질 경우 복잡도가 네 배로 늘어나기 때문이다. 이렇게 찾은 최적 파라미터를 compound scale이라고 한다. 

 

 

이렇게 찾아낸 최적화 결과물은, 각 파라미터를 독립적으로 변화시키는 것보다 월등하게 뛰어난 결과를 보였다고 주장한다. 하지만 막상 논문을 세세히 읽어보면, 그렇게 엄청난 결과물은 아니다. 본 논문에서 가지고 나온 자체 architecture인 EfficientNet에 적용한 결과가 아니라, 기존 논문에서 제시한 모델을 사용할 경우, 성능을 향상시키는 가장 큰 비중은 모델 depth를 키우는 것에서 나오고, 이후에 compound scale로 개선한 결과는 제한적인데다가 FLOPS (복잡도)의 증가 역시 피하지 못한다. 

 

성능 부분에서 논쟁의 여지는 있지만, 본 논문에서 얻어가야 할 점도 명확하다 (본 논문에서 처음으로 제기한 방법이 아닐지라도). 하드웨어의 성능에 최대로 구동 가능한 FLOPS (모델 복잡도) 를 명확히 한 뒤에 baseline model을 적절히 설정하기만 하면, 최적의 parameter를 설정할 수 있다는 것이다. 이는 간단히 실험 가능한 영역이기도 하니, 다음 주에 한 번 실험해봐야겠다.

 

 두 번째 배울 점이라고 하면, 상당히 간단하면서도 명쾌하게 논문의 범위를 설정했고, 실험을 성공적으로 수행하면서 완성도 높은 결과물을 보였다는 것이다. 일주일에 한 편씩 논문을 내는 사람의 퍼포먼스는 이 정도구나 싶다. 나도 이 정도의 관록을 얻을 수 있으면 좋겠다. 그러려면 피똥싸게 도메인 지식을 늘려놔야겠지? 갈 길이 멀다.