본문 바로가기

개발/NLP

NLP Load : 맨땅에 헤딩하는 NLP 공부일지 (15)

Ⅰ. Language Model

언어모델(LM)은 언어라는 현상을 모델링하고자 단어 시퀀스(문장)에 확률을 할당(assign)하는 모델이다.
언어모델을 만드는 방법은 크게 통계를 이용한 방법인공 신경망을 이용한 방법으로 구분할 수 있다.

1. 언어 모델 (Language Model)

언어 모델은 단어 시퀀스에 확률을 할당(assign)하는 일을 하는 모델이다.
풀어서 얘기하면 가장 자연스러운 단어 시퀀스를 찾아내는 모델인 것이다. 단어 시퀀스에 확률을 할당하게 하기 위해서 가장 보편적으로 사용되는 방법은 언어모델이 이전 단어들이 주어졌을 때 다음 단어를 예측하도록 하는 것이다.

다른 유형의 언어모델로는 주어진 양쪽의 단어들로부터 가운데 비어있는 단어를 예측하는 언어 모델이 있다. 이는 문장의 가운데에 있는 단어를 비워놓고 양쪽의 문맥을 통해서 빈 칸의 단어인지 맞추는 고등학교 수험 시험의 빈칸 추론 문제와 비슷하다. 추후 BERT쪽에 관해서 다루게 될 것같다.

언어 모델링(Language Modeling)은 주어진 단어들로부터 아직 모르는 단어를 예측하는 작업을 말한다.
즉, 언어모델이 이전 단어들로부터 다음 단어를 예측하는 일은 언어 모델링이다.

2. 단어 시퀀스의 확률 할당

NLP에서 단어 시퀀스에 확률을 할당하는 일이 왜 필요한지 알아보자.

a. 기계 번역 (Machine Translation:MT)

P(나는 버스를 탔다) > P(나는 버스를 태운다)

→ 언어 모델은 두 문장을 비교하여 좌측의 문장의 확률이 더 높다고 판단한다.

b. 오타 교정 (Spell Correction)

선생님이 교실로 부리나케 ______
P(달려갔다) > P(잘려갔다)

→ 언어 모델은 두 문장을 비교하여 좌측의 문장의 확률이 더 높다고 판단한다.

c. 음성 인식 (Speech Recognition)

P(나는 메롱을 먹는다) < P(나는 메론을 먹는다)

→ 언어 모델은 두 문장을 비교하여 우측의 문장의 확률이 더 높다고 판단한다.

언어 모델은 위와 같이 확률을 통해 보다 적절한 문장을 판단한다.

3. 주어진 이전 단어들로부터 다음단어 예측하기

언어 모델은 단어 시퀀스에 확률을 할당하는 모델이다. 그리고 단어 시퀀스에 확률을 할당하기 위해서 가장 보편적으로 사용하는 방법은 이전 단어들이 주어졌을 때, 다음 단어를 예측하도록 하는 것을 말한다. 이를 위해 사용되는것은 조건부 확률이다.

a. 단어 시퀀스의 확률

하나의 단어를 $w$, 단어 시퀀스를 대문자 $W$라고 한다면, $n$개의 단어가 등장하는 단어 시퀀스 $W$의 확률은 아래와 같다.

$$ P(W) = P(w_1, w_2, w_3, \cdots, w_n) $$

b. 다음 단어 등장 확률

다음 단어 등장확률을 식으로 표현해보자. $n-1$개의 단어가 나열된 상태에서 $n$번째 단어의 확률은 아래와 같다.

$$ P(w_n|w_1,\cdots,w_{n-1}) $$

|의 기호는 조건부 확률(conditional probability)을 의미한다.

예를들어보자. 다섯번째 단어의 확률은 아래와 같다.

$$ P(w_5|w_1,w_2,w_3,w_4) $$

전체 단어 시퀀스 $W$의 확률은 모든 단어가 예측되고 나서야 알 수 있으므로 단어 시퀀스의 확률은 다음과 같다.

$$ P(W) = P(w_1,w_2,w_3,w_4,w_5,\cdots,w_n)=\prod_{i=1}^nP(w_i|w_1,\cdots,w_{i-1}) $$

