Computer/Machine Learning

인공지능과 기계학습

Novelism 2021. 8. 31. 22:05

 

 인공지능의 정의는 그렇게 명확하게 와닿지 않습니다.

 지능 같은 것을 인간이 컴퓨터로 구현한 것을 인공지능이라고 말할 수 있을 텐데, 

 그 지능이라는 게 무엇인지도 그리 명료하지 않기 때문입니다. 

 하나씩 이야기해보면, 사물 인지, 수치 계산 능력, 논리적 사고, 추론, 학습능력 등 여러 가지 요소들이 있습니다.

 그리고 그 요소들은 어찌 보면 서로 상당히 다르기도 합니다. 인간의 지능은 이런 다양한 요소가 총체적으로 어우러져서 나타나는 것입니다. 이런 요소들 중 하나만 떼어서 생각하면 우리가 일반적으로 생각하는 지능과는 좀 다르게 느껴집니다. 예를 들어 계산기는 계산을 잘하는데, 우리가 그것을 굳이 지능이라고 부르지는 않습니다. 계산기가 보통 사람보다 계산 잘한다고 해서 그 계산기가 사람보다 지능이 높다고 이야기하진 않겠죠. 우리가 일반적으로 생각하는 지능은 아마도 강 인공지능 (혹은 범용 인공지능)에 해당될 것입니다. 강 인공지능은 어쩌면 명확히 제시되지 않은 문제에 대해서, 스스로 문제를 찾아가고 상당히 자율적이면서 자기 주도적인 지능을 말하는 것 같습니다. 어떤 전용 기능으로 설계되지 않아도 다양한 문제, 접해보지 않았던 문제에 대해서 스스로 사고하는 능력까지 갖추는 것인데, 뭐 이런 분야는 그동안 별로 발전하지 않아 왔고, 최근 인공지능의 인기는 이쪽 분야도 아니라서 자세히 이야기하긴 어렵네요. 그리고 감정, 욕구, 마음, 영혼 같은 것은 지능과는 좀 다르고, 훨씬 어려운 문제이기에 굳이 이런 문제는 여기서 다루고 싶진 않습니다. (저도 생명체라서 철학적으로는 이쪽에 더 관심이 있긴 합니다.)

 현재 인기 있는 머신러닝 분야는 인공지능 분야에서도 약한 인공지능에 속합니다. 지능이 있어야 풀 수 있을 것 같은 문제에 대해서 그 문제만을 푸는 방법들입니다. 바둑을 잘 두는 것은 아마도 지능이고, 사람과 대화할 수 있는 것도 지능이라 할 수 있겠죠. 약 인공지능에선 바둑을 두는 머신은 바둑만을 두고 대화하는 로봇은 대화만을 합니다. 물론 두 가지를 같이하는 모델을 만들려면 별개로 만들 수도 있겠죠. 훈수 두는 로봇(?)... 여하튼 특정 기능으로 만들었다면 그일 만을 합니다. 인공지능에는 일일이 주어진 상황에 대해 서 사람이 룰 (혹은 알고리즘)을 설계하고 룰대로 행동하게 하는 방법도 포함됩니다. 요즘 인기 있는 머신러닝 분야에선 룰을 일일이 입력하는 대신, 데이터를 통해 머신을 학습하는 방법을 사용합니다. 하지만 현업에선 둘을 섞어서 사용하기도 합니다. 

 

 룰 기반 방법에서 포기하기 어려운 장점이 있습니다. 채팅 봇을 생각해봅시다. 그냥 서로 의미 없는 대화만을 한다면 어쨌건 대화만 이어지면 됩니다. 그런데 대화로부터 무언가를 파악해서 특정 행동을 하기 위해선 대화를 이해하고, 거기서 어떠한 요소를 파악해서 그것을 사람에게 요소로서 전달해야 합니다. 

 예를 들어 채팅을 통해서 방문 예약을 한다면 

 이름

 생년월일, 전화번호 (개인정보)

 방문일시 

 담당자

 등의 정보를 묻고, 대화로부터 파악해야 합니다.

 그런데 이런 문제라면 룰을 사용하는 것이 훨씬 편합니다. 

 대화로부터 부족한 정보가 있어도 (예를 들어 연락처를 제공하지 않았을 때) 머신이 알아서 그것을 다시 묻도록 학습시키는 것보다, 룰을 만들어서 부족한 정보가 있으면 묻도록 하는 편이 쉬울 것입니다.)

 머신러닝 방법을 이용하고 자연어로 처리한다면 이들 정보는 대화 문맥에서 예측 대상이 되어버립니다. 

 학습할 때 데이터와 정답을 주고 학습시키는 방법으로 온갖 다양한 정답 문장들을 학습시켜야 하는데, 이런 것이 번거롭고 쉽지 않은 일입니다. 그리고 굳이 룰 따로, 학습 따로가 아니라, 함께 섞어서 사용할 수도 있습니다. 

 

 최근에는 워낙 머신러닝이 대세가 되어서 인공지능에 대한 개념이 달라졌지만, 

