본문 바로가기

NLP

[CS224N] Lecture 5: Recurrent Neural Networks RNNs

본 강의는 Stanford CS224N NLP with Deep Learning Winter 2021 Lecture 5을 듣고 정리한 내용입니다. 

1. Parsers

Neural based Dependency Parser

Simple feed-forward neural network multi-class classifier

  • hidden layer를 통해 input에 대해 행렬곱+비선형 layer를 추가해 공간을 변형시킬 수 있음. 
  • 이후 softmax layer에 넣어 분류 확률로써 활용. 

Graph-based dependency parser

  • transition based dependency parser의 대안. 
  • 모든 단어 쌍을 고려해서, 단어들이 ROOT에 의존한다고 봄. 그 덩어리가 ROOT에 의존할 확률이 얼마나 되는지, 혹은 그 크기가 다른 단어에 의존하는 확률이 어떻게 되는지를 계산. 
    ex) 'big'이 ROOT에 얼마나 의존하는가 / 'big'이 'cat'에 얼마나 의존하는가 점수를 얻음
  • 이를 잘 하기 위해서는 두 단어의 의미를 아는 것 이상으로 "contextual" 문맥 정보를 이해하는 것이 매우 중요함. big 전 후에 무엇이 있는지 등을 문장의 의존성 표현으로 변형.
  • 맥락을 바라보는 신경망을 이용해서 훨씬 더 나은 context를 표현할 수 있는 것.

A Neural graph-based dependency parser(2017)

  • graph-based dependency parser를 neural world로 확장시킴.
  • 정확도는 높아졌지만 긴 문장에 대해 시간적 단점 존재. 

2. A bit more about neural networks

Regularization 

사실 full loss function에는 regularization term이 존재함. e.g. L2 regularization
모델의 모든 parameter의 제곱의 합을 추가해, 정말 유용한 경우에만 0이 아닌 parameter 값을 갖도록 제한함. (유용하지 않다면 0) 

  • Classic View of Regularization : feature가 많을 떄 overfitting 방지에 도움이 된다.
    training data에 대해 계속 학습할수록 parameter는 loss를 최소화하는 방향으로 학습이 될 것. 하지만 독립적인 data에 대해서도 잘 분류하는지를 테스트해 보면, 어느 학습 시점 이후 오히려 test 결과가 악화되는 시점이 발생함. 

  • 하지만 이 고전적 관점은 현대 NN에 신경망에 대한 잘못된 관점, 시대에 뒤떨어진 관점임.
  • Now : Regularization은 우리가 "big" Neural Net을 만들 때 독립적인 test data에 대해 잘 일반화 되는지(generalize) 확인하기 위해 필요하다. 즉, model이 training data에 overfit 되는가는 관심 X 
  • big NN는 항상 hugely overfit to train data인 상황임. NN은 너무 많은 parameter를 가지고 있기 때문에 사실 loss가 0이 될 때 까지 학습가능함. 하지만 모델이 잘 정규화된다면 역시 잘 일반화되어 다른 데이터에 대해서도 좋은 성능을 낼 수 있을 것. 
  • regularization parameter $\lambda$: 정규화의 강도. 크게 할수록 강한 정규화가 이루어져 모델이 데이터에 잘 맞지 않게 학습되며 너무 작으면 generalization(일반화)가 힘듦. (독립적인 dataset에 대한 평가)
  • 하지만 큰 신경망은 너무 많은 parameter를 가지고 있기 때문에 L2 정규화로는 부족함. 

Dropout

  • 학습 중에 Feature Co-adaptation(적응)을 방지하는 방법 = Good Regularization Method!
  • Training Time : 학습 중 각 instance/batch에 대해 모델의 input의 각 뉴런의 50%를 랜덤하게 0으로 만듦.
  • Test Time : 모델 weights를 모두 유지. (halve the model weights, now twice as many)
  • 이것이 feature co-adaptation을 방지해줌. 즉, feature가 오직 다른 feature들이 함께 존재해야만 유용한 경우를 방지할 수 있음.
  • 따라서 dropout는 naive bayes와 logistic regression model 중간지대를 형성함. naive bayes는 모든 가중치를 독립적으로 설정하고, logistic regression model은 모든 weight가 다른 모든 context에서 설정되기 때문임.
  • 또한 dropout은 model bagging과 같은 앙상블 방법과도 유사함. 매번 feature의 다른 부분집합을 사용하고 있기 때문.
  • Now : strong, feature-dependent regularizer로 활용됨. (not uniform regularizer like L2 - 모든것을 L2 loss로 정규화)
     feature-dependent regularization을 배울 수 있음. 