4. 언어 모델의 간단한 직관

'비행기를 타려고 공항에 갔는데 지각을 하는 바람에 비행기를 [?]' 라는 문장이 있다.

‘비행기를’ 다음에 어떤 단어가 오게 될지 사람은 쉽게 ‘놓쳤다’라고 예상할 수 있다.

우리 지식에 기반하여 나올 수 있는 여러 단어들을 후보에 놓고 놓쳤다는 단어가 나올 확률이 가장 높다고 판단한 것이기 때문이다.

그렇다면 기계에게 위 문장을 주고, ‘비행기를’ 다음에 나올 단어를 예측해보라고 한다면 과연 어떻게 최대한 정확히 예측할 수 있을까?
기계도 비슷하다. 앞에 어떤 단어들이 나왔는지 고려하여 후보가 될 수 있는 여러 단어들에 대해서 확률을 예측해보고 가장 높은 확률을 가진 단어를 선택한다. 앞에 어떤 단어들이 나왔는지 고려하여 후보가 될 수 있는 여러 단어들에 대해서 등장 확률을 추정하고 가장 높은 확률을 가진 단어를 선택한다.

Ⅱ. 통계적 언어 모델 (Statistical Language Model)

언어 모델의 전통적인 접근 방법인 통계적 언어 모델을 소개한다.

통계적 언어 모델이 통게적인 접근 방법으로 어떻게 언어를 모델링 하는지 배워보자.

통계적 언어 모델(Statistical Language Model)은 줄여서 SLM이라고도 한다.

1. 조건부 확률

조건부 확률은 두 확률 $P(A),\;P(B)$에 대해서 아래와 같은 관계를 갖는다.

$$ P(B|A) = \frac{P(A,B)}{P(A)}\\P(A,B) = \frac{P(A)}{P(B|A)} $$

더 많은 확률에 대해 일반화해보자. 4개의 확률이 조건부 확률의 관계를 가질 때, 아래와 같이 표현할 수 있다.

$$ P(A,B,C,D) = P(A)P(B|A)P(C|A,B)P(D|A,B,C) $$

이를 조건부 확률의 연쇄 법칙(chain rule)이라고 한다. 4개가 아닌 $n$개에 대해 일반화를 해보자.

$$ P(x_1,x_2,\cdots,x_n)=P(x_1)P(x_2|x_1)P(x_3|x_1,x_2)\cdots P(x_n|x_1\cdots x_{n-1}) $$

조건부 확률에 대한 정의를 통해 문장의 확률을 구해보자.

2. 문장에 대한 확률

문장 ‘I am a boy’의 확률 $P(I\;am\;a\;boy)$를 식으로 표현해보자.

각 단어는 문맥이라는 관계로 인해 이전 단어의 영향을 받아 나온 단어이다. 모든 단어로부터 하나의 문장이 완성된다. 그렇기 때문에 문장의 확률을 구하고자 조건부확률을 사용하는 것이다. 앞서 언급한 조건부 확률의 일바화 식을 문장의 확률 관점에서 다시 적어보면 문장의 확률은 각 단어들이 이전 단어가 주어졌을 때 다음 단어로 등장할 확률의 곱으로 구성된다.

$$ P(w_1,w_2,w_3,\cdots,w_n) = \prod_{n=1}^nP(w_n|w_1,\cdots,w_{n-1}) $$

즉, 위 문장을 가지고 식을 적용하면 아래와 같다.

$$ P(I\;am\;a\;boy)=P(I)\times P(am|I)\times P(a|I\;am)\times P(boy|I\;am\;a) $$

3. 카운트 기반의 접근

문장의 확률을 구하기 위해 다음 단어에 대한 예측 확률을 모두 곱하는것은 필요하다.

그렇다면 SLM은 이전 단어로부터 다음 단어에 대한 확률을 어떻게 구할까? 카운트에 기반하여 확률을 계산하게 된다.

‘I am a ’가 나왔을 때, ‘boy’가 나올 확률인 $P(boy|I\;am\;a)$를 구해보자.

$$ P(boy|I\;am\;a)=\frac{count(I\;am\;a\;boy)}{count(I\;am\;a)} $$

