본문 바로가기
Deep Learning Study/NLP

Stanford CS224N - Lecture 5. Recurrent Neural networks RNNs

by BangGeuk 2024. 4. 6.

본 글은 Stanford CS224N: NLP with Deep Learning | Winter 2021 내용을 기반으로 합니다.

강의를 듣고 정리한 글로 혹시 잘못된 부분이나 수정할 부분이 있다면 댓글로 알려주시면 감사하겠습니다.


강의 순서

1. Neural dependency parsing

2. A bit more about neural networks

3. Language modeling + RNNs

 

1. Neural dependency parsing

 

문제점 #1: sparse

문제점 #2: incomplete

훈련 데이터에 따라 특정 feature가 존재하여 없는 feature가 존재. 예를 들어, 어떤 단어는 동사 앞에 나오지 않는 경우 해당 feature는 존재하지 않는다.

문제점 #3: expensive computation

 

How do we gain from a neural dependency parser?

 

Indicator feature의 많은 연산량을 dense vector로 변환하여 신경망을 통해 학습하는 방식으로 접근해 볼 수 있다.

 

A neural dependency parser

 

신경망을 도입함으로써 MaltParser에서 C & M 2014로 성능과 속도가 향상되었다. MSTParser과 TurboParser은 정확도가 높으나 속도가 느리다는 단점이 있었다.

 

어떠한 방식으로 성능과 속도를 향상했는지 알아본다.

 

First win: Distributed Representations

 

- 각 단어를 단어 임베딩으로 나타내어 각 단어의 d차원의 dense vector로 표현한다.

- 품사(part-of-speech tags; POS)와 dependency labels도 d차원의 벡터로 표현한다.

위 그림과 같이 word, POS, dependency label를 vector로 표현한 후 concatenation을 한다.

 

Second win: Deep Learning classifiers are non-linear classifiers

 

전통적인 ML classifiers(Naive Bayes, SVMs, logistic regression and softmax classifier)는 선형 decision boundaries를 제공하여 강력한 classifiers가 아니다. Neural networks는 비선형 decision boundaries를 제공하여 훨씬 강력하다.

 

신경망의 경우 비선형 활성화 함수가 포함되어있기 때문에 신경망 위에 분류기를 올려서 사용하면 훨씬 복잡한 분류도 해낼 수 있다. 간단하게 신경망 분류 모델의 구조를 보면 아래와 같다. 여기서 ReLU(Retified Linear Unit)이 비선형 활성화함수이다.

 

Neural networks는 ReLU와 같은 비선형 활성화 함수가 포함되어 있어서 비선형 decision boundaries를 제공할 수 있다. 아래 그림은 간단한 feed-forward neural network multi-class 분류를 보여준다.

아래 그림은 Neural Dependency Parser Model 아키텍처를 보여준다.

 

위 방식을 이용하여 Chen and Manning(2014)은 성능과 속도면에서 성공적인 neural dependency parser였다.

 

그 후, Transition-based neural dependency parsing은 지속적으로 발전되어왔다. 그리고 Graph-based dependency parser이 등장했다. 이는 모든 단어 쌍을 효과적으로 고려하는데 단어 간의 관계에 대한 확률을 계산하는 것이다. 그러나 길이의 문장은 2개의 dependencies를 가질 수 있기 때문에 neural transition-based parsers보다 훨씬 느리다.

 

2. A bit more about neural networks

Regularization

 

신경망 모델을 만들 때, 엄청나게 많은 매개 변수들을 사용하게 된다. 이는 모델이 복잡해지고 학습 데이터에 너무 잘 맞춰지게 되는 과적합 현상을 일으킬 수 있다. 따라서, 정규화가 필요하며 전체 손실 함수는 정규화가 된다. 예를 들어, L2 regularization이 있다.

L2 regularization은 모든 매개변수의 제곱값의 합에 대한 패널티를 전체 손실 함수에 추가하는 방법이다. 매개변수의 값이 크면 클수록 그에 대한 패널티가 커져 모델이 과적합을 피하도록 유도한다.

 

Dropout

 

Preventing Feature Co-adaptation은 좋은 정규화 방법이다. Feature co-adaptation은 신경망 학습 과정에서 여러 특징들이 서로 너무 의존하게 되는 현상이다. 이는 특정 데이터 셋에 대해 너무 최적화되어 일반화 능력이 떨어지는 원인이 될 수 있다. 즉, Feature-co-adaptation을 방지하는 것은 모델을 더 강건하게 만들고 각 특징들이 독립적으로 유용함을 보장하기 위해 중요하다. 이를 방지하기 위해 Dropout을 사용한다.

 

