N-gram 은 앞 N-1 개 단어만 보고 다음 단어를 확률로 맞추는 가장 단순한 통계 언어 모델이다. 오늘날 LLM 의 출발점으로 불리며, 지난 50여 년 동안 자연어 처리 기술의 기반 역할을 해왔다. 트랜스포머가 가져온 변화를 이해하려면 이 출발점부터 알아야 한다.
처음 N-gram 을 만난 건 2020년이었다. 자연어 처리를 막 공부하던 시기였고, BERT가 한창 화제였지만 교과서는 여전히 N-gram부터 시작했다. 단순한 확률 계산만으로 다음 단어를 예측한다는 점이 흥미로웠고, 동시에 왜 결과가 자주 어색했는지도 빠르게 와닿았다.
N-gram 은 어떻게 작동하나

연속된 N 개의 토큰
N-gram은 연속된 N개의 토큰 묶음을 의미한다. 토큰은 문자일 수도, 음절일 수도, 단어일 수도 있다. N 이 1 이면 유니그램, 2 면 바이그램, 3 이면 트라이그램이라고 부른다.
“오늘 날씨가 좋다”라는 문장을 단어 단위로 쪼개면 바이그램은 (“오늘”, “날씨가”), (“날씨가”, “좋다”)가 된다. 문자 단위로 쪼개면 (“오”, “늘”), (“늘”, ” “) 식이다. 검색 인덱스, 자동완성, 언어 모델 모두 이 토큰 묶음을 쓴다.
마르코프 가정으로 줄인 계산
언어 모델의 목표는 한 문장이 나타날 확률을 구하는 것이다. 이론적으로 계산하면 모든 앞 단어를 고려해야 한다. 문장이 길어질수록 계산량도 급격히 증가한다.
N-gram 은 여기서 한 가지 가정을 한다. 다음 단어는 바로 앞 N-1 개 단어에만 의존한다. 이를 마르코프 가정이라고 한다. 가정을 받아들이면 확률 계산이 단순한 카운트로 줄어든다.
카운트만으로 끝나는 학습
말뭉치에 “In Korea, more”가 1,000번, “In Korea, more than”이 600 번 나타났다면,
P(than | In Korea, more) = 600 / 1000 = 0.6 이다.
별도의 신경망 학습 없이, 등장 빈도만 계산해 모델을 만들 수 있다. (출처)
def bigram_prob(w_prev, w_next, counts):
pair = counts.get((w_prev, w_next), 0)
total = counts.get(w_prev, 0)
return pair / total if total else 0.0
섀넌 1948, N-gram 의 출발선

정보 이론에서 시작
N-gram은 클로드 섀넌이 1948 년 “A Mathematical Theory of Communication” 논문에서 처음 소개했다. 정보 이론의 시작점이자 통계 언어 모델의 시작점이다. (출처)
섀넌은 이어 1951 년 “Prediction and Entropy of Printed English” 논문에서 영어 N-gram 모델을 본격적으로 논의했다. 영문 텍스트의 엔트로피를 측정하려면 N-gram 으로 다음 글자를 예측해야 했다. (출처)
50 년을 받친 골격
1950년대 이후 음성 인식, 기계 번역, 검색, 맞춤법 검사까지 자연어 응용 거의 전부가 N-gram을 활용 했다. 대규모 말뭉치만 있으면 N-gram으로 그럴듯한 결과가 나왔다. (출처)
Google 도 한때 Books N-gram Viewer 서비스로 출판물 속 단어 빈도 변화를 시각화했다. 구현이 단순하다는 점이 가장 큰 장점이었다.
트랜스포머와 N-gram, 결정적 차이

