2주차(1) - Character-level Convolutional Networks for Text Classification

2019. 1. 18. 15:47풀잎스쿨 NLP Bootcamp

  • 배경설명

2015년에 이 논문이 나오기 전까지 Text Classification을 하고자 할 때는 Convolution Network (이하 Conv-Net), 그리고 RNN을 통한 방법이 쓰였다. 그리고 이러한 방법을 사용할 경우, 문장/문단/문서를 Token으로 분할하게 되는데, 이 Token의 단위는 보통 Word(단어)단위였다. 이는 지난 논문에서 설명했듯이 단어를 사용할 경우 단어 내의 Semantic 의미와 Synthetic의미를 보존해야 NLP Task를 위한 모델의 성능이 잘 나온다는 인식이 있었기 때문이다.


 하지만 이 논문에서는 Word단위의 Token대신 Character(글자, 알파벳)단위를 사용함으로써 꼭 Word단위를 사용하지 않아도 NLP Task에 대해서 충분히 좋은 성능을 낼 수 있다고 주장한다. 이렇게 Character-level의 단위를 Tokening을 사용하고자 하는 시도는 이 논문에서 처음 제시되었다고 주장한다.


  • Character-level Conv-Net
글자 단위의 Conv-Net을 만들기 위해 1-D Convolution을 사용한다. 여기서는 고정된 input function과 kernel function을 가지고 있으며, 이는 우리가 흔히 알고 있는 Conv-Net에서의 kernel (또는 filter) 구조라고 생각해도 된다. 또한 기존 NLP모델에서 Conv-Net을 사용할 때, 매우 얕은 Network를 구성할 수 밖에 없었는데, 여기서는 6개의 Conv-Net과 3개의 FC(Fully-Connected) Layer를 사용하는 모델을 제시한다. 이렇게 여러개의 Layer를 쌓을 수 있던 이유는 rectifier 또는 threshold function이라고 불리는 방식을 사용했기 때문인데, 많이 알려진 방법인 ReLU와 동일한 방법이다. (h(x) = max{0, x})

  • Character quantization
이 논문에서 글자 단위로 Tokenization을 진행할 때 사용했던 글자는 총 70가지이며, 다음과 같이 구성되어있다.
  1. 알파벳: abcdef.....wxyz (총 26개)
  2. 숫자: 012...90 (총 10개)
  3. 특수문자: -,;.!?:’’’/\|_@#$%ˆ&* ̃‘+-=<>()[]{} (총 33개)
  4. 개행문자 (1개)
또한 문자들을 encoding하는 방법으로는 one-hot encoding이라는 방법이 쓰였는데, 이는 index중 해당되는 index의 값만 1로 바꿔주는 방식이다. (예: [0, 0, 0, 1, 0, 0, ..., 0] = 4번째에 해당하는 글자 = d)

그리고 논문에서 사용한 글자들이 알파벳 기준이다보니 대문자/소문자를 구분하느냐의 여부도 살펴보게 되었다. (나중에 다시 언급)

  • 모델 구조/디자인
이 논문에서는 하나의 정해진 모델을 제시한 것이 아닌 Large/Small의 두종류의 모델을 제안한다. 두 모델 모두 총 9개의 Layer로 구성되어 있으며, 6개의 Conv-Net과 3개의 FC(Fully-Connected) Layer로 구성되어있다.


Input에서의 Feature갯수는 70개이며, input의 길이는 1014로 설정되어있다. (하지만 용도에 따라서 input 길이는 언제든지 조정할 수 있다) 또한 regularization을 위해 FC Layer 3개 사이사이에 Dropout을 0.5의 확률로 적용시키는 구조로 되어있다. Layer의 상세 수치는 다음과 같다.

Conv-Net에서는 1,2번째 Layer에서는 Kernel크기가 7이며, 나머지 Conv-Net Layer에서는 Kernel크기 3을 사용하고 있다. 또한 Large모델과 Small모델의 parameter가 다른 것을 볼 수 있다.

Fully-Connected Layer에서는 Large모델과 Small모델에 따라 FC의 크기가 달라지는 것 이외에는 차이를 보이지 않는다.


  • Data Augmentation
Computer Vision에서는 데이터의 양을 늘리기 위해 roation이나 noise를 넣거나 하는 방식으로 data augmentation을 하는 것이 일반적으로 쓰인다. NLP에서의 augmentation은 Computer Vision에서 쓰이는 방법을 그대로 쓸 수는 없다. 따라서 문장에서의 단어를 동의어 사전(thesaurus)을 이용하여 동일한 의미를 가진 다른 단어인 동의어로 바꿔서 같은 의미를 가지나 다른 단어로 구성되어있는 데이터를 생성해 낸다.

사실 사람이 직접 문장을 보고 동일한 의미를 가진 새로운 문장을 만들어내는 것이 가장 이상적인 방법이겠지만, 그렇게 진행할 경우 시간적인 비용과 노력이 매우 많이 소모가 된다. 이러한 점을 피하기 위해 동의어 사전을 사용하여 문장 내의 단어를 동의어로 대치하는 방법을 사용하는 방식을 도입한다.

