Anti Math Math Club

Data Augmentation in Natural Language Processing 본문

Machine Learning & Deep Learning/Natural Language Processing

Data Augmentation in Natural Language Processing

seewoo5 2020. 7. 11. 23:04

보통 머신러닝 혹은 딥러닝 연구에서 어떤 문제를 풀 때 데이터가 부족한 경우 해결책으로써 가장 많이 생각하는 방법은 data augmentation 혹은 transfer learning (pre-training & fine-tuning) 입니다. 전자는 기존에 존재하는 데이터를 특정 방식으로 변형하여 비슷한 가상의 데이터를 만들어내는 것이고, 후자는 같은 도메인이지만 훨씬 더 크기가 큰 데이터에 대해서 모델을 먼저 훈련시킨 뒤 (pre-training), 원래의 데이터에 맞게 파라미터를 미세하게 조정해주는 (fine-tuning) 방법입니다. CV(Computer Vision)에서는 data augmentation 기법으로는 주어진 이미지를 자르고 붙이고 늘이고 뒤집는 등의 방법이 있고, transfer learning으로는 주로 ImageNet에 pre-train된 모델의 파라미터를 가져와서 fine-tuning하는 방법을 사용합니다. 

 

NLP의 경우에는 이전의 Word2Vec, ELMo등과 최근의 GPT, BERT(와 친구들인 ALBERT, RoBERTa, SpanBERT 등), ELECTRA, BART 등 다양한 pre-training 기법들이 소개되었습니다. (그리고 pre-training하는 dataset으로는 Wikipedia같이 거대한 corpus가 사용되고는 합니다.) 이에 대해서는 나중에 하나씩 소개하도록 하고, 이번 포스트에서는 NLP에서의 여러 data augmentation 기법에 대해서 알아보도록 하겠습니다. 

 

Data Augmentation의 가장 큰 특징 중 하나는 데이터의 도메인에 따라서 그 방법이 매우 달라진다는 것 입니다. CV의 경우 대부분 2차원의 이미지를 다루고, 분류문제를 푼다고 할 때는 이미지를 자르거나 변형했을 때 그 label이 쉽게 변하지 않는다는 점을 이용합니다. 하지만, NLP의 경우에는 단어 하나를 바꿨을 때 그 문장의 의미가 완전히 달라질 수 있기 때문에 CV의 여러가지 방법론을 바로 적용할 수는 없습니다. 예를 들어서, "This is the best movie I've ever seen"이라는 문장에서 best를 worst로 바꾸거나, 혹은 not이라는 단어를 앞에 끼워넣게 되면 문장의 의미(긍정 혹은 부정)가 완전이 바뀌게 됩니다. 그렇기 때문에 좀 더 조심해서 augmentation을 할 필요가 있습니다. 

 

NLP의 데이터는 기본적으로 문자 혹은 단어의 sequence이므로, NLP에서의 augmentation은 sequence를 어떻게 변형하는지의 문제로 귀결됩니다. 결국에는 sequence의 일부에 변형을 가하거나 sequence 자체를 만들어내는 방법을 사용할텐데, 가장 쉬운 방법인 바꿔치기(replacement)부터 설명하도록 하겠습니다. 

 

Replacement

이미지를 자르고 붙이는 것 처럼 문장 역시 기존의 단어를 삭제하거나 새로운 단어를 끼워넣고, 혹은 다른 단어로 대체하는 방법을 생각할 수 있습니다. 이 때, 새로운 단어로 대체(replace)하는 방법으로는 다음과 같은 접근들이 있습니다. 

 

1) Synonym replacement

가장 간단한 방법으로, 기존의 단어를 비슷한 의미를 가지는 다른 단어(synonym)로 바꿔치는 방법입니다. 여기서 비슷한 의미를 갖는 단어는 사람의 도움이 필요하게 되고, 이는 유의어 사전(thesaurus)의 도움을 받아야 합니다. Character-level Convolutional Networks for Text Classification이라는 논문에서는 geometric distribution에 따라서 synonym replacement를 적용함으로써 분류모델의 성능을 높였습니다. 

 

2) Similar embedding replacement

비슷한 단어로 기존 단어를 대체할 때 정말로 synonym을 사용하는 방법도 있겠지만, 모델을 통해서 학습된 word embedding vector를 기준으로 비슷한 정도를 판단할 수도 있을 것입니다. 이는 사람의 손으로 label을 달 필요가 없다는 장점이 있고, 단어의 뜻 자체는 다르지만 단어가 바뀐 전체 문장의 label 자체는 비슷할 수도 있다는 장점이 있습니다. 예를 들어서, "This is the best movie I've ever seen"에서 movie가 actor로 대체된다면 실제 문장의 의미는 달라지지만 문장 자체의 label은 바뀌지 않을 것입니다. 