위와 같이 표현할 수 있다.

4. 카운트 기반 접근의 한계 - 희소 문제(Sparsity Problem)

언어 모델은 실생활에서 사용되는 언어의 확률 분포를 근사 모델링 한다.

실제로 정확하게 알아볼 방법은 없겠지만 이제까지 다룬 예제와 같이 특정 단어 이후 타겟단어가 나올 확률이 존재한다는 것이다.
이를 실제 자연어의 확률 분포, 현실에서의 확률분포라고 하자. 언어모델의 궁극적인 목표는 현실에서의 확률 분포를 근사하는 것이다.
이를 카운트 기반으로 접근하려고 하면 가지고 있는 코퍼스(corpus). 즉, 다시말해 기계가 훈련하는 데이터는 정말 방대한 양이 필요하게 된다.

$$ P(boy|I\;am\;a)=\frac{count(I\;am\;a\;boy)}{count(I\;am\;a)} $$

위의 수식이 나타내는 바와 같은 경우 훈련한 코퍼스에 ‘I am a’라는 단어 시퀀스가 없었다면 이 단어 시퀀스에 대한 확률은 0이 된다. 혹은 ‘I am a boy’라는 단어 시퀀스가 없다면 분모가 0이 되어 확률이 정의가 되지 않는다. 이처럼 충분한 데이터를 관측하지 못하여 언어를 정확히 모델링하지 못하는 문제를 희소 문제(Sparsity Problem)라고 한다.

Ⅲ. N-Gram Language Model

N-Gram 언어 모델은 여전히 카운트에 기반한 통계적 접근을 사용하고 있다.

단, 모든 단어를 고려하는 것이 아닌 일부 단어만 고려한다. 이때 몇개의 단어를 보느냐에 따라 n이 결정된다. SLM(Statical Language Model)의 한계는 훈련 코퍼스에 계산하고 싶은 문장이나 단어가 없을 수 있다는 점이다. 확률을 계산하고 싶은 문장이 길어질수록 갖고있는 코퍼스에서 그 문장이 존재하지 않을 가능성이 높다. 즉, 카운트 할 수 없을 가능성이 높다는 말이다. 그런데 아래와 같이 참고하는 단어들을 줄이면 카운트를 할 수 있을 가능성을 높일 수 있다.

$$ P(is|An\;adorable\;little\;boy) \approx P(is|boy) $$

가령, ‘An adorable little boy’가 나왔을 때 ‘is’가 나올 확률을 그냥 ‘boy’가 나왔을 때 ‘is’가 나올 확률로 생각해보는건 어떨까요? 갖고있는 코퍼스에 ‘An Adorable little boy’가 있을 가능성보다는 ‘boy is’라는 더 짧은 단어 시퀀스가 존재할 가능성이 더 높다.

즉, 단어의 확률을 구하고자 기준 단어의 앞 단어를 전부 포함해서 카운트하는 것이 아니라, 앞 단어 중 임의의 개수만 포함해서 카운트하여 근사하자는 것이다. 갖고 있는 코퍼스에서 해당 단어의 시퀀스를 카운트할 확률이 높아진다.

1. N-gram

이때 임의의 개수를 정하기 위한 기준을 위해 사용하는 것이 n-gram이다. n-gram은 n개의 연속적인 단어 나열을 의미한다. 갖고 있는 코퍼스에서 n개의 단어 뭉치 단위로 끊어서 이를 하나의 토큰으로 간주한다. 예를 들어 문장 ‘An adorable little boy is spreading smiles’가 있을 때, 각 n에 대해 n-gram을 전부 구해보면 다음과 같다.

  • unigrams : an, adorable, little, boy, is, spreading, smiles
  • bigrams : an adorable, adorable little, little boy, boy is, is spreading, spreading smiles
  • trigrams : an adorable little, adorable little boy, little boy is, boy is spreading, is spreading smiles
  • 4grams : an adorable little boy, adorable little boy is, little boy is spreading, boy is spreading smiles

