Preliminaries
머신 러닝, 딥 러닝에 발을 담궈보면 언제나 나오는 representation learning.
학부 시절 수업을 들었을 때나, 유튜브에 공개된 외국 강의 자료들을 봐도 항상 등장한다.
단어 뜻만 보면 "표현 학습" 인데, 공부를 막 시작하다 보면 이게 도대체 무슨 의미인가 하고 쉬이 넘어가기가 쉬웠다.
머신 러닝, 딥 러닝 관련 자료를 보면 위와 같은 그림이 자주 등장한다.
CNN의 hidden layer가 주어진 이미지의 feature를 위 그림처럼 학습해서 최종적으로 분류와 같은 downstream task를 수행할 수 있다는 설명을 하는데, 그런가보다~ 하고 넘어가기가 쉽다.
도대체 자주 언급되고 등장하는 feature, representation이 뭘까?
Representation Learning
wikipedia를 보면 다음과 같이 소개하고 있다.
특징 학습(feature learning) 또는 표현 학습(representation learning)은 특징을 자동으로 추출할 수 있도록 학습하는 과정이다.
그래서 이 특징, 표현이 뭘까?
이를 설명하기 위해 많이들 드는 예시로 강아지, 고양이 등 동물의 분류가 있다.
우리(사람)는 동물을 보면 "아 이건 무슨 동물이다" 라는 걸 (어느 정도) 알 수 있다.
위 예시에서 고양이는 "뾰족한 귀", "입과 코 주변의 수염", "털 위의 무늬", "큰 눈동자" 등 으로 유추해볼 수 있고, 강아지는 "접혀진 귀", "상대적으로 작은 눈동자", "커다란 코" 등 으로 유추해볼 수 있으며, 햄스터는 "동그란 외형", "작은 눈동자", "작은 코", "작은 입", "몸에 비해 짧은 팔과 다리", "동그랗게 세워져 있는 귀" 등 으로 유추해볼 수 있을 것이다.
이처럼 우리는 어린 시절 부터 보고 접해온 동물들의 여러 특징들을 종합하여 "이 동물은 강아지/고양이/햄스터 구나" 라는 결론을 내릴 수 있다.
하지만 사람에게도 한계는 존재한다.
100억 장의 동물 사진들을 가지고 이 동물들을 완벽하게 분류해보라 하면 시간도 상당히 오래 걸리고, 에너지가 부족하면 실수가 잦아지기 마련이다.
그래서 컴퓨터를 이용해 이러한 단순하면서도 반복적으로 수행할 수 있는 작업을 해결하고자 하는 시도가 많았다.
(대표적인 예시로 사람의 손 글씨를 분류하고자 하는 연구가 있다: Gradient-based learning applied to document recognition, Y. Lecun et al., 1998)
하지만 사람과는 다르게 컴퓨터는 눈이 있는 것도 아니고, 단순히 전기 신호인 0, 1의 이진수를 통해 작업을 수행한다.
숫자를 통한 단순 계산은 사람을 능가하는 수준의 정확도와 속도를 보여주지만, 실제 세계에서 우리가 접하는 여러가지 물체/개체들은 복잡한 특징을 가지고 있어 숫자로 표현하는 것이 힘들기 마련이다.
컴퓨터가 사람처럼 특정 물체/개체를 어떻게 인식하게 할 수 있을까? 에서 시작된 것이 바로 representation learning의 기원이라고 생각한다.
즉 "데이터를 잘 설명할 수 있는 특징(feature, representation)을 생성하고, 컴퓨터가 이 특징을 학습하여 주어진 데이터들에 대한 여러 작업을 처리할 수 있게 하자!" 정도 로 생각할 수 있을 것이다.
representation learning이 무엇인가에 대한 내용을 계속 기술하자니 서두가 너무 길어지는 것 같아, 잘 정리되어 있는 medium 포스팅으로 대신하고자 한다:
표현학습(Representation Learning) 개요
표현학습의 핵심을 살펴보고, 이것이 신경망과 깊게 관련되어 있음을 보입니다. 또한 향후 ICT산업이 어떻게 바뀌게 될 지 예측해봅니다.
medium.com
(어떻게 보면 사람도 방대한 양의 데이터를 통해 여러 물체/개체의 representation을 학습한 것으로도 볼 수 있지 않을까?)
Embedding
앞서 언급한 듯이, 사람과는 다르게 컴퓨터는 숫자를 통해 작업을 수행한다.
즉, 컴퓨터를 통한 연산을 수행하기 위해선 우리가 알고 있는 물체/개체와 같은 데이터를 숫자로 표현해야 하는 작업이 필요하다.
이미지는 RGB 값, 오디오는 주파수 값 과 같은 수치들을 이용해 숫자로 표현할 수 있지만, 현재 작성하고 있는 이러한 글자(텍스트) 들은 어떻게 숫자로 표현할 수 있을까?
단순하게 생각해보면 하나의 단어, 하나의 글자 마다 고유한 숫자를 대입하여 해당하는 단어/글자를 표현할 수 있는 특징, 즉 feature vector를 구성할 수 있을 것이다. (Integer Encoding)
하지만 단어/글자는 동일한 외형이지만 그 뜻이 다른 경우도 빈번하며, "다섯"처럼 그 자체에 숫자/순서의 개념을 내포하고 있는 경우가 있어 자칫하다간 의도한 것 과는 다른 결과를 초래할 수도 있다.
이러한 문제를 다루고자 아예 컴퓨터가 이해할 수 있는 0과 1만을 이용해 단어/글자를 표현하는 방법이 있다.
예를 들어 "강아지" 라는 글자를 $(0, 1)$, "고양이" 라는 글자를 $(1, 0)$과 같은 vector표현할 수 있을 것이다. (One-hot Encoding)
하지만 이런 표현 방법도 제한점이 존재한다.
"햄스터" 라는 글자를 $(1, 1)$, "원숭이"라는 글자를 $(0, 0)$으로 표현했다고 생각해보자.
그렇다면 "돌고래", "개구리"와 같은 글자는 어떻게 표현할 수 있을까?
앞서 표현한 $(0, 1)$과 같은 차원이 2인 vector로 표현하기엔 부족하며, 결국 표현하고자 하는 숫자를 더 늘려(vector의 차원을 확장) "돌고래"라는 글자는 $(1, 0, 0)$, "개구리"라는 글자는 $(1, 0, 1)$ 로 표현할 수 밖에 없을 것이다.
이처럼 0과 1만을 이용한 표현법은 다루어야 하는 글자의 수가 많아짐에 따라 0과 1의 수를 늘려서 표현해야 하는 문제가 발생한다.
즉, 글자의 수가 많아짐에 따라 vector의 차원도 늘어나는 것도 문제이지만, 데이터를 표현하는 숫자가 0과 1로만 이루어져 있게 되어 불필요한 저장 공간 낭비가 될 수 있다.
극단적으로 보면 100,000차원 vector가 99,999개의 0, 1개의 1로 구성되어 있는 상태가 될 수 있다. (Sparse vector)
이렇게 되면 컴퓨터 저장 공간의 낭비가 심해질 뿐 더러, 글자 그 자체의 특징을 표현해주기엔 역부족해질 수 있는 문제가 존재한다.
(그리고 vector의 차원이 늘어나고 sparse해짐에 따라 두 vector 간의 similarity를 계산하는 작업이 상당히 비효율적이게 되기 쉽다)
그래서 아예 "0과 1뿐만이 아닌, 모든 숫자와 소수점을 이용하여 정해진 크기의 vector로 표현하자"라는 접근이 나타난다.
이것이 Embedding 이다.
앞서 언급한 예시로 보면 "강아지"를 $(0, 1)$이 아닌 $(0.23, 0.98)$, "고양이"를 $(0.96, 0.38)$와 같이 고정된 크기를 가진 실수 vector로 표현하는 것이다. (Embedding vector)
Embedding을 생성하는 방법엔 여러 방법이 존재하는데, 그 중 2013년 Google에서 발표한 Word2Vec 기법이 가장 유명하고 대중적이다.
Word2Vec에 대한 설명은 학부 시절 개별적으로 공부를 할 때 참고한 아주 양질의 자료가 있기에, 대체하고자 한다: 링크
(사실 word2vec 말고도 머신 러닝, 딥 러닝에 대한 전반적인 개요가 정말 깔끔하고 친절하게 잘 기술되어 있다 🙂)
간단하게 설명하자면 신경망을 이용해 주어진 단어를 실수 vector로 표현하여 주어진 단어의 representation vector/feature vector/embedding vector를 생성하는 기법이며, 생성된 vector를 이용해 downstream task를 수행할 수 있는 것이다.
Graph Machine Learning
이처럼 실 세계의 데이터를 이용한 복잡한 문제를 해결하고자 컴퓨터를 활용하기 시작하였고, 해당 데이터들을 컴퓨터가 연산에 활용할 수 있도록 적절한 형식(vector)으로 변환하여 컴퓨터에 전달해주었다.
(이미지는 RGB, 오디오는 주파수, 텍스트는 word embedding, ...)
앞서 언급했던 이미지/텍스트 를 위한 머신 러닝, 딥 러닝 작업을 위해선 흔히 아래와 같은 lifecycle을 따른다고 볼 수 있다.
실제 데이터(Raw Data)를 적절히 가공하여 컴퓨터가 활용할 수 있도록 적절한 vector로 변환(Feature Engineering)한 후, 컴퓨터를 이용해 작업을 수행한다(Learning Algorithm, Model, ...).
실 세계에는 이미지, 오디오, 텍스트와 같은 데이터 이외에도 사람 간의 복잡한 관계, 분자 구조를 구성하는 원소 간의 관계, 회사나 기관의 조직도와 같이 graph 형태로 표현되는 데이터 또한 존재한다.
그렇다면 이러한 graph 형태의 데이터로부터 feature/representation을 어떻게 추출 할까?
graph 형태의 데이터는 앞서 언급하였던 데이터들과는 성격이 상당히 다른 것이 특징이다.
graph를 구성하는 요소인 node라는 것이 있고, 각 node 끼리 edge를 통해 연결되어 있고, edge마다 그 종류가 다르고 특성이 다를 수 있으며, 심지어 edge에 방향성이 존재하기도 한다.
이처럼 graph 그 자체는 구조적인 특징을 가지고 있으며, 심지어는 구성 요소 간의 관계정보 까지 포함하고 있는 복잡한 형태의 데이터이다.
이렇게 복잡한 데이터를 비교적 잘 표현할 수 있는 representation을 생성하는 것은 많은 시간이 필요할 것이고, 많은 연산이 필요로 할 것이다.
따라서 앞서 언급했던 embedding 기법(접근법)이 graph 데이터에도 적용되기 시작하였다.
단순히 보면 별도의 번거로운 feature engineering 과정을 거치지 않고 graph에 존재하는 node(또는 edge)들의 특징을 잘 간직하는 정해진 크기의 vector로 바로 변환하자는 접근이다.
(latent space(정해진 크기의 차원/vector)로 node/edge를 project/mapping하여 해당 node/edge에 대한 representation vector를 얻어보자는 접근)
이게 무슨 소리일까?
주어진 graph의 node $u$ 대해, 이를 $\mathbb{R}^d$ 차원으로 project/mapping하는 함수 $f$ ($f: u \rightarrow \mathbb{R}^d$)를 이용해 representation vector를 생성하자는 의미로 생각할 수 있다.
즉 graph representation learning의 기본 아이디어는 저 차원의 vector 공간(latent space)으로 graph를 project/mapping하여 representation을 생성하는 것이고, 이 representation이 잘 생성될 수 있도록(graph의 구조적인 정보를 온전히 내포할 수 있도록) 저 차원 vector 공간으로 project/mapping하는 함수 $f: u \rightarrow \mathbb{R}^d$를 적절하게 조절/학습한다는 것으로 볼 수 있다.
(node/edge를 적절하게 encoding 하여, embedding spacce에 적절히 project/mapping)
(다시 봐도 CS224W 강의가 진짜 양질의 강의인 듯 하다)
graph representation learning의 목표는 위와 같이 node $u$, $v$의 embedding으로 표현된 vector $\mathbf{z}_u$, $ \mathbf{z} _v$의 유사도가 실제 node 간의 유사도에 근접해지도록 하는 것이다.
즉, 실제 graph에서 유사도가 높은 두 node라면 latent space에서도 유사도가 높을 것이다 라는 점을 전제 하에 두고 mapping function $f$를 최적화 하는 것으로 볼 수 있다.
Random Walk Approach
graph representation learning에서 embedding을 생성하기 위한 대표적인 접근법이다.
random walk는 node들에 대한 sequence 데이터로, 하나의 기준점 node에서 시작해 정해진 길이 만큼 walk를 진행하여 sequence를 생성한 것이다. (한 node에서 시작해 정해진 길이 만큼 갔을 때 생성되는 발자국 으로 생각할 수도 있다)
두 node간의 유사도를 random walk sequence에서 동시에 발생할 확률로 정의하는데, 즉 node들이 graph의 짧은 random walk에서 동시에 존재하는 경향이 보인다면, 해당 node들이 비슷한 embedding을 갖도록 encoding하는 것이다.
대표적인 random walk 기반의 방법으로 DeepWalk, node2vec 이라는 방법이 있다.
간단히 보면 DeepWalk는 random walk를 생성하여 Word2Vec의 방법을 활용하는 방법이고, node2vec은 random walk를 어떻게 진행할 것인지를 다르게 설정하여 graph의 local/global 적인 representation을 잘 표현할 수 있는 방법이다.
두 방법을 작성하기엔 글이 너무 길어질 듯 하기도 하고, CS224W를 들으며 공부하던 시절 참고했던 블로그 포스팅/자료로 대체하고자 한다: 블로그 포스팅, GraphSAGE 저자가 작성한 book(Chapter 3.3)
Node2vec explained graphically
Node2vec is an embedding method that transforms graphs (or networks) into numerical representations [1]. For example, given a social network where people (nodes) interact via relations (edges)…
towardsdatascience.com
(양질의 자료가 있다면 적극 활용하는 것이 옳다고 생각하기에...😅)
다짜고짜 graph domain으로 넘어가기 보단, 그래도 역시 representation learning이 무엇인가 라는 걸 먼저 다시 한번 짚고 가야한다는 생각을 했기에 representation learning에 대한 내용도 기술하게 되었다.
representation learning을 어떻게 풀어서 기술할 수 있을까 천천히 생각하며 작성하다 보니 해당 부분의 내용이 좀 길어진 듯 하다.
(어디까지나 개인적으로 아카이빙, 정리 용으로 작성한 글 이기에 다소 오류/문제점이 있을 수 있습니다.)
그래서 Graph Neural Network에 대한 부분은 아예 다음 포스팅에서 기술하고자 한다.
E.O.D.
'학업 이야기 > Data Science' 카테고리의 다른 글
Graph Representation Learning (2): Graph Neural Networks (2) | 2024.07.17 |
---|