Pytorch로 시작하는 딥러닝 입문(10-03. N-gram 언어모델)

2024. 4. 6. 08:34딥러닝 모델: 파이토치

n-gram 언어 모델은 여전히 카운트에 기반한 통계적 접근을 사용하고 있으므로 SLM의 일종이다. 

다만 앞서 배운 언어 모델과는 달리 이전에 등장한 모든 단어를 고려하는 것이 아니라 일부 단어만 고려하는 접근 방법을 사용한다. 이때 일부 단어를 몇 개 보느냐를 결정하는데, 이것이 n-gram에서의 n이 가지는 의미이다. 

 

♣ 코퍼스에서 카운트하지 못하는 경우의 감소

SLM의 한계는 훈련 코퍼스에 확률을 계산하고 싶은 문장이나 단어가 없을 수 있다는 점이다. 확률을 계산하고 싶은 문장이 길어질수록 가지고 있는 코퍼스에서 그 문장이 존재하지 않을 가능성이 높다. 하지만 다음과 같이 참고하는 단어들을 줄이면 카운트할 가능성을 높일 수 있다. 

 

 

가령 'An adorable little boy가 나왔을 때 is가 나올 확률'을  'boy가 나왔을 때 is가 나올 확률'로 생각하는 것이다. 

가지고 있는 코퍼스에서 An adorable little boy is가 있을 확률보다 boy is 라는 짧은 단어 시퀀스가 존재할 확률이 더 높다. 

 

아니면 'little boy가 나왔을 때 is가 나올 확률'로 생각하는 것도 대안이다. 

 

즉 An adorable little boy가 나왔을 때 is가 나올 확률을 구하기 위해 이전에는 An adorable little boy가 나온 횟수가 An adorable little boy is 가 나온 횟수를 카운트해야 했지만, 이제는 앞 단어 중 임의의 개수만 포함해서 카운트하는 것이다. 이렇게 하면 갖고 있는 코퍼스에서 해당 단어의 시퀀스를 카운트할 확률이 높아진다. 

 

 

♣ N-gram

위와 같은 경우, 임의의 개수를 정하기 위한 기준을 위해 사용하는 것이 n-gram이다. n-gram은 n개의 연속적인 단어 나열을 의미한다. 코퍼스에서 n개의 단어 뭉치 단위로 끊어서 이를 하나의 토큰으로 간주한다. 

 

An adorable little boy is spreading smiles 라는 문장에서 각 n에 대해 n-gram을 구하면 다음과 같다. 

 

n이 1일 때는 유니그램, 2일 때를 바이그램, 3일 때는 트라이그램이라고 명명하고 n이 4 이상일 때는 gram 앞에 숫자 그대로를 붙여서 명명한다. 

 

n-gram을 사용한 언어 모델에서는 다음에 나올 단어의 예측은 오직 n-1개의 단어에만 의존한다. 예를 들어 'An adorable little boy is spreading' 다음에 나올 단어를 예측할 때, n=4 인 언어 모델을 사용한다고 해보자. 

이 경우, 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가 더 맞다고 판단하게 된다. 

 

♣ N-gram Langauge Model의 한계

앞서 본 4-gram 언어 모델은 주어진 문장에서 앞에 있던 단어인 '작고 사랑스러운(an adorable little)'이라는 수식어를 제거하고, 반영하지 않았다. 그런데 '작고 사랑스러운' 수식어까지 모두 고려하여 작고 사랑스러운 소년 '모욕을 퍼트렸다'라는 부정적인 내용이 '웃음지었다'라는 긍정적인 내용 대신 선택된 것에 의문이 남는다. 전혀 말이 안 되는 문장은 아니지만 n-gram은 앞의 단어 몇 개만 보다 보니 의도하고 싶은 대로 문장을 끝맺음하지 못하는 경우가 생긴다. 문장을 읽다 보면 앞 부분과 뒷부분의 문맥이 전혀 연결 안 되는 경우도 생길 수 있다. 결론적으로, 전체 문장을 고려한 언어 모델보다는 정확도가 떨어질 수밖에 없다. 이를 토대로 n-gram 모델에 대한 한계점을 정리해보자.

 

1. 희소 문제(Sparsity Problem)

문장에 존재하는 앞에 나온 단어를 모두 고려하는 것보다 일부 단어를 고려하는 것으로 코퍼스에서 카운트하는 확률을 높일 수 있었지만 n-gram 언어 모델도 여전히 희소 문제가 존재한다. 

 

 

2. n을 선택하는 것은 trade-off 문제

 

앞에서 몇 개의 단어를 볼 지 n을 정하는 것은 trade-off가 존재한다. n을 1보다는 2로 선택하는 것이 대부분의 경우에서 언어 모델의 성능을 높일 수 있다. 가령 spreading보다 is spreading을 보고 다음 단어를 예측하는 것이 더 정확하다. 훈련 데이터가 적절하다면 언어 모델이 적어도 spreading 다음에 동사를 고르지 않을 것이다. 

 

n을 크게 선택하면 실제 훈련 코퍼스에서 해당 n-gram을 카운트할 수 있는 확률이 적어지므로 희소 문제는 점점 심각해진다. 또한 n이 커질수록 모델 사이즈가 커진다는 문제도 있다. 

 

n을 작게 선택하면 코퍼스에서 카운트는 잘 되겠지만 정확도가 현실의 확률분포와 멀어진다. 그렇기 때문에 적절한 n을 선택해야 한다. 정확도를 높이려면 n은 최대 5개를 넘게 잡아서는 안 된다고 권장한다. 

 

n이 성능에 영향을 주는 것을 확인할 수 있는 유명한 예제 하나를 살펴보자. 스탠퍼드 대학교의 공유 자료에 따르면 월 스트리트 저널에서 3,800만 개의 단어 토큰에 대해 n-gram 언어 모델을 학습하고, 1,500만 개의 테스트 데이터에 대해서 테스트를 했을 때 다음과 같은 성능이 나왔다고 한다. perplexity는 수치가 낮을수록 좋은 성능을 나타낸다. 

 

위의 결과는 n을 1에서 2, 2에서 3으로 올림에 따라 성능이 올라가는 것을 보여준다. 

 

 

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

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

 

이러한 점이 언어 모델의 약점이 될 수도 있는데, 훈련에 사용된 코퍼스가 무엇이냐에 따라 성능이 비약적으로 달라지기 때문이다. 

 

 

♣ 인공 신경망을 이용한 언어 모델(Neural Network Based Language Model)

 여기서는 다루지 않지만 N-gram 언어 모델의 한계를 극복하기 위해 분모, 분자에 숫자를 더해서 카운트했을 때 0이 되는 것을 방지하는 등의 여러 일반화 방법이 존재한다. 하지만  n-gram 언어 모델의 본질적인 취약점을 완전히 해결하지 못했고, 대안으로 N-gram 언어 모델보다 대체적으로 성능이 우수한 인공 신경망을 이용한 언어 모델이 많이 사용되고 있다.