Skip to content

Back_Translation

JAEHEE RYU edited this page May 24, 2021 · 1 revision

❓WHY?

학습 데이터가 너무 부족하다. NLP에서 가장 간단한 증강 방법이 역번역(Back Translation)이다. 질문을 paraphrasing 하여 데이터를 증강해보고 이를 학습에 적용하고자 실험하였다. 아래 PORORO 라이브러리를 사용하면 쉽게 역번역을 활용할 수 있다. (TMI : 대회 데이터는 3,952개의 train 데이터, 240개의 validation 데이터로 구성되어 있다)

👨🏻‍💻 CODE

  1. 필요 라이브러리 설치
pip install pororo
  1. 필요한 라이브러리 선언 및 Machine translation model(Pororo) 불러오기
import pickle
from tqdm.notebook import tqdm
from pororo import Pororo
from datasets import load_from_disk
from torch.utils.data import DataLoader, TensorDataset

mt = Pororo(task="mt", lang="multi", model="transformer.large.multi.mtpg")
  1. 역번역 함수 선언 : 아래 middle 언어(현재 영어) 바꿔주면 더 많은 증강 가능
def cycling_translation_en(s) :
    s_en = mt(s, 'ko', 'en')
    s_ko = mt(s_en, 'en', 'ko')
    return s_ko
  1. 질문 가져오기
train_file = load_from_disk("/opt/ml/input/data/data/train_dataset")['train']
qa_records =[{"example_id": train_file[i]["id"], 
              "document_title": train_file[i]["title"], 
              "question_text": train_file[i]["question"], 
              "answer":train_file[i]["answers"]}
             for i in range(train_file.num_rows)]

​ 위 예시처럼 train에서의 질문&답변 쌍은 약 3,952개가 존재

  1. qa_records에 역번역 데이터 추가하여 2배로 증강
qa_records_en = []
for qa in tqdm(qa_records):
    qa['question_text'] = cycling_translation_en(qa['question_text'])
    qa_records_en.append(qa)
qa_records.extend(qa_records_en)
  1. pickle로 저장
with open('qa_records_aug.pickle', 'wb') as f:
    pickle.dump(qa_records, f)

✅ Result

  • 위 데이터를 추가하려 학습한 결과 성능이 오히려 떨어졌다.
  • 역번역이 진행되면서 한국어 어순이 망가지기도 했고, 오히려 복잡하게 표현되는 경우가 있어 학습에 방해요소로 작용했을 것이라 추측됨
  • 우리 대회 데이터를 증강하는 방식이 아닌, 잘 정제된 KorQuAD, AI hub MRC 데이터를 사전학습하여 Fine tuning 하는 로직으로 솔루션의 방향이 잡히면서 역번역 데이터는 이후 학습에 활용하지 않음(Closed)