cf) TF-IDF
[ML] TF-IDF(Term Frequency-Inverse Document Frequency)
1. TF-IDF?정의단어의 빈도(TF)와 역문서빈도(IDF)를 곱해서, 문서 내 각 단어의 "중요도"를 가중치로 매기는 방법단순히 "몇 번 나왔는가"만 세는 빈도수 카운트(Bag of Words)의 한계를 보완쓰임문서 간
blog.chaenii.me
TF-IDF도 텍스트를 벡터로 바꾼다. 그런데 TF-IDF는 순수하게 "단어가 몇 번 등장했는가"라는 통계에 기반한다.
"강아지"와 "개"는 글자가 다르니 전혀 다른 차원으로 취급 → 의미가 같다는 것을 전혀 모른다.
임베딩(embedding): 신경망이 대량의 텍스트를 학습 → "이 단어가 어떤 맥락에서 쓰이는가" 함께 학습
"강아지"와 "개"는 비슷한 문맥에서 자주 등장하므로 임베딩 공간에서 가까운 벡터가 된다.(TF-IDF는 절대 할 수 없는 일)
1. 분포 가설 (Distributional Hypothesis)
"비슷한 맥락에서 등장하는 단어는 비슷한 의미를 가진다"
- 임베딩이 작동하는 이론적 토대.
- "나는 강아지를 키운다"와 "나는 개를 키운다" → 같은 맥락에서 한 단어만 다름.
- 이런 패턴을 대량의 텍스트에서 통계적으로 학습하면, 신경망은 "강아지"와 "개"를 비슷한 벡터로 배치하게 된다.
- 단어의 "정의"를 가르친 게 아니라, "어떤 맥락에서 쓰이는지"의 패턴만 학습해서 의미가 따라 나온 것.

2. 벡터 연산 → 의미 연산
분포 가설이 잘 학습된 임베딩 공간에서는 벡터의 덧셈·뺄셈이 의미상의 관계로 이어지는 성질이 나타난다.
e.g) king에서 man의 의미를 빼고 woman의 의미를 더하면 queen에 가까운 벡터가 나온다
$$
\vec{v}(\text{king}) - \vec{v}(\text{man}) + \vec{v}(\text{woman}) \approx \vec{v}(\text{queen})
$$
- 무슨 뜻인가: "king − man"이라는 벡터 차이가 대략 "왕족의 성별을 결정짓는 방향" 같은 의미를 포착하고 있어서, 그 방향을 woman에 더하면 queen 쪽으로 이동한다는 직관이다
- 왜 가능한가: 임베딩이 학습되는 과정 자체가 "비슷한 맥락→비슷한 벡터"라는 패턴을 통계적으로 누적한 결과라서, 의미적 관계가 벡터 공간상의 기하학적 관계(방향과 거리)로 자연스럽게 인코딩되기 때문이다
- 한계: 실제로는 항상 완벽하게 들어맞지는 않고, 모델·학습 데이터에 따라 정확도가 다르다. 그래도 임베딩이 "의미"를 다룬다는 걸 보여주는 상징적인 예시로 자주 인용된다.
3. 임베딩이 만들어지는 과정
- 트랜스포머 신경망이 텍스트를 입력받아 고차원 벡터를 출력한다
- 학습 과정에서 "이 단어 주변에 어떤 단어가 오는가"를 예측하는 과제를 반복적으로 풀면서 신경망 내부의 가중치가 조정된다
- 그 결과로 나오는 벡터(=임베딩)가 의미를 반영하게 된다
트랜스포머 구조(트랜스포머와 LLM 참고)를 깊이 몰라도 무방하다.
실전에서는 이미 학습된 임베딩 모델을 API로 호출해서 쓰는 게 대부분이다.
차원(dimension)의 의미
- 임베딩은 고정된 차원의 실수 벡터로 나온다 (예: OpenAI text-embedding-3-small = 1536차원, AWS Bedrock Titan = 1024차원)
- 각 차원에 "이건 동물 관련 정도" 같은 명시적 의미는 없다.
- 수천 개 숫자 전체가 조합되어 의미를 표현하는 분산표현(distributed representation)
- 중요한 실전 규칙
- 차원이 다른 임베딩 모델끼리는 직접 비교할 수 없다.
e.g) 1536차원 벡터와 1024차원 벡터는 애초에 같은 공간에 있지 않으므로 코사인 유사도 계산 자체가 불가능하다. - 한 시스템 안에서는 반드시 같은 임베딩 모델을 일관되게 써야 한다
- 차원이 다른 임베딩 모델끼리는 직접 비교할 수 없다.
유사도 계산
임베딩끼리의 유사도는 거의 항상 코사인 유사도로 계산한다.
두 문장을 각각 임베딩하고 코사인 유사도를 구하면, 값이 높을수록 의미적으로 비슷한 문장이라는 뜻이다.

