[AI] 텍스트 임베딩의 소개 - 1편: 단어 임베딩

James • Head of AI

  • AI
  • Embedding
  • NLP
  • 테크 인사이트

채널팀에 새롭게 생긴 AI 팀의 리더 James입니다😀 앞으로 채널의 다양한 서비스에 AI 모델들을 실험하고 적용하면서 사용되었던 이론들에 대해서 하나씩 블로그에 소개해 드릴 예정입니다. 첫 번째로 텍스트 임베딩이라는 개념을 소개드리고자 하며 이 개념이 앞으로 어떻게 채널톡에 활용될 수 있을지 공유드리겠습니다. 텍스트 임베딩 모델도 여러가지 종류와 쓰임새가 있지만 이번 포스팅에서는 텍스트 임베딩의 목적과 단어 임베딩에 대해서 먼저 소개드리겠습니다.

1. Structured data vs Unstructured data

세상에는 많은 데이터들이 있고 우리는 이 데이터를 이용해서 여러가지 정보를 얻고자 합니다. 데이터들 중에서는 분석하기 쉽게 엑셀이나 DB 등을 통해서 구조가 잘 정리된 데이터도 있지만 훨씬 많은 양의 데이터는 그렇게 예쁘게 정리가 되어 있지 않습니다. 우리가 보통 웹에서 얻을 수 있는 텍스트 데이터들; 뉴스, 블로그, SNS, 대화, 댓글, 소스코드 등 그 형식이 너무 다양해서 하나로 정리하기 힘들게 되어 있죠. 그 뿐만 아닙니다. 세상에 많은 데이터들은 이미지의 형식으로 존재하거나 음성, 심지어 동영상데이터들도 매우 많이 있죠.

구조화가 잘 되어 있어서 분석하기 쉬운 데이터들을 정형 데이터(structured data)라고 한다면 그 외에 구조화가 되어 있지 않은 수 많은 데이터들은 비정형 데이터(unstructured data)라고 할 수 있습니다. 각각의 특징을 다음처럼 얘기할 수 있습니다.

정형 데이터 (structured data)

  • 테이블이나 관계형 데이터베이스 구조로 존재한다.

  • 숫자나 텍스트, 날짜 등의 형식의 값을 가진다.

  • 전체 데이터의 20% 가량을 차지한다.

  • 저장 공간이 크지 않다.

  • 분석이 쉽다.

비정형 데이터 (unstructured data)

  • 정해진 구조가 없이 자유롭게 존재한다.

  • 파일, 웹페이지, pdf 등의 형식으로 존재하고 텍스트, 이미지, 음성, 동영상 등등을 포함한다.

  • 전체 데이터의 80% 가량을 차지한다.

  • 상대적을 큰 저장 공간을 필요로 한다.

  • 분석이 어렵다.

정형 데이터는 분석하기 쉽지만 세상에 존재하는 상당수의 데이터는 비정형으로 되어 있습니다. 이런 비정형 데이터들을 분석하기 어렵다고 해서 방치한다면 상대적으로 우리는 엄청나게 많은 양의 정보를 놓치게 될 것입니다.

2. Why do we want data after all?

우리가 결국 데이터를 통해서 하고자 하는 것들이 무엇인지 다시 생각해볼까요? 제 생각엔 크게 세 가지의 목적으로 구분될 수 있을 것 같습니다.

  1. 검색: 우리가 가지고 있는 데이터에서 필요한 데이터만을 찾아야하는 일이 많습니다. 수많은 웹사이트들 중에서 우리가 원하는 정보를 가진 웹사이트를 찾아야 하는 일도 있고, 수많은 동영상 중에서 보고 싶은 영상만을 찾고자 하기도 합니다. 데이터의 수가 많으면 많아질수록 검색은 점점 더 어려운 문제가 되겠죠.

  2. 분석: 물론 데이터를 분석한다는 것은 아주 다양한 개념을 포함하는 말이지만 크게 분류하자면 분석이라는 것은 데이터가 가지고 있는 유용한 정보를 추출하는 모든 행동을 말합니다. 통계적인 지표를 추출하거나 (statistics) 비슷한 것끼리 묶어주거나 (clustering) 데이터 간의 상관관계를 분석하거나 (correlation) 하는 등의 여러가지 분석을 얘기할 수 있을 것입니다.

  3. 예측: 예측은 데이터를 이용해서 궁극적으로 하고 싶은 일 중에 하나일 수도 있습니다. 미래의 어떤 값이나 현상을 예측함으로서 우리는 큰 생산성의 향상을 기대할 수 있습니다. 예측이라는 것은 비슷한 사례를 검색하거나 현재의 데이터 분석을 통해서 이루어질 수도 있는 것이므로 이 세가지 목적이 밀접하게 관련이 있다고도 볼 수 있습니다. 물론 End-to-end 방식을 통해 바로 예측하는 것이 최근의 트렌드라고도 볼 수 있습니다.

앞에서 말한 정형 데이터들은 이 세가지 활동을 하는데에 큰 어려움이 없습니다. 약간의 전처리 과정만 거친다면 정형 데이터들은 1. DB에 저장되어 SQL을 통해서 검색을 할 수도 있을 것이며, 2. 데이터를 수치화하여 수학적인 분석이 가능할 것이고 3. 이를 통해 다양한 확률적인 기법을 통해 예측에 사용될 수 있습니다.

하지만 비정형 데이터들은 상대적으로 이런 일을 하기엔 좀 까다로운 데이터들입니다. 물론 비정형 데이터를 정형화(structuralize)할 수만 있다면 문제가 없을 것입니다. 하지만 그게 쉬운 일이었다면 애초에 비정형 데이터라는 말이 있지도 않았겠죠. 수많은 형식의 데이터를 하나의 형식으로 정형화시킨다는 것은 매우 힘든 일일 뿐만 아니라 가능하다 하더라도 그 과정에서 손실되는 정보들도 많이 생겨서 결과적으로 그다지 효율적이지 않을 것입니다.

3. Vector Embedding

만약에 이런 비정형 데이터들을 정보 손실을 최소화하며 하나의 형태로 압축시켜서 표현할 수 있다면 어떨까요? 꿈같은 얘기겠지만 이게 가능하다면 비정형 데이터로 검색/분석/예측을 하는 것도 훨씬 쉬운 일이 될 것이라고 예상할 수 있습니다. 많은 AI 기술들은 이런 데이터들을 벡터라는 숫자들로 표현하여 이를 해결하려 합니다.

벡터 (Vector): 벡터라는 개념은 고등학교 수학이나 물리에서도 배우셨을텐데요(?) 흔히 유클리드 공간에서의 벡터라는 것은 크기와 방향이 같이 있는 기하학적 개념을 얘기합니다. 일단 지금은 그냥 n개의 숫자 표현이라고 생각하면 됩니다. 여기서 n은 차원수(dimension)를 말하는 것입니다. 그리고 이런 벡터들이 존재하는 공간을 벡터 공간(vector space)라고 합니다. 벡터 공간 내에서 벡터들은 사칙 연산이 가능하며 서로의 거리도 잴 수 있고 각도도 잴 수 있습니다.

임베딩 (Embedding): embed라는 단어의 사전적 의미는 "박아 넣다"입니다. 여러가지 형태의 데이터를 벡터 공간에 박아 넣어서 벡터로 만드는 것을 임베딩(embedding)이라고 하고 그렇게 만들어진 벡터를 임베딩 벡터 (embedding vector)라고 말합니다. 텍스트를 벡터로 만드는 것을 텍스트 임베딩 (text embedding), 이미지를 벡터로 만드는 것은 이미지 임베딩(image embedding)이라고 하면 되겠죠. 다루기 힘든 데이터들을 벡터로 만든 뒤 벡터 공간 내에서 더하고 빼고 거리도 재고 각도도 재면서 분석하는 것이 임베딩의 목표라고 할 수 있습니다.