인공지능의 역사는 어쩌면 컴퓨터의 역사와 비슷합니다. 무엇을 말하고 싶은 것이냐면... 컴퓨터가 처음 개발되었을 시기에 사람들이 생각하는 인공지능은 그냥 컴퓨터 알고리즘이라는 것입니다. 컴퓨터로 알고리즘을 만들고 문제를 푸는 것과 인공지능이 거의 같은 것처럼 여겨진 것 같습니다. 즉, 신약개발에서 분자가 약이 되기 위해 만족해야 하는 조건들을 컴퓨터 알고리즘으로 구현하고, 그것을 이용해서 신약 후보물질을 탐색하는 것도 (CADD), 인공지능 신약개발이라 할 수 있습니다. 
예를 들어 kinase 들은 hinge 영역을 가지고 있는데, kinase에 결합하기에 적절한 서브 구조가 있습니다. kinase inhibitor들은 상당수 이 구조를 가지고 있기에 이것을 룰로 만들어서 가상 스크리닝을 할 수도 있습니다. (그 이유는 kinase가 ATP와 결합하기 때문이고, 저 특유의 서브 구조는 ATP의 서브 구조와 유사합니다.)

비록 룰을 데이터로부터 학습한 게 아니라, 사람이 학습해서 컴퓨터에 넣어줘도 이런 것도 인공 지능이라 할 수 있습니다. 물론 요즘 통념적으로 말하는 인공지능은 주로 머신러닝이라 이런 방법을 인공지능이라고 잘 말하지는 않을 것입니다. 이런 방법은 머신러닝은 아닙니다. 머신러닝 ⊂ 인공지능입니다. 

 

머신러닝은 크게 생성 모델과 판별 모델 두 가지로 나뉠 수 있는데, 머신러닝은 기본적으로 통계분석이라는 점을 생각해볼 수 있습니다.

 생성 모델이란, 데이터의 분포를 통계적으로 학습하는 것입니다. 예를 들어서 (uniform random number generator로부터) 특수한 확률 분포를 가지는 random number generator라는 것을 만든다고 생각해봅시다. 우리가 어떤 사람들의 키에 대한 데이터를 얻었다면 그 데이터 분포는 아마도 가우시안 분포를 이룰 것입니다. 생성 모델이란 이 분포를 학습하고, 이 분포로부터 나올 수 있는 데이터를 생성하는 것입니다.

 이 경우라면 평균값 mu와 표준편차 sigma를 가지는 gaussian random number generator 가 학습되겠죠. 
만약 키와 몸무게 두 가지가 함께 주어진다면, 각각은 가우시안 분포를 이룰 것이고, 키와 몸무게는 상관관계가 높을 것입니다. 생성 모델이 잘 학습되었다면 생성 모델로 데이터를 많이 생성했을 때, 그 분포가 표본 집단의 데이터 분포와 유사할 것입니다. (물론 모집단과 유사하면 좋겠지만, 우리는 모집단의 분포를 모르고 비교할 수도 없죠.) 

사실 단순한 문제라면 굳이 뉴럴 넷을 모델로 사용하는 것보다는, 가우시안 모델을 사용하고 mu와 sigma 만을 학습하는 게 더 간단할 것입니다. 하지만, 머신러닝, 딥러닝을 처음 공부할 때는 일단 쉽게 해 볼 수 있는 통계분석을 예제로 먼저 해보고, 그것을 딥러닝으로 고쳤을 때 어떻게 나오는지 보는 것도 좋은 접근방법이라고 생각합니다. 특히 생성 모델 같은 것을 처음부터 이미지 생성, 문장 생성으로 공부할 경우는 개념 잡기가 쉽지 않습니다. 

