GloVe
Global Vectors
단어 동시 출현 행렬 기반 임베딩. Stanford에서 개발.
Global Vectors
단어 동시 출현 행렬 기반 임베딩. Stanford에서 개발.
GloVe(Global Vectors for Word Representation)는 Stanford NLP 그룹이 2014년에 개발한 단어 임베딩 알고리즘입니다. 단어를 고정 길이의 밀집 벡터(dense vector)로 변환하여, 의미적으로 유사한 단어들이 벡터 공간에서 가�게 위치하도록 학습합니다.
Word2Vec이 주변 단어 예측(local context)에 집중하는 반면, GloVe는 전체 코퍼스의 단어 동시 출현 통계(global co-occurrence)를 활용합니다. 이 접근법 덕분에 "king - man + woman = queen" 같은 유명한 단어 유추(analogy) 태스크에서 뛰어난 성능을 보였습니다.
핵심 원리는 단어 동시 출현 행렬을 먼저 구축한 뒤, 두 단어 벡터의 내적이 그들의 동시 출현 확률의 로그값에 비례하도록 최적화하는 것입니다. 이 방식은 Word2Vec의 예측 기반 방식과 전통적인 행렬 분해 방식의 장점을 결합했습니다.
2025년 현재 Transformer 기반 임베딩(BERT, OpenAI Ada)이 대세지만, GloVe는 여전히 가치가 있습니다. 사전 학습된 벡터를 무료로 다운로드할 수 있고, 추론 시 연산이 거의 없으며, 해석 가능성이 높아 학술 연구와 리소스 제한 환경에서 활용됩니다.
# GloVe 임베딩 로드 및 활용 예제
import numpy as np
from scipy.spatial.distance import cosine
# 1. 사전 학습된 GloVe 벡터 로드 (Wikipedia 6B, 100차원)
# 다운로드: https://nlp.stanford.edu/projects/glove/
def load_glove(filepath):
embeddings = {}
with open(filepath, 'r', encoding='utf-8') as f:
for line in f:
values = line.split()
word = values[0]
vector = np.array(values[1:], dtype='float32')
embeddings[word] = vector
return embeddings
glove = load_glove('glove.6B.100d.txt')
print(f"로드된 단어 수: {len(glove):,}개") # 약 40만 단어
# 2. 단어 유사도 계산
def similarity(word1, word2):
if word1 not in glove or word2 not in glove:
return None
return 1 - cosine(glove[word1], glove[word2])
print(f"king - queen 유사도: {similarity('king', 'queen'):.3f}") # ~0.65
print(f"cat - dog 유사도: {similarity('cat', 'dog'):.3f}") # ~0.80
print(f"cat - car 유사도: {similarity('cat', 'car'):.3f}") # ~0.30
# 3. 단어 유추 (king - man + woman = ?)
def analogy(a, b, c, topn=5):
"""a:b = c:? 형태의 유추"""
target = glove[b] - glove[a] + glove[c]
similarities = []
for word, vec in glove.items():
if word in [a, b, c]:
continue
sim = 1 - cosine(target, vec)
similarities.append((word, sim))
return sorted(similarities, key=lambda x: x[1], reverse=True)[:topn]
print(analogy('man', 'king', 'woman'))
# [('queen', 0.77), ('monarch', 0.71), ('princess', 0.69), ...]
# 4. Gensim으로 간편하게 사용
from gensim.models import KeyedVectors
# GloVe를 Word2Vec 포맷으로 변환 후 로드
glove_model = KeyedVectors.load_word2vec_format(
'glove.6B.100d.word2vec.txt', binary=False
)
print(glove_model.most_similar('python', topn=5))
# [('perl', 0.75), ('java', 0.72), ('ruby', 0.70), ...]
"검색 품질 개선에 GloVe 써볼게요. 사용자가 '노트북'을 검색하면 'laptop', '맥북'도 같이 매칭되게 유사어 확장하는 방식인데, API 비용 없이 로컬에서 바로 됩니다."
"GloVe와 Word2Vec의 핵심 차이는 학습 방식입니다. Word2Vec은 슬라이딩 윈도우로 주변 단어를 예측하는 반면, GloVe는 전체 코퍼스의 동시 출현 행렬을 분해합니다. GloVe가 전역 통계를 활용해서 희귀 단어 처리에 더 강합니다."
"BERT 임베딩이 좋긴 한데, 매번 GPU 추론이 필요하잖아요. 배치 처리가 어려운 실시간 서비스에서는 GloVe 룩업 테이블이 훨씬 빠릅니다. 300차원 벡터 하나 가져오는 건 마이크로초 단위거든요."
GloVe는 학습 코퍼스에 없는 단어를 처리할 수 없습니다. 신조어나 오타가 많은 데이터에서는 FastText(subword 기반)가 더 적합합니다.
"bank"가 은행인지 강둑인지 구분하지 못합니다. 다의어가 많은 태스크에서는 BERT 같은 contextual embedding을 사용하세요.
일반 텍스트에는 Wikipedia 학습 버전(6B), 소셜 미디어에는 Twitter 버전(27B)을 사용하세요. 차원은 100d(빠름)~300d(정확) 중 선택합니다.