좋은 임베딩이란? 임베딩이 데이터 분석에 도움이 되려면 비슷한 성질을 가지는 데이터들의 벡터들은 서로의 거리가 가까우면 좋습니다. king이라는 단어는 queen이나 man같은 단어와는 거리가 가까우면서 woman이라는 단어와는 거리가 멀어야 좋다는 뜻입니다. 이런 임베딩을 가질 수 있다면 어떤 기준 벡터로부터 거리가 가까운 벡터들을 찾아주는 검색이 가능할 수 있고, 거리가 가까운 벡터들을 묶어서 그룹화하는 클러스터링도 가능하겠죠. 내가 아는 데이터의 벡터와 거리가 가까운 것을 보고 데이터의 특성을 예측하는 것도 가능할 것입니다. 보통 벡터들의 거리는 코사인 유사도 (cosine similarity) 혹은 유클리드 거리 (Euclidean distance)로 표현하는데 이 글에서는 코사인 유사도를 사용하겠습니다. 코사인 유사도는 다음과 같이 정의할 수 있어요.

이런 임베딩을 어떻게 하면 만들 수 있을까요? man, woman, king, queen 네 단어에 대한 벡터를 만들면서 man, womanking, queen은 가깝게 queen, manking, woman은 멀게 하면 좋을 것 같은데요. 이런 임베딩은 사실 얼마든지 만들 수 있고 무한히 많이 만들 수 있습니다. 예를 들어 vman=(1, 0), vwoman=(0, 0), vking=(1, 2), vqueen=(0, 2)로 정의하면 어느 정도 가능해지죠.

하지만 이건 단어가 네 개 뿐인 상황이고, 단어가 엄청 많아지면 이렇게 쉽게 임베딩을 만드는 건 어려운 일이 될 거에요. 이 때, 단어가 아무리 많아도 쉽게 만들 수 있는 임베딩이 있습니다. 그건 벡터의 각 차원에 해당하는 값을 각 단어들의 일치여부로 정의하는 방법입니다. 이 때 이 벡터들의 차원은 단어들의 전체 개수와 같게 되죠. 전체 단어가 n개이면, 차원이 n인 벡터들로 n개의 단어를 one-hot encoding 벡터로 표현할 수 있습니다. 예를 들어볼까요? n개의 단어 중에 순서대로 man, woman, king, queen, apple, orange, … 이런식으로 단어가 주어진다고 가정하면 one-hot encoding은 vman = (1, 0, 0, …), vwoman = (0, 1, 0, …) 이렇게 표현할 수 있게 되는거죠.

하지만 one-hot encoding이 우리가 원하는 임베딩일까요? 위에서 언급했듯이 좋은 임베딩은 비슷한 성질을 가지는 데이터들의 벡터는 서로의 거리가 가까우면 좋은데 one-hot encoding은 모든 벡터들의 코사인 유사도가 0이라 좋은 임베딩이라고 할 수 없습니다! 결국 좋은 임베딩을 구하기 위해서 우리는 딥러닝의 도움을 받게 됩니다! One-hot encoding은 딥러닝이 좋은 임베딩을 구하기 위한 입력 포맷으로 쓰이게 됩니다.

4. Deep Learning for Embedding

딥러닝 모델은 주어진 손실함수(loss function)를 최소화하는 과정을 통해 최적의 모델 파라미터를 찾는 것으로 학습을 시킬 수 있는데요. 최적의 텍스트 임베딩을 위해서는 어떤 데이터를 어떤 손실함수를 통해서 학습시켜야 될지에 대해서 이야기 해보겠습니다.

분포 가설 (Distributional Hypothesis)

