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. 정리
- 임베딩은 신경망이 "어떤 맥락에서 쓰이는가"를 학습해서 만드는 의미 벡터 — TF-IDF와 달리 동의어 관계를 포착함
- 분포 가설("비슷한 맥락에서 등장하는 단어는 비슷한 의미를 가진다")이 이론적 토대
- 벡터의 덧셈·뺄셈이 의미 관계로 이어지는 성질이 나타남(king−man+woman≈queen)
- 차원이 다른 임베딩 모델끼리는 직접 비교 불가 — 한 시스템 안에서는 모델을 통일해야 함
- 유사도는 거의 항상 코사인 유사도로 계산
임베딩은 "텍스트→벡터" 변환만 하고 끝난다. 새로운 텍스트를 생성하지는 않는다.
반면 같은 트랜스포머 계열이지만 "다음에 올 단어를 예측해서 텍스트를 생성하는" 모델이 LLM이다. → 트랜스포머와 LLM
GitHub 댓글