2016년 3월, 수많은 국제 바둑 기전에서 18차례에 걸쳐 우승한 세계 최상위급 프로 기사 이세돌 9단과 구글 딥마인드의 바둑 인공지능, 알파고의 공개 대국이 있었다. 알파고의 등장 이전 프로 기사를 이긴 프로그램은 없었기에, 바둑계에서는 이세돌의 승리를 예상했다. 알파고가 학습 데이터로 삼은 16만개의 기보 중 프로기사 수준의 기보의 수가 적었고, 자가 대전만으로 학습하기에는 바둑의 경우의 수가 너무나도 방대하다는 점도 이런 예측을 뒷받침했다.
2022년의 우리는 이미 알고 있듯, 이 대국은 4-1로 알파고의 승리로 돌아갔고, 전세계의 언론사들은 바둑을 재패한 인공지능의 등장에 불타올랐다. 그러나 인공지능의 발전은 “인류 최고의 바둑 기사를 상대로한 승리”에서 멈추지 않았다. 딥러닝의 힘을 빌린 인공지능은 바둑과 같이 뚜렷한 규칙과 원리가 존재하는 분야를 넘어, 이전까지는 인간만이 할 수 있을것이라 생각되었던 ‘직관’의 영역까지도 넘보고 있다. 현시대의 딥러닝 모델들은 이 다재다능함을 무기로 머핀과 치와와를 구분하는 수준의 이미지 분류부터 자연어의 원활한 해석과 번역까지, 수많은 분야에서 그 효용성을 인정받고 있다.
우리는 어떻게 머핀과 치와와를 구분할 수 있을까? 비슷한 연한 갈색 바탕에 검정색 얼룩이 있는 사진이라 해도, 우리는 이것이 치와와의 눈인지 초콜릿 머핀의 초코칩인지 구분할 수 있다. 그러나 이 과정을 논리정연하게 풀어서 설명하는 것은 절대로 쉽지 않다. 수많은 머핀과 치와와들을 봐온 우리의 직관은, ‘검정색 픽셀들의 위치를 비교하는’ 수준에서 설명될 정도로 단순하지 않기 때문이다. 이런 관점에서, 머핀과 치와와 사진 데이터를 ‘학습’시키면 처음보는 사진도 머핀인지 치와와인지 구분해내는 딥러닝 모델의 능력은 마법과도 같아 보인다. 이 기사는 이런 ‘마법’이 어떻게 실현될 수 있는지를 다룬다.
딥러닝이란 무엇인가
기본적인 의미의 딥러닝은 비선형적 연산을 시행하는 여러개의 레이어를 쌓아, 인풋을 추상화(핵심적인 특징을 추출)하는 알고리즘이다. 숫자 이미지가 어떤 숫자를 가르키는지 구분한다거나, 단어의 의미를 추상화해 벡터공간에 표현한다거나, 잡음이 섞인 음성에서 원본 음성의 특징만을 뽑아내는 것 등이 추상화의 예시이다. 슬쩍 들어봐도 명확한 해결책을 찾기 어려운 문제인 만큼, 고전적인 방식의 프로그래밍을 통한 문제해결을 좋은 성과를 거두기 힘들었다. 다시 말해, “이미지와 숫자”, “단어와 벡터”, “잡음과 원본” 사이의 복잡한 관계는 기존의 방법들로는 모델링하기 어려웠다.
딥러닝에서는 이에 대한 해결책으로 인간의 뇌 구조를 모방하여, 복잡하고 비선형적인 연산을 수행하는 레이어를 여러개 쌓는, 이른바 신경망(Neural Network) 모델을 활용한다. 당연하게도 신경망 모델은 기존의 모델들에 비해 무겁고(저장해야할 가중치의 개수가 많고) 연산과 학습에 걸리는 시간도 많았으나, 비교할 수 없는 수준의 성과를 내었다. 컴퓨터 기술의 비약적인 발전과 GPU / TPU를 이용한 빠른 연산의 실현또한 딥러닝 기술에 있어 큰 호재였다.


