어휘 사전
어휘 사전 (Vocabulary)
1. 개요
어휘 사전(Vocabulary)이란 자연어 처리(NLP)에서 모델이 처리할 수 있는 모든 고유한 토큰(Token, 텍스트의 최소 의미 단위)의 집합을 의미하며, 텍스트 데이터를 컴퓨터가 이해할 수 있는 수치형 벡터로 변환하기 위한 기초 매핑 테이블 역할을 한다.
2. 어휘 사전 구축 과정
어휘 사전 구축은 원시 텍스트(Raw Text)를 정수 인덱스로 변환하는 정형화된 과정을 거친다.
2.1 구축 단계
- 토큰화(Tokenization): 문장을 단어, 형태소, 혹은 문자 단위의 토큰으로 분리한다.
- 고유 단어 추출: 전체 말뭉치(Corpus)에서 중복을 제거하여 유일한 토큰들의 집합을 생성한다.
- 인덱싱(Indexing): 각 고유 토큰에 0부터 시작하는 고유한 정수 번호를 부여한다.
2.2 변환 예시
사전 정의: {"나": 0, "는": 1, "학교": 2, "에": 3, "간다": 4, "집": 5, "으로": 6}
| 원문 텍스트 | 토큰화 결과 | 인덱스 변환 (Mapping) |
|---|---|---|
| "나는 학교에 간다" | ["나", "는", "학교", "에", "간다"] |
[0, 1, 2, 3, 4] |
| "학교에 간다" | ["학교", "에", "간다"] |
[2, 3, 4] |
| "나는 집으로 간다" | ["나", "는", "집", "으로", "간다"] |
[0, 1, 5, 6, 4] |
2.3 양방향 매핑 구조
효율적인 데이터 처리를 위해 어휘 사전은 일반적으로 두 가지 형태의 딕셔너리 구조를 동시에 유지한다.
- Word-to-Index (Forward Mapping): 텍스트를 입력받아 모델에 넣을 정수 인덱스로 변환할 때 사용한다. (예: {"나": 0, "는": 1, ...})
- Index-to-Word (Backward Mapping): 모델이 출력한 정수 인덱스를 다시 사람이 읽을 수 있는 텍스트로 복원(Decoding)할 때 사용한다. (예: {0: "나", 1: "는", ...})
3. 특수 토큰 (Special Tokens)
표준적인 단어 외에 모델의 구조적 제어나 예외 상황 처리를 위해 정의된 특수 토큰들이 존재한다.
[PAD](Padding): 입력 문장들의 길이를 동일하게 맞추기 위해 빈 공간을 채우는 토큰이다. 연산 시 무시되도록 설정된다.[UNK](Unknown): 어휘 사전에 등록되지 않은 단어(OOV)가 등장했을 때 이를 대체하는 토큰이다.[SOS](Start of Sentence): 문장의 시작을 알리는 토큰으로, 주로 Seq2Seq나 LLM과 같은 생성 모델에서 첫 토큰으로 입력된다.[EOS](End of Sentence): 문장의 끝을 알리는 토큰으로, 모델이 텍스트 생성을 멈춰야 하는 시점을 판단하게 한다.[CLS](Classification): 문장 전체의 의미를 대표하는 토큰으로, 주로 BERT와 같은 모델에서 분류 작업의 입력으로 사용된다.[SEP](Separator): 두 개의 문장을 구분하거나 문장의 끝을 알리는 구분자 토큰이다.
4. 어휘 사전의 크기와 최적화
사전의 크기(Vocabulary Size)는 모델의 성능과 자원 효율성 사이의 트레이드-오프(Trade-off) 관계에 있다.
4.1 사전 크기의 영향
- 크기가 너무 클 때: 모델의 임베딩 층(Embedding Layer) 파라미터가 급증하여 메모리 사용량이 늘어나고, 희소 단어(Rare words)에 대한 학습 부족으로 과적합(Overfitting) 위험이 커진다.
- 크기가 너무 작을 때: 너무 많은 단어가
[UNK]토큰으로 처리되어 정보 손실이 발생하고 모델의 표현력이 저하된다.
4.2 최적화 방법: 빈도수 기반 필터링 (Min-count)
전체 말뭉치에서 등장 횟수가 매우 적은 단어(예: 5회 미만 등장)를 제거하고 [UNK]로 통합하는 방식이다. 이를 통해 노이즈를 제거하고 모델의 일반화 성능을 높일 수 있다.
5. 어휘 사전의 한계와 발전
5.1 OOV(Out-of-Vocabulary) 문제
OOV 문제란 학습 단계의 어휘 사전에는 없었으나, 추론(Test) 단계에서 새로운 단어가 등장하여 모델이 해당 단어를 처리하지 못하고 모두 [UNK]로 치환해버리는 현상을 말한다. 이는 신조어, 오타, 혹은 복합어의 조합으로 인해 발생하며, 모델의 정보 손실을 야기한다.
5.2 서브워드 분절법 (Subword Segmentation)
단어를 더 작은 단위(Subword)로 쪼개어 사전의 크기를 제한하면서도 모든 단어를 표현할 수 있게 하여 OOV 문제를 해결한다.
BPE (Byte Pair Encoding)와 WordPiece 비교
| 구분 | BPE (Byte Pair Encoding) | WordPiece |
|---|---|---|
| 병합 기준 | 가장 빈번하게 등장하는 문자 쌍 (Frequency) | 가능도(Likelihood)를 최대화하는 쌍 |
| 특징 | 단순 빈도 기반의 반복적 병합 | 통계적 확률 기반의 병합 |
| 대표 모델 | GPT 시리즈, RoBERTa | BERT |
| 목표 | 빈도수가 높은 조합을 하나의 토큰으로 통합 | 전체 말뭉치의 가능도를 높이는 방향으로 분절 |
5.3 BPE 작동 원리 예시 코드
import collections
def get_stats(ids):
counts = collections.defaultdict(int)
for i in range(len(ids)-1):
counts[(ids[i], ids[i+1])] += 1
return counts
def merge(ids, pair):
new_ids = []
i = 0
while i < len(ids):
if i < len(ids)-1 and (ids[i], ids[i+1]) == pair:
new_ids.append(pair[0] + pair[1]) # 병합된 토큰 생성
i += 2
else:
new_ids.append(ids[i])
i += 1
return new_ids
# 초기 데이터: 각 단어를 문자 단위로 분리
words = ["hug", "pug", "pun", "bun"]
# 단순화를 위해 각 단어를 리스트로 표현
ids = ["h", "u", "g", "p", "u", "g", "p", "u", "n", "b", "u", "n"]
# 1회차 병합: 가장 빈번한 쌍 (u, g) 또는 (u, n) 중 하나 선택
stats = get_stats(ids)
best_pair = max(stats, key=stats.get) # 예: ('u', 'g')
ids = merge(ids, best_pair)
print(f"1차 병합 후: {ids}") # ['h', 'ug', 'p', 'ug', 'p', 'u', 'n', 'b', 'u', 'n']
# 2회차 병합: 다음 빈번한 쌍 (u, n) 선택
stats = get_stats(ids)
best_pair = max(stats, key=stats.get) # ('u', 'n')
ids = merge(ids, best_pair)
print(f"2차 병합 후: {ids}") # ['h', 'ug', 'p', 'ug', 'p', 'un', 'b', 'un']
# 결과적으로 'bug'라는 새로운 단어가 들어와도 [b, ug] 혹은 [b, u, g]로 표현 가능하여 OOV 해결
6. 활용 및 주의사항
6.1 임베딩 층(Embedding Layer)과의 연결성
어휘 사전의 인덱스는 모델의 첫 번째 층인 임베딩 층의 행 인덱스로 직접 연결된다.
- 작동 프로세스:
단어$\rightarrow$사전 인덱스(Integer)$\rightarrow$<a href="/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5/%EC%8B%A0%EA%B2%BD%EB%A7%9D%20%EA%B5%AC%EC%84%B1%20%EC%9A%94%EC%86%8C/%EC%9E%84%EB%B2%A0%EB%94%A9%20%EB%B2%A1%ED%84%B0" class="wiki-link wiki-link-missing">임베딩 벡터</a>(Float Vector)- 상세 원리:
- Word2Vec, FastText: 사전의 각 인덱스에 대응하는 고정된 크기의 밀집 벡터(Dense Vector)를 학습한다.
- 모델은 입력받은 정수 인덱스를 사용하여 임베딩 행렬(Embedding Matrix)에서 해당 행의 벡터를 추출(Lookup)하며, 이 벡터가 신경망의 실제 연산에 활용된다.
6.2 구축 시 주의사항
- 사전 일치(Vocabulary Consistency): 학습 데이터로 구축한 사전을 테스트 데이터 및 실제 서비스 환경에서도 동일하게 사용해야 한다. 인덱스가 하나라도 밀리면 모델은 완전히 다른 단어로 인식한다.
- 도메인 특화 사전: 의료, 법률, IT 등 전문 분야의 텍스트를 처리할 때는 일반적인 사전보다 해당 도메인의 전문 용어가 충분히 반영된 특화 사전을 구축하거나, 기존 사전에 전문 용어를 추가하는 과정이 필요하다.
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.