brunch

데이터가 부족할 때, Data Augmentation

chatGPT를 위한 NLP 기초 : Data Augmentation

by 별똥별 shooting star


들어가며

데이터를 학습하다 보면 거대한 규모의 대기업이 아니고서는 고질적으로 데이터가 부족한 문제에 직면하게 된다. 물론 대 기업이라고 모든 분야에 데이터를 충분히 습득하는 것은 아닐 수 있다. 여하튼 데이터가 적으면 그만큼 성능도 좋아지지 않기 때문에 이를 해결할 대책이 필요하다. 그래서 나온 것이 Data Augmentation 기법이다. 오늘은 자연어 처리에 적용하는 다양한 Data Augmentation 기법에 대해서 소개하고자 한다.



1. Data Augmentation

자연어 처리에서 Data Augmentation은 단일 데이터로 학습을 가능하게 하는 Back Translation, 어휘를 대체하는 Lexical Substitution, 노이즈를 활용한 Random Noise Injection으로 크게 3가지 기법이 있다.


1) Back Translation

기계번역은 Encoder와 Decoder에 병렬적으로 문장을 입력하여 학습을 한다. 하지만 데이터를 구하는데 비용과 데이터의 사이즈가 언어별로 천차만별이기 때문에 단일 데이터로 학습을 가능하게 하는 Back Translation 기법을 고안하게 된 것이다. Back Translation은 단일 데이터 혹은 단일 언어 데이터를 통해 번역 모델을 학습시키는 방법으로 2016년 에든버러 대학의 리코 샌리치 교수에 의해 제안되었다. 이 기법은 도대체 어떤 방법을 사용했길래 단일 데이터로 학습이 가능하게 만들었는지 지금부터 살펴보도록 하겠다.


Encoder에 입력하는 Source와 Decoder에 입력하는 Target가 있다. 우선적으로 Source를 통해 Target를 번역하는 모델을 학습한다. 동시에 Target를 통해 Source를 번역하는 모델을 학습한다. 그리고 이어서 Target로 Source를 학습한 모델을 활용해 Source 데이터를 생성한다. 생성된 source 데이터와 Target 데이터를 병렬 쌍으로 만든 다음 최종적으로 Source를 통해 Target를 번역하는 모델을 학습하는 것이다.


Back Translation은 변형해서도 사용하는데 뒤에서 배울 Noise를 추가하기도 한다. 성능도 이 Noise를 추가한 기법이 제일 좋다고 알려져 있다. 추가적으로도 이를 활용한 기법들이 다양하게 있다. 자세한 설명은 아래의 링크에 들어가면 다른 분들께서 잘 정리를 해주셨다.


참고 자료

https://dev-sngwn.github.io/2020-01-07-back-translation/



https://kh-kim.github.io/blog/2020/09/30/Back-Translation-Review.html


https://deepkerry.tistory.com/m/17


2) Lexical Substitution

Lexical Substitution은 위에서도 잠깐 얘기했듯이 어휘를 대체하여 데이터를 부풀린다. 어휘를 대체하는 방법도 3가지가 있는데 동의어 기반 대체, Embedding 활용 대체, TFIDF 기반 대체가 그 방법들이다.


첫 번째로 동의어 기반 대체부터 살펴보겠다. 동의어 기반 대체는 특정 단어의 동의어나 유의어를 구축해 놓은 사전인 시소러스를 활용한다. 대표적인 시소러스는 영어기반인 WordNet, 한국어 기반인 KorLex, Koream WordNet이 있다. 조금 더 자세한 내용은 아래의 링크를 클릭하면 PyTorch 공식 사이트에서 잘 정리를 해주셨다.


https://kh-kim.gitbook.io/natural-language-processing-with-pytorch/00-cover-4/03-wordnet


두 번째로는 Embedding의 유사도를 활용한 대체이다. 다시 얘기하면 Embedding은 유사한 단어끼리 비슷한 공간에 밀집해 놓는데 이것을 활용하는 것이다. 이를 활용하는 대표적인 라이브러리는 gensim이 있지만 한국어 Embedding 정보는 없다는 것이 단점이다. 그래서 한국어 같은 경우는 대게 Knlpy에서 제공하는 Mecab를 활용해서 유사도 기반으로 대체할 수 있다.


세 번째로는 TF-IDF이다. TF-IDF는 여러 문서를 통해 단어의 중요도를 부여한다. 이중 중요도가 낮은 단어들이 있는데 이러한 단어들을 다른 단어들로 대체를 하는 방법이 TF-IDF 기반 대체이다.


3) Random Noise Injection

문장 데이터에는 분명 완벽하게 작성된 문장만 있는 것은 아닐 것이다. 오타는 어쩔 수 없이 존재하게 되어 있다. 심지어 유명한 책을 읽어봐도 가끔이 오타가 있는 것을 발견하곤 한다. 이러한 허점을 이용해 일부러 Noise를 생성하여 학습할 데이터를 증간하는 것이다. 물론 Noise에는 오타만 있는 것이 아니니 추가적으로 랜덤 유의어, 공백 노이즈에 대해서도 살펴보도록 하겠다.


첫 번째는 오타 추가이다. 키보드로 문장을 작성하거나, 휴대폰으로 문장을 작성하거나 특정 단어마다 자주 발생하는 오타가 있다. 주로 이 오타는 타이핑을 할 때 가까운 거리에 있는 문자들을 잘 못 눌러 발생한다. 이 방법을 활용해 키의 거리를 기반으로 Noise를 추가하는 것이다.


두 번째는 공백 노이즈이다. _ 토큰을 활용해 문장의 일부 단어를 공백으로 바꾸어주는 것이다. 주로 과적합을 방지하기 위하여 사용되곤 한다.


세 번째로는 랜덤 유의어이다. 이 방법은 불용어가 아닌 단어를 랜덤으로 선정한 후 특정 단어와 유사한 단어를 선정하여 랜덤으로 삽입을 하는 방법이다.



마치며

오늘은 데이터를 증강시키는 방법에 대해서 간단하게 알아보았다. 데이터 증강이 필요해질 때 데이터를 증강시키는 방법도 있었구나 정도만 기억나도 충분하다. 인지만 하고 있다면 언제든지 검색해서 방법을 찾고 적용할 수 있다. 필자의 경우는 아예 몰라서 사용해 볼 생각도 못 했던 적도 있었다.

keyword
매거진의 이전글트랜스포머 모델(Transformer)_3