2주차(2) - Very Deep Convolutional Networks for Text Classification

2019. 1. 18. 16:19풀잎스쿨 NLP Bootcamp

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


  • 요약 & 배경 설명
이전 논문인 Character-level Convolutional Network for Text Classification에서 언급했듯이 Character-level(글자 단위)를 통한 Tokenization을 기반으로 한 ConvNet은 좋은 성능을 보였다. 하지만 이 논문에서도 언급했듯이, 최대 6개의 Conv. Layer까지 구현할 수 있었고, 그 이상의 Layer 갯수를 사용할 시, 성능이 저하된다고 밝힌바 있다.

하지만 Computer Vision에서는 VGG와 같은 16개 내지 19개의 Layer를 기반으로 한 모델이 나온 후, ResNet과 같이 101개 또는 151개의 Layer를 구성하는 등 매우 깊은 구조의 네트워크를 만들었고, 그 결과는 매우 성공적이었다. NLP에서는 과연 이렇게 깊은 네트워크를 구성하는 것이 정말 불가능한 일일까? 이 논문은 이렇게 깊은 네트워크를 이용하여 모델을 만들 경우, 얕은 않은 구조의 네트워크보다 훨신 나은 성능을 보인다고 말하고 있다.


  • VDCNN(Very Deep Convolutional Neural Network)의 구조

네트워크의 시작은 Lookup Table로 시작을 한다. Lookup Table에서는 (f0, s)의 크기를 가지는 2D 텐서(Tensor)를 생성하게 되는데, 여기서 s는 1024로 고정된다. 그리고 f0은 이미지에서 RGB에 해당하는 차원이라고 생각할 수 있다.


첫 Conv. Layer에서는 Size 3인 Convolution kernel 64개로 구성된다. 이 Layer는 Temporal Convolution이라고 부르는데, 이는 시간적인 정보(혹은 순서에 대한 정보)를 Convolution이 처리하고 있기 때문인 것으로 보인다. 처음 Temporal Convolution 이후에는 'Convolutional Block'이라고 불리는 구조를 쌓아나가는 구조로 구성되어있다.


VDCNN은 VGG와 ResNet에서 아이디어를 얻었기 때문에 네트워크를 디자인 함에 있어서 다음 두 규칙을 반드시 준수하도록 설계되어있다.

  1. 동일한 output temporal(시간적) resolution을 가지게 하도록 Layer들 간에서는 동일한 갯수의 feature map을 갖도록 한다.
  2. temporal resolution이 절반이 된 경우에는 이와 반대로 feature map의 갯수를 2배로 늘린다.
이러한 디자인은 네트워크에서 사용하는 메모리를 줄여주는데 도움이 된다. 또한 VDCNN은 3가지의 pooling 연산을 가지는데, 각각 출력 feature map의 갯수가 128, 256, 512개를 가지도록 출력할 때 적용된다. 여기서 각 convolutional block의 output은 512 x s_d만큼의 크기를 가지는데, s_d = s / 2^p의 값을 가지게 된다. 여기서 s는 위에서 언급했듯이 1024로 고정된 수치이다. 그리고 p값은 downsampling연산 횟수로서 각각의 값은 1, 2, 3에 해당된다. (s^2 = 2, 4, 8) 일단 우리가 다루고자 하는 input 문자는 s_d의 고정된 크기를 가진다는 점을 알고 있다면 문제가 조금이라도 더 쉽게 이해될 것이다.

하지만, 우리가 일반적으로 다루는 텍스트의 경우에 항상 길이가 고정되어있는 것이 아니다. 따라서 padding을 통해서 문자의 길이를 일정하도록 (여기서는 길이 s로) 맞춰주는 작업이 필요하게 된다. 


그리고 기존 모델에서의 ConvNet은 n-gram방식에서 기반한 방식을 사용하는데, 여러개의 다른 크기에 대한 convolution을 진행하는 방식이다. (3, 5, 7개의 Token을 단위로 해서 묶어서 Convolution을 진행하는 방식이 좋은 예시이다.) 이러한 방법에서 아이디어를 얻게 되었는데, convolution은 각기 다른 n-gram을 통해 가까운 Token간의 관계, 또는 먼 Token간의 관계에 대한 feature를 추출하게 된다는 것이다.


이 논문에서는 이러한 아이디어에 기반하여, Layer를 Block단위로 쌓아가며 결과적으로 9개의 Token간에 대한 정보를 추출하게 되는데, 사실 각각의 9개 모두에 대한 Token의 feature를 학습하는 것이 아닌 각기 다른 3-gram feature에 대한 조합을 기반으로 깊은 hierarchical한 구조에 대해 학습하게 되는 것이다. 사실 이러한 방법은 VGG 모델의 시간적 요소를 도입한 아이디어라고 이해해도 좋다. 