“나는 오늘 아침으로 OO을 먹었다”라는 문장을 생각해보겠습니다. 여기 OO에 들어갈 수 있는 단어는 어떤게 있을까요? 주로 아침 식사로 먹는 음식들이 될 것입니다. 예를 들면 "토스트", "시리얼", "떡국", "샌드위치", "바나나" 등의 단어들이 포함될 수 있겠죠. 단어가 무엇인지 몰라도 앞뒤로 사용되는 단어들을 보면 대략적으로 그 의미를 유추할 수 있습니다. 이처럼 어떤 단어의 의미는 단어가 같이 사용된 맥락에 의해 결정된다는 것이 분포 가설의 핵심 아이디어입니다. 이 분포 가설을 통해서 딥러닝 모델은 단어에 최적화된 임베딩을 찾을 수 있습니다. 가장 대표적인 예가 word2vec이라는 단어 임베딩 (word embedding) 모델입니다.

word2vec

word2vec은 자연어 처리(NLP) 분야에서 가장 유명한 단어 임베딩 방식 중 하나입니다. 분포 가설을 기반으로, word2vec은 단어의 의미를 해당 단어의 주변 단어들, 즉 맥락에 기반하여 표현하려고 시도합니다. 즉, 유사한 맥락에서 함께 사용되는 단어들은 의미적으로 유사하다고 가정합니다. word2vec은 크게 두 가지 아키텍처로 구분됩니다:

  1. CBOW: 이 방식은 주변 단어들(예: “오늘”, “아침”, “먹었다”)을 입력으로 받아 중심 단어(예: “토스트”)를 예측합니다. CBOW는 주변 단어들의 평균을 사용하여 중심 단어를 예측하는 모델입니다.

  2. Skip-Gram: 이 방식은 중심 단어를 입력으로 받아 주변 단어들을 예측합니다. 이 방식은 대규모 데이터셋에서 더 좋은 성능을 보이는 경향이 있습니다.

    어떤 아키텍처를 사용하든, word2vec의 목표는 각 단어에 대해 고정된 크기의 벡터를 생성하는 것입니다. 이 벡터는 단어의 의미적 특성을 반영하여 유사한 단어들은 벡터 공간에서 서로 가깝게 위치하게 됩니다.

word2vec을 사용하면 단어에 대한 사칙연산도 가능합니다. 단어의 임베딩이 벡터임으로 벡터의 사칙연산을 사용하는거죠. 예를 들어 vking - vman + vwoman = vqueen 같은 식을 대략적으로 만족할 수 있게 됩니다. (왕인데 남자가 아니고 여자이면 여왕) 학습이 간단하고 수렴이 빠르며 작은 모델로도 이런 장점들을 가지는 단어 임베딩을 만들어낼 수 있어서 많이 쓰이는 모델입니다.

하지만 이 word2vec으로 대표되는 단어 임베딩은 몇가지 뚜렷한 한계점이 존재합니다.

  1. 학습 데이터에 없는 단어(out-of-vocabulary)에 대해서는 임베딩을 구할 수 없습니다.

  2. 그리고 단어 임베딩은 단어별로 정의되기 때문에 다의어에 대한 처리가 어렵습니다. 단어는 문맥에 따라 의미가 다를 수 있는데 예를 들어 사과를 표현하는 apple과 회사를 표현하는 apple의 벡터 임베딩이 하나이기 때문에 두 단어를 구분할 수 없습니다. 이는 word2vec이 분포 가설을 제대로 반영하지 못하는 부분이라고 볼 수 있습니다.

다음 포스팅에서는 이런 단어 임베딩의 한계점을 극복하는 조금 더 개선된 임베딩 방법에 대해서 소개 드리겠습니다. 그리고 이런 임베딩을 통해서 구현할 수 있는 응용사례들도 설명드리겠습니다. 앞으로 채널팀의 AI 포스팅도 많은 기대 부탁드립니다!

We Make a Future Classic Product

채널팀과 함께 성장하고 싶은 분을 기다립니다

사이트에 무료로 채널톡을 붙이세요.

써보면서 이해하는게 가장 빠릅니다

회사 이메일을 입력해주세요