N-gram 의 한계
하지만 N-gram은 구조 자체에서 한계를 가진다. 앞 N-1 개 단어만 본다는 말은, N 보다 멀리 떨어진 문맥은 신경쓰지 않는 다는 뜻이다. N 을 5 나 7 로 늘리면 어떨까. 늘릴수록 학습 데이터에서 그 조합이 한 번도 등장하지 않은 케이스가 많아진다. 카운트가 0 이 되면 확률도 0 이다. 학습 데이터에 없는 문장은 제대로 처리하기 어렵다.
스무딩 기법(Kneser-Ney 등)으로 보정하지만, 본질적 한계는 그대로 남는다. 멀리 떨어진 단어 사이의 의존성을 포착하지 못하는 단점이 있다.
어텐션(attention)이 바꾼 게임
2017 년 트랜스포머가 등장하면서 언어 모델의 접근 방식이 크게 달라졌다. 어텐션은 문장 전체에서 어떤 단어가 어떤 단어를 봐야 할지 학습으로 정한다. 기존의 고정된 마르코프 가정에서 벗어난 것이다. 길이 한계가 완전히 사라진 건 아니지만, “N-1 개”라는 N-gram의 한계는 해소 되었다.
대규모 데이터셋에서 트랜스포머가 N-gram을 압도하는 건 당연한 결과다. 다만 작은 데이터셋에서는 여전히 Add-lambda 같은 고전 N-gram 추정 기법이 트랜스포머보다 우월하다는 EMNLP 2024 연구도 있다. (출처)
트랜스포머 안에 N-gram이 있다
트랜스포머가 N-gram 언어 모델을 정확히 표현할 수 있다는 사실도 수학적으로 증명됐다. 흥미로운 결과다. 즉 트랜스포머는 N-gram 을 포함하는 더 강한 모델이다. (출처)
N-gram 은 사라진 기술이 아니라 현대 언어 모델의 기반 개념으로 이어지고 있다.
LLM 시대에도 쓰이는 N-gram

검색 자동완성
ElasticSearch 의 자동완성은 지금도 Edge N-gram 필터로 구현한다. “클로”까지만 쳐도 “클로드”가 추천되는 자동완성 기능이 Edge N-gram 기반으로 동작한다.
MySQL InnoDB 의 전문 검색 인덱스도 N-gram 파서를 쓴다. 한국어·일본어·중국어처럼 단어 경계가 불분명한 언어에서 문자 단위 N-gram 으로 토큰을 만든다. (출처)
평가 지표 BLEU
기계 번역의 표준 평가 지표 BLEU 가 N-gram 기반이다. 모델이 생성한 문장과 정답 사이의 N-gram 겹침 비율을 계산한다. LLM 시대에도 BLEU 는 대표적인 번역 성능 평가 지표로 계속 사용되고 있다.
베이스라인과 해석
큰 모델을 평가할 때 가장 단순한 비교 기준이 N-gram 이다. 새 모델이 기본적인 N-gram 기준보다 성능이 낮다면 실용성이 부족하다고 판단하기도 한다. 트랜스포머의 학습 결과를 해석하는 실험에서도 N-gram 이 기준점으로 쓰인다.
2020년, 처음 N-gram 을 만난 기억
2020년에 N-gram 을 처음 만났을 때 인상적이었던 건 단순함이었다. 별도의 신경망 학습 없이 단어 빈도만 계산하면 모델이 완성됐다. GPU도 긴 학습 시간도 필요 없었다.
한계도 곧 느껴졌다. 트라이그램은 학습 말뭉치에 자주 같이 등장한 단어를 반복적으로 선택하는 경향이 있다. 문맥이 살짝만 달라져도 같은 답이 나온다. 당시 직접 실습해 보면서 왜 트랜스포머 같은 구조가 필요했는지를 자연스럽게 이해할 수 있었다.
LLM 시대에도 N-gram 은 여전히 남아 있다
N-gram은 오래된 기술이지만, 오늘날 LLM을 이해하기 위해 여전히 가장 먼저 알아야 할 언어 모델이다. 검색 자동완성, BLEU, 베이스라인까지 LLM 시대에도 빠지지 않고 등장한다.
자연어 처리를 처음 공부한다면 한 번은 직접 코드로 짜 보면 좋다. 단순한 확률 계산만으로 모델이 동작하는 구조를 직접 경험해 보면, 이후 다른 언어 모델을 이해할 때도 좋은 기준이 된다.