
지난 글들을 요약하자면 이렇다.
- 언어 모델의 시초: 초기의 언어 모델은 문장의 확률을 구하기 위해 첫 단어부터 n번째 단어까지의 모든 연쇄 확률을 계산해야 했다.
- 마르코프 가정의 도입: 하지만 문장이 길어질수록 계산량이 기하급수적으로 늘고 데이터 부족(희소성) 문제가 심각해져, 최근 N-1개의 단어만 참고하자는 N-gram 방식이 표준이 되었다.
- N-gram의 종류: 이에 따라 직전 단어 하나만 보는 바이그램(Bigram), 두 개를 보는 트라이그램(Trigram) 등 참고할 단어의 개수를 정하는 모델들이 발전했다.
- 앙상블 기법: 모델의 성능을 높이기 위해 여러 N값을 가진 모델들을 섞어서 사용하는 보간(Interpolation) 방식이 발달했다.
- 백오프(Back-off): 고차원 N-gram(예: 트라이그램)에 해당 데이터가 없으면, 하위 모델(바이그램, 유니그램)로 단계적으로 내려가며 확률을 찾는 조건문 방식의 로직이 구현되었다.
- Unknown 토큰: 학습 데이터에 아예 없는 단어가 등장할 경우, 이를 [UNK] (Unknown Token)로 처리하여 모델의 에러를 방지했다.
- 스무딩(Smoothing): 희소성 문제로 인해 빈도가 0인 단어 조합이 나올 경우 전체 확률이 0이 되는 것을 막기 위해, 1을 더하는 라플라스 스무딩이나 k를 가중하는 기법을 사용했다.
- PPL(Perplexity): 이러한 모델들이 실제 언어를 얼마나 잘 예측하는지 평가하기 위해, '헷갈리는 정도'를 수치화한 퍼플렉시티(PPL) 지표가 사용되었다.
- 단어의 관계성: 단어 사이에는 동의어, 다의어, 반의어 등 복잡한 의미 관계가 존재한다.
- WordNet의 등장: 이를 체계화하기 위해 전문가들이 단어 간 상하 관계와 유의어 집합을 정의한 WordNet이라는 시소러스(유의어 사전)를 구축해 사용했다.
- 사전 기반의 한계: 그러나 신조어 대응이 늦고 수동 갱신 비용이 너무 커서, 기계가 스스로 단어를 수치화하는 벡터화(Vectorization) 방식이 연구되었다.
- 원핫 인코딩(One-hot Encoding): 초기 벡터화는 단어 하나당 하나의 인덱스만 1이고 나머지는 0으로 채우는 방식이었으나, 단어 간 유사도를 계산할 수 없다는 치명적인 단점이 있었다.
- 코사인 유사도의 한계: 원핫 벡터들은 서로 직교(Orthogonal)하므로 코사인 유사도를 구해도 항상 0이 나와, 단어와 문서 간의 관계를 나타낼 새로운 방법이 필요해졌다.
- 문서-단어 행렬(DTM): 행에는 단어, 열에는 문서를 배치하여 빈도수를 기록하자, 문서 간의 유사도를 코사인 유사도로 비교할 수 있게 되었다.
- 빈도의 함정: 하지만 'the'나 '이/가' 처럼 의미 없는 기능어가 빈도가 높다는 이유로 중요하게 취급되는 문제가 생겼고, 이를 해결하기 위해 흔한 단어의 가중치를 낮추고 로그(Log)를 씌워 수치를 안정화했다.
- TF-IDF의 탄생: 이것이 바로 단어의 중요도를 계산하는 TF-IDF 방식이다.
- TF (Term Frequency): 특정 문서 내 단어 빈도에 로그를 씌워 계산한 값이다.
- IDF (Inverse Document Frequency): 특정 단어가 나타난 문서의 수DF의 역수를 취하고 로그를 씌워, 여러 문서에 흔하게 등장할수록 낮은 점수를 준다.
- PMI의 등장: 단어 간의 결합을 확률적으로 계산하기 위해 PMI(점별 상호 정보량) 개념이 활용되기 시작했다.
- PMI의 원리: 두 단어가 실제로 연달아 나올 확률을 각 단어가 독립적으로 나올 확률의 곱으로 나누어, 우연히 만난 것인지 의미 있게 연결된 것인지 측정한다.
- Dense 벡터로의 전환: 카운트 기반 방식(TF-IDF 등)은 여전히 차원이 너무 크고 희소성 문제가 남았기에, 이를 해결하기 위해 작은 차원에 의미를 압축하는 밀집(Dense) 벡터와 임베딩 기술이 등장하게 된다.
DENSE VECTOR
정보의 단위 unit들을 분포를 통해서 저장한 벡터이다.
밀집 벡터는 단어를 단순한 숫자가 아니라, 그 단어가 가진의미적 정보의 단위(Semantic Units)들을 여러 차원에 골고루 분산시켜 저장한 벡터입니다.
ex)

