3주차(2) - Efficient Character-level Document Classification by Combining Convolution and Recurrent Layers

2019. 1. 26. 16:37풀잎스쿨 NLP Bootcamp

참고자료: (도승헌님 발표자료)

(수정)P5. Efficient Character-level Document Classification by Combining Convolution and Recurrent Layers.pdf

논문링크: https://arxiv.org/pdf/1602.00367.pdf


Abstract

기존 방식에서는 문서를 분류/클러스터링 하는 방법이 Word-level에 기반하였다. 이러한 방법은 Convolutional Network(이하 ConvNet)에 기반한다. 새로이 연구된 방식들은 다수의 ConvNet Layer를 쌓아서 좀더 넓은 범위의 단어를 고려하도록 디자인 되었으며, 이 모델의 성능 또한 괜찮은 결과를 보였다.

이런 모델들의 구조는 크게 두 파트로 구성되어있는데, 하나는 Feature Extraction을 담당하는 부분이 있으며, 다른 하나는 Classification을 담당하는 부분으로 이루어져 있다. 기존 논문에서 제시한 ConvNet의 방식은 Feature Extraction을 위해 다수의 Layer를 쌓도록 고안되었다.

하지만 이러한 방식은 통계적 관점으로 볼 때 매우 비효율적이다. 이는 각 단어 토큰을 각각 고려하는 방식이기 때문인데 이러한 토큰들을 계산할 때의 parameter의 갯수는 고정되어있기 때문이다. 이렇게 되면 단어의 기본 형태나 접두사/접미사가 동일한 단어들에 대해 따로 계산해 줘야하는 점이 문제로 발생한다. 물론 이러한 방법들을 외부적인 방법으로 해결하는 방법은 존재하지만, 이 경우에 언어 자체의 특성에 많이 의존하게 된다는 점이 생긴다.

또한 이렇게 Word-level로 고려할 경우, vocabulary에 없는 단어들에 대해서는 고려하기가 힘들다. Word-level로 접근할 시에는 이러한 단어들을 <UNK>(Unknown) 토큰으로 설정하는 것이 일반적인데, 이 경우에는 단어 자체가 굉장히 드문 빈도로 사용되는 케이스에 대해 <UNK>토큰으로 인식해버리는 문제점이 생긴다. 또한 단어 자체에 오타가 있거나, 축약어와 같은 케이스를 감안하기 힘들게 된다.

이러한 문제점을 해결하기 위해 Character-level로 접근하는 시도가 제시된다. 또한 ConvNet의 특성상 필터가 Input 전체가 아닌 일부분에 대한 정보만 포함할 수 밖에 없으므로 이러한 문제점을 LSTM을 사용함으로써 해결하고자 한다. 이런 방식으로 접근할 경우, ConvNet Layer를 많이 쌓는 방식에 비해 Parameter갯수가 훨씬 적다는 장점이 있다. 이는 곧 연산이 좀더 효율적으로 진행될 수 있다는 뜻이다.

Contribution

Basic Building Blocks: Neural Network Layers

(a)모델은 ConvNet만을 이용한 모델이며, (b)모델은 Convolution-Recurrent Network모델이다. 두 모델 모두 Character-level Input을 사용한다. (a)모델의 경우 지난 논문 리뷰에서도 설명했으니 넘어가고, 이번 논문의 Contribution인 (b)모델에 대해 살펴보도록 한다.


이 모델은 크게 4개의 파트로 구성되어있다.

  1. Embedding Layer
  2. Convolutional Layer
  3. Recurrent Layer
  4. Classification Layer

Embedding Layer는 일단 문서 전체를 하나의 sequence라고 간주한다. 그 다음, 각각의 글자/토큰에 대해 글자 Vocabulary를 기반으로 One-hot Encoding을 진행한다. 여기서 사용된 글자의 갯수는 총 96개이다.

이렇게 Encoding된 sequence는 다시 8 dimension으로 encoding된다. (논문에서는 d-dimensional로 설명하고 있다.) 여기까지가 Embedding Layer의 내용이다.

ConvNet Layer에서는 이렇게 Encoding된 Sequence를 더 짧은 sequence로 만들기 위해 Convolution연산을 진행한다. 여기서 Convolution연산은 tanh나 sigmoid함수와 같은 non-linear function을 적용한다.