위 그림은 손글씨 인식을 위한 신경망의 예시 도식이다. 도식의 경우 인풋 레이어와 아웃풋 레이어, 그리고 그사이의 히든 레이어 1개로 이루어져 있다. 히든 레이어의 개수는 2개 이상인 경우가 많으나, 예시의 간단함을 위해 1개로 가정한다. 신경망 모델의 가장 기본적인 단위는 노드(도식에서 동그라미로 표시)다. 인풋 레이어의 노드들은 32 * 32 픽셀 흑백 이미지의 각 픽셀 값(0 ~ 1)을 그대로 받아와 다음 레이어로 전달하며, 히든 레이어의 노드들부터는 앞선 노드들에서 값을 전달받아 연산을 수행한다. 각 노드는 이전 레이어의 노드들의 출력값에 일정 가중치를 곱하고, 비선형 함수를 통과시킨 후, 다음 레이어의 노드들에게 출력하는 구조로 이루어진다. 각각 0 ~ 9를 의미하는 아웃풋 레이어의 10개 노드들 중 출력값이 가장 큰것을 이미지가 가르키는 숫자로 추측하는 방식이다.
물론 학습 과정 없이 이 모델을 사용한다면 출력된 결과는 정확도 10% 언저리의 무의미한 추측일 것이며, 아웃풋 레이어 10개에 0 ~ 9 라는 의미를 부여하는 것또한 무의미한 행동일 것이다. 우리가 구성한 신경망 모델이 추측하는 결과는 그 노드들의 ‘가중치’ 값에 달려있으며, 우리가 알아보고자 하는 ‘학습’은 이 가중치들을 최적화시키는 과정이자, 앞선 추측들에 의미를 부여해주는 방법이다. 다음 파트에서는 가중치들을 최적화시키는 방법인 ‘경사하강법’에 대해 알아본다.
경하하강법 : 가중치의 최적화
앞선 파트의 딥러닝 모델은 복잡하고 무거운 비선형적 연산의 알고리즘이다. 이번 파트에서는 신경망 모델의 내부 구조보다는 전반적인 흐름이 중요하기에, 모델 전체를 ‘인풋으로 이미지인 X를 받고’ ‘아웃풋 레이어의 출력 값인 길이 10의 벡터 E를 출력하는’ 함수 F로 취급한다.
우리는 신경망 모델의 학습을 위해 수많은 숫자 이미지(X)들과, 그 이미지가 나타내는 숫자(y)들의 데이터셋을 활용해, 함수 F에 이미지 X를 넣었을 때 나온 추측 벡터 E가 정확한 숫자를 가르키도록 하고싶다. 이를 위해, 우리는 벡터 E가 얼마나 ‘정확’한지 판별해줄 또 하나의 함수를 이용한다. 이런 함수를 가리켜 손실 함수(Loss Function)라 하며, 간단히 함수 L이라 표현하겠다. 손실 함수는 ‘인풋으로 모델의 추측값 벡터 E와 실제 정확한 숫자 y를 받고’ ‘그 둘 사이의 차이를 출력하는’ 함수다. 여기서의 ‘차이’는 단순한 의미의 차가 아닌, 두 확률분포상의 차이를 측정하는 값인 교차 엔트로피를 의미하나, 기사의 범위 밖으로 생각해 다루지 않는다. 학습 과정의 최종적인 목표는 데이터셋 상의 모든 X를 대입했을때의 손실 함수 값 평균이 최소가 되도록 가중치들을 조정하여, 신경망 모델 F가 정확한 추측을 할 수 있도록 하는 것이다.

가능한 모든 가중치 값들을 전부 대입하여 손실 함수가 최소인 경우를 찾아낼 수 있다면 더없이 좋겠지만, 많으면 수천만개까지 갈 수 있는 가중치의 개수를 고려하면 불가능에 가까운 방법이다. 경사하강법은 이 문제의 해결을 위해 편미분을 활용한다. 산꼭대기에서 산 아래로 내려오기 위해 한걸음 한걸음 더 낮은 곳으로 발을 옮기듯이, 현재의 가중치 분포에서의 손실 함수 값을 계산하고, 그 지점에서 각각의 가중치 값에 대해 손실 함수를 편미분한 후, 손실 함수가 감소하는 방향으로 조금씩 가중치 값을 조정한다. 이 한걸음 한걸음을 반복하며 가중치를 최적화시키고, 손실 함수 값이 더이상 변하지 않으면 그 상태를 최적의 가중치 분포로 생각하는 방법이다.
이런 방식의 경사하강법은 간단하지만, 극소점(local minimum)에 갇히기 쉽고 매 단계마다 모든 X에대한 손실 함수 값을 다시 계산해야한다는 문제점이 있다. 이를 극복하기 위해 단계마다 하나의 X만을 활용하는 SGD, 일부 X만을 활용하는 mini-batch GD, ‘한걸음’의 크기를 능동적으로 조절하는 Adagrad, 관성의 개념을 도입해 극소점 문제를 해결하려는 Adam등 경사하강법을 기반으로 한 다양한 학습 방법이 개발되고 있다.
AI 열풍이 불며, 이제는 인공지능이 활용되지 않는 분야를 찾는게 어려워지는 시대가 왔다. 딥러닝은 인공지능 분야의 핵심 기술로 앞으로도 지속적으로 활용될것이라 전망된다. 만약 기사를 통해 딥러닝에 관심이 생겼고, 딥러닝의 원리와 모델의 종류들에 대해 조금 더 알고싶다면, 딥러닝 모델들의 종류와 특징들에 대해 설명하는 유튜브 영상들을 우선적으로 시청하는 것을 추천한다. 원리나 세부사항은 둘째치고 모델을 만들어서 테스트해보고 싶은 사람이라면, Google Colaboratory를 통해 텐서플로나 파이토치의 튜토리얼을 따라가며, 경험을 쌓는것도 좋은 선택일 것이다.
강민준 | Mathematics & Computer Sci. | 지식더하기
참고자료
[1] https://ruder.io/optimizing-gradient-descent/
첨부 이미지 출처
[1] MNIST dataset
[2] https://www.ibm.com/cloud/learn/gradient-descent
