임베딩
텍스트의 어휘는 우리 머릿속에 형성된 개념을 지칭하는 표식입니다. 그러한 기호 자체는 의미가 없습니다. 이러한 기호의 의미는 활용 속에서 결정되는데, 이것은 경험을 통해 형성되는 '학습’이라고 할 수 있습니다.
20세기에 주요한 기계학습 알고리즘들이 개발되었는데, 신경망은 다른 것들과는 달리 입력의 적절한 표현 방법 자체를 학습합니다. 데이터 자체에 대해 적응하는 비매개변수형이나 입력을 다른 형태로 변환하기는 하지만 표현 방법이 고정된 커널 기법과 근본적으로 다릅니다. 즉, 어떻게 표현해야 하는가 자체를 학습하는 것입니다.
텍스트의 어휘를 어떻게 표현해야 하는지 고민하는 방향에서 신경망의 이러한 특성이 바람직합니다.
임베딩의 개념을 개발하고 제시한 주요한 신경망 기반의 연구는 다음과 같습니다.
신경 확률 언어 모델 (NPLM), 2003
Word2Vec, 2013
2003년 처음 제시된 후, 2013년 재발견되기까지 10년이 걸렸습니다. 그 이후 임베딩은 2015년 이후부터 2020년대 딥러닝 언어모델의 근간이 되었습니다.
임베딩은 단어를 고정된 크기의 벡터로 변환하는 변환 행렬입니다.
import numpy as np
import pandas as pd
# 어휘 목록 및 OOV 처리
어휘목록 = ['<OOV>', '개', '고양이', '늑대', '호랑이']
어휘수 = len(어휘목록)
벡터크기 = 2 # 임베딩 차원 크기
# 랜덤 초기화된 임베딩 행렬 생성 (OOV 벡터는 0으로 설정 가능)
C = np.random.randn(어휘수, 벡터크기)
C[0] = np.zeros(벡터크기) # OOV 벡터를 0으로 초기화 (선택 사항)
# 변환 행렬 출력
pd.DataFrame(C, index=어휘목록, columns=[f"x{k+1}" for k in range(벡터크기)]).round(3)# 사용자 입력 단어 테스트 (직접 입력 가능)
단어 = input("단어 입력: ").strip()
# 단어가 목록에 있는지 확인 후 색인 찾기
단어색인 = 어휘목록.index(단어) if 단어 in 어휘목록 else 0
x = C[단어색인]
# 색인 및 임베딩 벡터 출력
print(f'단어: "{단어}"')
print(f'색인: {단어색인}')
print(f'임베딩 벡터: {x.round(3)}')단어: "개"
색인: 1
임베딩 벡터: [0.566 0.636]
분산 표현¶
이러한 벡터들은 고차원 벡터 공간에서 연속적인 실수값을 가지는 형태로 표현됩니다. 기존의 원-핫 인코딩 방식은 단어 간 의미적 관계를 반영하지 못하는 한계를 가지지만, 분산 표현(distributed representation)은 단어 간의 의미적 유사성을 수치적으로 반영할 수 있도록 설계되었습니다.
"분산(distributed)"이라는 개념은 정보가 여러 차원에 걸쳐 분산되어 표현된다는 점에서 유래되었습니다. 이는 기존의 기호 기반 표현(Symbolic Representation)과 비교되며, 특히 신경망과 같은 기계 학습 모델에서 보다 효율적이고 유의미한 데이터 표현을 가능하게 합니다.
분산 표현에서는 단어가 단일 요소(예: ID, 원-핫 벡터)로 표현되는 것이 아니라, 다차원 벡터의 여러 요소에 걸쳐 분산되어 표현됩니다. 예를 들어, 기존 방식에서는 '강아지’가 단순히 ID = 1과 같은 기호적 표현으로 나타나지만, 분산 표현에서는 [0.8, 0.2, 0.1, 0.6, 0.3]과 같은 벡터로 표현됩니다. 이 벡터의 각 요소는 단어의 특정 속성을 반영하며, 단어의 의미가 벡터의 여러 차원에 걸쳐 분산되어 표현된다고 볼 수 있습니다.
분산 표현의 특성¶
하나의 의미가 여러 차원에 분산되어 표현됨
의미적으로 비슷한 단어들은 비슷한 벡터 값을 가짐
정보가 분산된 방식으로 저장되므로 일반화가 가능함
분산 표현의 장점¶
의미적 유사성을 반영할 수 있음
희소성(Sparsity) 문제 해결
기존의 원-핫 인코딩 방식에서는 단어 개수만큼 벡터 크기가 커지는 문제가 있지만, 분산 표현은 상대적으로 작은 차원의 벡터(예: 300차원)로도 충분한 의미 표현이 가능합니다.추론 및 일반화 가능