폴백(fallback) 임베더
진짜 임베딩 모델을 쓸 때 생길 수 있는 문제:
- API 호출 비용이 든다
- 네트워크·인증 문제로 실패할 수 있다
이런 상황에 대비해 "의미는 없지만 항상 똑같은 결과를 내는" 가짜 임베더를 폴백으로 두는 패턴이 있다.
e.g) 텍스트의 SHA-256 해시값을 반복해서 고정 길이 숫자 배열을 만들고 정규화한 것.
진짜 임베딩과의 차이:
| 진짜 임베딩 | 풀백 임베더(해시 기반) | |
| 같은 텍스트 → 같은 벡터 | ✓ | ✓ |
| 비슷한 텍스트 → 가까운 벡터 | ✓ | ✗ |
| API 비용 | 있음 | 없음 |
| 장애 가능성 | 있음 | 없음 |
쓰는 상황:
- 개발 단계에서 비용 없이 파이프라인을 테스트할 때
- 실제 임베딩 API가 죽었을 때 시스템이 완전히 멈추지 않게 하는 안전장치
4. 단어 임베딩 vs 문장 임베딩
임베딩에는 크게 두 계열이 있다.
- 단어 임베딩(Word Embedding)
- Word2Vec, GloVe 같은 초기 모델.
- 단어 하나에 고정된 벡터 하나를 대응시킨다.
- "bank"가 금융 문맥이든 강둑 문맥이든 항상 같은 벡터가 나온다.
- 문맥에 따라 의미가 달라지는 다의어를 제대로 표현할 수 없다는 근본적 한계가 있다.
- 문장 임베딩(Sentence / Contextual Embedding)
- BERT, sentence-transformers 같은 트랜스포머 기반 모델.
- 입력 전체 문맥을 보고 각 단어의 벡터를 결정한다.
- "은행 계좌를 열었다"의 "은행"과 "강 은행에 앉았다"의 "은행"이 다른 벡터로 나온다.
- RAG, 의미 검색에서 쓰이는 임베딩은 거의 다 이 계열이다.
| 단어 임베딩 (Word2Vec, GloVe) | 문장 임베딩 (BERT, sentence-transformers) | |
| 맥락 반영 | ✗ 고정 벡터 | ✓ 문맥마다 다른 벡터 |
| 다의어 처리 | 불가 | 가능 |
| 출력 단위 | 단어 | 문장 전체 |
| 주요 용도 | 언어학 연구, 간단한 분류 | RAG, 의미 검색, 클러스터링 |
5. 임베딩 파인튜닝
일반 임베딩 모델을 도메인 특화 데이터로 추가 학습(fine-tuning) 하면 성능이 크게 올라가는 경우가 많다.
e.g. 쇼핑몰 CS 데이터로 파인튜닝한 임베딩 모델
- "배송 지연"과 "출고 지체"를 더 가깝게 배치한다 (도메인 동의어)
- "환불"과 "취소"를 더 명확히 구분할 수 있다 (맥락에 따라 다른 개념)
파인튜닝 방식:
- 대조 학습(contrastive learning)
- "(질문, 정답 문서)" 쌍은 가깝게, "(질문, 관련 없는 문서)" 쌍은 멀게 학습.
- 주로 검색 시스템에 쓰인다
- 레이블 데이터 활용
- 분류 태그가 달린 데이터로 학습해서 같은 카테고리는 가깝게, 다른 카테고리는 멀게
6. 다국어 임베딩
영어로 주로 학습된 일반 임베딩 모델은 한국어 텍스트에서 성능이 낮을 수 있다. 특히:
- 한국어 형태소 분리(토크나이저가 한국어에 최적화되지 않은 경우)
- 한국어 특유의 조사·어미 처리
이를 위한 대안:
- 다국어 모델: multilingual-e5, paraphrase-multilingual-mpnet 같은 모델은 100개 이상 언어로 학습되어 한국어도 어느 정도 커버
- 한국어 특화 모델: KLUE-BERT, KoSentenceBERT 등 한국어 코퍼스로 학습된 모델. 한국어 텍스트 분류·검색에는 이 쪽이 더 정확한 경우가 많음
- 한국어 포함 파인튜닝: 영어 기반 모델을 한국어 도메인 데이터로 파인튜닝
7. 정리
- 임베딩은 신경망이 "어떤 맥락에서 쓰이는가"를 학습해서 만드는 의미 벡터 — TF-IDF와 달리 동의어 관계를 포착함
- 분포 가설("비슷한 맥락에서 등장하는 단어는 비슷한 의미를 가진다")이 이론적 토대
- 벡터의 덧셈·뺄셈이 의미 관계로 이어지는 성질이 나타남(king−man+woman≈queen)
- 차원이 다른 임베딩 모델끼리는 직접 비교 불가 — 한 시스템 안에서는 모델을 통일해야 함
- 유사도는 거의 항상 코사인 유사도로 계산
임베딩은 "텍스트→벡터" 변환만 하고 끝난다. 새로운 텍스트를 생성하지는 않는다.
반면 같은 트랜스포머 계열이지만 "다음에 올 단어를 예측해서 텍스트를 생성하는" 모델이 LLM이다. → 트랜스포머와 LLM
GitHub 댓글