또한 ResNet 모델에서 아이디어를 얻은 만큼 ResNet에서 'shortcut 연결'이라고 부르는 방식을 도입하는데, 이는 identity mapping과 동일한 컨셉이라고 이해하면 좋다. (X(input) + f(X)(ConvNet 학습을 통해 나오는 조정값))


이 논문에서 주어진 목적은 Text Classification이었는데 이를 위해서 k-max pooling 방법을 통해 down-sampled된 결과를 고정된 차원수로 맞춰주었다. (128 x s/2이나 256 x s/4, 또는 512 x s/8) 또한 output과 관련이 있는 layer들(FC)에 대해서는 2048의 고정된 hidden unit갯수로 설정했다. 한가지 특이한 점은, 이전 논문들과는 달리 FC Layer들 사이에 regularization을 위해 drop-out방법을 사용하지 않고 Conv. Layer들 바로 다음에 Temporal Batch Normalization을 진행해 줬다는 것이다.


  • Convolutional Block



Convolutional Block에서는 위에서 언급했듯이 Conv. Layer 다음에 Batch Norm을 적용시키는 방법을 사용하고 있다. 또한 Activation function으로 ReLU를 사용하고 있다. 모든 Temporal convolution의 kernel size는 3으로 고정되어있으며, temporal resolution을 맞추기 위해 padding을 사용한다. Conv. Layer의 갯수는 아래의 표와 같다.

논문에서는 29개의 Layer갯수 뿐만이 아닌 9, 17, 29, 49개의 Layer를 가진 모델을 각각 만들어서 그 성능을 비교한다.


  • 사용 데이터셋
지난 논문에서의 contribution중 하나였던 대규모(large-scale) 데이터셋을 사용한다. 목록은 다음과 같다.


(지난 논문에서 이 데이터셋에 대해 언급했으므로 자세한 사항은 생략한다. 필요하다면 논문을 직접 참고하면 더욱 상세한 수치를 알 수 있다.)


  • 모델 셋팅
지난 논문과 같이 Character-level로 Token을 만들어 feature로 사용하게 된다. 각 문자는 "abcdefghijklmnopqrstuvwxyz0123456 789-,;.!?:’"/| #$%ˆ&*˜‘+=<>()[]{}"이고 (여기서 쌍따옴표는 해당되지 않는다!!!), 총 69개의 다른 Token으로 구성되어있다. Input text는 지난 논문과 동일한 1014의 고정된 길이를 가진다. Character embedding은 16의 크기를 가지며, 학습은 미니배치 128크기로 SGD를 통해 학습하도록 한다. 또한 learning rate는 0.01, momentum은 0.9로 설정한다.

  • 실험 결과
    • 깊이가 깊지 않은 모델에 대해서도 논문에서 제시한 ConvNet 구조를 사용할 경우 성능이 좋게 나온다.

(여기서 Convolution은 pooling을 사용하지 않은 모델, KMaxPooling은 동일한 Convolution 모델에 k-max pooling을 사용한 경우, MaxPooling은 동일한 Convolutional 모델에 k-max pooling이 아닌 전체에 대해 max pooling을 사용한 경우이다.)

  • 깊이가 깊을수록 성능이 개선됨을 보인다.
  • 다른 pooling 방법에 비해 Max-pooling을 사용할 경우 성능이 더 잘 나온다.
  • (2016년 당시의) SOTA를 훨씬 뛰어넘은 성능을 보인다.
  • Layer 29개를 넘겨서 학습할 경우, 성능이 오히려 더 떨어지는 현상을 보인다. (Shortcut 연결이 이러한 성능저하를 어느정도 막아주는데 도움을 준다고 해도)

  • 정리

이 논문의 contribution이라고 하면 역시 Layer를 깊게 쌓음으로써 성능을 더 좋게 할 수 있는 방법을 제시했다는 점이다. (여기서는 "benefit of depths"라고 표현한다.) 비록 이미지처럼 쉽사리 Deep 한 구조를 내기는 어렵지만 residual connection을 통한 방법이 NLP모델에서도 통용될 수 있다는 점을 보여줬다는 점을 봐야 할 것이다. 특이사항이라고 하면 지난 논문과는 달리 Text 데이터셋에 대해 Thesaurus를 이용한 Data Augmentation을 진행하지 않았다는 점인데, 이에 대해 논문에서는 굳이 사용하지 않아도 좋은 성능을 낼 수 있다는 점을 보여주기 위함이라고 밝히고 있다. 그리고 Data Augmentation을 사용할 경우, 성능이 더 떨어지는지 좋아지는지에 대한 실험은 하지 않았으며, 추후의 논문에서 이 부분에 대한 결과를 보여준다고 밝히고 있다.



후기: 개인적인 느낌은 'Computer Vision에서 쓰이는 방법이 2016년도부터 점차 넘어오기 시작했구나' 라는 인상을 받는다. 충분히 납득할 수 있는것이, Character-level을 기준으로 모델을 만들 경우 signal processing과 비슷한 것으로 이해를 할 경우, 여러가지 시도를 할 수 있었을지도 모른다는 느낌이다.