본문 바로가기
Deep Learning Study/NLP

[Lecture 1] Language Models and RNNs

by BangGeuk 2024. 10. 1.

오늘 강의에서 초점을 맞출 것은 Language Model이란 무엇인가. 그리고 가장 기본적인 형태의 Language Model은 무엇이 있고 RNN은 어떠한 형태로서 활용이 되면서 우리가 Language Model을 어떻게 만들어 나가는지 간략하게 설펴보도록 한다.

 

그래서 오늘 배울 것은 크게 두 가지이다.

1. Language Modeling은 무엇인가.

2. Recurrent Neural Networks (RNNs)는 어떤 형태로 구성되어 있는 네트워크인가.

 

Language Modeling이라는 개념은 상당히 중요한 개념이다. 현재 사용하고 있는 도구들 혹은 방법론들이 Language Modeling을 기반으로 하고 있다(ex. BERT, GPT-3, ChatGPT 등).

1. Language Modeling

Language Modeling is the task of predicting what word comes next.

Language Modeling은 앞에 있는 text를 바탕으로 그 다음에 나올 단어에 대한 확률분포를 만드려고 하는 것이다. 수식으로 나타내면 다음과 같다.

 

각 단어에 대한 확률분포를 예측하는 것으로도 볼 수 있고 다음과 같이 전체 텍스트에 대해 있을 확률도 매핑해주는 역할을 해준다.

 

그러면 우리가 왜 Language Modeling을 신경써야할까? 이 질문에 대한 답변은 예전과 현재에 따라 다르다.

 

Old answer:

  • Language Modeling은 benchmark task로 사용되었어가지고 우리가 만든 모델이 얼마나 잘 이해하고 있는지 파악하기 위해 사용되었다.
  • 수 많은 NLP task의 subcomponent로 사용되었다. 특히, 텍스트 생성이나 텍스트 확률을 예측하는 과정에 집어넣었다.

 

New answer:

  • 모든 모델들이 Language Modeling으로 이루어져 있다. GPT-3, GPT-4, Claude, Gemini Ultra 등 모든게 Language Modeling이다. 즉, 지금 하고 있는 대부분의 NLP task 자체가 Language Modeling task에 의존해서 하고 있다.

그리고 또한 휴대폰에서의 다음 단어 자동완성, 구글 검색 엔진 등 다양하게 사용되어왔다. 이러한 Language Modeling 역사에 있어서 가장 빼놓을 수 없는 전통적인 방법론 중 하나는 n-gram Language Model이 있다. 못해도 10년 이상은 활용되었다.

n-gram Language Models

n-gram이란 연속된 n개의 단어를 이야기한다. 

unigrams : "the", "students", "opened", "their"

bigrams : "the students", "students opened", "opened their"

trigrams : "the students opened", "students opened their"

four-grams : "the students opened their"

 

Idea : 통계적인 방법으로 해결하며 다양한 종류의 n-gram을 잔뜩 수집한다. 그것을 기반으로 다음 단어를 예측하도록 모델을 만든다.

 

우선 수식을 보기 전에 Markov assumption에 대해 간략히 설명하자면. Markov assumption은 우리가 다음 행동을 하는 데 있어서 과거에 있는 모든 것들이 영향을 미치지 않고 이전에 있었던 바로 전 행동만 다음 행동에 영향을 미친다는 가정이다. Markov assumptiong은 Language Modeling에도 동일하게 적용된다. 다음 단어를 예측하는 데 있어서 n-1개의 연속된 단어만이 다음 단어를 예측하는 데 영향을 미친다는 가정을 한다. 수식으로 나타내면 다음과 같다.

 

그런 후, conditional probablity (조건부 확률)을 다음과 같이 바꿔서 해결한다. 즉, (n-1)개가 나올 단어 확률과 n개가 나올 단어 확률로 계산을 한다. 

 

예제를 한 번 보자.

