Computer Science/AI & Data

Momentum(모멘텀)

Henry Cho 2025. 6. 22. 01:26

* 포스트 난이도: HOO_Middle

* Machine Learning ver.1: July 27, 2022

* AI & Data ver.2: June 21, 2025


# Review Comments

본업에 충실하다 보니, 매번 포스팅이 늦어지고 있다. 새로운 포스트를 작성하는 것도 중요하겠지만 기존에 오래된 포스트를 업데이트를 하는 일도 중요하다는 생각이 들었다. 내 블로그 특성상 "잡 구하기"와 같이 트렌드적인 요소도 있지만 해당 포스트인 "모멘텀"과 같이 개발자로서 기본적으로 알아둬야 할 내용도 포함되어 있기 때문이다.

 

해당 포스트는 2022년도에 작성한 포스트이며, 이건 딱 봐도 그냥 내가 기억하기 위해서 작성해둔 포스트처럼 보였다. 질문을 받아서 작성된 포스트도 있지만 이렇게 필요한 내용만 메모장처럼 적어놓은 걸 보니 브로들을 고려하지 않은 나만의 포스트이었던 거 같다. 만일 어떤 브로가 질문을 해서 작성된 포스트이면 더더욱 창피할 뿐이다. 아무튼 댓글에 "감동적"이라는 내용을 보곤 딱 두 가지 생각이 들었다. 1) 이 분은 나와 같이 기억이 가물가물했던 부분을 살펴보려고 검색했구나. 2) 내용이 부실해서 업데이트를 원한다는 말을 돌려서 하시는 거구나.라고 들렸다.

 

그래서 해당 포스트를 주말에 짬을 내서 업데이트를 진행하기로 했다. 기존에 Machine Learning이라는 카테고리에 포함된 모멘텀에 대한 이야기이며, 이번 업데이트로 AI & Data 카테고리로 이동하였으며, 머신러닝에서 모멘텀에 대한 설명을 추가하여 HOO_Middle 난이도로 변경하였다.

 

참고로 HOOAI 블로그의 난이도는 "어려운 내용"과 "쉬운 내용"으로 나눠지는게 아니라 "이해하기 쉬운" 그리고 "이해하기 어려운"으로 나눠져 있다. 본질적으로 들어가면 설명이 많이 생략이 된 것일수록 난도가 높고 설명이 길고 구체적일수록 난도가 낮은 포스트라고 생각하면 된다.


# Momentum (모멘텀)

Momentum (모멘텀)을 이해하기 위해서는 먼저 모멘텀이 왜 필요한 지를 머신러닝에서 이해해야한다. 머신러닝의 가장 큰 핵심은 모델을 학습시켜서 오류를 최소화하고 정확도를 높이는 것이다. 사실 이렇게 생각하면 머신러닝의 목표와 의미가 매우 단순하다. 마치 떡볶이를 만드는 데 있어서 가장 중요한 건 맛있으면 된다. 보기만 좋고 맛이 없으면 음식의 본질적인 역할을 하지 못하는 거와 같이 머신러닝을 사용하는 가장 큰 이유는 최적의 결과를 산출하기 위해서이다.

 

다양한 머신러닝 라이브러리와 챗지피티와 같은 LLM이 대중화되면서 머신러닝이 막상 "뚝딱"하고 작동되는 원리 같지만 그 안에는 수많은 장애물들이 존재한다. 아무리 챗지피티를 쓰더라도 수많은 장애물들을 인지하고 고쳐나가는 건 개발자의 역할이고 이러한 머신러닝이 가진 고질적인 학습 문제점을 해결해 나가는데 중요한 개념이 모멘텀인 셈이다.

 

"그래서 모멘텀이 뭔데?"라고 하면 사실 물리에서 사용하는 아주 기초 용어이다. CS, CE 전공자라면 물리를 듣다보니 친숙할 수 있는 "P=mv"이다. 물리에서 벡터량이 모멘텀에 해당하듯이 머신러닝에서 사용하는 모멘텀의 의미도 이와 비슷하다. 이전 과정을 고려해서 현재의 과정에 적용하여 문제점을 해소하는데 효율성을 높여주는걸 모멘텀이라고 부른다.

 

"이게 무슨 소리인지 더 모르겠어!"라고 할 수 있다. 한마디로 모멘텀은 이전의 잘못을 인지하고 다음부터는 안 그래야지 하는 어린아이를 생각하면 된다. 마치 우리가 인턴으로 회사에 가서 처음 일한다면 회사의 규칙을 모르다 보니 간단한 복사 일도 망칠 수가 있다. 하지만 한 번 두 번 하다 보면 당사 내규나 암묵적으로 복사를 어떤 방식으로 하는지를 알게 되고 점차 회사에서 정해진 규칙을 지키다 보면 회사에서 "복사 요정"이 되어 있을 것이다. 마찬가지로 모멘텀도 학습과정에서 단순하게 많은 양의 데이터를 학습하고 결과를 내는 것보다 과거의 프로세스를 참고해서 학습이 진행됨으로써 보다 더 높은 정확도와 좋은 결과를 산출할 수 있게 되는 셈이다.


