brunch

You can make anything
by writing

- C.S.Lewis -

by 인용구 Apr 04. 2021

신경망처럼 학습하라

#1. 신경망 학습이 알려주는 성공 필승 전략

    컴퓨터 비전 분야는 전례 없는 부흥기를 맞이하였습니다. 2023년 현재 구글 학술검색을 들어가보면 가장 "공학 및 컴퓨터 과학" 분야의 가장 영향력 있는 저작물은 컴퓨터 비전 학회인 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)을 활용했는데, 그 시점에서 이미 과거의 많은 기계학습 방법들을 능가하는 방법을 보이며 그 탁월함을 드러냈습니다. 그러나 신경망 모델은 깊어질수록 조정해야 하는 노드 연산(변수)의 개수가 늘어나면서 학습이 어렵다는 문제가 있었습니다. 이를 위해 convolution 연산을 활용하는 합성곱 신경망 (CNN, convolutional neural network)이 제안되어 변수의 개수를 획기적으로 줄였으며, 더 깊은 심층 신경망 (DNN, deep neural network)를 학습시키기 위한 다양한 구조들이 제안되었습니다. 앞서 이야기한 ResNet이 대표적인 심층 신경망 구조가 되겠습니다. 현대의 신경망 모델과 그것을 학습시키는 방법론은 이미 1987년 Yann LeCun에 의해 제안되었지만, 신경망 모델은 2010년대에 이르러서야 조명을 받게 되었는데요. 이는 복잡한 행렬 연산을 빠르게 처리하는 GPU 하드웨어의 발전, 인터넷의 보편화에 따른 기하급수적인 데이터 양 증가 등 복합적인 이유가 작용하였습니다. 이론이 현실에서 실현되기까지 20년의 시간이 걸린 셈입니다.


CNN의 아버지, 얀 르쿤이 제안한 LeNet
여러 신경망 구조의 모습



인공 신경망을 학습시키는 방법


    그렇다면 인공 신경망을 어떻게 학습시킬까요? 처음에 인공 신경망의 연산들은 무작위하게 설정되어 있습니다. 이 모델에 데이터를 입력했을 때 얻어낸 결과와 정답을 비교해 오차(loss)를 구하면, 미분 연산을 통해 각 노드 연산의 조정에 따른 오차의 변화를 수학적으로 찾아낼 수 있습니다. 다시 말해 현재보다 성능을 높이기 위해 연산을 어떻게 수정하면 되는지를 알 수 있는 것이죠. 그렇게 연산을 수정하고, 성능을 다시 확인하고. 이런 과정을 여러 번 거치다 보면 자연스럽게 성능이 발전합니다. 비유하자면 '산의 정상에 도달하는 것'을 목표로 할 때, '현재 위치에서의 기울기를 보고 더 높은 곳의 방향으로 한 발짝씩 내딛는 전략'이 신경망 학습의 기본적인 아이디어라고 볼 수 있습니다. 이러한 학습 원리를 gradient descent라고 부릅니다.


    인공 신경망 학습에서 가장 중요한 것은 정확한 목표, 즉 loss function의 설정입니다. 산의 정상은 높은만큼 상대적으로 춥기도 하죠. 그렇다고 등산의 목표를 현재 위치보다 더 '높은 곳'이 아닌 '추운 곳'의 방향으로 걷는다면 우리는 어느 그늘진 골짜기에 도달할 지도 모릅니다. 인공 신경망은 정답과 모델의 예측값 사이의 오차를 줄이는 방향으로 학습되기 때문에, 우리가 이 학습 과정을 통해서 결과적으로 얻어내고자 하는 정답, 또는 이상을 구체적이고 분명하게 표현하는 것이 중요한 것이죠. 학습 과정에서 또 다른 중요한 요소는 '목표와의 차이에 얼마나 민감하게 반응할 것인지' (*learning rate / optimizer 설정)입니다. 다시 등산의 비유로 돌아와서, 우리가 매 걸음을 걸을 때마다 발 밑의 기울기를 확인하고 방향성을 수정하면 어느 세월에 산을 오를까요? 느리다고 꼭 정확한 것만도 아닙니다. 지나치게 소심한 행보는 낮은 봉우리에서도 '여기가 주변 중엔 최고로 높아' 하며 안주하는 결과를 내놓기도 합니다. 가끔은 더 높은 곳으로 오르기 위에 내리막을 성큼성큼 건너가야 할 때도 있는 법이니까요. 몇 발자국마다 평가 및 수정, 다시 말해 반성을 거칠 것인지, 그 반성을 100% 반영할 것인지 또는 일단 진행하던 방향으로의 관성을 유지하며 변화에 대한 요구를 부분 수용할 것인지. 이런 전략의 선택에 따라서 또 학습된 인공 신경망의 성능은 천차만별로 달라집니다.