Non-linearities, old and new

  • 다중 신경망을 만들 때 여러 선형 변환을 중첩해서 결합하기 때문에 최종적으로도 선형 표현이 됨. 따라서 비선형성이 필요하다.
  • 대표적인 non-linear function : logistic(sigmoid), tanh, hard tanh, ReLU

Parameter Initialization

  • weight을 작은 random value로 초기화해야 한다.
  • 보통 uniform(-r, r) with r chosen으로부터 weight 초기화하는 방법을 사용해 너무 커지거나 작아지지 않도록 조정한다.
    다만 layer normalization의 사용 이후로 이 목적의 필요성은 사라짐.
  • Xavier initialization : pytorch에서 대표적으로 사용하는 초기화 방법. 

Optimizers

  • 일반적으로, SGD는 잘 작동한다. 하지만 적절한 learning rate를 찾기 위한 hand-tuning 과정이 종종 좋은 결과를 만들기 위해 필요함. 
  • 더 복잡한 신경망 구조에서 accumulated gradient를 활용한 더 복잡한 'adaptive' optimizers를 고려할 수 있음.
    ex) Adagrad, RMSprop, Adam, SparseAdam...

Learning Rates

  • 단순히 constant learning rate를 활용할 수 있음. 보통 10의 -3, 10^-4 로 시작하는 경우가 많다.
    너무 크게 잡을 경우 모델이 발산하거나 수렴하지 못하고, 너무 작을 경우 모델이 충분히 학습되기 전에 학습이 종료되어버림. 
  • 실제 학습에서는 학습 진행 중에 learning rate를 낮추는 것이 더 나은 결과를 얻는 경우가 많음. 
    • 따라서 k epoch마다 학습률을 줄이는 방식을 일반적으로 많이 활용함. (halve the learning rate every k epochs)
      $lr = lr_0 e^{-kt}$, for epoch $t$
  • fancier optimizer를 활용해도 여전히 learning rate을 잘 설정해야 함. (보통 최적화 중에 줄어들기 때문에 시작할 때 생각보다 큰 값을 활용해야 함.)

3. Language Modeling + RNNs

(1) Language Modeling

  • definition : Language Modeling은 현재 단어 다음에 어떤 단어가 올지 예측하는 작업이다.
  • More formally : given a sequence of words $x^{(1)}, x^{(2)} , \cdots, x^{(t)}$, compute the probability distribution of the next word $x^{(t+1)}$ : $P(x^{(t+1)}| x^{(t)}, \cdots, x^{(1)})$ => 주어진 단어들이 있을 때 다음단어의 확률 분포를 계산하는 것. 
  • 따라서 Language Model을 한 단어에 확률을 할당하는 작업으로 생각할 수 있음. Chain rule을 사용하면 아래와 같이 ㅅtext의 확률분포를 계산할 수 있음.  
    $\begin{aligned} P\left(\boldsymbol{x}^{(1)}, \ldots, \boldsymbol{x}^{(T)}\right) & =P\left(\boldsymbol{x}^{(1)}\right) \times P\left(\boldsymbol{x}^{(2)} \mid \boldsymbol{x}^{(1)}\right) \times \cdots \times P\left(\boldsymbol{x}^{(T)} \mid \boldsymbol{x}^{(T-)}, \ldots, \boldsymbol{x}^{(1)}\right) \\ & =\prod_{t=1}^T P\left(\boldsymbol{x}^{(t)} \mid \boldsymbol{x}^{(t-1)}, \ldots, \boldsymbol{x}^{(1)}\right)\end{aligned}$
  • 그렇다면 어떻게 Language Model을 만들 수 있을까?

