딥러닝을 이용한 자연어처리 Section D

Overview : Language Modelling

  • Generation을 위해 Language Modelling을 알아야 하는데 generate를 하지는 않고, scoring을 한다.
  • 문장을 input으로 받아서 input에 대한 확률을 내뱉는다. (단어 나열에 확률을 부여하는것)
  • Sentence Generation과 Scoring은 Equal model이다.
  • Scoring function을 살짝 바꿔서 문장의 prefix등을 보고 partial score를 예측할 수 있다면 efficient하게 search할 수 있다.

Autoregressive Language Modelling

  • sequence가 주어졌을 때 어떻게 probability distribution을 계산할지.
  • token들이 하나씩 주어질 때 다음 token의 확률이 뭐가 나올지 쭉 곱하는 것. conditional probability생각.
  • 좋은 이유 : unsupervised문제를 supervised problem으로 바뀐다. 각각의 conditional들을 보면 input 과 output pair에 대해 학습하게 되기 때문.
  • sentence scoring즉 language modelling은 sentence classification을 아주 많이 하는 문제가 된다.

  • 각각의 conditional distribution확률을 1~t-1번째 token이 주어졌을 때, t번째 token을 classification하는 model을 만드는 것과 똑같다. sentence representation 5가지 배운것 중에 사용하고, 실제 데이터에 있었던 token의 probability가 높아지도록.
  • loss term은 negative log probability가 되고 쭉 더하는 것.
  • 문장이 얼마나 likely한지 보는 예제 (6-7쪽)

  • Score가 negative likelihood loss와 똑같다. 즉, 자주 나오는건 스코어가 높아지도록!

N-Gram Language Models

NN 이전에는 어떻게 했을까?

  • IBM등에서, speech recognition을 하기 위해 language modelling을 해야한다고 접근.

    • Machine translation도 가장 말이되는 문장을 후보군에서 뽑는 것.
    • MLE
    • N-gram Probabilities : 앞에 N개가 나왔을 때 확률
    • N개의 preceding token이 나온 상태에서.
    • 동전을 던져보고 몇 번 head로 떨어지는 지 세어서 전체 횟수를 나누면 bernoulli의 p를 찾는것. (MLE)
    • 도서관, 지식인, wikipedia등의 데이터셋에서 전체 단어 수를 세고 N-Gram table을 만들어서 phrase들이 몇 번 나왔는지 알 수 있다.

      • 이 N그램이 몇번 나왔는지/ 앞에 N-1개나왔을 때 다른 단어까지 뭐가나왔는지 토탈넘버
      • 이렇게 계산하면 된다.
      • 예제 : (12쪽) New York University

하지만 N-Gram Language Model의 두 가지 큰 문제점이 있다.

  1. Data Sparsity

    • a lion is chasing a llama
    • chasing a llama라는게 처음 나와서 확률이 0이 되어버리는 것.
  2. Inability to capture long-term dependencies

    • 멀리 떨어져있는 단어끼리 연관되어 있어서 N gram에 잡히지 않는 경우
    • context사이즈를 늘리고, n을 늘리면 되긴 하는데, N이 커지면 커질 수록 sparsity가 커지게 된다 .
    • 영어는 N=7이면 거의 완벽하게 맞출 수 있다.
    • 예제 : “The same stump which had impaled the car of many a guest in the past thirty years and which he refused to have removed
      • 앞의 4 단어만 보면 마지막에 removed라는 단어가 나올거라는걸 맞추기 어렵다.
      • 문장 뜻 : he라는 사람의 guest들이 30년동안 나무 그루터기때문에 차가 계속 걸렸었는데 he는 그걸 30년동안이나 stump를 없애는걸 거부했던 나쁜놈이라는 뜻임 ㅇㅇㅇ 이름안나오고 He라는게 갑자기 처음나와서 헷갈렸음
      • 이 문장 처음 본 Duke대 친구 반응 : “이거 무슨 고대영어야? 아니면 수능영어?”
    • Common한 sentence도 잘 맞추면서 cornerside를 잘 맞추는 것도 중요하다.

