언어 모델의 가장 기본적인 형태는 단어 시퀀스 $[x_1,x_2,...x_{t-1}]$ 이 주어졌을 때 다음 단어 $x_t$ 가 등장할 확률을 계산하는 것을 기반으로 동작한다. 즉, 문장의 일부가 주어졌을 때 나머지 부분을 유추하는 것이다.

N-gram 은 연속된 n 개의 단어들의 모임을 의미한다.
I cannot wait to study
1-gram (unigram) >>> I, cannot, wait, to, study
2-gram (bigram) >>> I cannot, cannot wait, wait to, to study
N-gram Language Modeling 의 목표는 가능한 모든 N-gram 에 대해 통계적으로 얼마나 자주 나타나는지를 수집하고, 이를 이용해 다음 단어를 예측하는 것이다.
$$ P(w∣\text{I cannot wait to study})=\frac{count(\text{I cannot wait to study } w)}{count(\text{I cannot wait to study})} $$
N-gram 방식은 하나의 단어를 예측할 때 이전 N-1 개의 단어를 사용하는데, N 이 커질수록 가능한 단어 조합 수가 기하급수적으로 늘어난다. 그러나 대부분의 조합은 학습 데이터에 실제 등장하지 않는다. 조합은 수천, 수백만 개인데, 실제로 관측되는 N-gram 은 몇 개 되지 않아 데이터의 sparsity 문제가 발생한다.
이를 해결하기 위해 NN 이 도입된 Neural Language Model 이 등장했다. Neural Language Model은 각 단어를 고정된 벡터(embedding) 로 바꾸고 이 벡터들을 입력으로 받아 다음 단어 분포를 출력하는 NN 을 학습한다. 이렇게 하면 관측되지 않은 단어 조합도 일반화할 수 있다.

이 구조가 고정된 길이 n 의 벡터를 이용해 다음 단어를 예측하는 신경망 기반 언어 모델인 Fixed-Window Neural Language Model 이다.
하지만 위와 같은 방식에도 단점이 있는데, 입력 단어 수가 많아지면 각 단어마다 embedding 과 연결된 weight 들로 인해 파라미터 수가 급격하게 증가한다는 것이다. 또한 입력 시퀀스의 길이가 가변적인 NLP 에서 MLP 의 사용은 적합하지 않다는 문제도 있다.
이를 개선하기 위해 같은 weight 들을 반복해서 사용하는 RNN 이 탄생했다. 하나의 가중치 행렬을 두고, input length 만큼 반복해 사용하는 것이다.

$W_X$ : Input vector (One-hot encoded)
$W_H$ : Hidden state vector (activations)