Training time: 일부 뉴런에 대한 입력값을 0으로 변경하여 비활성화를 한다.

Test time: 모든 모델 가중치를 이용하여 평가한다.

 

Non-linearities

 

신경망 모델에서 여러 층을 쌓아 복잡한 문제를 해결하기 위해서 비선형 활성화함수를 사용한다. 초기에는 0과 1 사이의 값을 출력하는 logistic("sigmoid") 함수가 주로 사용되었다. 그러나 모든 출력값을 양의 값으로마나 내놓는 한계가 있어 -1과 1 사이의 값으로 확장한 tanh 함수를 사용하기 시작했다. 하지만, logistic이나 tanh 함수는 모두 일정 범위를 벗어나면 gradient vanishing 문제가 발생하여 hard tanh 같은 함수가 등장하였다. 이를 개선한 ReLU 함수는 모델이 더 빠르게 학습하고 더 깊은 네트워크를 효과적으로 학습할 수 있게 해주어 성공적이었다. 현재는 Leaky ReLU, Swish 등 여러가지 비선형 활성화 함수들이 등장하였다.

 

Parameter Initialization

 

매개변수 초기화를 통해 학습을 안정적으로 하고 좋은 성능을 낼 수 있다. 신경망의 가중치를 모두 0으로 시작하면 학습 과정에서 모든 뉴런이 동일한 업데이트를 받게 되어 대칭성 문제를 야기한다. 따라서, 가중치를 작은 임의의 값으로 초기화하여 각 뉴런이 서로 다른 특징을 학습할 수 있게 해야한다.

Uniform(-r, r) 초기화를 통해 가중치를 일정한 범위 내의 임의의 값으로 설정한다. 일반적으로 편차는 0으로 초기화한다. Xavier 초기화는 널리 사용되는 방법 중 하나다. 분산을 이전 층의 뉴런 수와 다음 층의 뉴런 수의 합에 반비례하도록 설정하여 정규분포로 초기화한다.

 

Optimizers

 

SGD는 많은 경우에 잘 작동하지만 좋은 결과를 얻기 위해서는 학습률을 수동으로 조정해야 할 필요가 있다. 더 복잡한 모델이나 특정 상황에서는 "adaptive(적응형)" 최적화 알고리즘을 사용하는 것이 더 나은 결과를 얻을 수 있다. 이러한 적응형 최적화 알고리즘은 gradient를 기반으로 매개변수 조정의 크기를 동적으로 조정한다. 즉, 각 매개변수에 대해 다른 학습률을 적용하여 학습 과정을 더 효율적으로 만든다. Adagrad, RMSprop, Adam, SparseAdam 등이 있다.

 

Learning rates

 

학습률(learning rate)는 gradient에 기반하여 매개변수를 얼마나  조정할지 결정하는 상수이다. 일반적으로 0.001로 시작하는 것이 자주 사용된다. 학습률이 큰 경우, 모델이 수렴하지 않고 발산될 수 있다. 학습률이 작은 경우, 학습속도가 너무 느려져서 모델이 충분히 학습하기 전에 학습을 중단할 수 있다.

 

효율적인 학습을 위해서 학습률을 동적으로 조정하는 것이 유용하다. 매 epoch마다 학습률을 점진적으로 낮추는 방식이 있다. 최신 최적화 알고리즘들을 초기 학습률을 하이퍼파라미터로 요구하고 이후에는 내부적으로 학습률을 동적으로 조정한다.

3. Language modeling + RNNs

언어 모델링이란 문맥을 보고 다음 단어를 예측하는 작업이다.

언어 모델은 vocabulary 내의 단어에서 다음 단어에 대한 확률 분포를 계산한다.

어떻게 언어 모델을 만들 수 있을까?
 
전통적인 방법으로 신경망 없이 만들 수 있는 방법부터 소개한다.
 

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"

- 4-grams: "the students opened their"

 

아이디어 : 많은 양의 텍스트에서 다양한 n-gram이 얼마나 자주 나타나는지에 대한 통계를 수집하여 확률 모델을 만듬

 

이를 위해, Markov assumption을 한다. (t+1)번째 단어는 앞의 (n-1)개 단어에만 의존한다.

'분모와 분자의 확률은 어떻게 구할 것인가'라는 물음에 대한 답변으로는 단순히 문서의 큰 말뭉치에서 n-gram이 얼마나 자주 발생하는지 계산한다.

 

아래 그림은 4-gram language model 학습 예시이다.

 

3개의 단어 "students opened their"만 고려하고 나머지는 버린다.

