-
통계적 언어 모델(SLM)과 N-gramAI 2026. 2. 22. 01:49
스마트폰 키보드나 포털 검색창에서 내가 다음에 입력할 단어를 미리 알고 추천해 주는 기능, 도대체 원리가 무엇일까요? 컴퓨터가 문장을 이해하고 생성하는 가장 기본적이고 고전적인 원리, '통계적 언어 모델(SLM)'과 'N-gram'에 대해 알아봅니다.
통계적 언어 모델(SLM)
통계적 언어 모델(Statistical Language Model)은 문장(단어의 시퀀스)에 확률을 부여하는 모델입니다. 핵심 질문은 하나입니다.
"이 단어 뒤에 어떤 단어가 오는 것이 가장 자연스러운가?"
컴퓨터는 수많은 텍스트 데이터를 통계적으로 분석하여, "내가 밥을 [ ]" 다음에 '먹었다'가 올 확률이 '공부했다'가 올 확률보다 높다는 것을 계산해냅니다.
쉽게 말해, 어떤 문장이 얼마나 자연스러운지, 혹은 다음에 어떤 단어가 올 확률이 높은지를 통계적으로 계산하는 모델입니다.
- 장점: 일일이 규칙을 정의해야 하는 규칙 기반 모델보다 개발에 대한 Cost가 훨씬 적다. 많은 데이터가 뒷받침될 경우, 훨씬 더 유연한 문장 생성이 가능하다(많이 사용되는 문장).
- 한계점: 한 번도 본 적 없는(학습 데이터에 존재하지 않는) 단어 / 문장에 대해서는 출력값에 적절한 의미를 부여할 수 없다. 따라서 언어 모델이 아우르는 범위를 넓히기 위해 다양한 단어를 포함하는 특성 범위의 데이터가 필요하다.문장의 어순에 대한 고려가 없기 때문에 다소 어색한 문장이 생성될 수 있다
- 핵심 원리: 확률의 연쇄 법칙 (Chain Rule)
문장 $W$가 단어 $w_1, w_2, w_3, \dots, w_n$의 순서로 구성되어 있다면, 이 문장이 나타날 확률 $P(W)$는 각 단어가 이전 단어들에 의존하여 나타날 조건부 확률의 곱으로 표현됩니다.
$$P(w_1, w_2, w_3, \dots, w_n) = P(w_1)P(w_2|w_1)P(w_3|w_1, w_2) \dots P(w_n|w_1, \dots, w_{n-1})$$P(나는 커피를 마신다) = P(는|나) x P(커피|나는) x P(를|나는 커피) x P(마신다|나는 커피를) = 0.9 x 0.5 x 0.95 x 0.73 = 0.312075 - 카운트 기반의 접근:
이론적으로 $P(w_n|w_1, \dots, w_{n-1})$을 구하려면 전체 말뭉치에서 앞선 단어 뭉치($w_1, \dots, w_{n-1}$)가 등장한 횟수 대비, 그다음 단어($w_n$)까지 포함된 횟수를 세면 됩니다.$$P(w_n|w_1, \dots, w_{n-1}) = \frac{\text{Count}(w_1, w_2, \dots, w_n)}{\text{Count}(w_1, w_2, \dots, w_{n-1})}$$

통계적 기계 번역(SMT, Statistical Machine Translation)
통계적 기계 번역은 통계적 언어 모델을 기반으로 동작합니다. 1988년에 IBM이 Model 1을 통해 새로운 번역 방식을 선보였고. 수많은 데이터로부터 통계적 확률을 구해 번역을 진행합니다.
번역은 자연스러운 문장을 생성하는 것뿐만 아니라 번역문의 문법 구조도 고려해야 하기 때문에 단순히 P(Target | Source) 만을 고려해서는 안 된답니다. 원문과 번역문, 각 단어 간의 매핑 관계를 추가로 고려해야 하는데, 그 관계를 정렬(Alignment) 이라고 부릅니다.