4-gram Language Model을 학습한다 가정하자. 4-gram이니 앞에 있는 세 개의 단어를 이용해 네 번째 단어를 이용하는 것으로 해결할 것이다. 예시를 보면 다음과 같다.

 

"students opened their"은 1000번 발생했고 그 다음에 "books"가 발생한 횟수는 400번, "exams"가 발생한 횟수는 100번으로 각 확률은 0.4, 0.1이다.

 

n-gram Language Model이 2015년쯤까지 많이 사용할 만큼 놀라운 성능을 보였으나 한계점이 굉장히 많다.

 

Sparsity Problem 1 : "students opened their w"라는 것이 데이터에 존재하지 않을 수 있다. 즉, 데이터에 없는 문장 단어가 없으면 확률이 0이 나온다. 실제로 0일수도 있긴 하지만 때로는 다양성적인 측면과 실제로 발생할 수 있는 경우가 있다. 이런 것을 방지하고자 vocabulary에 존재하는 모든 단어에 대해서 아주 작은 값을 넣어준다.

 

Sparsity Problem 2 : "students opened their"라는 것이 데이터에 존재하지 않을 수 있다. 이렇게 되면 계산이 불가능하다(잘 없는 일이긴 하다). 이런 것을 방지하고자 조건 자체를 "opened their"과 같이 줄여서 데이터에 존재할 수 있는 형태로 만든다. 이런 것을 backoff라고 부른다.

 

이러한 것들을 sparsity problem이라고 하며 n이 커지면 커질수록 안좋아진다(n이 커질수록 sparsity problem이 커지고 저장공간이 많이 필요하게 됨) . 따라서, n을 5이상으로 설정할 수 없다. n-gram은 문법적으로 잘못될 일은 거의 없다. 하지만, 앞에 고려하고 있는 context가 너무 짧다보니 전체적인 관점에서 봤을 때 말이 되지 않는 문장이 생성된다. 그래서 neural language model에 대한 필요성이 나왔다.

 

window-based neural model

 

특정 window size만큼 input으로 넣어서 그걸 기반으로 예측한다. 아래는 NER(Named Entity Recognition) task이다.

 

fixed-window neural Language model

 

고정된 window size만큼 input에 넣는다.

각 단어들을 one-hot vector로 변환한다. (one-hot vector는 단어들 간의 유사성, sparsity 등 문제가 많아 시간이 흐른 후 word embedding vector를 사용해 변환한다.)

ex) the => {1, 0, 0, 0}, students => {0, 1, 0, 0}, ...

 

word embedding들을 연결하여 neural network를 통과시킨 후, softmax를 거쳐 확률분포를 뽑아낸다.

softmax에 대해 간략히 설명하면, 각 단어에 대해 score값(아래 그림에서는 Uh+b2)이 나오게 되면 이것을 neural network 관점에서 정규화되지 않은 log probability라고 가정한다. exponential function e^(x)를 통과시켜주면 음수가 없어지고 양수로 변환해주고 log값을 없애주는 장점이 있다. 모든 단어들에 대한 exponential값들을 더해준 후 비율을 계산하면 normalized probability를 얻을 수 있다.

 

장점

  • sparsity problem이 없다. 문서에 존재하지 않았던 단어들에 대해서도 학습을 시킬 수 있다. 어짜피, 파라미터들을 학습시켜서 하는 것이다보니 가능하다.
  • storage problem이 없다. n-gram은 모두 저장해야했으나 이것은 파라미터만 저장하면 된다.

 

단점

  • fixed window가 n-gram처럼 여전히 작다.
  • input을 처리하는 데 있어서 단어의 위치의 영향을 받는다. 즉, 곱해지는 W가 달라진다.

이러다보니 이런것들을 처리하고자 RNN이 재발굴되었다. Recurrent Neural Network (RNN)는 90년대에 나온 엄청 오래된 아이디어이다. 한계가 명확하고 RNN을 받쳐줄 데이터가 없다보니 사용이 되지 않았다. 그런데 language model에 적용할 것들을 찾아보다보니 90년대에 등장한 RNN을 재발굴하여 언어 모델에 적용해보았다.

 

