채널톡
채팅 상담, CRM, 팀 메신저, AI 인터넷 전화, 화상 통화 등의 기능을 제공하는 올인원 AI메신저입니다
앞으로 채널의 다양한 서비스에 AI 모델들을 실험하고 적용하면서 사용되었던 이론들에 대해서 하나씩 소개해 드릴 예정입니다.
첫 번째로 텍스트 임베딩이라는 개념을 소개드리고자 하며 이 개념이 앞으로 어떻게 채널톡에 활용될 수 있을지 공유드리겠습니다. 텍스트 임베딩 모델도 여러가지 종류와 쓰임새가 있지만 이번 포스팅에서는 텍스트 임베딩의 목적과 단어 임베딩에 대해서 먼저 소개드리겠습니다.
[작성자] James _ 채널톡 채널팀 AI 리더
세상에는 많은 데이터들이 있고 우리는 이 데이터를 이용해서 여러가지 정보를 얻고자 합니다. 데이터들 중에서는 분석하기 쉽게 엑셀이나 DB 등을 통해서 구조가 잘 정리된 데이터도 있지만 훨씬 많은 양의 데이터는 그렇게 예쁘게 정리가 되어 있지 않습니다. 우리가 보통 웹에서 얻을 수 있는 텍스트 데이터들; 뉴스, 블로그, SNS, 대화, 댓글, 소스코드 등 그 형식이 너무 다양해서 하나로 정리하기 힘들게 되어 있죠. 그 뿐만 아닙니다. 세상에 많은 데이터들은 이미지의 형식으로 존재하거나 음성, 심지어 동영상데이터들도 매우 많이 있죠.
구조화가 잘 되어 있어서 분석하기 쉬운 데이터들을 정형 데이터(structured data)라고 한다면 그 외에 구조화가 되어 있지 않은 수 많은 데이터들은 비정형 데이터(unstructured data)라고 할 수 있습니다. 각각의 특징을 다음처럼 얘기할 수 있습니다.
정형 데이터 (structured data)
비정형 데이터 (unstructured data)
정형 데이터는 분석하기 쉽지만 세상에 존재하는 상당수의 데이터는 비정형으로 되어 있습니다. 이런 비정형 데이터들을 분석하기 어렵다고 해서 방치한다면 상대적으로 우리는 엄청나게 많은 양의 정보를 놓치게 될 것입니다.
우리가 결국 데이터를 통해서 하고자 하는 것들이 무엇인지 다시 생각해볼까요? 제 생각엔 크게 세 가지의 목적으로 구분될 수 있을 것 같습니다.
앞에서 말한 정형 데이터들은 이 세가지 활동을 하는데에 큰 어려움이 없습니다. 약간의 전처리 과정만 거친다면 정형 데이터들은 1. DB에 저장되어 SQL을 통해서 검색을 할 수도 있을 것이며, 2. 데이터를 수치화하여 수학적인 분석이 가능할 것이고 3. 이를 통해 다양한 확률적인 기법을 통해 예측에 사용될 수 있습니다.
하지만 비정형 데이터들은 상대적으로 이런 일을 하기엔 좀 까다로운 데이터들입니다. 물론 비정형 데이터를 정형화(structuralize)할 수만 있다면 문제가 없을 것입니다. 하지만 그게 쉬운 일이었다면 애초에 비정형 데이터라는 말이 있지도 않았겠죠. 수많은 형식의 데이터를 하나의 형식으로 정형화시킨다는 것은 매우 힘든 일일 뿐만 아니라 가능하다 하더라도 그 과정에서 손실되는 정보들도 많이 생겨서 결과적으로 그다지 효율적이지 않을 것입니다.
만약에 이런 비정형 데이터들을 정보 손실을 최소화하며 하나의 형태로 압축시켜서 표현할 수 있다면 어떨까요? 꿈같은 얘기겠지만 이게 가능하다면 비정형 데이터로 검색/분석/예측을 하는 것도 훨씬 쉬운 일이 될 것이라고 예상할 수 있습니다. 많은 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, woman과 king, queen은 가깝게 queen, man과 king, 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은 딥러닝이 좋은 임베딩을 구하기 위한 입력 포맷으로 쓰이게 됩니다.
딥러닝 모델은 주어진 손실함수(loss function)를 최소화하는 과정을 통해 최적의 모델 파라미터를 찾는 것으로 학습을 시킬 수 있는데요. 최적의 텍스트 임베딩을 위해서는 어떤 데이터를 어떤 손실함수를 통해서 학습시켜야 될지에 대해서 이야기 해보겠습니다.
분포 가설 (Distributional Hypothesis)
“나는 오늘 아침으로 OO을 먹었다”라는 문장을 생각해보겠습니다. 여기 OO에 들어갈 수 있는 단어는 어떤게 있을까요? 주로 아침 식사로 먹는 음식들이 될 것입니다. 예를 들면 "토스트", "시리얼", "떡국", "샌드위치", "바나나" 등의 단어들이 포함될 수 있겠죠. 단어가 무엇인지 몰라도 앞뒤로 사용되는 단어들을 보면 대략적으로 그 의미를 유추할 수 있습니다. 이처럼 어떤 단어의 의미는 단어가 같이 사용된 맥락에 의해 결정된다는 것이 분포 가설의 핵심 아이디어입니다. 이 분포 가설을 통해서 딥러닝 모델은 단어에 최적화된 임베딩을 찾을 수 있습니다.
가장 대표적인 예가 word2vec이라는 단어 임베딩 (word embedding) 모델입니다.
word2vec
word2vec은 자연어 처리(NLP) 분야에서 가장 유명한 단어 임베딩 방식 중 하나입니다.
분포 가설을 기반으로, word2vec은 단어의 의미를 해당 단어의 주변 단어들, 즉 맥락에 기반하여 표현하려고 시도합니다. 즉, 유사한 맥락에서 함께 사용되는 단어들은 의미적으로 유사하다고 가정합니다. word2vec은 크게 두 가지 아키텍처로 구분됩니다:
어떤 아키텍처를 사용하든, word2vec의 목표는 각 단어에 대해 고정된 크기의 벡터를 생성하는 것입니다. 이 벡터는 단어의 의미적 특성을 반영하여 유사한 단어들은 벡터 공간에서 서로 가깝게 위치하게 됩니다.
word2vec을 사용하면 단어에 대한 사칙연산도 가능합니다. 단어의 임베딩이 벡터임으로 벡터의 사칙연산을 사용하는거죠. 예를 들어 vking - vman + vwoman = vqueen 같은 식을 대략적으로 만족할 수 있게 됩니다. (왕인데 남자가 아니고 여자이면 여왕) 학습이 간단하고 수렴이 빠르며 작은 모델로도 이런 장점들을 가지는 단어 임베딩을 만들어낼 수 있어서 많이 쓰이는 모델입니다.
하지만 이 word2vec으로 대표되는 단어 임베딩은 몇가지 뚜렷한 한계점이 존재합니다.
다음 포스팅에서는 이런 단어 임베딩의 한계점을 극복하는 조금 더 개선된 임베딩 방법에 대해서 소개 드리겠습니다. 그리고 이런 임베딩을 통해서 구현할 수 있는 응용사례들도 설명드리겠습니다. 앞으로 채널팀의 AI 포스팅도 많은 기대 부탁드립니다!
©모든 저작권은 해당 콘텐츠 제공자 또는 해당 콘텐츠 제공자와 채널톡이 공동으로 보유하고 있으며, 콘텐츠의 편집 및 전송권은 채널톡이 가지고 있습니다.