그리고 "students opened their"의 빈도 수는 1000번일 때,

"students opened their books"의 빈도 수가 400번이면 P(books | students opened their) = 0.4

"students opened their exams"의 빈도 수가 100번이면 P(exams | students opened their) = 0.1

 

n-gram의 문제점

 

Sparsity Problems

  • 분자가 0일 경우 → 작은 값(δ)을 모든 단어 w에 대한 개수에 더해준다 (이를 smoothing이라고 함)
  • 분모가 0일 경우 → 더 작은 gram으로 줄인다. ex) "students opened their" -> "opened their" 사용 (이를 backoff라고 함)

n-gram 언어 모델에서 n을 증가시키면 이러한 희소성 문제는 더 심해진다. 그래서 일반적으로 n은 3~5로 사용하였다.

 

Storage Problems

  • 말뭉치 내의 모든 n-gram에 대해 저장해야 확률을 계산할 수 있다. 즉, n 또는 말뭉치가 증가하면 모델 크기도 증가한다.

ex) 예전 구글 번역기는 클라우드를 이용하여 N-gram을 이용했지만 현재는 신경망 기반인 모델을 사용하여 핸드폰에서도 이용 가능하다.

 

n-gram은 문법적으로는 괜찮은 문장이지만 이상한 문장의 흐름을 생성한다. 따라서, 우리는 훨씬 더 나은 언어 모델이 필요하다.

 

How to build a neural Language Model?

 

n-gram 언어 모델과 같이 멀리 떨어진 단어들은 버린다. 그리고 fixed window에 있는 단어들을 신경망에 넣는다.

 

단어 임베딩을 연결하고 hidden layer에 넣은 후 softmax classifier를 통해 확률 분포를 계산한다. 가장 높은 확률 분포를 가진 단어를 다음 단어로 생성한다.

fixed-window neural language model

 

"Y. Bengio, et al. (2000/2003): A Neural Probabilistic Language Model" 논문에서 fixed-window neural language model을 소개하였고 흥미로운 좋은 결과를 보여주었다. 어떤 단어가 다음에 나올지 예측하기 위해 더 큰 맥락을 가질 수 있는 문제를 해결하지 못했다.(n-gram 문제와 동일) 하지만, 분산된 표현의 형태로 나타내어 많은 장점을 가지고 있다.

 

Improvements over n-gram LM:

  • No sparsity problem : distributed representation을 사용하기 때문에 말뭉치에 없더라도 예측이 가능
  • Don't need to store all observed n-grams : 단어 벡터와 W, U 행렬만 저장하면 된다.

Remaining problems:

  • Fixed window is too small : window를 크게 하면 W 행렬이 커진다
  • Enlarging window enlarges W
  • Window can never be large enough
  • x(1) and x(2) are multiplied by competely different weights in W : 각 단어들에 대해 다른 W가 곱해진다

Recurrent Neural Networks (RNN)

 

Recurrent Neural Network는 위의 문제를 해결하기 위해 같은 가중치 W를 반복적으로 사용한다.

 

첫 번째 단어 이 들어오면 이전과 같이 distributed representation으로 변환한 후 은닉층에 넣어 hidden state 을 만들어 단어를 예측한다. 이 후 두 번째 단어가 들어오면 앞서 생성된 의 W를 가져와서 를 생성한다. 이렇게 다음 input word와 이전 hidden state를 업데이트하여 W를 곱한다. 이러한 방법을 모든 단어에 대해 반복적으로 수행하기 때문에 recurrent하다고 한다.

 

이전 예시와 같이 "the students opened their"라는 문장을 예시로 든다. 초기 hidden state는 0으로 초기화한다. 첫 번째 word embedding을 We로 곱한 값에 이전 hidden state와 Wh를 곱한 값을 더한다. 그 후, tanh를 사용하여 h(1)을 만든다. 이렇게 반복적으로 h(4)까지 만든 후 h(4)와 행렬 U를 곱한 후 softmax 함수를 통해 다음 단어에 대한 확률 분포를 얻는다.

RNN 장점

  • 임의의 input text 길이를 처리할 수 있다
  • 이론적으로는 얼마든지 뒤로 거슬러 예전 정보를 사용할 수 있다 
  • 입력의 길이가 길어도 모델의 크기가 증가하지 않는다
  • 모든 timestep마다 같은 가중치가 적용된다 (입력 데이터를 처리하는 방식이 일관)

RNN 단점

  • 반복적인 계산으로 속도가 느리다 (외부 for 문)
  • 이론적으로 여러 step의 정보에 접근할 수 있지만 실제로는 매우 불완전하