N-gram
- 간단히 생각해보면, N-gram 모델은 Markov을 가정하는 거와 마찬가지다.
- 즉 N-gram은 n-1개 이전 단어를 가지고 다음 단어를 예측하는 것이므로, 이는 n-1개의 이전 단어만을 이용해서 알 수 있다는 가정이 필요하기 때문이다.
- 즉 N개의 단어를 끈어서 살펴본다는 것이 전부이고, 예측하는 방식은 주어진 corpus 전체에서 counting하는 식으로 진행을 하는 것이다.
밑의 정리가 잘된 자료를 참고해보자.
3) N-gram Language Model
1. 코퍼스에서 카운트하지 못하는 경우를 좀 줄여보자.
앞서 언급했듯이, 갖고있는 코퍼스에서 확률을 계산하고 싶은 문장이 없을 수 있습니다. 그런데 확률을 계산하고 싶은 문장이 길어질수록, 갖고있는 코퍼스에서 그 문장이 존재하지 않을 가능성이 높고, 카운트할 수 없을 가능성이 높습니다. 그런데 마르코프의 가정을 사용하면 카운트를 할 수 있을 가능성이 높아집니다.
가령, An adorable little boy가 나왔을 때 is가 나올 확률을 그냥 boy가 나왔을 때 is가 나올 확률로 생각하면 어떨까요? 우리가 갖고있는 코퍼스에 An adorable little boy is가 있을 가능성 보다는, boy is라는 더 짧은 워드 시퀀스(word sequence)가 있을 가능성이 더 높지 않을까요?
조금 지나친 일반화로 느껴진다면,

little boy가 나왔을 때 is가 나올 확률로 생각하는 것은 어떨까요?