Embedding vector의 비슷함을 정의하기 위한 방법으로는 kNN (k-Nearest Neighborhood)과 consine similarity가 있고, That’s So Annoying!!!: A Lexical and Frame-Semantic Embedding Based Data Augmentation Approach to Automatic Categorization of Annoying Behaviors using #petpeeve Tweets (EMNLP 15')에서는 Word2Vec embedding을 바탕으로 cosine similarity를 기준으로 kNN을 적용해서 augmentation을 하였습니다. Word2Vec이외에도 GloVe나 fasttext등의 embedding을 사용할 수도 있겠지요. 

 

3) Contextualized embedding replacement

2번째보다 조금 더 진화한(?) 방법으로, Language Modeling을 이용해서 주어진 단어를 대체하는 방법입니다. 무슨말이냐 하면, "This is the best movie I've ever seen"이라는 문장에서 대체하고자 하는 단어를 제외한 나머지 문장을 모델의 입력으로 주고, 해당 단어를 예측하는 방법으로 훈련을 시킨 뒤, 모델의 prediction중에서 확률이 높은 다른 단어들로 바꿔치기 하는 방법입니다. Contextual Augmentation: Data Augmentation by Words with Paradigmatic Relations (NAACL-HLT '18)에서는 CNN혹은 bi-directional LSTM을 이용해서 해당 단어를 예측하는 모델을 훈련시킨 뒤, top-K probability를 가지는 단어들로 replace함으로써 synonym replacement에 비해서 효과가 좋음을 보였습니다. Conditional BERT Contextual Augmentation에서는 단어를 하나씩 가리고 바꾸는 것이 아니라 여러개의 단어를 가리고 한번에 예측하는 BERT의 Masked Language Modeling(MLM)을 사용해서 augmentation을 했고, 위의 방법보다 성능이 더 좋게 나왔다고 합니다. 

Contextualized data augmentation via language model (Kobayashi 2018)

Noising

CV에서 이미지에 blur를 주거나 noise를 주는 것 처럼 기존 문장에 noise를 주는 방법들도 있습니다. Data Noising as Smoorhing in Neural Network Language Models (ICLR '17)에서는 Unigram noising과 Blank noising의 두가지 기법을 사용했습니다. Unigram noising은 하나의 token을 unigram distribution에 따라서 랜덤하게 바꿔치기 하는 것이도 (replacement라고 생각할 수도 있지만 좀 결이 다르다고 생각해서 따로 분리하였습니다) Blank noising은 다른 token 대신 공백(blank)으로 바꾸는 것 입니다. 이때 본 논문에서는 bigram distribution에 따라서 token별 확률을 다르게 설정하였습니다. 

 

Generative methods

기존의 문장에서 단어 몇개를 바꾸는 것이 아니라, 아예 문장 자체를 새로 만드는 것을 생각해 볼 수도 있습니다. Do Not Have Enough Data? Deep Learning to the Rescue! (AAAI '20)에서는 (제목은 마치 모든 도메인을 아우르는 것 같지만 실제로는 NLP의 data augmentation에 대해서만 다루고 있습니다) LAMBADA (LAnguage Model-BAsed Data Augmentation)이라는 framework를 제안합니다. LAMBADA의 준비물로 필요한 것은 BERT와 같은 pre-train된 모델인데, 이 논문에서는 GPT-2를 사용하였습니다.

방법은 다음과 같습니다. 먼저, 원래의 train data를 기반으로 baseline classifier를 훈련시킵니다. 그리고 나서, pre-train된 모델을 같은 task로 train dataset에 fine-tuning을 합니다. (GPT-2의 경우에는 language modeling으로 훈련을 시키는데, 여기서 기존의 데이터를 <Label> [SEP] <Sentence> [EOS]의 형식으로 바꾸어서 input으로 넣어주게 됩니다.) 그리고 나서 fine-tuning된 모델을 가지고 새로운 데이터를 만들어냅니다. 예를 들어서, <POSITIVE> [SEP] This is the best movie I've ever seen [EOS]라는 원래의 데이터가 있을 때, 앞의 일부 <POSITIVE> [SEP] This is 를 fine-tune된 GPT-2에 입력으로 넣어준 뒤, 새로운 데이터 <POSITIVE> [SEP] This is the movie I always want to see 와 같은 새로운 문장을 얻어냅니다. 마지막으로, 이렇게 만들어진 문장들이 이상한 문장이거나 label이 잘못된 문장일 가능성이 있기 때문에 처음에 훈련시킨 baseline classifier를 이용해서 각 label별로 confidence score가 높은 top N개의 문장만을 augmented data로써 사용합니다. 

 

 

LAMBADA framework (Anaby-Tavor et. al. 2019)

 

MixUp

mixup: Beyond Empirical Risk Minimization (ICLR '18)에서는 주어진 두 이미지의 픽셀값의 평균을 취해서 새로운 이미지를 만들고, 그 이미지의 label역시 기존 label의 평균으로써 생각하는 MixUp을 제안하였습니다. 아래와 같이 강아지와 고양이 이미지가 있을 때, 둘의 평균 이미지를 구하고 label은 (강아지 + 고양이) / 2로 두는 것이죠.  

MixUp algorithm (Chaudhary, [2])

Augmenting Data with Mixup for Sentence Classification: An Empirical Study에서는 이러한 MixUp 기법을 NLP에 적용하였습니다. 문장 자체는 이미지처럼 어떤 값을 지니는 형태가 아니기 때문에, (사과 + 오렌지)/2와 같은 단어를 생각하는 것은 불가능하지만, representation vector를 이용하면 벡터 연산을 통해서 MixUp을 적용하는 것이 가능해집니다. MixUp을 적용하는 순서에 따라서 크게 두가지 방법으로 나누어지는데, 먼저 MixUp의 대상이 되는 두 문장을 zero padding을 통해서 같은 길이로 맞춰준 뒤,

 

1. WordMixUp: 각 word representation vector의 weighted average를 취해서 만든 vector를 모델의 input으로 넣어서 새로운 sentence representation vector를 얻거나,

2. SentenceMixUp: 기존 두 문장의 word representation vector들을 먼저 모델에 넣어서 sentence representation vector를 얻은 뒤, 이를 weighted average를 취해서 새로운 sentence representation vector를 얻습니다. 

 

여러 classification dataset에 실험한 결과, dataset에 따라서 WordMixUp과 SentenceMixUp중 뭐가 더 좋은지가 달랐지만, augmentation을 적용하지 않은 모델에 비해서는 두 접근 모두 성능이 올라가는 것을 확인하였습니다. 

 

MixUp for NLP (Chaudhary, [2])

Instance crossover

Atalaya at TASS 2019: Data Augmentation and Robust Embeddings for Sentiment Analysis에서는 염색체 교차(Chromosome Crossover)에서 영감을 얻어서 같은 label의 주어진 두 문장의 일부를 서로 바꿔치기하는 기법을 사용하였습니다. Instance Crossover를 사용했을 때 Classification Accuracy에는 변화가 없었지만, F1-score는 크게 증가한 것으로 미루어 보아 Neutral이나 None같은 minor한 class에 도움이 많이 되는 것을 알 수 있다고 합니다. (아쉽게도 label이 다른 두 문장에는 적용하기 힘든 것으로 생각됩니다. 아마 mixup같이 label의 평균을 내는 방법이 먹힐지도 모르겠습니다.)

 

Chromosome Crossover (Left, Wikipedia) and Instance Crossover (Right, Luque 2019)

Miscelleneous

그 외에 오탈자를 고려한 error injection이라는 방법도 있습니다. "This is the best movie I've ever seen"이라는 문장에서 일부 문자를 오타가 날만한 다른 문자 (키보드 상에서 가까운 문자)로 변경하는 것으로, 큰 효과를 보이지는 않는 것 같습니다. 또한, BART(Bidirectional Auto-Regressive Transformers) 논문에서는 augmentation은 아니지만 input을 오염(corrupt)시키는 여러가지 방법을 제시하는데, 이 역시 일종의 augmentation 기법으로 생각할 수 있을 것 같습니다. 

Corruption of input in BART (Lewis et. al. 2019)

EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks (IJCNLP '19)에서는 단어의 의미 등을 고려하지 않고 random하게 단어를 삽입(insertion)하거나 제거(deletion), 혹은 문장 내의 두 단어를 바꾸는(swap) 방법이 모델의 성능 향상에 도움이 되었다고 합니다. 여기에 synonym replacement까지 총 4가지의 augmentation을 같이 사용했는데, 이 4가지를 하나씩 사용했을 때도 성능 향상이 있었고 (augmentation을 어느정도 하느냐에 따라 달라집니다) data의 수가 작을수록 performance gain이 커지는 것으로 나타났습니다.

Text Data Augmentation Made Simple By Leveraging NLP Cloud APIs에서는 여러가지 augmentation 기법이 소개되었는데, I'm을 I am으로, She is를 She's로 바꾸는 등의 surface transformation과 syntax tree를 이용하여 몇몇 규칙에 따라서 문장을 바꾸는 (수동을 능동으로 바꾼다던지) 기법을 이용하였습니다. 

 

References

[1] Data Augmentation in NLP, https://towardsdatascience.com/data-augmentation-in-nlp-2801a34dfc28

[2] A Visual Survey of Data Augmentation in NLP, https://amitness.com/2020/05/data-augmentation-for-nlp/