[빅데이터 연재/기고 ]
컴퓨터의, 컴퓨터에 의한, 컴퓨터를 위한 언어
-Word Embedding의 세계-
야마다 아키히코
언어학 박사 / 자연어처리전공
우리가 서로 생각과 감정을 공유하고 소통하는 데 가장 많이 사용하는 것이 언어이다.
특별한 이유가 없다면 우리는 자신이 태어난 나라에서 사용되는 언어를 자연스럽게 습득하고 그것을 유창하게 사용한다. 가끔 아주 어린 서양 아이가 아주 유창하게 영어로 엄마와 이야기하는 것을 보고 당연한 일이지만 오랫동안 영어를 공부해도 자유롭게 영어를 쓸 수 없는 나는 깜짝 놀란다. 이렇게 친근하고 자유롭게 사용하는 언어이지만 언어를 연구해 보면 매우 심오하고 복잡한 시스템이 존재하고 있다는 것을 알 수 있고, 오랜 기간 이들을 연구해 온 학문이 바로 언어학이라고 할 수 있다.
언어학에 대해 여기서 길게 기술할 수는 없지만 대학원 때 놈 촘스키(Noam Chomsky)를 중심으로 한 생성문법 연구의 다양한 이론(X-bar theory 등)을 배울 때는 언어의 신비에 깜짝 놀랐다. 또 '크다'나 '작다'와 같은 기본적인 단어도 “크다는 무슨 의미일까?”, “작다는 무슨 의미일까?”를 설명하려고 하면 매우 어렵다. 이러한 어렵고 미묘한 언어를 인공지능 컴퓨터가 이해할 수 있도록 하려면 어떻게 해야 할까? 결론적으로는 컴퓨터가 언어를 우리처럼 이해하고 있다고는 아직 말하기 어려운 면이 있지만 이를 가능하게 하기 위한 기술 중 하나가 이번에 소개하는 "Word Embedding"이라고 할 수 있다.
Word Embedding이라는 용어를 처음 들었을 때 솔직히 무엇인지 이해가 어려웠다. 직역하면, "단어 매립"인데 도대체 단어를 어디에 매립하는 것인지 불분명했다. 공부하면서 알게 된 것은 학문적인 정의는 다양하겠지만 단어를 벡터로 표현해 벡터 공간에 매립시킨다 정도의 의미인 것 같다. 숫자처리의 달인 컴퓨터가 이해할 수 있는 형태, 즉 벡터 형식 숫자로 단어를 표현해 주어 컴퓨터가 처리할 수 있도록 하는 이 기술이 word embedding이라고 이해하고 word embedding이 컴퓨터 언어 처리의 핵심적인 기술이라고 생각한다. 가장 간단하고 단순한 벡터화 방법으로 0과 1만으로 표현하는 One-Hot Encoding이라는 방법이 있다.
예를 들어 “빅데이터 공부 재미있다”랑 “영어 공부 즐겁다”라는 예문만 있는 세계를 상상해보면 존재하는 단어는 {‘빅데이터’, ‘공부’, ‘재미있다’, ‘영어’, ‘즐겁다’} 이렇게 존재한다. 이런 단어를 One-Hot Encoding으로 표현하면 단어집합의 크기가 5임으로 5차원 벡터를 사용해
‘빅데이터’ = [1,0,0,0,0]
‘공부’ = [0,1,0,0,0]
‘재미있다’ = [0,0,1,0,0]
‘영어’ = [0,0,0,1,0]
‘즐겁다’ = [0,0,0,0,1]
이런식으로 할 수 있다. 아주 단순하고 좋은 방법 같지만 단어가 많아지면 많아질수록 vector의 차원이 계속 증가하는 점이 어려움이 있고 또한 뭔가 ‘재미있다’랑 ‘즐겁다’는 비슷한 의미니까 벡터간에 관계가 있으면 좋은데 그러한 단어와 단어의 의미 관계를 표현하는 것도 쉽지는 않아 보인다. 이러한 부분 은 특별히 단어와 단어의 의미적인 관계를 해결하고자 하는 시도는 많이 있었지만 많이 알려진 모델으로 Word2Vec이 있다.
Word2Vec는 2013년에 Mikolov 등 연구팀이 발표한 모델이다. Word2Vec은 Harris에 Distribution Theory를 이론적 기반으로 한다. 자세한 설명은 논문을 참고해 주셨으면 좋겠지만, 간단히 말해 Distribution Theory에서는 의미적으로 관련이 있는 단어는 같은 문장 안(가까운 곳)에 함께 나타나는 경향이 있다는 언어의 특징을 설명한 것이다. 예를 들어 개와 고양이는 의미적으로 동물이라는 점에서 관련이 있고 애용 동물로 가정에서 사람들과 같이 살고 4개의 다리로 뛰어다니는 점 등등 여러 공통점을 가지고 있다. 반면 개와 의자에서는 그다지 공통된 성질을 찾을 수 없다. 이러한 면에서 개와 고양이는 가까운 의미적 성질을 가지고 있으며 개와 의자는 먼 의미적 성질이라고 생각할 구 있다. 이런 의미적인 성질이 문장 속에서 함께 등장하는 단어에 따라서도 구분할 수 있다는 것이다. 예를 들면,
(1) 개가 집 마당을 뛰어다니다.
(2) 고양이가 집 마당을 뛰어다니다.
(3) *의자가 집 마당을 뛰어다닌다. (*는 언어학에서 비문이라는 표지)
이 경우 (1)과 (2)는 올바른 문장으로 성립하지만 (3)은 올바른 문장이라 할 수 없다(문학적 비유 표현으로는 가능할지도 모르지만...).즉 개와 고양이는 뛰어 다닌다는 단어와 관련을 갖지만 의자는 그렇지 않다는 것을 알 수 있다.이처럼 개와 고양이는 유사한 의미적 성질을 가지고, 의자는 개와 고양이가 갖는 의미적 성질과는 다르다는 것을 말할 수 있다. 이러한 단어의 의미적 성질을 반영한 word embedding 방법이 Word2Vec이다.Word2Vec 모델은 어떻게 이러한 단어의 의미적 성질의 관련성을 학습하였는가? 자세한 이론적인 설명은 논문을 참고해 주었으면 하는데 가장 핵심적인 개념이 cosine similarity가 아닐까 싶다. Word Embedding이 단어를 벡터형태로 표현하는 기술임은 이미 설명한 바와 같다. 벡터이기 때문에 벡터와 벡터가 얼마나 가까운 곳에 있는지는 두 개의 벡터간의 각도를 사용하여 정량적으로 계산할 수 있다. 이러한 각도를 이용해 두 개의 벡터가 얼마나 가까운지 즉 벡터와 벡터의 유사도를 나타내는 값 중 하나가 Cosine similarity이다.
벡터와 벡터가 가까운 곳에 존재하면 두 개의 벡터의 각도가 작아져 cosine similariy가 커지는 구조이다. 이를 이용하여 word2vec는 각 문장을 하나하나 살펴보면서 가까이 나타나는 단어와 단어의 cosine similarity가 커지도록 각 단어의 벡터 값을 갱신하면서 최적의 벡터 값을 확정해 나간다. 특히 Word2 Vec에서는 Skip-gram이라는 비지도학습방식을 채택하여 하나의 타겟단어(target word) 벡터를 입력으로 받아 그 단어의 앞뒤에 나타나는 문맥단어들(context words)을 예측할 확률이 가장 높아지도록 학습하는(즉 타겟단어 벡터와 그 문맥단어들의 벡터와의 cosine simility가 커지도록 하는) 방법을 채택하고 있다.
python에서 Word2Vec을 사용하는 방법은 gensim이라는 python package를 사용하면 아래와 같이 매우 쉽게 구현할 수 있다.
sentences 부분에 Word2Vec를 훈련할 때 쓸 text data를 지정해주고 나머지 parameter들을 설정하면 word2vec model를 학습시킬 수 있다.
그리고 위의 그림속 코드에서 word2vec_model.wv로 각 단어의 백터를 확인할 수 있고, word2vec_model.wv.most_similar(“원하는 단어(target word)”)로 원하는 단어(target word)와 가장 큰 cosine similarity를 가지는 단어를 순서대로 확인할 수 있다. 다양한 텍스트를 사용해서 word2vec 모델을 학습하여 어떤 단어와 어떤 단어가 관련이 있는지를 조사해보는 것도 재미있는 분석이라고 생각한다.
또한 단어가 벡터로 표현되어 있기 때문에 단어와 단어의 벡터계산이 가능하다. 그래서 아래와 같은 흥미로운 결과를 얻을 수 있다.
word2vec는 단어와 단어의 의미적인 관계를 잘 표현한 모델이라 크게 주목받으며 자연어처리(NLP)의 여러 기계학습모델의 성능을 향상 시키는 데 기여했다.
이처럼 매우 뛰어난 word2vec이지만 기술적인 한계로 꼽을 수 있는 것이 한 단어에 하나의 고정적인 벡터 값을 주는 것밖에 할 수 없다는 점이다. 같은 스펠링의 단어라도 문맥에 따라 다른 의미를 갖는 경우가 많다. 예를 들어 영어의 “well”은 “잘”이라는 의미로 사용될 때가 있고 “우물”이라는 의미로 사용될 때가 있는 다의어이다. Word2Vec의 경우 한 단어에 하나의 고정적인 벡터를 주므로 이러한 문맥에 따른 의미 차이에 대응하기가 어렵다. 이러한 고정적인 벡터를 주는 모델을 Static Word Embedding이라고 한다.
이러한 Static Word Embedding의 단점을 극복하는 모델로 출현한 것이 Contextualized word embedding 혹은 Dynamic embeddings라 불리는 모델이다.
대표적인 것으로 ELMo, GPT, BERT 등을 들 수 있다. 이들은 입력으로 받는 문장 속의 있는 단어들과이 관계에 맞게 단어의 벡터를 적절하게 갱신하면서 출력하기 때문에 문맥 변화에 대응할 수 있다. 이러한 Word Embedding으로 더욱 언어의 의미를 정확하게 분석할 수 있는 기계학습 방법들이 나타났고 자연어처리 분야에 다양한 문제의 기계학습 모델 성능이 급격적으로 향상했고 자연어처리 분야의 발전에 혁신을 이루어왔다고 할 수 있다.
이러한 모델들은 Huggingface라는 플랫폼에서 다양하게 공개 되어있고 자유롭게 쓸 수 있도록 되어있다. python에서도 Huggingface를 쉽게 사용할 수 있는 방법들이 있어서 비교적으로 쉽게 다양한 word embedding 모델을 이용할 수 있다.
자세한 부분은 Hugging Face home page(https://huggingface.co/)를 참조 부탁한다.
인간 언어의 신비로움과 그 언어를 이해하는 인공지능을 만들기 위한 연구와 그 진보에 대해서 간단히 설명을 드렸다. 컴퓨터에 언어를 이해시키기 위한 기술의 발전은 놀랍지만 이러한 언어 모델을 구축하기 위해서는 엄청난 대량의 언어데이터와 복잡한 알고리즘와 컴퓨팅 파워가 필요하다는 것도 사실이다. 이렇게 해도 컴퓨터가 완전히 이해한다고는 할 수 없는 복잡한 언어를 우리가 자연스럽게 습득하고 그를 통해 서로 이해하고 교제한다는 것이 정말 놀라운 것이라는 생각이 든다. 이 글을 통해 우리가 가지고 있는 언어능력에 대해 다시 한번 놀라면서 그 귀한 언어라는 도구를 다른 사람을 사랑하고 위로하고 활력을 주기 위해 귀하게 사용되어 지기를 바라며 이번 글을 마친다.