차원의 효율성 (Sparse vs Dense)
- 기존 희소 벡터(Sparse Vector): 단어 사전의 크기만큼 차원이 생성됩니다. 단어가 1만 개면 벡터의 길이도 1만이며, 대부분의 값이 0인 비효율적인 구조이다.
- 밀집 벡터(Dense Vector): 사용자가 정한 상대적으로 작은 차원(예: 100, 300차원 등) 안에 모든 정보를 압축한다. 모든 차원이 0이 아닌 실수값으로 꽉 차 있어 연산 효율이 매우 높다.
노이즈(Noise) 저항성
- 개별 오염 최소화: 희소 벡터는 특정 단어의 빈도수가 갑자기 튀거나 데이터에 오류가 생기면 해당 인덱스의 값이 직접적으로 오염된다.
- 분포의 힘: 반면 밀집 벡터는 의미 정보가 수많은 차원에 분산(Distributed)되어 저장됩니다. 따라서 일부 수치가 조금 변하더라도 전체적인 단어의 방향성(의미)은 크게 훼손되지 않는 강력한 복원력을 가진다.
Distributional Hypothesis
단어들이 유사한 맥락에서 등장했다면, 유사할 것이다. 라는 가설
단어를 몰라도 어떤 단어와 나오는 가를 통해 유추해서 학습한다.
ex) 우리는 'ong choy' 라는 단어를 알 수 없다.
1. ong choy와 함께 나오는 단어는 ong choy와 갈릭과 함께 먹으면 맛있다.
2. 밥위에 먹으면 맛있다.
3. 짠 소스와 함께먹으면 맛있다
라는 문장들이 함께온다고 생각했을 때
'spinach'라는 단어가 함께 나오는 단어들을 판단해 보았을 때
1. spinach와 갈릭은 함께먹으면 맛있다.
2. spinach는 밥위에 먹으면 맛있다.
3. spinach는 짠 소스와 함께 먹으면 맛있다.
를 통해서 우리는 ong choy와 spinach가 비슷한 단어라는 것을 확인할 수 있다.
이를 통해서 비슷한 단어의 밀집 벡터들은 유사하게 모여있을 것이라는 General idea를 찾을 수 있고,
INTUITION: 만약 두 단어가 비슷한 임베딩을 가지면, 그 단어는 비슷한 맥락을 가지고 있다고 예측할 수 있다는 것이다.
이는 label없이 예측하는 self-supervised learning으로 학습할 수 있다.
그러면 이 Dense vector를 어떻게 만들어야하는가가 중요하다.
Word2Vec details
context word(중심 단어) 와 target word(타겟단어) 를 통해서 같이 나온 case를 찾기 시작했다.
이를 또 빈도수로 나타내게 되면, 공간이 커지고 희소성이 생기게 되었다.
그래서 이를 dense벡터로 임베딩 하기로 했고, skip-gram learing을 사용하게 되었다.
SKIP-GRAM
Skip-gram의 핵심 아이디어는 중심 단어(W)를 사용하여 주변의 문맥 단어(C)들을 예측하는 것이다. 의미적으로 유사한 중심 단어들은 유사한 문맥 단어들을 예측하게 될 것이라는 원리를 이용한다.

- D: 전체 공출현(Co-occurrence) 쌍의 집합
- 델타 : 최적화해야 할 파라미터(단어 임베딩)
공식을 통해 center word와 context word를 각각 embedding하고, 같은 context에 있을경우와 같은 context에 없을 경우의 확률을 구한다.
Softmax
각 단어는 중심 단어일 때의 벡터와 문맥 단어일 때의 벡터, 두 가지 밀집 벡터를 가진다. 두 단어가 함께 나타날 로그 확률은 두 벡터의 내적에 비례한다고 가정하며, 이를 전체 단어장에 대해 정규화하기 위해 Softmax 함수를 사용한다.

그런데 이는 문제가있는데 같이 안나올 확률을 구하다 보면 모든 경우의 수를 모두구해야 한다는 단점있다.
Softmax의 한계와 Negative Sampling의 등장
전통적인 Softmax 방식은 치명적인 단점이 있다. 분모에서 전체 단어장에 있는 모든 단어에 대해 지수 함수를 계산하고 더해야 한다는 점이다. 단어장이 수십만 개라면 연산 비용이 너무 커져 학습이 불가능해집니다.
이를 해결하기 위해 문제를 이진 분류로 바꿔버린 것이 바로 Negative Sampling이다.
Negative Sampling
이 단어가 중심 단어와 함께 나올 확률은?"을 계산하는 대신, 단어 쌍(이 실제 문장에 존재하는 진짜(True) 쌍인가, 아니면 가짜(False)인가를 예측하게 한다.

최종식

진짜가 나올 확률은 높히고, 가짜가 나올 확률을 셈플링한 부분은 확률을 줄이는 방식으로 학습하게 되면 dense 벡터가 생성된다.

'AI' 카테고리의 다른 글
| 태태개발일지 - 기계학습(배깅,랜덤포레스트,부스팅) (0) | 2026.04.11 |
|---|---|
| 태태개발일지 - 기계학습(KNN, 의사결정 tree) (0) | 2026.04.05 |
| 태태코딩 - 자연어처리(word-net, tf,df,idf,pmi) (0) | 2026.03.28 |
| 태태개발일지 - 자연어처리(N-gram) (0) | 2026.03.21 |
| 태태코딩 - 기계학습(개요) (0) | 2026.03.14 |