누워서 읽는 머신러닝 (1)

드디어 첫 번째 글입니다. 서문에서는 이 시리즈를 왜 시작하게 되었는지에 대해서 주절주절 이야기를 했었고 이제 본격적인 이야기를 시작해보고자 합니다.

머신러닝이란 단어는 이제 일종의 버즈워드가 되어버린 것 같습니다. 이 분야를 잘 아는 사람이든 아니든 일단 뭔가 자동화가 되는 분야에 대해서는 전부 AI 혹은 머신러닝/딥러닝이라는 단어를 끼워넣는 듯한 기분까지 듭니다.

그렇다면 머신러닝이란 대체 무엇일까요? 무엇이길래 이렇게 사람들 사이에서 자주 쓰이고, 언론에서도 그렇게 난리일까요?

머신러닝은 데이터를 기반으로 기계를 학습시켜서 풀고자하는 문제에 대한 결과값을 예측하게 만드는 방법이다.

여러 정의들이 존재할 수 있지만, 저는 간단하게 위와 같이 머신러닝을 정리해 봤습니다. 이 정의에서 중요한 점은 크게 3가지라 생각하는데 바로 데이터, 학습, 그리고 예측입니다.

  • 데이터: 머신러닝의 기반은 데이터입니다. 데이터의 중요성은 이 시리즈 전반에 걸쳐서 꾸준히 언급할 것이지만, 실제 도메인에 머신러닝 또는 딥러닝을 적용시키고자 할 때마다 오히려 알고리즘보다 데이터가 더 중요한게 아닌가 하는 생각이 들 정도로 중요합니다.

  • 학습: 그 중요한 데이터를 가지고 기계 즉 컴퓨터를 학습시켜야 합니다. 학습을 시켜야 한다고 말하면 굉장히 모호한 것 같은데, 이런 표현을 거의 모든 곳에서 쓰고 있기 때문에 일단은 차용해서 쓰겠습니다. 학습이 정확하게 무엇을 뜻하는지에 대해서는 이어지는 글들에서 설명하겠습니다.
  • 예측: 결국 머신러닝을 쓰는 이유는 우리가 풀고자하는 문제를 기계(컴퓨터)가 대신 풀어주는, 즉 예측을 해주기 바라기 때문입니다. 이 예측을 잘하기 위해서 위의 두 요소(데이터, 학습)이 필요하고, 예측을 평가하기 위한 metric들이 필요합니다.

Type of Machine Learning

머신러닝은 어떻게 학습시키냐에 따라 지도학습(supervised learning)과 비지도학습(unsupervised learning)으로 나눌 수 있다고 보통 이야기 합니다. 그러나 최근에는 알파고로 인해 다시 주목받고 있는 강화학습(reinforcement learning)을 포함해 세 가지로 나뉜다고 말할 수 있습니다(물론 예전부터 3가지로 분류되어 오긴 했습니다만…). 강화학습은 다른 시리즈를 통해서 다룰 예정이기 때문에 이 시리즈에서는 머신러닝은 단순히 지도학습비지도 학습으로 나뉜다고 생각하겠습니다.

Supervised Learning (지도학습)

지도학습은 말 그대로 선생님이 있다고 생각하면 됩니다. 우리가 학교를 다닐 때 (어연 졸업한지가…) 계속해서 반복하는 것은 어떤 문제에 대해 답을 구하고 그 답이 맞는지 틀렸는지를 선생님이 채점하는 과정을 통해 피드백을 받고 결국 정답을 맞출 확률을 높혀가는 것이라 생각할 수 있습니다. 이 지도학습은 이 과정과 정확히 일치합니다.

좀 더 어려운 단어를 써서 이야기 하자면 데이터마다 정답인 Label이 존재하는 것입니다. 그래서 지도학습에 사용되는 데이터를 Labeled data라고 이야기하곤 합니다.

Unsupervised Learning(비지도 학습)

비지도학습은 지도학습과는 조금 다르게 정답 Label존재하지 않습니다. 쉽게 말하자면 여러 색 돌멩이들이 모여있을 때 그 돌멩이들을 색깔별로 나누는 것(Clustering)을 말합니다.

Problems of Machine Learning

여러 프로젝트들을 진행하면서 느끼는 점들 중 하나는 머신러닝으로 풀 수 있는 문제는 상상력에 비례한다는 느낌입니다. 점점 프레임워크들이 쓰기 쉬워지고 추상화가 되고 있는 상황에서 이를 어떤 문제를 푸는 데에 사용하는 지는 전적으로 사람의 아이디어에 달렸다는 생각입니다. (아이디어 좀 주세요..)

Classifiation

