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. 임베딩이 만들어지는 과정
내부적으로는 신경망이 텍스트를 입력받아 고차원 벡터를 출력한다. 다만 "임베딩이 만들어지는 방식"은 모델 세대와 목적에 따라 조금씩 다르다.
- Word2Vec 같은 초기 단어 임베딩은 주변 단어를 예측하거나, 주변 단어로 중심 단어를 예측하는 식으로 학습했다.
- BERT 계열은 문장 중 일부 토큰을 가리고 맞히는 masked language modeling을 통해 문맥 표현을 학습했다.
- RAG·의미 검색용 sentence embedding 모델은 "관련 있는 질문-문서 쌍은 가깝게, 무관한 쌍은 멀게" 만드는 대조학습(contrastive learning)을 많이 쓴다.
공통점은 하나다. 사람이 "이 단어와 저 단어는 비슷하다"고 직접 규칙을 적은 게 아니라, 대량의 데이터에서 같이 쓰이는 패턴과 구별되어야 하는 패턴을 학습한 결과로 벡터 공간이 만들어진다.
정확한 트랜스포머 구조(트랜스포머와 LLM 참고)를 깊이 몰라도, "이 벡터는 신경망이 학습한 의미 표현"이라는 결과물만 알고 써도 무방하다.
실전에서는 이미 학습된 임베딩 모델을 API로 호출해서 쓰는 게 대부분이다.
차원(dimension)의 의미
- 임베딩은 고정된 차원의 실수 벡터로 나온다
- e.g) OpenAI `text-embedding-3-small` = 1536차원, `text-embedding-3-large` = 3072차원
- 모델에 따라 `dimensions` 같은 파라미터로 더 짧은 벡터를 요청할 수도 있음.
- 각 차원에 "이건 동물 관련 정도" 같은 명시적 의미는 없다.
- 수천 개 숫자 전체가 조합되어 의미를 표현하는 분산표현(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 댓글