- 퍼틸리티는 직역하면 '출생률' 정도 되는 뜬금없는 의미를 갖고 있는데요, 원문의 각 단어가 번역 후에 몇 개의 단어로 나타나는지를 의미하는 값입니다. 위 예를 따르면 Everyone의 퍼틸리티는 2이고, Clapped 의 퍼틸리티는 3입니다. 그리고 to, the 의 퍼틸리티는 0이죠! 번역에 직접적으로 등장하지 않는다는 의미입니다. 퍼틸리티에 대한 확률은 p(n|w) 로 정의되며 n은 퍼틸리티 값, w는 원문의 단어입니다. music 은 높은 확률로 음악 으로만 번역될 테니 p(1|music) = 0.9 정도로 표현할 수 있겠죠?
- 왜곡은 원문의 단어가 번역문에서 존재하는 위치를 나타냅니다. 위의 예에서 Clapped는 손뼉(6) 을(7) 쳤다(8) 로 번역되므로 Clapped의 왜곡은 (6, 7, 8)로 나타납니다. 왜곡에 대한 확률은 p(t|s, l) 로 정의되며 t은 번역문에서 각 단어의 위치, s는 원문에서 각 단어의 위치, 그리고 l은 번역문의 길이입니다. Everyone(1) 으로 시작하는 문장은 모두(1) / 가(2) 라고 번역될 확률이 높으니 p(1|1, 8) x p(2|1, 8) 역시 제법 높을 것을 추측할 수 있습니다.
$$\begin{aligned} P(K|E) \approx \\ & \{ P(2|\text{Everyone}) \\ & \times P(1|1, 8) \times P(2|1, 8) \\ & \times P(\text{모두}|\text{Everyone}) \\ & \times P(\text{가}|\text{Everyone}) \} \\ \times & \{ P(3|\text{clapped}) \\ & \times P(6|2, 8) \times P(7|2, 8) \times P(8|2, 8) \\ & \times P(\text{손뼉}|\text{clapped}) \\ & \times P(\text{을}|\text{clapped}) \\ & \times P(\text{쳤다}|\text{clapped}) \} \\ \times & \{ P(1|\text{in}) \\ & \times P(4|3, 8) \times P(\text{에}|\text{in}) \} \\ \times & \{ P(1|\text{time}) \\ & \times P(5|4, 8) \times P(\text{맞춰}|\text{time}) \} \\ \times & \{ P(0|\text{to}) \} \\ \times & \{ P(0|\text{the}) \} \\ \times & \{ P(1|\text{music}) \\ & \times P(3|7, 8) \times P(\text{음악}|\text{music}) \} \end{aligned}$$SLM의 대표 주자: N-gram과 마르코프 체인(Markov Chain)
전체 문장의 확률을 구하려면 이전의 모든 단어를 고려해야 합니다. 하지만 문장이 길어질수록 계산은 복잡해지고 데이터는 부족해지죠. 이 문제를 해결하기 위해 등장한 것이 바로 N-gram입니다
N-gram은 텍스트에서 n개의 연속된 단어 시퀀스(Sequence)를 하나의 단위로 취급하는 모델입니다. '통계적 언어 모델(Statistical Language Model, SLM)'의 일종으로, 특정 단어 뭉치가 뭉쳐서 등장할 확률을 계산하여 다음에 어떤 단어가 올지 예측하는 데 사용됩니다.
마르코프 체인과 마르코프 가정
- 마르코프 체인(Markov Chain): "미래의 상태는 과거의 긴 역사가 아니라, 오직 현재(직전)의 상태에 의해서만 결정된다"는 확률 과정 모델입니다.
- 마르코프 가정(Markov Assumption): 이를 언어 모델에 적용한 것으로, "다음에 올 단어는 문장의 처음부터가 아니라, 바로 앞의 $n-1$개의 단어에만 의존한다"고 현실적인 타협(가정)을 하는 것입니다.
즉, 전체 맥락을 다 보는 대신 단어를 $n$개씩 뭉쳐서 직전 상태만으로 다음 단어를 예측하며 계산 효율성을 확보합니다. $n$의 크기에 따라 부르는 명칭이 달라집니다.
- Unigram ($n=1$): 단어 1개 단위 (예: "This", "is", "a")
- Bigram ($n=2$): 단어 2개 단위, 1차 마르코프 체인 (예: "This is", "is a")
- Trigram ($n=3$): 단어 3개 단위, 2차 마르코프 체인 (예: "This is a")
- 4-gram ($n=4$): 단어 4개 단위 (예: "This is a sentence")
확률 계산식 (Trigram 기준)
예를 들어, "this is a" 다음에 "sentence"가 올 확률은 다음과 같이 조건부 확률로 계산합니다.
$$P(\text{sentence} | \text{this is a}) \approx \frac{Count(\text{this is a sentence})}{Count(\text{this is a})}$$전체 말뭉치(Corpus)에서 "this is a"가 등장한 횟수 중에서 그 뒤에 바로 "sentence"가 따라온 횟수가 얼마나 되는지를 통계적으로 산출하는 방식입니다.
실전 예시: 문장 유사도 분석
N-gram은 두 문장이 얼마나 유사한지 측정할 때도 유용합니다. 아래 두 문장을 비교해 보겠습니다.
- 문장 1: This is a wonderful sentence
- 문장 2: This is a beautiful sentence
$n$의 크기에 따라 일치하는 정도(Precision)를 계산하면 다음과 같습니다.
단위 (N) 일치하는 N-gram 뭉치 일치율 (Precision) $N=1$ (Uni) {this, is, a, sentence} 80% (5개 중 4개) $N=2$ (Bi) {this is, is a} 50% (4개 중 2개) $N=3$ (Tri) {this is a} 33.3% (3개 중 1개) ① 유니그램 (Unigram, N=1) : 단어 1개씩 묶기
- 문장 1 뭉치 (5개): {This, is, a, wonderful, sentence}
- 문장 2 뭉치 (5개): {This, is, a, beautiful, sentence}
- 일치하는 뭉치: {This, is, a, sentence} -> 4개
- 계산: $4 / 5 = 0.8$ -> 80% (정답)
② 바이그램 (Bigram, N=2) : 단어 2개씩 묶기
- 문장 1 뭉치 (4개): {This is, is a, a wonderful, wonderful sentence}
- 문장 2 뭉치 (4개): {This is, is a, a beautiful, beautiful sentence}
- 일치하는 뭉치: {This is, is a} -> 2개
- 계산: $2 / 4 = 0.5$ -> 50% (정답)
💡 포인트: 'a wonderful'과 'a beautiful'이 다르고, 'wonderful sentence'와 'beautiful sentence'가 다르기 때문에 일치율이 뚝 떨어집니다. 단어의 '순서'와 '연결성'을 보기 시작하는 단계입니다.
③ 트라이그램 (Trigram, N=3) : 단어 3개씩 묶기
- 문장 1 뭉치 (3개): {This is a, is a wonderful, a wonderful sentence}
- 문장 2 뭉치 (3개): {This is a, is a beautiful, a beautiful sentence}
- 일치하는 뭉치: {This is a} -> 1개
- 계산: $1 / 3 \approx 0.333$ -> 33.3% (정답)
💡 포인트: N이 커질수록 조건이 깐깐해집니다. 주변 문맥(Context)이 완전히 똑같아야만 일치한다고 판단하기 때문입니다.
N-gram의 장점과 한계
- 장점
- 단순함: 구조가 간단하여 구현이 쉽고 계산 속도가 빠릅니다.
- 도메인 특화: 특정 분야의 말뭉치로 학습할 경우 해당 도메인의 문맥을 잘 반영합니다.
- 한계점 (Critical Issues)
- 희소 문제 (Sparsity Problem):
현실에서는 충분히 가능한 문장이라도, 학습 데이터(말뭉치)에 없다는 이유만으로 그 확률을 0으로 판단해버리는 현상입니다.
이를 해결하기 위해 Smoothing(라플라스 평활화)이나 Back-off 같은 기법이 필요합니다.
만약 내가 가진 데이터가 아래 문장 하나뿐이라고 가정해 봅시다.
데이터: "나는 사과를 먹는다."
질문: "나는 포도를 먹는다"가 나올 확률은?
계산: $P(\text{포도}|\text{나는}) = \frac{\text{Count}(\text{나는 포도})}{\text{Count}(\text{나는})}$
그런데 내 데이터에는 "나는 포도"라는 표현이 한 번도 없습니다. 그러면 Count는 0이 되고, 확률도 0%가 됩니다. - 장기 의존성 (Long-term Dependency) 부족: 아주 긴 문장에서 앞부분의 정보가 뒷부분에 영향을 주는 경우, $n$개 단어만 보는 N-gram은 이를 포착하지 못합니다.
- 데이터 의존성: 학습한 데이터에 없는 표현은 예측할 수 없습니다.
- 희소 문제 (Sparsity Problem):
'AI' 카테고리의 다른 글
LSTM(Long Short-Term Memory) (1) 2026.02.22 순환 신경망(RNN)의 개념 (0) 2026.02.22 FastText (0) 2026.02.22 Word2Vec: Negative Sampling (0) 2026.02.21 단어의 의미를 벡터로, Word2Vec (0) 2026.02.21