본문 바로가기

DM ML AD

모든 ML 알고리즘의 이해

이직 후로는 면접에 들어가지 않고 있지만 면접에서 유능한 인재를 만나면 묻고 싶었지만 아직 한 번도 묻지 못한 질문이 있다. 머신러닝 학습의 핵심이 뭐냐? 는 질문이다. 개별 알고리즘의 개념이 아닌 모든 알고리즘들의 공통된 근간이 무엇인지를 묻는 질문이다. 내가 생각하는 이 질문의 답에 관한 글이다. 물론 내가 틀렸을 수도 있다.
모든 — 적어도 내가 아는 모든 — ML 알고리즘은 유사도 (또는 거리)를 측정하는 거다. 나 (X)랑 닮은 X’를 찾거나 나랑 전혀 다른 X’’를 찾는 것이 ML 알고리즘이다. 회귀 Regression은 나랑 닮은 X들이 공통으로 같은 Y, 보통은 평균을 예측/계산하는 알고리즘이다. 분류 Classificaiton은 나와 근접한 X들이 다수를 점유하는 클래스를 찾는 거다. Clustering은 나랑 가까운 X들은 같은 그룹에, 먼 X들은 다른 그룹에 할당하는 거다. 디멘전 리덕션 Dimensionality Reduction은 나의 속성을 최대한 유지한 채 차원을 줄려 표현하는 거다. 요즘 나오는 그 어떤 복잡한 알고리즘을 가져와도 그 근간에는 유사도 Similairty (또는 거리 Distance)를 구하는 거다. 뒤에서 다시 다루겠다.
그런데 특수한 경우가 아닌 이상 유사도를 구하는 것이 쉽지 않다. 특수한 경우란 Boolean 연산 또는 집합 (Set) 연산이 가능한 경우를 뜻한다. 객체 A와 객체 B가 얼마나 유사한지는 측정하기 어렵더라도, 'A와 B가 같은가?’라는 질문에 같다 (1) 아니다 (0)으로, 즉 Boolean 값으로 표현할 수 있다. 또는 두 개의 집한 A와 B가 얼마나 유사한가?라는 질문에는 두 집합에서 1로 표현되는 공통 원소의 개수 또는 비율로 답하면 된다. 그런데 우리가 주로 다루는 요즘 (빅) 데이터는 이런 Boolean으로 유사도를 측정하기 어렵다. 물론 두 문장 A와 B가 유사한가?라는 질문에는 두 문장에 속한 공통 단어의 비율로 답할 수도 있으나 완전하지 못하다. 예를 들어, ‘Blue Sky’와 ’Sky Blue’는 순서가 없는 집합으론 동일하나 순서를 고려하면 같지 않다. 모든 ML 알고리즘은 유사도를 측정하는 거지만 사전에 거치는 과정이 필요하다. 바로 공통의 수치 벡터로 표현하는 거다.
벡터화 과정. 흔히 임베딩 Embedding이라 부르는 거다. 좀 더 고급스러운 표현은 Knowledge representation 또는 Represenation learning이다. 어떤 용어가 됐든, 임베딩은 임의의 객체를 계산 가능한 수치 (보통 Float/Double 형) 벡터로 만드는 거다. 어떤 임의의 객체더라도 길이가 같은 (엄밀히 같은 semantic space 내의) 벡터로 표현하면 그들 간의 유사도 또는 거리는 바로 구할 수 있다. 내적이든 consine similarity 든 eucliean distance 든 개발자의 마음에 달렸다. 정리하자면, 모든 ML 알고리즘은 객체를 같은 의미 공간 내의 벡터로 임베딩하고, 그들 간의 유사도를 구하는 거다. 이것만 알고 있으면 새로운 알고리즘을 만나도 이전보다는 조금은 쉽게 이해할 수 있다. 임베딩 파트와 유사도 파트만 구분하면 된다.
좀 복잡한 알고리즘으로 돌아가자. 지금은 ChatGPT가 가장 핫하니 Transformer를 얘기해 보자. 사실 나는 트랜스포머를 잘 모른다. Attention is all you need라는 논문도 여러 차례 읽었고 첨부된 그림이나 숙은 대강 이해했지만 이걸 다시 누군가, 특히 일반 대중에게 다시 설명할 수 없다. 그렇기에 나는 아직 트랜스포머를 이해하지 못한 상태다. 그렇지만 트랜스포머도 결국 앞서 말한 유사도를 구하기 위한 과정이라는 틀에서 벗어나지 않는다. 쉽게 오토인코더에 사용되는 인코더-디코더 구조를 생각하자. 인-디코더 구조는 "텍스트 A —> 인코딩 —> L (Latent Vector) —> 디코딩 —> 텍스트 B (= A’)”를 뜻하고, 트랜스포머도 이것의 특수한 케이스다. A가 L을 거쳐서 B가 되는 과정이 뭐가 유사도를 게산하는 거냐고 반문할 수 있다. 그런데 화살표를 조금 바꿔서 ‘텍스트 A —> 인코더 1 —> L1 & L2 <— 인코더 2 <— 텍스트 B’로 변형한다면 이제 텍스트 A/B를 인코어 1/2를 통과시켜서 L1/L2를 만들고, 여기서 L1과 L2가 같다 (또는 매우 유사하다) 면 텍스트 A와 텍스트 B는 유사하다고 말할 수 있다. ’sky is blue’와 ‘하늘이 푸르다’가 같은 이유는 전자의 의미 벡터가 후자의 의미 벡터와 거의 같기 때문이다. NP-hard지만 개념적으로 세상의 모든 한국어 문장을 임베딩한 것 중에서 ’sky is blue’의 임베딩 벡터와 같은 문장이 sky is blue의 옳은 번역이 된다. 텍스트로 그림을 그리든 음악을 만들든 텍스트의 임베딩 벡터와 가장 유사한 임베딩 벡터를 만들어내는 그림이나 음악이 요즘 소개되는 AI 서비스들이다.
다소 모호한 개념을 짧은 글로 표현하려니 글이 쉽게 적히지 않았다. 이제 새로운 논문을 읽을 때, 두 객체의 유사도를 판별하기 위해서 이런저런 복잡한 아키텍처와 수식의 임베딩 (또는 디-임베딩) 과정을 거치는구나라고 이해하면 된다. 굳이 논문의 모든 디테일을 이해할 필요가 없다. 다만 그 논문에서 주장하는 바가 내가 풀어야 하는 문제에 적합하면 (<— 이것도 유사도) 더 자세히 읽고 이해하고 적용하면 된다.
오래전부터 적으려던 글이지만 좋은 제목이 생각나지 않아 미웠는데, 글로 표현하는 것이 어려운 걸 보니 아직은 배움이 부족하다.

반응형