RNN이 neural network와 어떠한 점이 다른지 알아보자. 참고로 RNN이 현재는 사용되지 않지만, 이게 왜 사용되지 않는지. 그리고 얘가 가지고 있는 문제를 어떤 식으로 해결하기 위해서 지금의 transformer 구조와 지금의 Chatgpt가 나오게 된 것을 이해하기 위해서 알 필요가 있다.

 

RNN의 핵심 아이디어는 동일한 가중치를 계속해서 재사용하자는 것이다. 어떠한 종류의 input이 들어와도 동일한 W를 사용할 수 있게 해주었다.

 

입력은 one-hot vector로 처리하고 word embedding을 뽑아내어 RNN의 input으로 사용한다. 이전 스텝의 vector와 가중치 Wh를 곱하고 input과 We를 곱하여 더한다. 여기서, 중요한 점은 모든 hidden state마다 곱해지는 Wh가 같고 어떠한 input이 들어와도 We는 동일하다. 이를 통해, symmetry한 문제와 sparsity한 문제를 해결할 수 있다.

 

 

 

장점

  • 어떠한 길이의 input이 들어와도 처리할 수 있다.
  • 이론 상, 멀리 떨어져있는 정보도 활용할 수 있다. (계속해서 hidden state가 누적해서 가져오므로)
  • input context가 길어져도 모델 크기가 커지지 않는다. (모델 크기는 파라미터를 의미한다.)
  • 모든 time step마다 동일한 가중치를 이용하므로 input을 처리하는 방식이 symmetry하다. (입력 위치에 따라 형태가 달라지지 않고 input이 어떤 위치에 들어와도 동일한 가중치가 곱해져서 동일한 형태를 이룬다.)

단점

  • 연산이 너무 느리다. (hidden state를 업데이트하면서 학습하므로 이전 연산 결과가 나오지 않으면 다음 연산을 처리할 수 없다. 너무 비효율적이다.)
  • 이론상으로는 멀리 떨어져있는 정보를 활용할 수 있지만, 실질적으로는 멀리 떨어져있는 정보를 활용하기 굉장히 어렵다.

RNN Language Model을 학습시키기 위해서는 big corpus of text가 필요하다. 이를 통해, 모든 step마다 다음에 나올 단어를 예측하도록 학습한다. 각 step마다 나올 단어에 대한 정답 단어를 직접적으로(강제적으로) 알려주어 loss를 계산하여 학습한다. 이를 Teacher forcing이라 한다.

 

 

전체 데이터셋 자체가 너무 크다보니 전체 데이터셋에 대한 loss를 계산하지 않고 sentence 혹은 document 단위로 나눠서 loss를 계산한다. 이를 바탕으로 업데이트 하는 방식을 Stochastic Gradient Descent라 한다. Gradient Descent는 우리가 사용하고 있는 수많은 가중치들이 loss에 얼마나 영향을 미치는지에 대해 보기 위해서 계산한다. 그것에 대한 역방향으로 업데이트를 하는데 한 번에 계산하기 어려우니 나눠서 하는 방식을 Stochastic Gradient Descent라 한다. (자세한 내용 및 수식은 생략..)

 

RNN을 통해 text 생성을 할 수 있다. 각 단어에 대해 나오는 확률분포를 이용하여 단어를 샘플링하여 그것을 다음 step에 이용한다.

 

텍스트 생성을 n-gram보다 더 잘 하긴 하지만 엄청나게 잘 하진 않는다.

 

이러한 Language Model을 평가하는 방법에 대해 알아보자. 가장 기본적으로 사용하는 것은 perplexity이다. perplexity는 여전히 많이 사용한다. perplexity가 기본적으로 언어 모델이 어떻게 학습하고 있는지에 대한 개념을 보여주다 보니 평가지표로서 standard한 평가지표이다.

 

