학습목표
신경망 이전에 사용했던 언어 모델인 n-gram 언어 모델을 학습하고, 어떤 문제점이 있는지 살펴봅니다.
핵심키워드
- n-gram Language Model
- 최대우도추정(Maximum Likelihood Estimation)
- 데이터 희소성(Data Sparsity)
- 장기의존성(Long-Term Dependencies)
학습하기
자 앞에서, Language modeling이 결국 스코어링의 개념이란는 걸 알았는데요. 그럼 정확히 어떻게 스코어링을 하는가에 대해서 알아야겠죠? 그리고 그걸위해서는, 딥러닝이 있기 이전에 어떤 방법론을 사용했었는지 파악할 필요가 있습니다. 이걸 알고나면, 왜 딥러닝을 쓰고싶어지는지 알 수 있습니다.
33년 전, IBM에서 Speech recognition을 건들기 시작하면서 했던 이야기는, Speech recognition만 해서는 될 게 아니라, Language model이 반드시 필요하다는 것이었습니다. Speech recognition이 잘되는게 사실 좀 어려웠으니까, Speech recognition model이 어떤 가능한 경우의 수를 뽑아주면, Language model을 통해서 가장 좋은 문장을 뽑아내겠다. 머신 번역도 똑같습니다. 단순한 머신 번역 모델을 잘 만들기는 어렵지만, 가장 말이 되는 문장을 뽑아서 보여주면 굉장한 효과가 있겠죠. 쨋든 그 당시에는 뭐 GPU도 없고 데이터도 없고 해서 이걸 NN을 안쓰고 어떻게든 해내야했는데, 그렇게 최대 우도 추정같은게 나왔구요. 또 컨디셔널들 각각을 계산해야되는데, 이걸 N-gram prob라고 합니다.
최대 우도 추정이 이런 계열에서 가장 간단하면서, 가장 널리 쓰이는 방식입니다. 간단하게 예를 들자면, 동전 던지기를 하는거에요. 그런데 동전이 좀 삐뚤어져있단 말이에요. 이걸 던졌을때 앞면일지 뒷면일지 알고싶으면 어떻게 할까요. 한 만 번 던져본 다음에, 몇 번 앞면이 나오는지 세리고, 그거 나누기 만 번 하면, 확률이 나오는 거죠. 이게 많은 데이터를 필요로 하는, 머신러닝에서는 굉장히 효과적이겠죠. 지금은 자연어를 보고 있으니까 예를 들자면, 위키피디아, 뉴스 기사, 네이버 지식인 뭐 많잖아요. 그거시 텍스트 데이터를 다 긁어모아온 다음에, N-gram으로 나눠서 다 읽어내리는거죠. 그렇게 카운팅하면서 테이블을 만드는거죠. 그렇게 되면, 주어진 N-gram이 몇 번 나왔는지와, 주어진 N-gram에서 앞의 n-1개 빼고 나머지가 다 바뀐다고 했을 때 몇 번이 나왔는가. 첫 번째를 두 번째 수로 나누게 되면, 최대 우도 추정이 가능하고, 그러면 N-gram prob을 계산할 수가 있죠. 그러면 이제 새로운 문장이 들어왔을 때, 단어들을 순차적으로 보면서 확률값이 나오게되겠죠.
더 간단히 예를 들어볼게요. New York이 주어졌을 때, 다음에 University가 나올 확률을 계산하고 싶다. 그러면 어떻게 하느냐. 간단하겠죠. New York University를 다 세리고, New York Anything을 다 세리고, 첫 번째 나누기 두 번째를 하면, New York 뒤에 University가 나올 확률이 나오는 거죠. 다만 큰 문제점이 하나있어요. 첫째는, 데이터 희박성에 대한 겁니다. N-gram 하나가 독특한 경우죠. 예를 들어 a lion is chasing a llama라는 문장을 생각해봅시다. 이 문장의 확률은 p(a) * p(lion|a) * p(is|a lion) * p(chasing|lion is) * p(a|is chasing) * (llama|chasing a)인데, a lion is chasing a .. 여기까지는 괜찮은데 llama 이거에 대한 계산값이 없는 거죠. 한번도 등장하지 않던 단어가 나오면, 그 하나 때문에 문장 자체의 확률이 0가 되버립니다. 두번째 경우는, Long-Term Dependency를 잡을 수 없죠. N-gram의 경우는 n이 고정된 값인데, 이건 커지면 커질수록 데이터 희박성 문제가 커지겠죠. 그래서 n을 줄일 수 밖에 없구요. 물론 n=1이라면, 이건 각각의 단어들이 몇 번 나왔는지를 계산하니까 데이터 희박성 문제는 없죠. 대신 확률을 올바르게 줄 수가 없을 거구요. 딜레마에 빠지는거죠. n을 줄여도, 늘여도 문제가 있으니까. 뭐 물론, Language model에서 LTD문제를 해결하는게 의미가 있냐하는 점도 고려하긴해야합니다. 예를 들어, 영어의 경우 n=7정도면 Language model이 거의 완벽합니다. 그러나, 우리는 자주 등장하는 평범한 문장에 대한 스코어링도 중요하지만, 반례들을 놓치지않고싶은거니까요.
쨋든 이런 문제를 NN을 사용하기 이전 어떻게 핸들링했는지 이야기해보겠습니다.
일단 데이터 희박성 문제같은 경우에는 Smoothing이 있죠. 어떤 토큰에 대한 확률이 0인게 문제였으니까, 어떤 상수를 살짝 더해서 절대 0이 나오지 않도록. 그러면 확률값을 구할 수는 있는데, 진짜 그냥 할 수 있다 정도밖에는 안되죠. 그래서 조금더 나은게 Backoff라고, 카운트가 없으면, 0을 쓰는게 아니라, 조금 더 윈도우를 줄여가면서 값을 구해보자는 거죠. chasing a llama를 찾았는데, 이게 없으면 a llama를 보자. 이런거죠. 다만 이렇게 하면 확률 값을 다 더했을 때, 1이 안될테니까 살짝의 보정을 해주는거구요. 이런 방법론으로 가장 널리 쓰이는게 Kneser-Ney smoothing/backoff인데요. 이게 굉장히 잘되요. 특히 영어는 거의 완벽하구요. 아 그리고 이런거 쓰실 때, 절대 직접구현하지는 마세요. 많은 데이터를 순차적으로 카운팅하는 방식이기 때문에, 계산 효율을 내기가 어려워요 직접구현하면. 그러니까 KenLM이라는 오픈소스 쓰시는 걸 추천드리겠습니다.
자 그럼 이제 데이터 희박성은 끝났고, Long-Term Dependency는 어떻게 해결할거냐.
사실 이건 N-gram language model로는, 그러니까 카운팅 기반으로는 해결할 수가 없어요. 그래서 나온게, 문장이 있으면, 그 문장을 가지고 의존 구문 분석을 시행하는거에요. 그래서 앞의 토큰과 뒤의 토큰이 토큰의 개수를 카운팅하는거로 따지면 거리가 멀지만, 의존 구문에 따르면, 밀접한 관련성을 갖게 되는거죠. 다만 이렇게 하면, 다시 의존 구문 분석하고, 그 데이터를 계속 끌고가야하고, 여러 문제가 있고, 그렇습니다. 그렇다고 N크기를 높이면 데이터 희박성이 고개를 들고, 결국 N-gram으로는 해결이 안되요. 이상입니다.
'머신러닝 > [딥러닝을 이용한 자연어 처리]' 카테고리의 다른 글
Long Term Dependency (0) | 2020.04.15 |
---|---|
Neural N-Gram Language Model (0) | 2020.04.14 |
Autoregressive language modeling (1) | 2020.04.12 |
Overview: Language Modeling (0) | 2020.04.11 |
Questions (0) | 2020.04.10 |