분류문제입니다. 어떤 문제들 중에는 예측값이 discrete value인 경우가 있습니다. 예를 들면 넷플릭스 영화 시청 기록을 가지고 이 사람이 10대인지 20대인지와 같이 연령대를 맞추는 것입니다.

Regression

앞선 classification 문제와는 달리 연속적인(continuous value)로 예측값이 나오는 경우입니다. 판교에서 강남까지 택시를 탔을 경우 그 요금이 얼마나 나오는가 같은 문제가 Regression 문제가 될 수 있겠죠. 그런데 제가 처음 Regression이라는 단어를 접했을 때는 정말정말정말 와닿지 않았습니다. 사전을 찾으면 다음과 같이 나옵니다.

Regression : 후퇴, 복귀, 퇴화, 타락

????????????

아니 이 문제랑 후퇴, 복귀랑 무슨 상관인거지…라는 것이 제 생각의 흐름이었죠. 그런데 원서를 읽다가 이 단어에 대한 설명을 읽었고 그 내용은 다음과 같았습니다.

처음 Regression이라는 단어를 coin한(작명한) 통계학자가 아버지의 키가 작을 경우 아들의 키도 작다는 연관성을 그 당시에 알게 되었고, 그래서 이 단어를 붙였다.

그 책을 읽은지가 오래되어서 제 기억이 명확하지 않을 수 있기 때문에 혹시라도 틀린 내용이라면 댓글로 알려주세요!

각설하고, 이렇게 머신러닝에는 이렇게 유명한 두 개의 문제 종류가 있습니다. 물론, classification 문제라고 해서 regression으로 풀 수 없는 것도 아니고 vice versa이지만 그래도 문제 유형은 이런 것들이 있다는 것을 짚고 넘어가고 싶었습니다.

Machine Learning / Deep Learning

그렇다면 이때까지 머신러닝이 무엇인지와 문제 종류들을 설명했는데, 최근에 언론에서 이야기하는 딥러닝은 무엇일까요?

쉽게 말해서 딥러닝은 머신러닝에 포함됩니다.

머신러닝은 많은 분야를 포함하고 있는데, 그 중에서도 사람의 뇌 속에 있는 뉴런을 흉내낸 인공 뉴런을 가지고 만든 ANN(Artificial Neural Net)을 이용해서 문제를 풀어가는 분야가 있습니다. 이 분야는 이 인공뉴런을 엮어서 마치 사람의 뇌에 있는 뉴런들이 시냅스들을 통해 연결되듯이 체인을 만들어서 (DAG) 문제를 푸는 분야입니다. (이해가 어려우실 땐 지금은 스킵하셔도..) 사실 이 방식이 등장한 것은 꽤나 오래되었습니다. 그러나 예전에는 컴퓨팅 파워가 그리 좋지 못했기 때문에 많은 연산이 필요한 이 인공신경망을 제대로 이용할 수가 없었습니다.

이런 이유 때문에 인공지능의 겨울이라는 것이 2번이나 도래했고, 그렇기 때문에 알파고를 통해서 마치 새로운 학문이 나타난 것처럼 빵?하고 터진 것입니다.

역사: 캐나다의 CIFAR 이란 연굿에서 딥러닝의 대부라고 불리는 Hinton 교수님이 “A fast learning algorithm for deep belief nets” 이라는 논문을 통해서 딥러닝의 가능성을 다시 한 번 언급했고, 2012년에 이 교수님 밑에 있던 Alex라는 학생이 ImageNet이라는 대회에서 딥러닝을 가지고 좋은 기록을 내면서 열풍을 불러왔습니다.

앞서 언급했듯이 딥러닝은 처음 등장한 것이 아닌데 왜 처음 등장한 것 같이 느껴지냐면, 원래 이름은 Neural Net 이었기 때문입니다. 그렇지만, 인공지능의 겨울을 통해서 사람들은 이 단어에 대한 부정적인 인식을 가지게 되었고, 다시 붐을 일으키기 위해서 Deep learning 이라는 이름으로 새롭게 브랜딩을 한 것입니다. (사실 그 당시에는 뉴럴넷이라는 이름을 가지고 논문만 써도 리젝당하거나 인기를 못끌었다고 합니다.)

Linear Regression

사실 머신러닝/딥러닝을 공부한다고 하면 무엇인지 명확히는 몰라도 거의 CS101에 등장하는 printf처럼 제일 먼저 등장하는 것이 Linear Regression입니다. 그래서 이 글에서 다시 다루는 것이 의미가 있을까에 대한 고민을 했지만, 간단한 예시를 들고 설명하면서 프로젝트 진행과정에 대해서 언급하기에 좋을 것 같아 다루고자 합니다.