언어 모델이 몇 개의 단어를 가지고 나서 이 다음을 고민하고 있는지에 대한 지표이다. 즉, 언어 모델이 다음 단어를 예측하는 데 있어 몇 개의 단어를 참고하는지에 대한 지표이다. 따라서, 잘 학습되면 고민하고 있는 단어가 적을 것이다.

 

Entropy부터 Perplexity까지 간략하게 설명하면 다음과 같다.

 

정보 이론에서 불확실성을 Entropy로부터 측정한다.

우리가 가지고 있는 알파벳 개수가 26개라고 가정하자. 이 중 어떤 알파벳을 생각하고 있는지 질문을 통해 알아가고자 한다. 대답은 yes or no 이다. 이럴 때, 가장 빠르게 알 수 있는 방법은 반으로 쪼개는 것이다. 13개, 13개로 나눠서 있는지 없는지. 그리고 6개, 7개로 나눠서 있는지 없는지. 이럴 때, 기대되는 질문개수가 몇개일까? 26 = 2^(질문개수) 이다. 즉, 질문개수 = log2(26) = 4.x 이다. 이것을 좀 더 일반적으로 표현하면 질문개수 = log2(가능한 결과의 수) 이다. 좀 다르게 표현하면 H = log S 이다. n번만큼 이러한 일이 생기면 H = n log S = log S^n 이다.

 

여기서, 각 알파벳마다 나올 확률이 다른 경우도 알아보자. X랑 Y라는 기계가 있고 알파벳을 4개 출력한다하자.

X는 A,B,C,D 각각 0.25 확률로 출력한다. Y는 A,B,C,D 각각 0.5, 0.125, 0.125, 0.25 확률로 출력한다.

 

X 경우는 순서대로 물어보면 된다.

Y 경우는 A냐고 먼저 물어보는게 더 합리적이다. 여기서 A가 아니면 D냐고 물어본다. D가 아니면 B냐 물어보고 맞으면 B, 아니면 C이다.

Y 경우의 평균을 구해보자. P(A)*1 + P(B)*3 + P(C)*3 + P(D)*2 = 1.75 이다. 1, 3, 3, 2는 각각 질문 개수이다. 1.75가 불확실성이라 정의하고 Entropy라고 부른다. X는 모든 확률이 동일하기 때문에 더 불확실성이 높다. 계산해보면 X의 entropy는 2이다.

 

사건 발생 확률로도 볼 수 있는데 Y에서 A=1/2, B=1/8, C=1/8, D=1/4였는데 사건 발생 확률은 다음과 같다.

A=log2(2) = 1, B=C= log2(8) = 3, D=log2(4)=2이다. log 안에 확률을 역수취해준 걸 넣은다.

 

불확실성 H = 시그마(사건발생확률)*log2(1/사건발생확률) = 시그마p*log2(1/p) = - 시그마p*log2p

 

Perplexity는 entropy를 exponential한 것이다. 가장 최악의 경우는 N개의 선택지에서 고민하는 것이다. N은 vocabulary size이다. 따라서, perplexity가 낮을수록 좋다.

 

Summary

  • Language Model은 다음 단어를 예측하는 시스템이다.
  • Recurrent Neural Network는 neural network의 한 종류로서 어떠한 길이의 input이 들어와도 처리할 수 있다. 그리고 각 step마다 동일한 가중치를 사용한다. 각 step마다 output을 선택적으로 생성할 수 있다.
  • Recurrent Neural Network는 Language Model이 아니다. RNN을 Language Model로서 활용할 수 있다.
  • RNN은 LM을 어느정도 잘 만들 수 있지만 한계점이 있다.

한계점과 한계점을 개선하기 위한 모델, 여전히 해결되지 않은 점이 무엇이여서 transformer의 등장 배경은 다음 강의에서 배울 것이다.