little boy가 나왔을 때 is가 나올 확률로 생각하는 것은 어떨까요?
즉, 앞에서는 An adorable little boy가 나왔을 때 is가 나올 확률을 구하기 위해서는 An adorable little boy가 나온 횟수와, An adorable little boy is가 나온 횟수를 카운트해야만 했지만, 이제는 단어의 확률을 구하고자, 기준 단어의 앞 단어를 전부 포함해서 세지말고, 앞 단어 중 임의의 개수만 포함해서 세보자는 것입니다. 그러면, 갖고있는 코퍼스에서도 해당 단어의 나열을 카운트할 확률이 높아집니다.
2. 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
4-grams : an adorable little boy, adorable little boy is, little boy is spreading, 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
4-grams : an adorable little boy, adorable little boy is, little boy is spreading, boy is spreading smiles
n-gram을 사용할 때는 n이 1일 때는 유니그램(unigram), 2일 때는 바이그램(bigram), 3일 때는 트라이그램(trigram)이라고 명명하고, n이 4 이상일 때는 gram 앞에 그대로 숫자를 붙여서 명명합니다. 이제 n-gram을 이용한 언어 모델을 설계해보도록 하겠습니다.
n-gram을 통한 언어 모델에서는 다음에 나올 단어의 예측은 오직 n-1개의 단어에만 의존합니다. 예를 들어 'An adorable little boy is spreading' 다음에 나올 단어를 예측하고 싶다고 할 때, n=4라고 한 4-gram을 이용한 언어 모델을 사용한다고 합시다. 이 경우, spreading 다음에 올 단어를 예측하는 것은 n-1에 해당되는 앞의 3개의 단어만을 고려합니다.
만약 갖고있는 코퍼스에서 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
P(smiles|boy is spreading) = 0.200
3. N-gram Language Model의 한계
앞서 4-gram을 통한 언어 모델의 동작 방식을 확인했습니다. 그런데 조금 의문이 남습니다. 앞서 본 4-gram 언어 모델은 주어진 문장에서 앞에 있던 단어인 '작고 사랑스러운(an adorable little)'이라는 수식어를 제거하고, 반영하지 않았습니다. 그런데 '작고 사랑스러운'수식어까지 모두 고려하여 작고 사랑하는 소년이 하는 행동에 대해 다음 단어를 예측하는 언어 모델이었다면 과연 '작고 사랑스러운 소년이' '모욕을 퍼트렸다'라는 부정적인 내용이 '웃음지었다'라는 긍정적인 내용 대신 선택되었을까요?
물론 코퍼스 데이터를 어떻게 가정하느냐의 나름이고, 전혀 말이 안 되는 문장은 아니지만 여기서 지적하고 싶은 것은 n-gram은 뒤의 단어 몇 개만보다보니 의도하고 싶은 대로 문장을 끝맺음하지 못하는 경우가 생긴다는 점입니다. 문장을 읽다보면 앞 부분과 뒷 부분의 문맥이 전혀 연결 안 되는 경우도 생길 수 있습니다. 결론만 말하자면, 전체 문장을 고려한 언어 모델보다는 정확도가 떨어질 수 밖에 없습니다. 이를 토대로 n-gram 모델에 대한 한계점을 정리해보겠습니다.
(1) n을 선택하는 것은 trade-off 문제입니다.
앞에서 몇 개의 단어를 볼 지 임의의 개수를 정하는 것은 trade-off가 존재합니다. 임의의 개수인 n을 적당히 크게 잡는다면? 정확도가 높아질 수 있습니다. 가령, spreading만 보는 것보다는 is spreading을 보는 것이 더 정확할 것입니다. 적어도 spreading이 명사가 아니란 사실을 언어 모델이 알고있는 셈이기 때문에 spreading 뒤에 동사가 오진 않을 것입니다. 하지만 n을 높이면 높일수록 실제 훈련 코퍼스에서 해당 데이터를 카운트할 수 있는 확률은 적어집니다. 뿐만 아니라 n을 크게 잡을 수록, 모델 사이즈는 굉장히 커질 수 밖에 없습니다. 기본적으로 이 모델이 작동되려면, 코퍼스의 모든 n-gram에 대해서 카운트를 해야하기 때문입니다.
임의의 개수인 n을 작게 잡는다면? 훈련 코퍼스에서 카운트는 잘 되겠지만 근사의 정확도는 점점 실제의 확률분포와 멀어집니다. 그렇기 때문에 적절한 개수를 선택해야합니다. 앞서 언급한 trade-off 문제로 인해 정확도를 높이려면 n은 최대 5를 넘게 잡아서는 안 된다고 권장되고 있습니다.
(2) 카운트 했을 때 0이 되는 문제(zero count problem)
다음 단어를 예측하기 위해 문장에 존재하는 앞에 나온 단어를 모두 보는 것은 현실적으로 코퍼스에서 카운트 할 수 있는 확률이 적기 때문에, n-gram 언어 모델을 사용한다고 했습니다. 하지만 n-gram 언어 모델도 카운트를 할 수 있는 확률을 조금 높여줄 뿐이지 여전히 카운트가 되지 않을 가능성이 존재합니다.
여기서는 다루지 않겠지만, 이를 위해 N-gram Language Model에서 분모, 분자에 숫자를 더해서 카운트했을 때 0이 되는 것을 방지하는 등의 여러 일반화(generalization) 방법들이 존재합니다. 하지만 그럼에도 본질적으로 n-gram 언어 모델에 대한 취약점을 완전히 해결하지는 못하기 때문에, 이를 위한 대안으로 딥 러닝을 이용한 언어 모델이 사용되고 있습니다.
4. 적용 분야(Domain)에 맞는 코퍼스의 수집
어떤 분야인지, 어떤 어플리케이션인지에 따라서 특정 단어들의 확률 분포는 당연히 다릅니다. 가령, 마케팅 분야에서는 마케팅 단어가 빈번하게 등장할 것이고, 의료 분야에서는 의료 관련 단어가 당연히 빈번하게 등장합니다. 이 경우 언어 모델에 사용하는 코퍼스를 해당 도메인의 코퍼스를 사용한다면 당연히 언어 모델이 제대로 된 언어 생성을 할 가능성이 높아집니다.
때로는 이를 언어모델의 약점이라고 하는 경우도 있는데, 훈련에 사용된 도메인 코퍼스가 무엇이냐에 따라서 성능이 비약적으로 달라지기 때문입니다.
- 자료 출처: https://wikidocs.net/21692
댓글
댓글 쓰기