컴퓨터비전분야는전례없는부흥기를맞이하였습니다. 2023년 현재 구글 학술검색을 들어가보면 가장 "공학 및 컴퓨터 과학" 분야의 가장 영향력 있는 저작물(publication)은 컴퓨터 비전 학회인 IEEE/CVF Conference of Computer Vision and Pattern Recognition (CVPR)이라 합니다. 전체 순위에서도 CVPR은 4등에 위치하여 Nature, Science 같은 명망 높은 저널들과 어깨를 나란히 하고 있네요.
컴퓨터 비전이 이렇게 부상한 이유 중 가장 큰 것은 인공신경망 학습 방법의 성공에 있겠습니다. 인공신경망, artificial neural network (ANN)는 이제 비전 분야에서 보편적으로 사용되는 방법론으로 자리 잡았는데, 대표적으로 2016년 발표된 Kaiming He의 ResNet 논문 [1]은 피인용수 14만 7천 회에 육박하며 어마어마한 영향력을 발휘하고 있습니다. (2023년 1월 기준) 대충 계산해보면 하루 50명 이상이 해당 논문을 인용한 셈이네요. 흔히 인공 지능(AI)이라 부르는 기술은 바로 이 인공 신경망을 의미합니다.
인공 신경망이란?
인공 신경망은 그 이름에서 알 수 있듯이, 인간의 신경계를 모방한 기계학습 모델입니다. 신경세포는 다른 신경 세포와 전기 자극을 주고받으며 동작하는데, 마찬가지로 인공 신경망의 '노드(뉴런/세포)'도 이전 층의 노드로부터 신호를 받고, 일련의 연산을 거쳐 조작한 신호를 다음 층의 노드로 보냅니다. 인공 신경망을 학습한다는 것은 여기서 각 노드에서 일어나는 '일련의 연산'을 목적에 맞게 조정해가는 과정을 말합니다. 비전 분야에서는 이미지로 주어지는 시각 정보를 다루며 다양한 목적, 예를 들면 이미지에 나타나는 사물이 무엇인지 (분류, classification), 그 사물이 이미지에 어디에 위치해 있는지 (검출, detection) 등등의 질문에 대답하는 것을 목적으로 인공 신경망을 설계하고 학습시킵니다.
그림 1. 인체의 뉴런 세포 (좌)와 인공 신경망의 노드 (우). [2]
인공 신경망이 제안되었을 초기에는 다섯 개 미만의 층으로 구성된 얕은 모델 (MLP, multi-layer perceptron)을 활용했는데, 그 시점에서 이미 과거의 많은 기계학습 방법들을 능가하는 방법을 보이며 그 탁월함을 드러냈습니다. 그러나 신경망 모델은 깊어질수록 조정해야 하는 노드 연산(변수)의 개수가 늘어나면서 학습이 어렵다는 문제가 있었는데요. 이를 위해 합성곱 연산을 활용하는 합성곱 신경망 (CNN, convolutional neural network)이 제안되어 변수의 개수를 획기적으로 줄일 수 있었습니다. 나아가 더 깊은 심층 신경망 (DNN, deep neural network)를 학습시키기 위한 다양한 구조들이 제안되었습니다. 앞서 이야기한 ResNet이 대표적인 심층 신경망 구조 중 하나입니다. 현대의 신경망 모델과 그것을 학습시키는 방법론은 이미 1987년 Yann LeCun에 의해 제안되었지만, 신경망 모델은 2010년대에 이르러서야 조명을 받게 되었습니다. 왜냐하면 21세기에 들어와서야 복잡한 행렬 연산을 빠르게 처리하는 GPU 장치가 등장했고, 인터넷이 보편화되면서 학습에 활용할 수 있는 데이터의 양이 폭발적으로 증가했거든요. 이론이 현실에서 실현되기까지 20년의 시간이 걸린 셈이죠.
CNN의 아버지, 얀 르쿤이 제안한 LeNet
여러 신경망 구조의 모습
인공 신경망을 학습시키는 방법
그렇다면 인공 신경망은 어떻게 학습시키는 걸까요? 처음에 인공 신경망의 연산들은 무작위하게 설정되어 있습니다. 이 모델에 데이터를 입력하면 아무 의미 없는 결과가 출력되겠죠. 그러나 그 결과와 정답을 비교해 오차(loss)를 구하면, 미분 연산을 통해 각 노드 연산의 변화에 따른 오차의 변화를 수학적으로 찾아낼 수 있습니다. 다시 말해 현재보다 성능을 높이기 위해 연산을 어떻게 수정하면 되는지를 알 수 있는 것이죠. 그렇게 연산을 수정하고, 오차를 다시 확인하고. 그렇게 오차를 줄이는 과정을 여러 번 거치다 보면 자연스럽게 성능이 발전할 수 있습니다. 모델에 데이터를 입력해서 결과를 산출하는 과정을 "forward process", 결과와 각 노드 연산의 미분값을 통해 모델을 업데이트 하는 과정을 "backward process"라고 부릅니다. 이것을 한 번 진행하는 것을 "iteration"이라고 부르고, 학습 데이터 전체에 대해 그 과정을 모두 거치면 그것을 하나의 "epoch"이 완료되었다고 합니다. 보통 모델의 깊이나 데이터의 양에 따라 학습을 몇 epoch을 진행할지는 다르게 결정이 되지만, 그렇게 인공 신경망을 학습시켜서 성능이 어느 정도 값에 수렴하게 되면 모델이 잘 학습했다고 생각할 수 있겠지요.
이러한 학습의 원리를 "경사 하강법(gradient descent)"라고 부릅니다. 미분값(gradient)를 보고, 오차를 낮춘다(descent)는 의미입니다. 조금 뒤집어서 비유를 해볼까요? 오차가 제일 작은 상태, 다시 말해 성능이 제일 높은 상태를 '산의 정상'이라고 해봅시다. 신경망 학습의 기본적인 아이디어는 산의 정상에 도달하기 위해서1) 현재 위치에서의 기울기를 보고, 2) 더 높은 곳의 방향으로 한 발짝씩 내딛는 전략이라고 생각할 수 있겠습니다.
인공 신경망 학습에서 가장 중요한 것은 정확한 목표, 즉 Training objective의 설정입니다. 산의 정상은 높은만큼 상대적으로 춥기도 하죠. 그렇다고 등산의 목표를 현재 위치보다 더 '높은 곳'이 아닌 '추운 곳'의 방향으로 걷는다면 우리는 어느 그늘진 골짜기에 도달할 지도 모릅니다. 인공 신경망은 정답과 모델의 예측값 사이의 오차를 줄이는 방향으로 학습되기 때문에, 우리가 이 학습 과정을 통해서 결과적으로 얻어내고자 하는 정답, 또는 이상을 구체적이고 분명하게 표현하는 것이 중요한 것입니다. 학습 과정에서 또 다른 중요한 요소는 '목표와의 차이에 얼마나 민감하게 반응할 것인지' (*learning rate / optimizer 설정)입니다. 다시 등산의 비유로 돌아와서, 우리가 매 걸음을 걸을 때마다 발 밑의 기울기를 확인하고 방향성을 수정하면 어느 세월에 산을 오를까요? 느리다고 꼭 정확한 것만도 아닙니다. 지나치게 소심한 행보는 낮은 봉우리에서도 '여기가 주변 중엔 최고로 높다'며 안주하는 결과를 내놓기도 합니다. 가끔은 더 높은 곳으로 오르기 위에 내리막을 성큼성큼 건너가야 할 때도 있는 법이니까요. 몇 발자국마다 평가 및 수정을 거칠 것인지, 그 반성의 결과를 100% 반영할 것인지 또는 일단 진행하던 방향으로의 관성을 유지하며 부분 수용할 것인지. 이런 전략의 선택에 따라서 또 학습된 인공 신경망의 성능은 천차만별로 달라집니다.
여러 최적화 전략에 따른 학습 과정. [2]
며칠 전에는 수업의 과제로 간단한 인공 신경망을 학습시켜 보았습니다. 학습 과정을 보기 위해 1 epoch마다 test 성능을 확인하도록 코드를 작성했습니다. 작성한 코드가 오류 없이 돌아가면서 결과를 내놓는 것을 보면 성취감도 있고 퍽 재밌습니다. 초반에는 성능이 쭉쭉 오릅니다. 그러다가도 금방, 성능이 직전보다 0.2%만 올랐다가, 또 조금 줄었다가, 다시 올랐다가, 이러면서 어느정도 수렴을 하는 것처럼 보이게 되죠. 주식 시세표를 보는 사람처럼 속으로 '떡상 가즈아' 외치며 일희일비하다가, 문득 시간 낭비라는 생각이 들어 눈을 돌렸습니다. 그렇게 다른 일 좀 하다가, 시간이 지나 다시 확인해보니 벌써 학습이 끝나 있었습니다. 학습 곡선을 살펴보니 내가 계속 지켜보던 시점 이후로도 자글자글 변동하며, 그래도 조금씩, 결과적으로는 그 시점보다도 다시 4%인가 성능이 올라있더라고요. 우습게도, 그것에서 조금 감동받아 버렸습니다.
그림 2. 인공 신경망을 학습시키다 보면 어쩐지 응원을 하게 된다.
저의 배움의 과정이 신경망의 학습 과정과 퍽 닮아있다는 생각을 했습니다. 저는 배움의 끝에 제가 되고 싶은 모습, 이상형이 있어요. 구체적으로는 '훌륭한 연구자/대학원생 되기'가 지금은 제 연구실 생활의 목표가 되겠습니다. 그것을 달성하기 위한 저의 전략도 신경망의 학습 전략과 크게 다르지 않습니다. 1) 머릿속에서 기대하는 그 모습과 현재 저의 모습을 비교하여 평가하고, 2) 이상형에 더 가까워지기 위해 어떤 방향성을 갖고 나아가야 할지 판단하여 3) 저의 모습을 수정해나가는 것인 셈이죠.
문제는 '고도'라는 분명한 척도로 정의되는 산의 정상과 달리, '훌륭한 대학원생'은 굉장히 다양하고 복합적인 개념이라는 데에 있습니다. 훌륭한 대학원생이란 뭘까요? 이상적인 연구자가 되기 위해서는 어떤 능력이 필요한가요? 논문을 빠르고 정확하게 읽어내는 능력, 실험을 잘하는 능력, 연구실 동료들과 원만하게 지내는 능력... 하나로 꼽을 수가 없습니다. 그렇기 때문에 단순한 척도 하나만으로 평가할 수가 없습니다. 올바른 방향이 무엇인지도 분명하지 않고, 그 방향으로 나아가는 중이더라도 몇 개의 기준에선 퇴보로 보일 수도 있을 것입니다.
그런데 근래의 저를 돌아보니, 저는 눈에 보이는 몇 개의 지표로 저의 대학원 생활을 평가하며, 그것도 자주, 자신을 비관하고 있었습니다. '오늘은 논문을 하나도 채 읽지 못했어,' '자꾸 코드에서 에러가 나네,' '집중 안 돼 ㅠㅠ'... 이런 생각을 하며 좌절하고 저의 연구자로서의 자질을 의심했습니다. 말하자면 저는 필요 이상으로 이상과의 괴리에 민감하게 반응하고 있었던 거죠. 객관적으로 자신을 바라보며 반성하는 것은 필요하지만, 저는 모멸감 따위에 너무 많은 시간을 낭비하고 있었습니다.
한마디로 표현할 수는 없지만 저에게는 이상적인 대학원생의 모습이 있습니다. 행복하고 유능한 대학원생. 논문 읽기, 실험하기, 논문 쓰기 같은 연구의 모든 과정에서 기대하는 수준 이상의 능력을 갖춘 사람. 많은 시간을 쏟아도 좋으니, 그 시간 스트레스 받지 않으며 연구 활동을 즐길 수 있는 사람. 부끄럽지 않은 수준의 연구 실적을 갖춰 교수님과 연구실 동료들에게 신뢰받는 연구자. 이렇게 써보니 아직 갈길이 까마득히 멀지만, 그래도 저는 일단 지금의 저보다 발전한 모습의 저를 그릴 수 있습니다.
그리고 그렇기 때문에 저는 그 방향으로 나아갈 것입니다. 그 괴리가 단조 감소하지는 않겠지만, 가끔은 어제보다 부끄러운 오늘을 보내는 날도 있겠지만. 저는 분명한 목표가 있기에, 부끄러움을 알고 발전의 방향성을 찾기에 느리더라도 그 모습으로 나아갈 것입니다. 당연한 이야기 같지만, 목표를 품은 채 애쓰는 사람과 목표 자체를 잊은 사람은 당장의 모습에서 비슷할지 몰라도 엄청난 차이가 있거든요. 살면서 나는 항상 더 나은 사람으로 성장해 왔는가? 그것은 절대 아니지만, 돌이켜보면 그 모든 정체와 퇴보의 시간은 결국 목표를 잊고 있었던 시간, 혹은 그렇게 나아갈 필요성을 느끼지 못했던 시간이었습니다. 포기의 시간이었습니다. 지금은 아닙니다. 나는 내가 되고 싶은 모습을 알고, 그것을 위해 어떤 노력을 해야 하는지 알고 있습니다.
인공 신경망 학습의 성공은 '분명한 목표'과 '끊임없는 반성과 실천'이 매우 성공적인 발전의 전략임을 증명하고 있습니다. 정체된 것처럼 보여도, 정확한 방향성을 잃지 않고 계속 나아가다보면 분명 우리는 목적지에 가까워질 것입니다. 일단 오늘 신경망 학습에서 배운 교훈은, 성능 평가를 너무 자주 하면 오히려 학습 시간이 길어진다는 것. Test accuracy를 epoch마다 잴 필요는 없구나. Loss function이 잘 감소하고 있는지만 확인하면 된다. 매일 스스로의 능력을 평가하며 자책하기보다는 딱 오늘 이루려고 애썼던 것, 그것을 얼마나 잘 해냈는지만 생각하며 살기로 했습니다.
오늘은 잘 쉬는 게 목표다- 하면 그냥 아무것도 못했다고 우울해하지 말고 재충전했다는 데 의미를 두자. 수업 과제하느라 개인 연구를 하나도 못했다고 속상해하지 말고 과제를 효율적으로 잘 끝냈다는 것에 만족하자. 어차피 한 번에 하나씩, 언젠가 반드시 해야 하는 거니까. 그렇게 작은 성취들을 이루면서 나는 성장할 것입니다. 어제보다 나은 오늘을 사는 것이다. 그 시간이 쌓이면 나는 바라던 모습의 내가 되어있을 것을 믿습니다.
[1] He, Kaiming, et al. "Deep residual learning for image recognition." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.