보통 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 |
---|