brunch

You can make anything
by writing

C.S.Lewis

by 여운 Mar 26. 2023

컴퓨터에게 단어의 의미를 가르치는 방법

분포가설을 실현한 word2vec 

컴퓨터에게 단어의 의미를 어떻게 알려줄 수 있을까? 그전에 생각해봐야 하는 것이 '단어의 의미는 무엇인가'이다. 

언어학의 힘을 빌려보면 '분포가설(Distributional Hypothesis)'라는 것이 있다. '분포가설'은 단어의 의미는 그 단어가 사용되는 문맥에 의해 결정된다고 생각한다. 따라서 비슷한 문맥에서 사용되는 단어들은 의미가 유사한 것이다. 예를 들어, "오래 걷고 오는 날이면 편안한 소파에 앉고 싶어"라는 문장도, "오래 걷고 오는 날이면 편안한 의자에 앉고 싶어"라는 문장도 가능하다. 두 문장에서 '소파'와 '의자'는 유사한 (여기선 완전히 동일한) 문맥에서 사용되므로 두 단어의 의미도 유사할 것이라고 추측할 수 있다. 


word2vec은 분포가설을 이용해 각 단어를 벡터[참고]로 나타낸다. 우리가 단어 '의자'의 의미를 담은 벡터를 만들고 싶다면, 단어 '의자' 주변에 어떤 단어가 나올 것인지 예측하도록 학습하면 된다. 예를 들어 '편안한'이라는 단어는 '의자' 주변에 충분히 등장할 수 있다. 그러나 '맛있는'이라는 단어는 '의자' 주변에 많이 등장하지 않을 것이다. 단어 '의자'가 주어졌을 때 주변에 '편안한'은 올 만하고, '맛있는'은 올 만하지 않다고 학습하다 보면 비슷한 문맥에서 등장하는 '소파'와 '의자'의 벡터는 유사하게 학습될 것이다. 


이때 '맛있는'과 같은 negative example은 '의자' 주변에 등장하지 않는 단어라면 모두 될 수 있는데, 주변에 등장하지 않는 모든 단어로 학습하기엔 비효율적이다. 이를 위해 negative sampling 기법이 사용된다. 간단히 설명하자면 '의자' 주변에 등장하지 않는 단어들 중에서 랜덤하게 몇 개 단어를 뽑는데, 이때 빈도수가 많은 단어는 뽑힐 확률을 조금 낮추고, 빈도수가 적은 단어는 뽑힐 확률을 조금 높여서 너무 빈도수가 높은 '은, 는, 이, 가, 이, 그, 저' 등의 단어만 뽑히지 않도록 조정한다. 


이 방식의 최대 장점은 따로 데이터 레이블링이 필요하지 않다는 것이다. 예를 들어 감정 분류 모델을 학습하려면, [입력 "이 영화는 정말 재미없어요"에 해당하는 레이블(정답)은 "부정"]과 같은 데이터가 여러 개 필요하다. 그런데 이렇게 아름답게 레이블된 데이터는 많지 않다. 그래서 데이터를 억지로 늘린다거나(data augmentation) 다양한 고통스러운 방법이 사용된다. 하지만 word2vec은 그냥 줄글만 있으면 학습이 가능하다. 


이렇게 단어를 성공적으로 벡터로 나타내면 "king - man + woman = queen"와 같은 계산도 가능하다. 단어 'king'의 벡터에서 단어 'man'의 벡터를 빼고 단어 'woman'의 벡터를 더하면 단어 'queen'의 벡터가 나온다는 뜻이다.


 

word2vec을 이용하면 유의어를 알아낼 수 있기 때문에 '식당'이라고 검색해도 '레스토랑'을 포함한 결과를 보여줄 수도 있고 이 과 같은 분석도 할 수 있다 ^^


word2vec 대신 item2vec이란 이름으로 추천 모델에 활용되기도 한다. 어떤 유저가 '벚꽃엔딩'이라는 노래 다음에 '우연히 봄'이라는 노래를 들었다면, '벚꽃엔딩'과 '우연히 봄'은 '벚꽃엔딩'과 'All I want for christmas'보다 유사할 것이라고 생각할 수 있다. 그래서 청취한 노래, 구매한 상품 등을 단어로 보고 word2vec과 같은 방식으로 학습하여 유저가 소비한 아이템과 유사한 아이템을 추천해 줄 수도 있다. 


word2vec은 2013년에 발표되어 아직까지 널리 사용되는 모델이지만, 한계도 분명히 있다. 같은 형태의 단어라면 무조건 같은 벡터로 표현된다는 것이다. 예를 들어, '배'라는 단어는 과일일 수도, 운송수단일 수도 있지만 word2vec에선 같은 벡터로 학습되기 때문에 두 의미를 구분하기 힘들다. 동음이의어가 아니더라도 상황, 문맥에 따라 단어의 의미가 약간씩 달라질 수 있는데, 이를 반영하진 못한다. 

문맥에 따라 달라지는 단어의 의미를 반영한 모델 중 가장 성공적인 것이 Transformer이다. Transformer는 요즘 매우 매우 매우 핫한 챗GPT의 근본 구조이기도 하다. 


하지만 난 언어학의 '분포가설'을 차용해 코드로 구현해 냈다는 점에서 word2vec이 정말 천재적이라고 생각한다. 챗GPT 등 Transformer류의 모델이 너무나 잘 나가긴 하지만, 언어학 베이스가 들어간 word2vec에 좀 더 정이 간달까? 어쩔 수 없는 인문학도의 마음이다 ㅎ 


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari