본문 바로가기

B/Deep Learning

[자연어처리] 어떻게 텍스트 데이터를 늘릴 것인가? (Text Data Augmentation)

보통 Data Augmentation은

1. 학습데이터가 부족해서 데이터를 늘리거나,

2. 불균형데이터의 레이블들의 균형을 잡아주기 위하여

진행하곤 한다.

 

최근 NLP관련 프로젝트를 하면서 크롤링한 데이터를 팀원들과 일일히 라벨을 붙이고 있는데,,

현대판 인형공장이 따로없거니와,

크롤링 한 데이터에서도 쓸만한 데이터를 거르고 나니 1/10 수준으로 줄어들어

Data Augmentation을 고려하지 않을 수 없었다.

그래서 텍스트 데이터에서 Data Augmentation(이하 DA) 방법이 있는지 궁금해 찾아본 구글링 결과를 정리해보았다.

 

 

만약 내가 다루는 데이터가 이미지라면,

위아래, 혹은 좌우로 shift시키거나, 상하좌우를 반전시키거나, 확대, 축소하는 등 쉽고 간단한 방법이 있는데

직관적으로 생각해봤을때 텍스트데이터의 DA는 그 결의 굉장히 다를것 같다는 생각이 들었다.

이미지를 뒤집거나, 방향을 살짝 트는 등의 변형은 라벨 값에 큰 영향을 미치지 않는 비전 분야와 달리..

텍스트에서는 단어 하나를 변화시키는게 문장 전체의 의미를 변화시킬 수 있기 때문이다.

 

그렇게 열심히 논문을 뒤지다가 2019년 EMNLP에서 발표된

"Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks" 

논문에서 꽤 합리적인 아이디어를 얻을 수 있었다.

 


 

1. SR

특정 단어를 유의어로 교체하는 방식.

2. RI, RD

임의의 단어를 삽입(Insertion)하거나 삭제(Deletion)하는 방식

3. RS

문장 내 임의의 두 단어의 위치를 바꾸는 것.

 

 

논문에서는 이러한 테크닉들이 실제로 성능 향상에 유의미한 영향을 미칠 수 있으며,

Augmentation 과정을 통해 생성된 문장들이 원 라벨의 성질을 잘 따른다는 연구 결과를 내놓았다.

DA 기법으로 생성된 데이터들이 어느 정도의 노이즈를 모델에 부여함에 따라 모델의 일반화에 보다 도움을 줄 수 있기 때문이다.

 

특히 "작은 데이터셋에서 DA를 통한 성능 향상의 폭이 더 크게 나타난다"라는 연구결과가 있었다.

데이터셋의 크기 (N_train)에 따라 문장 내 얼마만큼의 단어에 변형을 가할 것인지 (α),

원 문장 당 몇 개의 Augmented Sentence를 만들지 (N_aug) 등의 요소를 하이퍼 파라미터로 설정해

데이터셋 크기에 맞는 적정 하이퍼 파라미터를 명시해주었다.

 

이를 한국어용으로 코드구현을 한 좋은 자료가 있어 아래 깃허브를 함께 올린다 ! 

github.com/catSirup/KorEDA/blob/master/eda.pygithub.com/catSirup/KorEDA/tree/master

이분께서는 RD, RS 두가지 방식을 먼저 추천하는 것 같다.

 


사실 캐글이나 데이콘 같이 준 데이터가 있는 상황에서는 DA를 크게 고려하지 않아도 되겠지만,

실제로 내가 데이터를 얻는 작업부터 시작해야 하는 프로젝트에서는 거의 필수적인거 같고

나중에 내가 현업에 가게 되면 이러한 기법의 필요성은 더욱 부각되지 않을까?

 

 

[ 월간 자연어 처리 ] (www.facebook.com/monthly.nlp/posts/222119705886568)

'B > Deep Learning' 카테고리의 다른 글

cuda: device-side assert triggered gpu 구동 Error 잡기  (0) 2021.10.22