(1)-1. n-gram Language Models

  • 신경망 이전의 NLP를 진행한 방법. 매우 간단하지만 매우 효과적임
  • Definition : A n-gram is a chunk of n consecutive words. 연속적인 n개의 단어들의 집합임
  • ex) the students opend their ____ -> (the, student, opend, their) or (the students, students opened, opened their), ... 
  • Idea : 단순하게 각기 다른 n-grams의 등장 빈도 통계를 활용해 다음 단어를 예측함.
  • Markov assumption : $x^{(t+1)}$이 오직 이전의 $n-1$ 단어들에만 의존한다는 가정을 함. $\begin{aligned} P\left(\boldsymbol{x}^{(t+1)} \mid \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(1)}\right) & =P(\boldsymbol{x}^{(t+1)} \mid \overbrace{\boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}}^{n-1 \text { words }}) \\ & =\frac{P\left(\boldsymbol{x}^{(t+1)}, \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)}{P\left(\boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)}\end{aligned}$
  • 즉, 분모의 경우 (n-1) gram의 probability, 분자의 경우 n-gram의 probabiliity로 볼 수 있음. 
  • Question : 어떻게 이런 n-gram, (n-1) gram 확률값을 구할 수 있을까? 
    Answer : 매우 큰 corpus data에서 서로 다른 n-gram 발생을 Count함으로써! $\approx \frac{count( \boldsymbol{x}^{(t+1)}, \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)} )}{ count(\boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)})}$
  • 4-gram Language Model을 학습하는 상황을 가정해 보자. 
    • "as the proctor started the clock, the students opened their ______ "문장에서 단어 앞의 3개 단어를 제외하고 나머지 단어들을 버림(condition). 
    • 매우 큰 corpus dataset에서부터 "students opened their w" 문장이 얼마나 빈번하게 발생했는가를 계산한다. $P(\boldsymbol{w}|\textrm{students opened their}) = \frac{count(\textrm{students opened their w})}{count(\textrm{students opened their})}$ 
    • Markov assumption을 했기 때문에 이전 문맥 정보를 없애버렸기 때문에 정보를 많이 상실함. + 현재 사용하고 있는 단어가 3단어이기 때문에 3rd order Markov model과 일치함.
  • Sparsity Problems with n-gram Language Models 
    • Sparsity Problem 1. 위의 예제에서 "students opened their w"가 한번도 데이터에 등장하지 않았거나 매우 드물게 등장하는 경우가 종종 발생함. 따라서 동시등장확률이 0이 되거나 0에 매우 가까운 확률값을 갖게 됨.
      Partial Solution : small $\delta$를 모든 count에 더해줌. 이를 smoothing이라 한다.
    • Sparsity Problem 2. 더 큰 문제로 분모에 해당하는 "students opened their"가 한번도 등장하지 않았다면? 
      Partial Solution : backoff - "opened their" 2 단어만을 condition으로 활용하기. 
    • n order를 늘릴수록 이런 문제는 더 빈번하게 발생함. 보통 사람들은 5-gram model로 모델을 만드는데, 그럴 경우 vocab size를 훨씬 늘려야 효과적인 결과를 얻을 수 있다. 
    • Problem 3. Storage : 거대한 corpus 내에서 이 단어 sequence를 모두 계산해서 저장해야 하기 때문에 매우 용량을 많이 차지함.

(1)-2. How to build a neural Language Model? 

  • Input : sequence of words $ \boldsymbol{x}^{(1)}, \ldots, \boldsymbol{x}^{(T)}$
    Output : probability distribution of the next word $P\left(\boldsymbol{x}^{(t+1)} \mid \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(1)}\right)$
  • 지금까지 배운 것 중 가장 간단한 방법 - window-based neural model!
    어떤 context window를 가지고 있다면 이를 neural net model에 넣고 classifier로 최종 output을 예측함.

초기 모델 : A fixed-window neural Language Model

  • n-gram language model에서와 마찬가지로 멀리 떨어져 있는 문맥 정보를 버리고, fixed window 단어들을 neural net에 넣고, 단어 임베딩을 연결해 hidden layer에 넣고 최종적으로 softmax classifier 분류기에 넣어 다음 등장할 확률을 예측할 수 있음. 
  • Improvements over n-gram LM :
    - No sparsity problem, Don't need to store all observed n-gram
  • Remaining Problems : 
    - Fixed window is too small, Enlarging window enlarges W matrix, window can never be large enoguh. 또한 다런 위치의 단어들에 대한 모델의 공유가 없어 어느정도 위치 독립적인 구성요소를 이룸.
  • 따라서 어떤 길이의 문장도 처리할 수 있는 neural architecture가 필요하다!! -> RNN의 등장!