1주차 - Convolutional Neural Networks for Sentence Classification

2019. 1. 13. 10:33풀잎스쿨 NLP Bootcamp

이 포스트는 모두의 연구소 풀잎스쿨 과정인 NLP Bootcamp의 퍼실을 맡고 계시는 김보섭님의 자료를 참고하여 작성했습니다.

Convolutional Neural Networks for Sentence Classification_김보섭.pdf

논문 링크: https://arxiv.org/abs/1408.5882


내용 요약

  • Pre-trained word vectorConvolutional Neural Network를 이용하여, 다양한 sentence-level의 classification에서 좋은 성능을 보여줌
  • 여기서 중요한것은 pre-trained word vector를 사용했다는 점이다. (이 논문에서 처음 제안)

내용 상세

  • Word Vector

이 논문 이전에 CNN을 이용한 방식이 없던 것은 아니다. 이전에도 CNN을 통한 문장단위의 Classification 방법(Collobert et al., 2011)은 존재했다. 다만 이 논문에서 새롭게 제시한 점은 Pre-trained Word Vector를 사용할 경우, 완전히 Random하게 initialize하는 방법보다 더 성능이 잘 나온다는 점을 제안한다. 이러한 점은 비교를 위해 CNN-Rand와 CNN-Static을 비교함으로서 명확히 하고있다.


이렇게 Word Vector를 사용하는 점으로 두가지 이점을 가져갈 수 있는데, 하나는 Semantic한 의미를 포함한다는 점, 그리고 다른 하나는 Synthetic한 의미를 포함한다는 점이다. 여기서 Semantic하다는 것은 단어 자체가 내재된 의미를 포함한다는 뜻이다.


예시를 들어보면, King이라는 단어에는 성별이 남성이라는 의미를 포함하고 있다. 그리고 Queen이라는 단어에는 성별이 여성이라는 의미를 포함하고 있다. 여기서 Queen의 Word Vector에서 King의 Word Vector를 빼면, 내재된 의미만 남는 것이다. 이것을 Man이라는 단어에 더하게 되면 성인 여성을 의미하는 Woman이라는 단어가 나오게 된다.


반대로 Synthetic하다는 것은 단어가 포함하고 있는 직접적인 의미를 나타내는 것이다. 여기서도 예시를 들어보면, Walking과 Walked는 단어의 시점만 다를 뿐, 걷는다는 Synthetic한 의미는 동일하다. 때문에, Walked의 Word Vector에서 Walking을 뺀 후, Swimming이라는 단어의 Word Vector에 이것을 더해주게 되면 Swim의 과거 시점에 해당하는 단어인 Swam이 나오게 된다.


여기서 사용하는 Pre-trained Word Vector는 이러한 Synthetic 속성와 Semantic 속성을 모두 내포할 수 있게 되는 Universal Feature Extractor가 되는 것으로, 이를 이용하여 Convolution Neural Network의 학습을 제안하고자 하는 것이 이 논문의 주요 골자이다.


사족으로, 사실 실제 업무를 하다보면 알게 되는 점이, 최신의 Language Model 네트워크의 구조는 공개되어 있는 경우가 많지만, 이렇게 Word Vector를 어떻게 만드는가에 대한 언급은 거의 없기도 하고, 기업이나 연구단체에서도 잘 공개하지 않는다고 한다. 따라서 바로 이 Word Vector를 얼마나 잘 만드느냐가 NLP관련으로 일할 때 실력이 얼마나 있느냐에 대한 척도로 사용할 수도 있다고 한다.


또한 지금 시점(2019.01)에서 알아두면 좋은 Word Vector 방법에는 Fasttext, CBOW(목표 단어를 중심으로 주변 단어의 빈도를 기준으로 구성), word2vec이 있다.


  • 모델 구조



이 논문에서 제안한 CNN 구조는 완전히 새로운 것은 아니다. Collobert가 작성한 논문이 Natural Language Processing (almost) from Scratch (Collobert et al., 2011)에서 제안한 모델에서 약간 변형한 구조이다.

(https://arxiv.org/pdf/1103.0398.pdf)



입력 문장의 경우, n 길이의 문장에 대해 x1에서 xn까지의 합으로 표현이 되며, 각 단어는 Word Vector이다. (여기서 각 Word Vector의 값은 실수값을 가짐) 이렇게 사용되는 각 단어는 보통 Token이라고 불리며, 다른 논문에서도 비슷하게 칭하는 경우가 많다.




Convolution Layer에서 Filter당 계산시에는 Conv-Static과 Conv-Non Static 두 부분으로 나뉘게 된다. Conv-Static에서는 Pre-trained Word Vector를 그대로 사용하며, 학습하지 않고 고정된 Word Vector를 가지게 된다. 반면, Conv-Non Static에서는 Pre-trained Word Vector를 사용하는 점은 동일하지만, 학습을 통해서 Fine-tuning을 거치게 된다는 점이 다른 점이다. 이 모델에서는 하나의 Input에 대해 Conv-Static과 Conv-Non Static의 두 채널을 동시에 거치게 된다.


주의할 점은, Conv-Static과 Conv-Non Static이 동일한 Layer를 공유한다는 점이다. 이는 수식 내에서 bias에 해당되는 부분인 b_conv가 둘다 동일한 방식으로 표현되는 점과 weight에 해당되는 부분인 w_conv가 둘다 동일한 방식으로 표현되는 점으로 알 수 있다. (f: activation, w: weight, b: bias)


또한 논문에서는 1D Convolution구조라고 언급하고 있는데, 사진에서는 2D Convolution처럼 보여서 의문점이 들 수 있다. 이는 단방향으로 Kernel Filter가 거쳐가는 방식을 1D Convolution, 상하 방향이나 좌우 방향으로 Kernel Filter가 거쳐가는 방식을 2D Convolution이라고 칭하고 있기 때문이다. (그림 기준으로 위에서 아래에 해당되는 단방향 진행)


또 하나 주의할 점이, 위 그림에서 표현하는 Conv-Net의 Output의 채널이 한개가 아니라 4개로 표현되어있는데, 이 네트워크에서는 우리가 흔히 생각하듯이 여러개의 Filter를 거치기 때문에 여러개의 채널이 나올 수 있는 것이 아니다. 여기서는 Convolution을 거쳐서 나온 Output 4개가 모두 동일하다.



Convolution Network를 거치고 난 후, Feature를 선택할 때, Max-over-time으로 Feature중 가장 큰 값을 선택함으로서 Sentence를 가장 잘 표현할 수 있는 값을 고른다.



Fully-Connected Layer에서는 Masking Vector의 방식으로 일정 확률로 Drop-out을 적용한다. (수식에서는 r로 표현)

 

Training에서 Drop-out을 적용했던 것과는 달리, Test에서는 Drop-out을 적용하는 방식이 약간 다른데, 확률적으로 Drop-out Vector를 Masking해주는 것이 아니라, Dense Layer의(FC) Weight의 값에 p의 확률만큼 곱해준다.

(만약 p가 0.2라면 w_dense에 모두 0.2의 Scala값을 곱해주는 방식)


또한 여기서는 w_dense에 L2 Norm을 적용을 한다. 하지만 여기서도 주의할 점이 있는데, 우리가 일반적으로 알고있는 Regularization방법이 아니라는 점이다. 일반적으로 l2 norm으로 regularization을 한다고 하면 l2 norm penalty를 적용하는 방식을 지칭하는데, 여기서는 L2 Norm을 거치고 난 이후의 값이 constraint를 넘는다면 (여기선 3으로 설정) 해당 constraint값으로 고정시키는 방식을 적용했다. (Scale Normalization을 했다고 이해하면 편하다고 함)


  • Model Variation
실제로 논문에서 새롭게 제시한 방법 이외에도 비교를 위해 다양한 방법을 제시한다. 각 모델의 방법은 다음과 같다.
  1. CNN-Rand: Word Vector를 학습하기 위해 모든 단어에 대해 Random Initialization을 적용한다.
  2. CNN-Static: Pre-trained Word Vector를 사용하며, 이 Word Vector값들은 고정된 값으로 설정한다.
  3. CNN-non-static: Pre-trained Word Vector를 사용하며, 네트워크를 통해 학습하며 Fine-tuning을 진행한다.
  4. CNN-Multichannel: CNN-Static과 CNN-non-static 두 방법을 모두 사용하는 방법이다. 학습시에는 두 모델 모두 Forward propagate한 이후에 비교해서 더 성능이 좋은 모델만 back-propagation을 진행한다.

  • Hyperparameter
    1. 모델 크기: 1 Layer로 구성된 Convolution Network
    2. Filter Size: 3, 4, 5 단어, Feature Map사이즈 100
    3. Regularization: Drop-out(0.5), L2 Norm Constraint
    4. 미니 배치 사이즈: 50
    5. SGD with Adadelta (Adagrad로 해도 동일한 성능이 나오지만 학습에 더 오랜시간이 소요된다.)
    6. Word Vector: 1000억개의 단어로 이루어진 Google News 데이터셋으로 구성된 Pre-trained Word Vector
  • Result

결과에서도 볼 수 있지만, Pre-trained를 사용했을때에 비해 Random Initialization을 사용할 때는 전체적으로 더 안좋은 결과를 보였다. 하지만 TREC과 CR에서 CNN-Multichannel의 결과가 더 좋을 것이라는 예상과 달리 CNN-Multichannel은 항상 좋은 결과를 보이지 않았다. 또한 Regularization을 필요 이상으로 걸어도 좋은 성능을 보인다는 언급이 있다. (약 2~4%의 성능 개선을 보임)


  • Static vs. Non-static

위 표에서 보이듯이 Sentiment와 관련한 단어(bad, good)에 대해 두 방법에 대한 결과가 다르다. Static의 경우 bad라는 단어에 대해 Semantic한 의미를 제일 많이 담고있는 good을 가장 가까운 단어로 지정하는 반면 Non-static의 경우 가장 유사한 뜻을 가지고 있는 terrible을 가장 가까운 단어로 지정한다. 이를 통해 Fine-tuning이 어떤 결과를 내는지 확인할 수 있다.


  • Pre-trained에 없는 단어의 경우
만약 word2vec에 없는 단어가 나올경우는 각 Feature Vector의 최소/최대값을 기준으로 Variance를 감안해서 Random Initialization을 진행한다. 현재(2019.01기준)으로도 없는 단어에 대한 Consensus는 특별하게 지정되지 않았다.


결론

결국 이 논문에서 제시하는 바는 word2vec으로 만들어진 Pre-trained Word Vector를 사용했을시 Significant한 성능 개선을 이룰 수 있다는 바이다. (다른 Word Vector에 비해 성능이 더 좋다는 언급이 있음)