이렇게 Convolution연산을 진행하고 나면 T`길이의 Sequence를 받게 된다.

이러한 Output을 받고 난 후에는 전 논문들에서 사용했던 방법인 Max-pooling (기존방식에서는 Max-over-time pooling으로 지칭)을 사용하여 sequence를 가장 잘 나타내주는 Feature만 남긴다. 여기까지가 모델 그림에서의 Convolutional Layers부분이다.

ConvNet의 Output sequence를 이용해서 Classification하기 위해 LSTM을 이용한 recursive연산을 진행한다. (Recurrent Layer) 여기서는 연산을 거친 sequence내의 input vector를 순서대로 넣어줌으로써 기억해야할 정보와 기억하지 않아도 될 정보를 구분한 후, sequence전체에 대해 Classification을 진행한다. (LSTM구조의 자세한 설명은 생략)


여기서 한가지 중요한점이, 보통 sequence를 넣을 경우에는 언어가 진행하는 방향으로 순차적으로 넣는 것이 일반적이다. 하지만 이렇게 진행할 경우, sequence의 초반에 있는 input vector는 적은 정보만을 가지고 연산이 진행되며, 상대적으로 sequence의 후반에 있는 input vector는 초반에 있는 input vector보다 훨씬 많은 정보를 가지고 연산이 진행 될 것이다. 이 경우, 연산에 사용되는 정보의 불균형이 일어나게 된다는 문제점이 생긴다.


이러한 점을 해결하기 위해 이 논문에서는 Bidirectional LSTM이다. 쉽게 말해 정방향/역방향 두종류의 LSTM을 사용하는 것으로 이해할 수 있다. 이렇게 나온 두가지 Output을 Concatenate하는 것까지가 Recurrent Layer 부분이다.

마지막으로 Classification Layer에서는 Softmax 연산을 진행한다.


여기서 K는 Classification하고자 하는 카테고리의 갯수이며, Wk, bk는 각각 weight와 bias이다.


Model details

이 모델에서 사용된 Optimizer는 AdaDelta이며 p=0.95, epsioln=10^-5를 사용했다. Batch Size는 128로 설정했으며 Gradient Norm (Gradient Clipping)은 5로 설정했다. (Gradient가 5보다 커지면 5로 설정)


또한 Early stopping을 사용하는 학습방법을 사용하였는데, patience value라는 것을 사용한다. 여기서 Early stopping을 하는 방법은 다음과 같다.

  1. Patience value도입

  2. 현재 상태에서 가장 낮은 Validation Loss가 0.5보다 낮을때, patience를 2배로 증가

  3. Epoch # > Patience value라면 학습을 멈춤


이외의 모델의 세부적인 디테일은 아래 표를 참고하면 좋을 것이다. (여기서는 각각의 다른 크기의 모델을 비교하기 위해 여러 hyperparameter를 소개한다.)



Conclusion & Result

여기서는 각 데이터셋에 최적이라고 생각되는 모델 Parameter를 사용했다. 일단 Network부분에 대한 설명을 하다면, C는 ConvNet Layer의 갯수, R은 Recurrent Layer의 갯수, F는 Fully-Connected Layer의 갯수, 그리고 D는 dimensional feature vector를 의미한다. (위 그림에서 D에 해당한다고 보면 될 것이다)


결과는 조금 흥미로운 점이 몇가지가 있는데,

  1. Classification의 카테고리 갯수가 많을수록 좋은 성능을 보인다.
    • 논문에서는 카테고리 갯수가 많을수록 디테일하고 손실없는 정보가 필요했기 때문으로 언급하고 있다.
    • Convolution만을 사용한 모델에서는 이러한 local feature에 대한 정보가 유실되었기 때문으로 보고 있다.
  2. 데이터셋의 크기가 작을수록 좋은 성능을 보인다.
    • 데이터셋의 크기가 작을수록 학습해야 하는 parameter의 갯수가 다르기 때문인 것으로 판단된다.
  3. ConvNet Layer가 2~3개일 경우 가장 좋은 성능을 보였다.
  4. ConvNet에서의 필터 갯수를 늘리는 것이 성능 향상에 크게 도움되지 않았다.
와 같은 점이었다. 딥러닝이 잘 학습하기 위해서는 무조건 많은 데이터가 필요하다는 점과는 상반된다는 점이 눈에 띈다.



세션 내 Q&A
  • NLP에서 RNN구조에서의 Drop-out 방법은 어떤 것이 있을까?
    • Layer Normalization
      • NLP에서의 Normalization은 Batch Normalization이 아닌 Layer Normalization을 뜻한다. 이는 NLP의 특성때문이다.
    • Recurrent Drop-out
    • Variational Drop-out
  • 자연어 처리에서의 Data Augmentation을 어떻게 진행할까?
    • Augmentation이 잘못되면 문장의 본래 의미가 소실되는 위험성이 있다.
    • 유의어로 교체하는 모델이 있다.
    • 번역 모델로 Augmentation을 하는 것이 가장 유용하게 쓰이고 있는 방법이다.

후기: 별다른 감상은 없고, Recurrent Layer가 정말 Efficient할까? 라는 의문이 드는 논문이었다. GPU의 병렬처리 특성상 ConvNet이 RNN보다 훨씬 Benefit을 많이 받는다고 알려져 있기 때문에, ConvNet과 RNN을 선택하는 문제는 항상 고민이 될 것으로 보인다.