n-gram을 통한 언어 모델에서는 다음에 나올 단어의 예측은 오직 n-1개의 단어에만 의존한다. 예를 들어 'An adorable little boy is spreading' 다음에 나올 단어를 예측하고 싶다고 할 때, n=4라고 한 4-gram을 이용한 언어 모델을 사용한다고 해보자. 이 경우, spreading 다음에 올 단어를 예측하는 것은 n-1에 해당되는 앞의 3개의 단어만을 고려한다.

$$ P(w|boy\;is\;spreading)=\frac{count(boy\;is\;spreading\;w)}{count(boy\;is\;spreading)} $$

만약 갖고있는 코퍼스에서 boy is spreading가 1,000번 등장했다고 해보자. 그리고 boy is spreading insults가 500번 등장했으며, boy is spreading smiles가 200번 등장했다고 하자. 그렇게 되면 boy is spreading 다음에 insults가 등장할 확률은 50%이며, smiles가 등장할 확률은 20%이다. 확률적 선택에 따라 우리는 insults가 더 맞다고 판단하게 된다.

$$ P(insults|boy\;is\;spreading) = 0.500\\P(smiles|boy\;is\;spreading)=0.200 $$

2. N-gram의 한계

앞서 4-gram을 통한 언어 모델의 동작 방식을 확인했다. 앞서 본 4-gram 언어 모델은 주어진 문장에서 앞에 있던 단어인 '작고 사랑스러운(an adorable little)'이라는 수식어를 제거하고, 반영하지 않았습니다. 그런데 '작고 사랑스러운' 수식어까지 모두 고려하여 작고 사랑하는 소년이 하는 행동에 대해 다음 단어를 예측하는 언어 모델이었다면 과연 '작고 사랑스러운 소년이' '모욕을 퍼트렸다'라는 부정적인 내용이 '웃음 지었다'라는 긍정적인 내용 대신 선택되었을까요?

물론 코퍼스 데이터를 어떻게 가정하느냐의 나름이고, 전혀 말이 안 되는 문장은 아니지만 여기서 지적하고 싶은 것은 n-gram은 앞의 단어 몇 개만 보다 보니 의도하고 싶은 대로 문장을 끝맺음하지 못하는 경우가 생긴다는 점이다. 문장을 읽다 보면 앞 부분과 뒷부분의 문맥이 전혀 연결 안 되는 경우도 생길 수 있기 때문이다. 결론만 말하면, 전체 문장을 고려한 언어 모델보다는 정확도가 떨어질 수밖에 없는 것이다. 자세한 내용은 아래와 같다.

  • 희소 문제 (Sparsity Problem)
    • 문장에 존재하는 앞에 나온 단어를 모두 보는 것보다 일부 단어만을 보는 것으로 현실적으로 코퍼스에서 카운트 할 수 있는 확률을 높일 수는 있었지만, n-gram 언어 모델도 여전히 n-gram에 대한 희소 문제가 존재한다.
  • n을 선택하는 것은 trade-off 문제
    • n을 크게 선택하면 실제 훈련 코퍼스에서 해당 n-gram을 카운트할 수 있는 확률은 적어지므로 희소 문제는 점점 심각해진다. 또한 n이 커질수록 모델 사이즈가 커진다는 문제점도 있다.
    • n을 작게 선택하면 훈련 코퍼스에서 카운트는 잘 되겠지만 근사의 정확도는 현실의 확률분포와 멀어진다. 그렇기 때문에 적절한 n을 선택해야 하고 앞서 언급한 trade-off 문제로 인해 정확도를 높이려면 n은 최대 5를 넘게 잡아서는 안 된다고 권장되고 있습니다.

3. 적용 분야(Domain)에 맞는 코퍼스의 수집

어떤 분야인지, 어떤 어플리케이션인지에 따라서 특정 단어들의 확률 분포는 당연히 다르다. 가령, 마케팅 분야에서는 마케팅 단어가 빈번하게 등장할 것이고, 의료 분야에서는 의료 관련 단어가 당연히 빈번하게 등장한다. 언어 모델에 사용하는 코퍼스를 해당 도메인의 코퍼스를 사용한다면 당연히 언어 모델이 제대로 된 언어 생성을 할 가능성이 높아진다.