[기계학습심화] 1. 기계학습 개요
“Machine learning is a branch of artificial intelligence (AI) and computer science which focuses on the use of data and algorithms to imitate the way that humans learn, gradually improving its accuracy.”
기계학습은 AI, 사람이 학습하는 방식을 모방하는 알고리즘과 대량의 데이터를 사용하여 정확도를 개선하는 컴퓨터 과학 분야의 한 갈래이다.
강의록에 나와있는 이 문장이 지금까지 배운 기계학습의 전부를 담고있다고 생각한다.
3년전만해도 손글씨를 인식하는 모델은 새롭고 신기한 모델이었다. 실제로 대학교 2학년 때 주변에서 들었던 아이디어 중에 사람 손글씨를 폰트로 만들어서 그걸로 타이핑하듯 과제를 작성하면 마치 내가 손으로 과제를 쓴 것처럼 만들어주는 프로그램이 있으면 좋겠다는 것도 있었다. 이제 손글씨 인식은 매우 기초적인 예제가 되어버렸기에 지금은 누구나 할 수 있는 주제가 되지 않았나 하는 생각을 하다보면 정말 AI의 발전속도가 엄청 빠르다는 것이 실감된다. 물론 이 프로젝트는 손글씨 인식을 넘어서 생성까지 해야하긴 하지만, 지브리 풍 그림 변환도 뚝딱뚝딱 하는 시기에 이런 건 AI를 공부하는 사람들에겐 졸업 프로젝트 수준이지 않을까 ㅋㅋ
AI를 공부하는데 있어서 필요한 선수 지식은 위와 같다고 한다.
AI는 여러 분야의 지식을 총 망라한 것이라고 한다.
우선 AI 관련 라이브러리는 파이썬 라이브러리가 많다보니 구현하는 과정에서 파이썬으로 구현하는 경우가 많아 파이썬 지식이 필수적이다.
추가적으로 기본적인 미분 지식과 선형대수학 지식이 매우 중요하고, 확률과 통계도 매우 중요하다.
기계 학습은 그 연산 과정이 행렬 연산이다보니 선형대수학 지식이 필요하고, 기계 학습은 근본적으로 데이터를 가지고 통계를 내는 작업이기 때문에 역시 확률 통계 지식이 필요하다.
이 외에도 전자공학과에 있는 신호 처리 수업과 같은 과목이 도움이 된다고 하신다.
최근에는 딥러닝 기법으로 모델을 학습시키는 것이 주류지만, 딥러닝 기법을 학습하기에 앞서 전통적인 기계학습 기법을 먼저 정리하려고 한다.
인공지능 기술이 발전한 컨텍스트를 이해하는 것도 중요하고, 최신 딥러닝 기법에서도 과거의 기계학습 기법을 접목하는 경우가 존재하기 때문이다.
인공지능은 그 분야가 매우 넓다.
우선 사람이 할 수 있는 모든 것들을 컴퓨터로 모방하려고 하는 것을 일컬어 AI 라고 부른다.
그 중에서 인간의 시각을 모방하는 컴퓨터 비전과 지능을 모방하는 기계학습이 존재할 수 있고, 이 둘 사이에 중첩되는 부분도 존재한다.
기계학습은 특히 데이터를 기반으로 컴퓨터를 학습시키는 것이고, (데이터 없이도 학습시킬 수 있다.) 그 중에서 인공 신경망을 활용하여 컴퓨터를 학습시키는 딥러닝 기법이 존재한다.
이번 학기에는 이들의 교집합에 해당하는 내용을 정리한다.
인공지능은 단순히 컴퓨터 과학 뿐 만 아니라, 생물학, 물리학, 수학, 전자공학 등 여러 학문의 지식이 모두 들어간다.
특히 인공신경망은 인간 뇌의 구조를 이해하게 된 이후에 등장한 기법으로, 현재 대부분의 기계학습에서 사용하는 방식이다.
인공지능의 응용분야는 매우 다양하다.
자율주행, 공장 자동화, 생체 인증, 이미지 문자 인식, 이미지 생성, 사물 인식, 의료 진단, 언어모델 등등에서 사용된다.
기계학습에서 데이터는 매우 중요하다.
이때 컴퓨터는 모든 데이터를 그저 '숫자 덩어리'로 인식한다.
예를 들어 어떤 사진 데이터가 있다고 하면, 그 사진은 각 픽셀들의 rgb 값의 모음으로 나타낼 수 있다.
그리고 기계학습으로 하는 일은 이 숫자값을 바꾸거나, 새로운 환경에서 숫자값을 예측하는 것이다.
이때 어떤 숫자가 주어질 때 새로운 숫자로 바꿔주거나 예측하는 것을 가리켜 '모델' 이라고 부르고, 수학적인 관점에서는 함수로 표현하기도 한다. 그리고 머신러닝은 결국 이 '모델'을 만드는 과정이다.
개와 고양이를 구분하는 것은 사람에겐 쉽지만 기계가 흉내내는 것은 매우 어렵다. (이젠 기초적인 예제가 되어버렸지만..)
단순히 색으로 구분하기에는 검은색 개와 검은색 고양이와 같은 종류도 고려해야 하다보니 형태도 고려해야 하는 등, 매우 복잡하다.
과거 초창기에는 개와 고양이를 분류할 때 규칙에 기반해서 분류하려고 시도했다.
(1학년때 인공지능 숫자야구 프로젝트를 진행하면서 너무 if-else 문 반복이라 이게 맞는지 모르겠다고 했더니 당시 교수님이 초기 인공지능은 모두 if-else 범벅이었다고 괜찮다고 말씀하셨던 것이 생각난다.)
그래서 이런 경우에는 개고, 이런 경우에는 고양이고, .. 그런 규칙들을 아주아주 자세하게 다 알려주는 것이다.
하지만 눈이 있고, 귀가 있고, 색은 검은색, 갈색 등으로 다양하게 있을 수 있고.. 와 같은 여러가지 설명을 덧붙여도 개와 고양이를 구분하는 것은 쉽지 않다.
그렇다고 설명을 너무 정교하게 했더니 이번엔 개를 개로 분류하지 않고, 고양이를 고양이로 분류하지 않는 경우가 생기기도 한다.
그래서 2010년대 초반까지만 해도 개와 고양이를 구분하는 것은 불가능한 문제로 여겨졌다.
그러다가 딥러닝 기법이 들어오면서 이 문제는 매우 쉬운 문제로 바뀌었다.
딥러닝은 데이터를 기반으로 모델을 만드는 방식으로, 기존 데이터를 잘 분류할 수 있는 모델을 컴퓨터가 계산하여 만들도록 시키고, 그 모델에 새로운 데이터를 넣어 잘 분류하는지 확인하는 방법이다.
이제 기계학습의 큰 개요를 간단하게 살펴보자.
먼저 결론을 간단하게 깔고 가면, 기계학습은 주어진 데이터 분포를 잘 나타내는 함수를 찾는 것이다. (function approximation)
함수는 입력값과 출력값 사이의 관계를 나타낸다.
지금까지는 수학에서 함수를 사용할 때, 또 프로그래밍에서 함수를 다룰 때 사전에 정의된 함수가 있거나, 우리가 먼저 함수를 정의를 하였다. 그리고 미지수 x에 다양한 데이터를 넣어보며 어떤 출력값이 나오는지를 살펴보았다.
하지만 기계학습은 조금 다르다.
기계학습에서는 사전에 정의된 함수가 없고, 오직 입력값과 출력값만 미리 정해져있다.
그리고 여러 입력값과 출력값들에 대해 그들의 관계를 잘 나타낼 수 있는 함수를 거꾸로 찾아야 한다.
그렇다면 기계학습에서 말하는 '입력값' 과 '출력값' 은 무엇일까?
위에서 간단히 언급했던 기계학습의 응용분야의 관점에서 예시를 살펴보자.
먼저 물체 인식의 경우, 어떤 사진이 입력으로 주어지면, 그 사진에서 특정 물체에 대한 bounding box 와, 해당 bounding box 에 있는 물체가 무엇인지 라벨링까지 한 결과물이 출력값이된다.
이미지가 입력으로 들어왔을 때, 꼭 물체인식만 할 수 있는 것은 아니다.
이렇게 사진에서 각 영역이 나타내는 것을 라벨링하는 semantic segmentation 도 할 수 있고
가구 이미지로부터 해당 가구의 크기, 위치, 각도 정보를 추상화한 이미지로 나타낼 수도 있다.
이렇게 사람 사진으로부터 사람의 신체 포즈를 선으로 나타낸 결과를 출력값으로 할 수도 있다.
사진으로부터 꼭 사진만 나올 필요도 없다.
사진을 설명하는 글을 생성하도록 하거나, 거꾸로 글로부터 사진을 만들어내도록 할 수도 있다.
이 외에도 글을 기반으로 원문 -> 번역을 입력값 출력값으로 하여 어떤 글을 번역하는 함수를 생각할 수도 있고,
사진과 질문이 입력으로 주어졌을 때, 사진 정보를 기반으로 질문에 대한 답을 출력으로 하는 VQA 함수를 생각할 수도 있다.
자율 주행 관점에서는 라이더가 읽어들인 주변 정보를 입력으로 하고, 자동차의 동작 제어를 출력으로 하는 함수를 생각할 수 있다.
이렇게 머신러닝은 입력이 있고 우리가 기대하는 출력이 있을 때, 분야에 상관없이 이 입력값과 출력값을 매핑시켜줄 함수를 찾는 문제로 귀결된다.
하지만 어떻게 함수를 찾아야 할까?
이 f(x) 라는 함수의 정확한 답은 사실 우리의 뇌 속에 있다.
인간은 경험에 기반하여 만들어진 f(x) 가 이미 존재하고, 그 함수에 어떤 x 가 들어오더라도 자신만의 y 라는 결과물을 도출해내며, 그 결과물은 대체로 정답이기 때문이다.
하지만 이 함수를 컴퓨터에게 정확하게 알아내도록 하는 것은 쉽지 않다.
우리조차도 아직 우리의 뇌 구조를 다 모르는데, 어떻게 컴퓨터에게 우리의 뇌 구조를 그대로 모방하라고 시킬 수 있을까?
그래서 우리는 우리의 뇌 속에 있는 함수와 최대한 비슷한 함수를 찾아내도록 시킬 것이다.
100% 정확하진 않을지라도, 우리가 만족할 만한 기준까지는 정확하게 동작하는 함수를 찾는 것이다.
그러면 이제 함수를 찾는 문제는 이렇게 2가지로 생각해볼 수 있다.
1. 기계학습이나 딥러닝을 사용하여 어떻게 함수를 학습시킬 것인가?
2. 현실에 있는 문제를 어떻게 입력과 출력이 있는 함수의 구조로 공식화할 것인가?
그리고 수업에서 중요하게 다루는 내용은 1번 어떻게 학습시킬 것인가? 이다.
함수를 학습시키는 방법은 크게 4가지가 있다.
- 지도 학습 (supervised learning)
훈련용 데이터에 x 뿐만 아니라 y도 있다.
위에서 지금까지 본 예시는 y가 주어진 경우들이 많다.
지도 학습은 정답이 있기 때문에 성능도 좋고 이론도 잘 정립이 되어있다.
그래서 신뢰도있는 모델을 만들 때 지도학습을 많이 활용하고 있다.
다만 이론이 잘 정립되어 있어서 더 이상 연구는 많이 하고 있지 않다.
- 비지도 학습 (unsupervised learning)
주어지는 훈련용 데이터에 y가 없다.
예를 들어 MRI 사진을 기반으로 암을 판별하는 함수를 찾고자 할 때, 전문가의 도움 없이 라벨링하는 것이 쉽지 않다.
이런 경우 라벨링 없이 모델을 훈련시키기 위해 비지도 학습을 사용할 수 있다.
- weekly / semi-supervised learning
훈련용 데이터 일부에는 y 가 있고, 일부에는 y가 없다.
지도 학습과 비지도 학습의 사이에 있는 방법으로, 현재 딥러닝 기술은 대부분 이 쪽에 속한다.
딥러닝 과정에서 데이터가 매우 많이 필요하다보니 모든 데이터에 라벨링하기가 쉽지 않기 때문이다.
그래서 일부 데이터는 사람이 정확하게 라벨링하고, 나머지는 라벨링 없이 학습하는 거대 모델 학습에 주로 활용한다.
- 강화학습 (reinforcement learning)
위 방법들과는 조금 결이 다르다.
어떤 환경이 주어지고, 그 환경에서 특정 액션을 선택해서 취하기를 반복하다보면 리워드가 온다.
그리고 그 리워드를 기반으로 기존의 선택 경로를 수정하고 다시 반복한다.
만약 결과가 좋다면 + 보상을 해주고, 결과가 안 좋다면 - 보상을 주어 기존 선택지를 고르지 않도록 유도하는 것이다.
학습이 끝날 때마다, 현재 여기에서 어디로 갔을 때 보상이 얼마고, 그 위치에서 어디로 갔을 때 보상이 얼마인지를 알 수 있기 때문에, 보상을 높게 받는 쪽으로 선택할 확률을 높이게 된다.
그래서 최종적으로 머신러닝의 방법론을 크게 나누면 위와 같이 지도학습, 비지도학습, 강화학습 3가지로 분류할 수 있다.
지금까지의 내용을 요약해보면 다음과 같다.
1. 기계학습은 입력 데이터와 출력 데이터로부터 (또는 입력 데이터만으로) 우리가 원하는 결과를 도출하는 함수를 찾는 것이다.
2. 제일 정확한 함수는 우리의 머릿 속에 있지만, 컴퓨터가 이를 그대로 모방하기는 쉽지 않아서, 최대한 머릿 속에 있는 함수와 비슷하게 동작하는 함수를 찾아야 한다.
3. 그런 함수를 찾는 방법은 크게 지도학습 / 비지도학습 / 강화학습이 있다.
이제 다음 글부터 본격적으로 '함수를 찾는 구체적인 방법' 들을 하나씩 정리해본다.