또한 어떠한 단어를 대치해야할지 결정하기 위해 문서 내에서 단어의 빈도수를 측정하여 순위를 결정한 후, 순위에 따라 단어를 대체할지의 여부를 결정하는 방식을 사용했다.

  • 기존 방법과의 비교
기존 방법과의 비교를 위해서 다음과 같은 기존 방법들을 기반으로 multinomial logistic regression 모델을 만들었다.
  1. Bag-of-words 기준의 TFIDF (term-frequency inverse-document-frequency)
  2. Bag-of-ngrams 기준의 TFIDF
  3. Word Embedding에서의 Bag-of-means

TFIDF란 문서 내에서의 단어 빈도수의 비율을 기준으로 단어의 확률을 정하는 embedding 방법이다. 예를 들자면, 문서 내에서 단어의 총 갯수가 10,000개라고 가정할때 만약 문서 내에서 the라는 단어가 900번이 나왔다면 900 / 10,000 = 0.09가 되는 방식이다.


  • 딥러닝 방법과의 비교
이 논문 이전에 사용했던 딥러닝 방법과의 비교를 위해서 다음과 같은 방법을 기반으로 모델을 만들었다.
  1. Word-based Conv-Net: Conv-Net의 구조 자체는 정확히 동일하게 가져가며, 이를 위해서 Layer의 갯수와 Output의 크기를 동일하게 설정했다.
  2. LSTM(Long-short term memory): 각 cell에서의 output을 모두 더해 평균을 낸 후, 이를 기준으로 classification을 진행한다.


  • 알파벳에서의 선택

영어는 대/소문자로 구분될 수 있기 때문에 대/소문자의 구분을 하는가의 여부를 결정할 필요가 있다. 이 논문에서 실험했을 때에는 대소문자를 구분하는 것이 오히려 성능에 안좋은 영향을 보였다고 나온다. 이에 대한 이유로 대소문자가 다르다고해서 semantic의미가 달라지는 것이 아니기 때문으로 판단하고 있다.


  • 대규모 데이터셋과 결과
이 논문이 의미있는 이유중 하나이다. 기존 open-source 데이터셋은 소규모의 데이터셋 밖에 존재하지 않았기 때문에 character-level Conv-Net을 위해 대규모 데이터셋을 직접 만들었다고 한다. 목록과 상세 정보는 다음과 같다.


또한 각 데이터셋을 통한 결과를 표로 보여준다.


위 표에서 볼 수 있듯이 Character-level Conv-Net이 항상 좋은 성능을 내는 것은 아니다. 상대적으로 소규모의 데이터셋의 경우에는 기존의 방법이 더 좋은 성능을 보였으며, 대규모의 데이터셋 간(예: Yahoo! Answers vs Amazon Reviews)에도 데이터의 질에 따라 오차율(percent of error)이 상당히 차이나는 것을 볼 수 있다.


  • 결론
논문에서는 실험을 통해서 다음과 같은 결론을 내린다.
    • 글자 단위의 Conv-Net은 충분히 효과적이다.
      • 충분한 성능을 낼 수 있으며, 이를 통해 우리는 언어 내 글자단위의 Token을 음성처리/소리에서의 Signal과 같이 봐도 좋을 것이다. (아래의 그림은 첫번째 Layer의 결과를 시각적으로 나타낸 것이다.

    • 데이터셋의 크기는 기존 모델과 Conv-Net모델 중 어느 것의 성능이 더 좋을지를 결정한다.
    • Conv-Net은 데이터의 질이 좋을 수록 더 잘 작동한다.
      • 예를들자면, Amazon의 상품 리뷰는 정성을 들여서 쓸 필요가 없으므로 데이터가 상대적으로 품질이 그렇게 좋지 않은 반면 Yahoo!의 질문답변 데이터는 상대방의 선택을 받아야 할 필요성이 있으므로 정성들여서 쓰는 경향때문에 데이터의 품질이 Amazon 리뷰에 비해 상대적으로 더 좋다. (때문에 더 낮은 오차율을 보인다.)
    • 알파벳의 대소문자를 구분하지 않는 것이 구분하는 것에 비해 더 나은 성능을 보인다. 이는 regularization효과로 보인다.
    • Word2Vec에서 Bag-of-means를 쓰는 것은 잘못된 사용이다.
    • 모든 Task에서 좋은 성능을 보이는 모델은 없다.


후기: Character-level Conv-Net은 충분히 좋은 모델이고 또 좋은 성능을 낼 수 있지만 이런 성능을 내기 위해서는 여러가지 점들이 고려되어야 하는 것으로 보인다. 때문에 NLP에 대한 도메인 지식과 Conv-Net, 또는 RNN과 같은 네트워크 구조의 이해는 시간이 지날수록 더욱 필수적이 될 것이라는 생각이 든다.