여러 최적화 전략에 따른 학습 과정. [2]

    며칠 전에는 수업의 과제로 간단한 인공 신경망을 학습시켜 보았다. 학습 과정을 보기 위해 epoch (성능 평가 - 모델 수정의 단위)마다 test 성능을 확인하도록 코드를 작성했다. 출력되는 걸 보다 보면 좀 재밌다. 초반에는 성능이 쭉쭉 오른다. 그러다가 어느 순간이 되면 성능이 직전보다 0.2%만 올랐다가, 또 조금 줄었다가, 다시 올랐다가, 이러는 것이었다. 주식 시세표를 보는 사람처럼 속으로 '떡상 가즈아' 외치며 일희일비하다가, 문득 시간 낭비라는 생각이 들어 눈을 돌렸다. 그렇게 다른 일 좀 하다가, 다시 확인해보니 벌써 학습이 끝나 있었다. 학습 곡선을 살펴보니 내가 계속 지켜보던 시점 이후로도 자글자글 변동하며, 그래도 조금씩, 결과적으로는 그 시점보다도 다시 4%인가 성능이 올라있더라. 거기서 느낀 바가 많았다.

그림 2. 인공 신경망을 학습시키다 보면 어쩐지 응원을 하게 된다.


    나의 배움의 과정이 신경망의 학습 전략과 퍽 닮아있다는 생각을 했다. 나는 배움의 끝에 내가 되고 싶은 모습, 이상형이 있다. 구체적으로는 '훌륭한 연구자/대학원생 되기'가 현재 내 연구실 생활의 목표가 되겠다. 그것을 달성하기 위한 나의 전략은 1) 나는 그 모습과 현재의 나의 모습을 비교하여 평가하고, 2) 이상형에 더 가까워지기 위해 어떤 방향성을 갖고 나아가야 할지 판단하여 3) 나의 모습을 수정해나가는 신경망인 것이다.


    문제는 고도라는 분명한 척도로 정의되는 산의 정상과 달리, '훌륭한 대학원생'는 굉장히 다양하고 복합적인 해석이 가능하다는 것에 있다. 훌륭한 대학원생이란 뭘까? 이상적인 연구자가 되기 위해서는 어떤 능력이 필요하지? 논문을 빠르고 정확하게 읽어내는 능력, 실험을 잘하는 능력, 연구실 동료들과 원만하게 지내는 능력... 하나로 꼽을 수가 없다. 그렇기 때문에 단순한 척도로 평가할 수가 없다. 올바른 방향이 무엇인지도 분명하지 않고, 그 방향으로 나아가는 중이더라도 몇 개의 기준에선 퇴보로 보일 수도 있을 것이다.


     그런데 근래의 나를 돌아보니, 나는 눈에 보이는 몇 개의 지표로 나의 대학원 생활을 평가하며, 그것도 자주, 자신을 비관하고 있었다. 오늘은 논문을 하나도 채 읽지 못했어... 자꾸 코드에서 에러가 나네... 아, 집중 안 돼... 이런 생각을 하며 좌절하고 나의 자질을 의심했다. 말하자면 나는 필요 이상으로 이상과의 괴리에 민감하게 반응하고 있었다. 객관적으로 자신을 바라보며 반성하는 것은 필요하지만, 나는 모멸감 따위에 너무 많은 시간을 낭비하고 있었다.


    한마디로 표현할 수는 없지만 나에게는 이상적인 대학원생의 모습이 있다. 나는 행복하고 유능한 대학원생이 되고 싶다. 논문 읽기, 실험하기, 논문 쓰기 같은 연구의 모든 과정에서 내가 기대하는 수준 이상의 능력을 갖추고 싶다. 많은 시간을 쏟아도 좋으니 그 시간 스트레스 받지 않으며 연구 활동을 즐길 수 있는 사람이 되고 싶다. 부끄럽지 않은 수준의 연구 실적을 갖춰 교수님과 연구실 동료들에게 신뢰받는 연구자가 되고 싶다. 이렇게 쓰니까 아직 갈길이 까마득히 먼데, 그래도 나는 일단 지금의 나보다 발전한 모습의 나를 그릴 수 있다.


    그리고 그렇기 때문에 나는 그 방향으로 나아갈 것이다. 그 괴리가 단조 감소하지는 않겠지만, 가끔은 어제보다 부끄러운 오늘을 보내는 날도 있겠지만. 나는 분명한 목표가 있기에, 부끄러움을 알고 발전의 방향성을 찾기에 느리더라도 그 모습으로 나아갈 것이다. 당연한 이야기 같지만, 목표를 품은 채 애쓰는 사람과 목표 자체를 잊은 사람은 당장의 모습에서 비슷할지 몰라도 엄청난 차이가 있다. 살면서 내가 항상 더 나은 사람으로 성장해 왔는가? 그것은 절대 아니지만, 돌이켜보면 그 모든 정체와 퇴보의 시간은 결국 내 이상을 잊고 있었던 시간, 혹은 그렇게 나아갈 필요성을 느끼지 못했던 시간이었다. 포기의 시간이었다. 지금은 아니다. 나는 내가 되고 싶은 모습을 알고, 그것을 위해 어떤 노력을 해야 하는지 안다.


    인공 신경망 학습은 '분명한 목적'과 '끊임없는 반성과 실천'이 성공할 수밖에 없는 성장 모델임을 분명하게 보여준다. 정체되는 것처럼 보여도 지나고 보면 천천히 계속 발전하고 있는 성능을 확인하자 뭔가 조급할 필요가 없다는 위로를 받은 기분이었다. 일단 오늘 신경망 학습에서 배운 교훈은, 성능 평가를 너무 자주 하면 오히려 학습 시간이 길어진다는 것. Test accuracy를 epoch마다 잴 필요는 없다. Loss function이 잘 감소하고 있는지만 확인하면 된다. 매일 스스로의 능력을 평가하며 자책하기보다는 딱 오늘 이루려고 애썼던 것, 그것을 얼마나 잘 해냈는지만 생각하며 살기로 했다. 오늘은 잘 쉬는 게 목표다- 하면 그냥 아무것도 못했다고 우울해하지 말고 재충전했다는 데 의미를 두자. 수업 과제하느라 개인 연구를 하나도 못했다고 속상해하지 말고 과제를 효율적으로 잘 끝냈다는 것에 만족하자. 어차피 한 번에 하나씩, 언젠가 반드시 해야 하는 거니까. 그렇게 작은 성취들을 이루면서 나는 성장할 것이다. 어제보다 나은 오늘을 사는 것이다. 그 시간이 쌓이면 나는 바라던 모습의 내가 되어있을 것을 믿는다.



[출처]

[커버] https://www.cognex.com/blogs/deep-learning/what-is-a-neural-network

[1] He, Kaiming, et al. "Deep residual learning for image recognition." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.

[2] Stanford CS231n Lecture Note https://cs231n.github.io/



#Deep Learning #Neural Network #CNN #Supervised Learning #Gradient Descent

매거진 선택

키워드 선택 0 / 3 0

댓글여부

afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari