zyint's blog

[논문요약] Convolutional Neural Networks for Sentence Classification (EMNLP 2014) 본문

Machine learning /papers

[논문요약] Convolutional Neural Networks for Sentence Classification (EMNLP 2014)

진트­ 2018.07.28 17:35

Kim, Y. (2014). Convolutional Neural Networks for Sentence Classification. https://doi.org/10.3115/v1/D14-1181 


이 논문은 기존에 pretrain된 word embedding vector를 이용해서 문장을 vector로 표현하는 방법입니다.

문장을 벡터로 표현하고 분류를 하든 여러가지 어플리케이션에 적용할 수 있는데 이 논문에서는 classification 문제에 적용했습니다.

이때, Computer vision에서 많이 사용하는 convolution neural network를 사용하는데, 최근 질문 답변이나 다양한 논문 및 application에서 이 방방법을 기반으로 사용합니다.


그래서 나온지 4년된 논문임에도 인용 횟수가 많습니다. (좋겠다...)



그래서 간단하게 요약을 해보면 다음과 같은 구조입니다.


단계 1. pretrain한 단어 벡터를 준비합니다.

  • 논문에서는 Google News 100billion 단어(1000억개)를 학습한 word2vec를 사용하였습니다. 차원은 300차원
  • 혹시나 pretrained word vector에 등장하지 않는 단어들은 랜덤하게 벡터를 초기화하고 fine-tuning을 수행합니다.
  • Collobert(2011)[각주:1]가 Wikipedia로 학습한 데이터도 써봤다는데 성능이 좋지 않아서 Google꺼를 썼다고 합니다.
  • pretrain 단어 벡터만 쓸수도 있지만, 다른 방법도 있습니다. 이미지에서 RGB채널과 같이 텍스트에서도 채널을 넣는 방법인데,
    • 한 채널은 pretrained word embedding그대로 사용하고 finetuning하지 않게 합니다, 
    • 다른 채널은 pretrain word vector로 초기화한 fine tuning 가능한 벡터로만듭니다. 데이터마다 다르지만 (어쩌면) 정확도를 올릴 수 있습니다. 

단계 2. classification를 위한 학습/테스트 데이터를 준비합니다. 여러 문장이 있고 각각 문장별 레이블이 있어야 합니다.


단계 3. 논문에 Figure1이 전체 구조를 설명하고 있긴한데 명확하지 않아서 이해하기보다는 헷갈릴 수 있습니다.

  • 2단계의 문장에서 한 번에 h개 단어를 보도록 하고 (이걸 윈도우라고 합니다)
    • h개 단어의 벡터(1단계에 얻은 pretrained word vectors)를 concatenation 합니다. 즉, 300차원 * h 크기 만큼의 1차원 벡터가 만들어집니다.
단계 4. 한 윈도우 벡터 x와 weight vector를 곱하고 여기에 스칼라 값 bias를 더하고. non-linear activation function f를 통과시킵니다. 논문에는 실험할 때 ReLU를 사용합니다.


단계 5. 이렇게 단계3,4에서 한개 윈도우의 c_i 값을 계산하면 윈도우를 이동하면 한 개 문장에서 여러개의 값을 구할 수 있습니다. 이걸 벡터로 표현하면 다음과 같습니다. 이걸 feature map이라고 합니다.


단계 6. 문장마다 단어개수가 다르고, 그러면 문장마다 feature map의 개수가 달라지는데. 모든 문장마다 하다의 값을 갖게끔 feature map벡터 중 가장 큰 값 하나만 사용합니다. 이걸 유식하게 max-over-time pooling operation 이라고 부릅니다.


단계 7: 단계3~6 까지가 한개 filter로 1개 feature 값을 생성한 겁니다. filter는 weight vector w 를 표현하는 걸로, 윈도우 크기 h와 filter의 weight vector w를 초기화하는걸 달리하면서 여러개의 필터를 만들 수 있습니다. 논문에서는 실험에서 1개 윈도우 크기마다 100개의 filter를 만들어서 썼습니다. h는 3,4,5를 썼네요. 

즉, 이제 300개의 feature가 만들어 진겁니다.


단계8: fully connected softmax layer를 통과시킵니다. 

이 때 regularization인 dropout[각주:2]을 사용하는데 keep probability는 p=0.5로 사용했습니다.

이때, 학습과정에서는 dropout을 사용하고 

test time에는 dropout을 사용하지 않습니다. 그리고 학습된 벡터는 

와 같이 rescale해주며, Gradient descent step 이후

인 경우 l2-norm이 s와 같게 되게끔 rescaling해줍니다.

Dropout을 적용함으로써  실험적으로 2~4% 정도 정확도 향상이 있었다고 합니다.



논문의 주요 contribution 중 하나는 이렇게 embedding한 문장 벡터를 다양한 application에서 적용할 수 있었다는 점입니다.






  1. R. Collobert, J. Weston, L. Bottou, M. Karlen, K. Kavukcuglu, P. Kuksa. 2011. Natural Language Processing (Almost) from Scratch. Journal of Machine Learning Research 12:2493–2537. [본문으로]
  2. ® G. Hinton, N. Srivastava, A. Krizhevsky, I. Sutskever, R. Salakhutdinov. 2012. Improving neural networks by preventing co-adaptation of feature detectors. CoRR, abs/1207.0580. [본문으로]
1 Comments
댓글쓰기 폼