인공지능에서 가장 중요한 단어를 하나만 고르라고 한다면 저는 망설임 없이 벡터(vector)를 선택하고 싶습니다. 그만큼 수학의 벡터라는 개념은 인공지능의 발전에 지대한 영향을 끼쳤습니다. 벡터 덕분에 수많은 연산과 병렬처리가 가능해졌고 말도 안되는 속도의 개선이 이루어졌기 때문입니다
출처 : wikipedia
이는 컴퓨터는 기본적으로 모든 정보를 이진수, 즉 0과 1의 조합으로 표현하고 처리하기 때문입니다. 이러한 이진 표현은 컴퓨터의 기본 구성 요소인 트랜지스터의 ON(1)과 OFF(0) 상태로 대응됩니다. 따라서 다양한 형태의 비정형 데이터(unstructured data)를 활용하여 인공지능과 의사소통을 하기 위해서는 음성(audio), 이미지(image), 텍스트(text) 등 모든 형태의 비정형 데이터를 우선 숫자로 변환해주는 과정을 거쳐야 합니다.
예를들어 자율주행 자동차는 눈앞의 물체를 어떻게 인식할까요? 이미지는 픽셀값의 집합으로 표현되기 때문에 우선 카메라 센서를 통해 입력된 이미지 데이터를 0부터255 사이의 숫자로 된 픽셀값으로 변환해주는 과정이 필요할 것입니다. 이미지의 색상, 위치 등 필요한 정보를 담고 있는 픽셀값이 입력값으로 들어오고 난 뒤에야 자율주행을 위한 딥러닝 알고리즘은 자동차를 멈출지 혹은 계속해서 나아갈지 판단할 수 있습니다.
텍스트 데이터를 다루는 자연어처리도 예외는 아닙니다. 자율주행 자동차와 마찬가지로 언어모델이 입력 값으로 들어오는 텍스트 데이터를 인식하고 처리할 수 있도록 숫자로 된 행렬 형태로 만들어주는 작업이 필요한데, 이러한 과정을 임베딩(embedding)이라고 합니다. 벡터화의 대표적인 방법으로는 0과1의 이진수로 각 단어들을 표현하는 원핫인코딩(one-hot encoding)과 텍스트 데이터상에서 단어 간의 유사도를 측정할 수 있도록 실수 값으로 표현하는 워드 임베딩(word embedding) 방식이 있습니다.
1. 원핫인코딩(one-hot encoding)
텍스트 데이터를 숫자로 표현하는 가장 간단하고 강력한 방식인 원핫 인코딩을 소개하겠습니다. 원핫 인코딩이란 단어의 집합을 0과 1의 이진수로 구성된 벡터로 변환하여 표현하는 방식입니다. 표현하고자 하는 단어의 인덱스(index)를 1로, 그 외의 인덱스에는 0을 부여하는 방식으로 단어 벡터를 표현합니다. 이 때 단어 집합의 크기는 차원의 크기가 됩니다.
원핫인코딩(출처 : Towards Data Science)
이해를 돕기 위해 ‘생각하는 기계와 자연어처리’라는 문장을 원핫 인코딩으로 표현해 보겠습니다. 우선 문장을 ‘생각하는’, ’기계와’, ’자연어처리’라는 세가지 부분으로 나누어 볼 수 있습니다. 이처럼 문장을 최소한의 의미표현 단위인 토큰(token)으로 나누는 것을 토큰화(tokenization)라고 합니다. 토큰화 작업이 끝났다면 문장을 구성하는 각각의 단어를 ‘생각하는(100)’, ‘기계와(010)’, ‘자연어처리(001)’라는 이진수로 변환하여 벡터(vector)로 표현할 수 있게 되는 것입니다.
이처럼 인코딩 과정을 거쳐 0과 1로 표현된 단어들을 더하면 ‘생각하는 기계와 자연어처리(111)’라는 새로운 벡터를 만들어낼 수 있습니다. 마찬가지로 벡터로 표현된 문장들이 모이면 하나의 글이 완성되는데, 이러한 방식으로 만들어진 문장의 조합을 BoW(Bag of Words)라고 합니다. 이처럼 0과1의 간단한 배열만으로도 여러 개의 문장을 컴퓨터가 인식하고 표현할 수 있도록 하는 것이 원핫인코딩의 핵심 개념입니다.
2. 단어 임베딩(word embedding)
워드 임베딩은 텍스트 정보를 0과 1의 이진수로 변환하는 것이 아닌, 0과1사이의 실수 값으로 변환하여 표현하는 방식입니다. 기본적으로 실수값에는 이진수보다 많은 정보를 담을 수 있어 원핫인코딩에 비해 훨씬 적은 행렬로 더욱 많은 정보를 표현할 수 있게 됩니다. 단어 임베딩은 원핫인코딩 방식의 치명적인 한계점인 희소행렬(sparse matrix) 문제를 해결해줄 수 있는 임베딩 방식이라고 할 수 있죠.
word embedding(출처 : neptune.ai)
워드 임베딩을 거친 단어표현 벡터에는 정보 값이 많이 포함되어 있다고 하여 밀집 벡터(dense vector)라고 표현하기도 합니다. 즉 기존에 원 핫 인코딩으로 표현했을 때 1,000개의 차원이 필요했던 문장을 워드 임베딩 방식의 밀집 벡터를 사용하면 그의 10분의 1 이하의 수준으로 줄일 수 있는 것입니다. 이처럼 고차원 벡터를 저차원 벡터로 축소하는 개념을 차원 축소(dimension reduction)이라고 합니다.
예를 들어 50,000개의 단어가 있을 때 원핫인코딩으로 ‘자연어’라는 단어를 표현하기 위해서는 아래와 같은 표현을 사용합니다. 그러나 밀집 벡터를 사용하고, 사용자가 밀집 벡터의 차원을 256으로 설정한다면, 모든 단어의 벡터 표현의 차원은 256으로 바뀌면서 모든 값이 실수로 변환됩니다.
또한 원핫 인코딩을 거쳐 0과1로 구성된 단어 벡터에서는 각 단어와 단어 사이의 관계를 계산하기가 불가능 했지만, 워드 임베딩을 거치면 단어가 실수로 표현되기 때문에 방향성(+, -)을 계산할 수 있고, 단어 간의 유사도 계산이 가능해집니다. 2장 ‘언어모델 해부하기’에서 자세히 배우겠지만, 단어가 이진수가 아닌 실수로 표현되기 때문에 언어모델을 통한 단어 예측(prediction)이 가능해집니다.