Traditional Solutions

  1. Data Sparsity

    • count가 0인 경우들이 있어서 문제가 된다. → smoothing
    • 하지만 이거도 말이 안됨. chasing a llama와 chasing a star둘다 0.1을 받는게 이상.
    • Backoff
      • n-1gram을 본다. chasing a llama확률을 0으로 두는게 아니라 a llama로 보는것.
    • Kneser-Ney method가 좋다.
      • Kneser smoothing쓰면 영어는 거의 완벽하게 된다.
      • KenLM open source를 사용하면 된다.
    • https://operatingsystems.tistory.com/entry/Data-Mining-Smoothing-Techniques
      • 이 블로그 포스트가 이해하는데 도움이 되고 좀 더 자세한 설명이 있다.
  2. Long-Term Dependency

    • count based로는 해결 못한다.
    • 문장이 있으면 DAG를 만들어서 연결되어 있는 단어들은 grammatically 거리가 가깝고, 아니면 멀고.
    • stump로 removed가 바로 연결 되는 것
    • dependency parsing을 먼저 해야된다는 문제가 있다.
    • 두 문제를 같이 해결해야 하지만 쉽지 않다

Neural N-Gram Language Model

NN을 사용하면 두 가지 문제를 다 해결하는 노력을 할 수 있다.

  • Neural Language Model로 data sparsity로 해결을 제시.

  • input으로 ngram을 벡터로 만들고 (구체적으로 아주 단순하게 그냥 concatenate함)
    • size가 같은 벡터가 나오게 됨
  • 그래프를 지나서 softmax를 하고 sum 해서 나눈다.
  • DAG가 만들어지면 backpropagation으로 학습시킬 수 있다.
  • 이렇게 하면 countbased와 다르게 training set에 나오지 않은 n-gram에 대해서도 probability를 계산할 수 있게 된다.
  • Data Sparsity가 왜 생기는가?

    • N-gram자체가 test할 때 나오고 train 할 때 없었어서.
    • discrete space에서 계산해서 그런거다. 문제점. 어떤 token들이 비슷한지 알 수 없다.
    • NN language model은 생각보다 간단하게 이 문제를 해결한다.
    • chasing a llama와 비슷한 다른 문장들 (cat, dog, deer)의 n-gram은 0이 아니어서.
    • Token representation단에서 각종 mammal들이 비슷하게 붙어 있게 된다. 자연스럽게 distribution이 비슷해진다.
    • 처음 보는 token이어도 continuous space안에서는 굉장히 가까운 곳에 붙어있게 되는 것이다.

    • three teams, four teams, four groups는 있었지만 three groups는 나타나지 않았지만, three와 four가 비슷한 점으로 mapping이 되었기 때문에 추리할 수 있다.

    • Three와 Four가 같은 곳에 매핑되지는 않지만 비슷한 곳에 매핑되게 된다.
    • 이렇게 되면 test time에 input 에 three가 들어가면, three groups를 본 적이 없어도 team만이 아니라 group에도 높은 probability를 주게 된다.
    • 실전에서 어떻게 Neural N-Gram Language Model을 어떻게 훈련시킬까?

      1. 데이터셋을 모은다. 데이터셋의 모든 n-gram을 추출한다.

      2. Stochastic Gradient Descent를 할 때, 데이터 training example을 뽑을 때 최대한 uniform하게 뽑아야 하니까 shuffle을 한다.

      3. 뽑고싶은 만큼 100-1000개정도씩의 minibatch로 뽑고 이 network를 classifier training하듯이 하면 된다.

      4. validation set을 이용해서 early-stopping을 해야 한다. Model의 architecture가 어떻게 될 지 정한다. architecture마다 hypothesis set이 하나가 생긴다.

      5. 골라진 hypothesis set 안에서 best model이 test set에 얼마나 잘 하는지 봐야 하는데 보통 language model의 척도로는 Perplexity라는 measure를 쓴다.

        $$ppl = b^{\frac{1}{|D|}\sum_{(x_1,\cdots,x_N)\in D}log_b{p(x_N|x_1,\cdots,x_{N-1})}}$$

        • test set의 모든 n- gram에 대해 log probability를 계산하고, average를 계산한 다음에 다시 exponentiation한다.
        • Perplexity가 가지는 의미는 context를 봤을 때 그 다음 단어를 몇 개나 되는, 얼마나 작은 vocab subset안에서 고를 수 있는지를 알려준다.
        • Perplexity가 1이라고 하면 testset의 모든 n-gram에 대해 input을 보면 다음 token이 뭐가 나올 지 완벽하게 볼 수 있는 것이고, perplexity가 10 이면 이 모델이 input을 봤을 때 그 다음 token이 뭐일지 10개 내외에서 맞출 수 있는 것이다.
        • maximum perplexity는? vocab size와 같은 것.
        • perplexity는 낮으면 낮을 수록 좋다. 낮을수록 scoring을 잘 하는 것이다.
        • 그러나 실질적으로는 perplexity를 가지고 쓸 수 있는게 잘 없다.