# 모멘텀과 SGD

"엥 저건 Gradient Descent 아닌가요?" 맞다. 한국 말로는 경사 하강법이라고 하는 방식인데 여기서 나온 문제를 모멘텀이 해소해준다.

 

(잠깐 샛길로 빠져서 개발 공부를 할 때 한글로 직번역된 용어로 공부하지 말고 영어 기반으로 공부하는 걸 추천한다. 솔직히 나도 직번역된 한글 용어를 보면 이게 무슨 소리야라는 생각이 들 때가 많다. 어쩔 수 없는 게 우리도 "어묵 먹을래?"라고 하면 먹고 싶지만 "Fish cake 먹을래?" 하면 나 조차도 먹기가 싫다. 비슷하게 개발 용어들이 아무래도 영어기반이다 보니 영어로 다가가면 이해하는데 어려움이 없지만 한글로 공부하면 이해하는데 어려움이 있을 수 있다. 추가로 한글로 공부하다가 미국뿐만 아니라 글로벌 기업이나 다른 나라에서 일하다 보면 결국 개발자들과 소통하는데 한글 용어로는 한계가 있다.)

 

다시 본론으로 돌아와서 경사 하강법, 아마 브로들은 Stochastic gradient descent를 많이 알고 있을 것이다. 바로 SGD, 한국말로 하면 아마 확률적 경사 하강법일 것이다. SGD를 사용하면, 아니 교수님의 설명만 들어보더라도 지역 최솟값, 지그재그 현상 등이 발생할 수 있어요.라는 말을 들어봤을 것이다. 말 그대로 아무래도 이전 프로세스를 고려해서 학습을 이어나가다 보니 큰 그림을 보지 못한 채 모델이 작은 문제점에 갇혀서 잘못된, 즉 왜곡된 결과를 산출하는 현상을 말한다.

 

그래서 모멘텀을 통해서 로컬 값이 아닌 전역 또는 Global 최솟값에 도달할 수 있으며, 이것을 Stochastic error surface라고도 부른다. SGD의 경우에는 모멘텀에 비해 그래프가 가파르게 계산되어 산출되다 보니 전역 최솟값을 보이는 값들이 많이 생긴다. 하지만 모멘텀은 이러한 다소 극단적인 그래프 결과가 산출되지 않도록 부드럽게 결과를 산출해 주는 역할을 수행한다. 아래는 SGD와 모멘텀을 비교한 간단한 예제 그림이다. (Fig.1을 보면 진짜 나만 보려고 만든 포스트였던 것 같다.)

 

Fig.1과 같이 SGD는 가파르게 계산하여 산출이 되다 보니 로컬 최솟값들도 많아질 뿐만 아니라 데이터를 처리하는 데 있어서 속도도 느릴 수밖에 없다. 한마디로 왼쪽 뾰족뾰족 그래프를 보면 사이사이 깊이 빠지는 부분들이 생기는데 이 부분이 바로 로컬 최솟값이라고 부르는 곳이다. 속도의 경우 당연히 위, 아래로 학습하는 과정에서 워낙 이동 과정이 많아지다 보니 속도가 느려질 수 있는 것이다.

 

반면에 Fig.1 오른쪽 그림을 살펴보면 로컬 최솟값이 상대적으로 줄어들기 때문에 데이터를 처리하는 속도가 SGD보다 모멘텀이 빠를 수 있다는 걸 보여준다. 한마디로 운동량 속도를 높이는데 도움이 된다는 것이며 평균 훈련 시간도 훨씬 적다. 실제로 ML을 돌려보면 같은 조건에서 모멘텀을 설정한 결과가 보다 더 빠르게 나오는 걸 알 수 있다. 나도 모멘텀을 설정해서 비교해 보면 많을 경우 2배 정도 학습 시간의 차이가 나타나기도 한다. 에러가 발생하는 건 다른 걸로도 해소가 되지만 실질적으로 머신러닝을 다룰 때, 아니면 딥러닝을 다룰때 가장 큰 싸움은 시간이다. 시간을 얼마나 효율적으로 단축하면서도 정확도를 높일 수 있냐가 관건인데, 이 과정에서 모멘텀의 개념이 중요한 요소인 셈이다.

 

참고로 머신러닝 또는 딥러닝에 있어서 필요한 기본 세팅 값들과 달리 모멘텀은 특정 값으로 많이 사용이 된다. 모멘텀의 경우에는 일반적으로 0.9로 지정하여 사용이 된다. "0.9로만 하세요!" 가 아니라 머신러닝을 처음 다루는 모멘텀 몇으로 할지 모르는 경우에 그냥 0.9로 해보라는 것이다.


Fig. 1 왼쪽은 SGD를 표현했으며 오른쪽은 모멘텀을 적용할 경우를 표현한 그림


 

728x90