딥러닝이란, 주로 깊은 인공신경망을 의미합니다. 옛날에는 인공신경망 (artificial neural network)를 잘 학습하기 어려워서 레이어 수가 적었는데, 최근 들어 레이어 수가 많은 깊은 신경망도 잘 학습할 수 있게 되었기 때문에 딥러닝이라는 용어를 많이 사용합니다. 

 

판별 모델은 특정 데이터를 주어졌을 때, 그 데이터가 어느 클래스에 속하는지(classificatoin) 혹은 그 데이터가 주어졌을 때, 그 데이터로부터 어떤 다른 무언가 실수 값을 예측할 수 있는지(regression) 판단하는 모델입니다.

 사진을 주고 고양이인지 개인지 판단하라거나, 특정 시간의 대기 상태 데이터, 기온 데이터 등을 주고 1일 후 비가 올 확률, 강수량이나 온도를 예측하라는 문제들이 가능할 것입니다. 

데이터로부터 이런 것을 어떻게 확률적으로 학습할까요. 
키를 주고 성별을 예측하라고 한다면, 쉽게 생각해서 같은 키인 사람들의 데이터로부터 남자의 비율과 여자의 비율을 찾아서 그 비율을 확률 값으로 줄 수 있겠죠. 
데이터의 분포가 불균형할 경우는 더 복잡한 방법을 사용해야 합니다. 예를 들어 애초에 수집한 데이터에서 성비가 다르다면 이 부분도 반영해주어야 합니다. 내가 가진 데이터에서 170의 키를 가진 사람 데이터를 봤더니 이중 남자 30명, 여자 70명이라면... 남자일 확률이 0.3%일까요? 데이터를 수집할 때 전체 데이터에서 남자가 1000명, 여자가 3000명이었다면? 
 수집한 데이터에서의 데이터의 분포와, 실제 예측해야 할 데이터에서의 데이터의 분포가 다르다면 이를 어떻게 보정해줘야 하는가도 문제입니다. 보정을 하려고 해도 모집단의 분포를 알아야 보정이 가능하겠죠. 현실의 데이터를 다루다 보면 이런 문제는 자주 나타납니다. 머신러닝은 내가 가지고 있는 샘플 데이터가, 모집단의 특성을 잘 반영할 것이라 가정 하에서 의미를 가집니다. 

여기서부터가 본론인데, 통계분석과 머신러닝의 차이는 무엇일까요?

 통계학은 머신러닝의 이론적 배경중 하나입니다. 하지만 그것이 전부는 아닙니다.

 머신러닝에서 학습이란 무엇인가 생각해봅시다. 데이터를 가지고 loss 함수가 최소가 되도록 파라미터를 최적화하는 과정입니다. 무슨 파라미터인가요? 공간 변환에 대한 파라미터입니다. 

 기본적으로 통계학은 주어진 입력공간 정보를 그대로 사용하지만, 머신러닝에서는 데이터들을 잘 식별할 수 있도록 (판별 모델의 경우) 공간을 변환합니다. 

데이터가 100차원의 vector라고 한다면, vector의 각 방향마다 중요도가 다릅니다. 이런 중요도에 대한 가중치를 잘 사용해야 유의미한 정보를 잘 판단할 수 있습니다. PCA 같은 선형 공간 변환도 있고, 때에 따라 유용하지만 한계가 있습니다, 머신러닝 방법들은 주로 비선형 공간 변환을 사용합니다. 특히 딥러닝에서는 비선형 공간변환을 여러 번 반복합니다. 

아래 예시에서 공간변환이 얼마나 중요한지 알 수 있습니다. 

x-y 공간에 대한 데이터를 r 방향에 대해 투영한 경우

그림에서 x-y 2차원에 찍힌 빨간 점과 녹색 점들은 원점으로부터의 거리 r 방향에서 보면 쉽게 분리가 됩니다. 예시에선 간단한 경우에 대해서 보여줬지만, 딥러닝에선 훨씬 복잡한 공간 변환이 가능합니다. 비선형 공간 변환을 위해선 sigmoid나 ReLU 같은 비선형 activation function들이 필요합니다.