Long Term Dependency

이전 단계의 토큰만 보기 때문에 long term dependency를 못 본다고 했었다. N이라는 숫자에 의해서. 그러면 이 문제는 어떻게 해결할 수 있을까?

  • Context size를 막 늘린다. Count based인 N-gram문제에서는 그렇게 할 수 없었다(data sparsity)
  • 하지만 continuous representation을 씀으로 그렇게 할 수 있다 (NN)
  • 하지만 문제점 ?
    • architecture size가 커지게 되고, 파라미터 개수도 많아지고, dataset도 커져야 한다.
    • parameter들을 제대로 estimate하기 위해서.
  1. Convolutional Language Model을 쓸 수 있다.

    • convolutional layer하나마다 local하게 조금씩 보는건데, 위로 쌓으면서 더 넓은 영역을 볼 수 있다.
    • Dilated Convolution을 그중에서 쓸 것이다.
    • 더 빠르게 보는 size가 exponential하게 늘어날 수 있는가?
    • 일반적인 convolution (아래 그림에서 색칠 없이 두줄만 본다)
      • 쌓아봤자 2개, 5개 보게 되는것. N을 쭉 늘리기 위해 layer를 많이 쌓아야만 한다.
    • Dilated convolution

      • layer를 쌓을 때 마다 중간중간에 구멍을 뚫어 놓는것.
      • 똑같이 아래층의 3개를 보더라도 중간을 띄고 봄으로써 size를 늘리는 효과.
    • 그냥 convolution을 생각없이 쓰다 보면, 다음 token을 맞추기 위해 미래 token도 사용해서 보게 되기 때문에 exact decomposition이 안 된다.
    • 그래서 미래 token은 mask out하고 이전 단계의 token만 보도록 한다. automated하게 코드를 짤 수 있다.

    • computation efficiency도 올라가고, number of parameter수도 너무 빠르게 올라가지 않게 되며 N을 크게 늘릴 수 있는 효과를 보게 된다!

    • 이 아이디어가 기본이 되어 ByteNet이라는 것도 나왔고, Glove, Pixel CNN, WaveNet…
    • 다양한 종류의 Language Model이 나오게 된다. 안드로이드 google voice assistant에 WaveNet이 이미 들어가있다.
    • Facebook Research에서 나온것 : Gated Convolutional Language Model
    • Causal structure를 capture하는 것이다. Generate할 때 causality modelling
    • Text Classification할 때는 과거 미래 등 상관 없이 문장 전체를 사용해서 찾아도 되는데, Language Modelling할 때는 generation하는 속도를 따라가야 하기 때문에 미래의 토큰을 사용해서 과거를 예측하면 안 된다.

    • begin of sentence

    • Neural N-gram, convolutional 아니어도 지금까지 배운 어떤 sentence language model이면 이 causal structure만 따라가면 만들 수 있다. Context size자체를 infinite하게 늘릴 수 있다.
  2. n이 infinite하게 갈 때 CBoW Language Model

    • 매번 다음 토큰을 predict하기전에 average하는 token은 그전에 나온것만 사용하도록.
    • CBoW가 classification에는 효과적이지만 Langauge Model에는 효과적이지 않다.
    • 의미에 관련. Language Model에서는 구조 자체가 중요하기 때문에 순서를 무시하는 이런 sentence representation은 적합하지 않다.
    • 그냥 어제 얘기한거라서 짚고 넘어감.
    • CBoW를 사용한 LM이 잘하는 것은 Token representation을 잘 찾는다는점 때문에 Word2Vec 임베딩 찾는데 많이 쓰고, sentence scoring에 이걸 쓸 이유는 없다.
  3. Recurrent Neural Network

    • LM에 실제로 많이 쓰이는 모델
    • Context를 infinite하게 늘리기 위해 online으로 여태 까지의 모든 token을 하나의 vector representation으로 표현하기 위해 사용
    • 다만 한쪽 방향으로만 가야한다! (Bidirectional안됨)
    • LM에 사용하기 위해서 미래 모델을 사용하지 못하니까, 과거 token들에 적용해서 summarization하고 softmax fn에 입력해서 distribution에서 score를 자동으로 계산.
    • 실전에서 가장 많이 사용 speech recognition, 스마트폰 키보드 autocomplete할 때 , search engine에서 일부 사용
      • search engine에서는 속도문제때문에 NN 제한적으로 사용
    • Sentence Generation다른 문제들에서 중간중간에 scoring을 주니까 candidate들을 prune out할 때 많이 사용한다.
  4. Self Attention

    • RNN잘 쓰이지만 한 가지 문제점은 문장이 길어질 수록 prefix summary를 잘 못하게 된다.
    • sequence가 주어졌을 때 vector 하나로 만드는데, 문장이 길어질 수록 기억하고 있어야 하는 내용들이 많아져서 RNN이 커져야하고, parameter 수가 많아지고, dataset이 커져야하는 악순환에 빠지게 된다.
    • Attention은 매 step마다 그 전에 있던 모든 token에 대해 따로 계산을 해주기 때문에 하나의 vector로 사용할 필요가 없다.
    • 그래서 RNN과 self attention을 같이 사용하게 된다.
    • Recurrent memory network
      • RNN을 돌려서 summarize된 하나의 벡터만을 사용하는 것이 아니라, 그 벡터를 기준으로 그전의 모든 벡터들과 pairwise comparison을 한다. (weighting function과 relational Network function을 사용)
      • weighting function이 기존에 있던 token들중 뭐가 중요한지 보고 고른다.
      • 그 전 다섯개 토큰 중 무엇이 가장 중요했는지 골라서 다음번 token을 예측할 때 사용하게 된다.
      • 지금까지 본 모든 token을 압축해서 하나에 넣을 필요가 없어진다.
      • 이 논문 소개에서는문장 중간중간 빈 공간을 채우는 문제에서 Recurrent NN이 잘 작동했다.
    • Recurrent Memory Network이 이전에 있던 것들보다 잘 된다.
    • DAG안에 들어만 가면 어떻게든 원하는대로 붙일 수 있기 때문에 섞어서 쓰는 것이 가능하고, 문제에 따라 잘 섞어서 쓰면 성능과 효율성이 올라간다.
    • Google Translation team : RNMT 에 rnn + self attention모델 사용함.

Summary

  • Language Model
    • Sentence의 score, probability가 뭐냐.
    • Autoregressive Language Model
      • 왼쪽에서 오른쪽으로 넘어가면서 probability를 계산.
      • 장점 : language model이라는것 자체는 unsupervised인데 ARLM 은 supervised문제 (text classification)으로 바꾸었다.
    • Count based N-gram Language Model의 문제점
      1. Data Sparsity
      2. Long-term Dependency
    • NN을 사용함으로써 어떻게 해결이 되었는지
    • 다섯가지 sentence representation방법 (section C) 로 text classification, language modelling, machine translation, question answering등 다양하게 사용할 수 있다.

Q & A

  • 업데이트예정

잘 이해했는지 확인할 수 있는 질문 (생각해보세요)

  1. Language Model이란 무엇인가?
  2. Autoregressive Model은 무엇인가? 장점은 무엇인가?
  3. Count based N-gram Language Model의 문제점 두 가지는 무엇인가?
  4. 각각의 문제를 해결하기 위해 제시된 방법들은 무엇인가?
  5. NN을 사용하면 어떤 문제가, 왜 해결될 수 있는가?