2019. 1. 26. 16:37ㆍ풀잎스쿨 NLP Bootcamp
참고자료: (도승헌님 발표자료)
논문링크: https://arxiv.org/pdf/1602.00367.pdf
Abstract
Contribution
Basic Building Blocks: Neural Network Layers
(a)모델은 ConvNet만을 이용한 모델이며, (b)모델은 Convolution-Recurrent Network모델이다. 두 모델 모두 Character-level Input을 사용한다. (a)모델의 경우 지난 논문 리뷰에서도 설명했으니 넘어가고, 이번 논문의 Contribution인 (b)모델에 대해 살펴보도록 한다.
이 모델은 크게 4개의 파트로 구성되어있다.
- Embedding Layer
- Convolutional Layer
- Recurrent Layer
- 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을 하는 방법은 다음과 같다.
Patience value도입
현재 상태에서 가장 낮은 Validation Loss가 0.5보다 낮을때, patience를 2배로 증가
Epoch # > Patience value라면 학습을 멈춤
이외의 모델의 세부적인 디테일은 아래 표를 참고하면 좋을 것이다. (여기서는 각각의 다른 크기의 모델을 비교하기 위해 여러 hyperparameter를 소개한다.)
Conclusion & Result
여기서는 각 데이터셋에 최적이라고 생각되는 모델 Parameter를 사용했다. 일단 Network부분에 대한 설명을 하다면, C는 ConvNet Layer의 갯수, R은 Recurrent Layer의 갯수, F는 Fully-Connected Layer의 갯수, 그리고 D는 dimensional feature vector를 의미한다. (위 그림에서 D에 해당한다고 보면 될 것이다)
결과는 조금 흥미로운 점이 몇가지가 있는데,
- Classification의 카테고리 갯수가 많을수록 좋은 성능을 보인다.
- 논문에서는 카테고리 갯수가 많을수록 디테일하고 손실없는 정보가 필요했기 때문으로 언급하고 있다.
- Convolution만을 사용한 모델에서는 이러한 local feature에 대한 정보가 유실되었기 때문으로 보고 있다.
- 데이터셋의 크기가 작을수록 좋은 성능을 보인다.
- 데이터셋의 크기가 작을수록 학습해야 하는 parameter의 갯수가 다르기 때문인 것으로 판단된다.
- ConvNet Layer가 2~3개일 경우 가장 좋은 성능을 보였다.
- ConvNet에서의 필터 갯수를 늘리는 것이 성능 향상에 크게 도움되지 않았다.
- NLP에서 RNN구조에서의 Drop-out 방법은 어떤 것이 있을까?
- Layer Normalization
- NLP에서의 Normalization은 Batch Normalization이 아닌 Layer Normalization을 뜻한다. 이는 NLP의 특성때문이다.
- Recurrent Drop-out
- Variational Drop-out
- 자연어 처리에서의 Data Augmentation을 어떻게 진행할까?
- Augmentation이 잘못되면 문장의 본래 의미가 소실되는 위험성이 있다.
- 유의어로 교체하는 모델이 있다.
- 번역 모델로 Augmentation을 하는 것이 가장 유용하게 쓰이고 있는 방법이다.