IMG_0D625A227932-1

위의 그림을 보면 앞서 언급했던 거리에 따른 택시비가 얼마나 나오냐는 문제를 매우매우매우 간단하게 만든 그래프입니다. x축이 거리, y축이 요금입니다.

이렇게 3요소 중 하나인 데이터를 만나게 되면 먼저 위와 같이 시각화를 진행해보는 것이 좋습니다. 사실 raw 데이터만 봐서는 이 데이터가 어떤 경향성을 띄고 있는지와 같은 것들을 파악하기 힘듭니다. 그래서 시각화 및 데이터 특이값 분석 등을 제일 먼저 진행합니다.

이 문제에서는 아무래도 단순하게 만들었기 때문에 특이값이 눈에 띄지는 않지만, 아마도 실제로는 교통 체증과 같은 이유로 거리는 짧지만 요금이 높게 나온 경우도 있을테니 그런 것들이 특이값이 될 수 있을 것입니다.

가설 정의

그리고 나선 우리는 가설을 정의해야 합니다. Linear Regression이니 선하나를 가지고 이 점들을 표현하는 것을 목표로 하기 때문에 가설은 다음과 같이 될 것입니다.

\[y\_origin = W*x\_data\]

IMG_BDC95A0227AF-1

Cost Function

이렇게 선을 그리면 얼추 맞는 것 같지만 이게 맞는 것인지 아닌지 제대로 알 수가 없습니다. 그래서 우리는 각 점들과 선 사이의 거리를 구해서 전부 더합니다. 결국 이 총합이 크다면 제가 그린 선은 이 점들의 경향성을 잘 표현하지 못하고 있는 것이고, 총합이 최소화 된다면 경향성을 잘 표현하고 있다고 생각할 수 있습니다. (물론 일차 방정식을 가지고 이를 제대로 표현하는 것은 사실상 불가능하지만 일단은 최대한 노력을 해본다고 생각해주세요).

Optimizer

이렇게 비용함수를 정의하고 나면 선을 계속해서 이동시켜보는 과정이 필요합니다. (최소값을 찾기 위해). 그렇지만 우리는 어떻게 이동해야 이 비용함수가 최소가 될 지 모릅니다. 그래서 새로운 개념 하나가 등장하는데 바로 Gradient Descent(경사하강법)입니다. 이 방식을 위해서는 단순히 차이들의 합을 이용하는 것이 아니라 Mean Square Error(평균 제곱 오차)를 사용합니다.

\[Cost =\frac{\sum(y' - y\_original)^2} {n}\]

선이 예측한 y'와 실제 점(y_original)의 차이를 제곱하고 평균을 구하는 개념입니다. 이 비용함수를 미분하고 그 미분값이 작아지는 방향으로 선의 parameter인 Wb를 조절해 나가는 과정이 이 optimizer가 하는 역할입니다.

Learning & Testing

이 비용함수와 Optimizer를 이용해서 학습을 진행합니다. 다만 주의해야 할 것은 모든 데이터에 대해서 학습을 진행하면 안된다는 점입니다. 뒤에서 설명할 Overfitting 이라는 문제가 있는데 간단히 말하자면 시험문제를 미리 풀어보면 시험에서 100점을 받는 것과 같은 것입니다. 즉, 공부를 할 때는 시험에 나올 것 같은 것을 공부하고, 시험문제는 다른 것이 나오더라도 잘 풀 수 있는 능력을 배양하는? 개념이라고 생각하시면 됩니다. 이를 위해 학습 데이터를 전부 사용하는 것이 아니라 80:20과 같이 나눠서 테스트를 위한 데이터를 남겨두는 것이 좋습니다.

Prediction

이제 학습과 테스트를 진행했으니 실제 데이터를 이용해서 우리가 풀고 싶어하는 문제를 풀어야 합니다. 앞선 Learning & Testing 단계를 통해서 파라미터들이 조정되었고, 이를 학습된 모델이라고 부릅니다. 이제 거리가 1km이면 택시비가 4000원이다와 같은 예측이 가능합니다.

머신러닝 문제 풀기 단계

위에서 간단한 문제를 통해서 진행해보았듯이 머신러닝 문제는 다음과 같은 과정을 따릅니다.

데이터를 분석하고 그에 대한 가설(Hypothesis)를 설정한 다음 비용함수를 설정합니다. 그 이후 옵티마이저를 이용해 이 비용함수를 최소화하는 방향으로 학습을 진행하고, 이 학습된 모델을 가지고 예측을 진행합니다.

이렇게 대략적인 머신러닝의 기본에 대한 내용을 다뤄보았습니다.

.