작성자: 세종대학교 데이터사이언스학과 이정은
해당 포스팅은 ToBigs 텍스트 심화세미나에서 발표를 진행했습니다.
https://velog.io/@tobigs-text1415/Lecture-11-Convolutional-Networks-for-NLP
이번 강의에서는 CNN을 사용한 Text Classification에 대해 설명합니다.
기존 RNN은 prefix context없이 phrase를 잡아낼 수 없고, 마지막 단어 벡터의 영향을 많이 받는 문제를 가지고 있었습니다.
CNN을 텍스트 처리에 사용하고자 한 메인 아이디어는 "문장 내 가능한 모든 단어 subsequence의 representation을 계산하면 어떨까?"였습니다.
이 방법은 해당 구문이 문법적으로 옳은지 판단할 수 없고, linguistically하지 않은 것 같다는 단점이 있습니다.
일반적으로 CNN은 이미지 처리에서 주로 쓰이며 2D convolution을 사용하지만, 텍스트 처리에서는 filter가 위아래 한 방향으로만 이동하는 1D Convolution을 사용합니다.
Input은 문장 내 각 단어를 나타내는 dense word vector입니다. (one-hot vector도 가능합니다.) Input의 크기는 단어 개수 x word vector의 차원, Filter의 크기는 한번에 보고자 하는 단어의 개수 x word vector의 차원입니다.
Filter는 polite/non-polite, about food/non about food 등의 특징을 나타냅니다.
한 개의 Filter가 위에서 아래로 이동하며 내적을 진행하면 output은 single vector인 5x1이 됩니다. 3개의 filter를 사용하면 output의 크기는 5x3으로 filter의 개수만큼 늘어납니다.
이때, 문장 내 단어의 개수는 7개에서 5개로 줄어들어 문장이 shrunk됩니다. 이를 해결하기 위해 padding을 사용합니다.
padding=1을 적용하면, input과 동일한 길이의 output을 얻을 수 있습니다.
Pooling은 특징들을 요약하는 역할을 합니다. Pooling에는 최대값을 가져오는 Max pooling과 평균값을 사용하는 Average pooling이 있습니다. 더 많이 사용되는 것은 max pooling인데, 그 이유는 자연어 처리에서 특징이 나타나는 경우는 매우 sparse하기 때문입니다. 예를 들어, polite라는 특징은 접속사, 관사 등에서는 나타날 수 없고, 그 외의 특정 단어에서 polite함이 드러날 것 입니다. 이때 이 특징을 max pooling이 더 잘 포착할 수 있다고 합니다.
Stride는 filter가 한번에 이동하는 거리를 나타냅니다. Stride=2와 Stride=2 & local max pooling은 둘 다 representation을 압축하여 생성하지만, 다른 결과값을 가집니다. 실제 텍스트 처리에서는 많이 사용되지 않습니다.
K-Max Pooling은 각 열에서 max값 k개를 선정하는 방법으로, 해당 값은 정렬 시키지 않고 위 열의 동일하게 가져옵니다.
Dilation rate는 filter 사이의 간격을 의미합니다. 즉, dilation=2인 3x3 filter는 dilation만큼 건너 뛰어 연산을 진행합니다. NLP에서의 dilated convolution은 적은 parameter로 더 넓은 범위를 볼 수 있게 합니다.
이미지 처리에서의 Dilation
https://zzsza.github.io/data/2018/02/23/introduction-convolution/
문장 자체의 의미를 중점적으로 이해하고 싶다면, filter의 크기를 증가시키거나 dilated convolution을 사용하여 한번에 보는 범위를 늘릴 수 있습니다. 혹은 CNN의 depth를 증가시키면 됩니다.
"Yoon Kim(2014): Convolutional Neural Networks for Sentence Classification. EMNLP 2014."
해당 논문의 목적은 Sentence classification입니다.
Convolution 연산은 word vectors을 concatenate하여 진행합니다. 한 채널에 대한 연산 결과는 c_i로 나타낼 수 있고, feature map c는 n개의 단어와 window size=h일 때 n-h+1 차원을 가지게 됩니다.
feature map c를 max pooling하여 각 channel마다 하나의 값을 얻습니다. max pooling을 하면 filter weight와 window size, 문장 길이의 변화에 강해집니다.
Max pooling 이후 나온 feature vector에 softmax를 취하여 클래스 분류를 진행합니다.
실제 모델에서는 filter size=2,3,4인 filter를 feature map으로 각 100개씩 사용하였습니다. pre-trained word vector를 사용하여 초기화하고, fine-tuning과 frozen을 모두 사용했습니다. 그리고 Dropout과 각 클래스의 softmax weight를 L2 normalize했습니다.
해당 모델은 간단한 single layer CNN으로 유의미한 분류 결과를 낸 것에 의의가 있습니다.
Batch Normalization은 CNN에서 주로 사용며, 배치별로 평균=0, 분산=1로 정규화시키는 작업입니다. 이를 수행하면 Convolution block이 항상 같은 scale을 가지기 때문에 안정적인 학습이 가능해집니다. 또한, parameter initialization에 덜 예민해지고 learning rate tuning이 한결 쉬워집니다.
Batch Nomralization / Layer Normalization
https://yonghyuc.wordpress.com/2020/03/04/batch-norm-vs-layer-norm/
1x1 크기의 filter로, 적은 parameter 개수로 channel의 수를 줄일 수 있습니다.
seq2seq 이전에 나온 translation 모델로, encode로 CNN & decoder로 RNN을 사용한 모델입니다.
"Conneau, Schwenk, Lecun, Barrault(2017): Very Deep Convolutional Networks for Text Classification. EACL 2017."
해당 논문에서는 text classification을 위한 deep한 CNN 모델을 제안합니다.
VD-CNN의 모델 구조는 다음과 같습니다. VGGnet, ResNet과 비슷한 구조를 가집니다.
실험에는 large text classification dataset들을 사용하였고, layer가 깊을수록 error값이 낮은 것을 확인할 수 있습니다. 해당 표에는 기재되어 있지 않지만 depth=47이 depth=29보다 낮은 성능을 보였다고 합니다. 즉, NLP 분야는 depth=34가 minimum인 이미지 분야처럼 deep한 모델을 사용하기는 어렵다는 것을 의미합니다.
RNN은 parallelize가 어려워 느리다는 단점을 가집니다. 이를 개선하기 위해 parallelize가 쉬운 CNN과 결합한 모델이 Quasi-Recurrent Neural Network입니다. 두 모델의 장점만을 가져와 Convolution과 Pooling을 통해 sequencial data를 parell로 처리합니다. 해당 모델은Sentiment classification을 진행했을 때, LSTM과 비슷한 성능을 내지만 3배 빠른 속도를 보였다고 합니다.
참고자료
https://arxiv.org/pdf/1408.5882.pdf
https://zzsza.github.io/data/2018/02/23/introduction-convolution/
https://happyzipsa.tistory.com/10
https://hwkim94.github.io/deeplearning/rnn/qrnn/paperreview/2018/03/02/QRNN1.html