본문 바로가기
Spoken Language Processing

Fairseq로 기계번역기 만들기

by 햇농nongnong 2022. 1. 13.

기계번역


  • 소스언어를 타겟언어로 번역하는 프로그램
  • 단순하게 data mapping 하는 문제 + 자연어는 생략과 중의성이 많아 컴퓨터가 이해하기 어렵, 표현도 많아서 훨씬 더 복잡한 문제 + 언어마다 다른 특징
  • 기계번역은 NLP 에서 어려운 task 에 속함
  • 예전에는 기계번역기 만들 때 많은 resource + 복잡한 규칙 + 많은 통계규칙들 다 활용하여 여러 개의 모듈들을 따로 만들어 합침
  • but 최근에 데이터 많아지고 + 딥러닝 등장 = 하나의 모듈에서 모든 일을 처리하는 방식으로 바뀜
  • 예전보다는 상대적으로 쉽게 개발 가능

 

준비물 1 - 오픈소스 : Fairseq

 

  • 기계번역을 위한 여러 오픈 소스 존재
  • 그 중 facebook 에서 만든 fairseq
  • WMT 라는 기계번역 대회에서 fairseq 가 활발하게 사용되고 있음 + 최근 WMT 대회에서 1등 모델 fairseq 많음
  • fairseq : command line 명령어 제공한다는 점이 장점

 

 

준비물 2 - 학습 데이터

1) 병렬 데이터

  • 소스와 타겟 언어 쌍으로 된 데이터
  • AI Hub 개방 데이터 참고

2) 단일 데이터 

  • 하나의 언어로 된 데이터
  • 라벨링되어 있지 않아서 학습 데이터로 바로 사용 불가
  • but 단일 데이터가 병렬 데이터보다 양도 많고 상대적으로 쉽게 구할 수 있어서 사용함
  • Wikipedia 데이터 참고

 

기계번역기 만들기


일반적인 텍스트 기반 머신러닝 파이프라인

 

 

+ 기계번역텍스트 생성하는 단계 = 디코딩 단계 추가

 

  • 크게 보면 데이터 처리, 모델링, 성능평가로 구분됨 - 이 파트들에서 각각 성능 향상 시킬 수 있음
  • 이러한 파이프라인 : 왼 -> 오 one way 가 아니라 사이클이 있음
  • 사이클을 통해 점진적, 반복적으로 발전해나감
  1.  전체를 감싸는 cycle : 데이터 준비부터 성능 평가까지 쭉 + 다시 돌아와 보완하면서 최종적으로 성능 높임
  2. 기계번역의 경우 작은 cycle 추가
  • 병렬 데이터로 최초 학습, 학습된 모델을 base model 이라고 함
  • 학습 데이터가 병렬 데이터인 특성을 활용 : 데이터 정제, 데이터 확장 가능
  • 학습된 base model 통해서 의미적으로 번역해서 병렬 데이터의 노이즈를 걸러낼 수 있음
  • 단일어 데이터를 번역해서 병렬 데이터로 만들어 낼 수 있음 - 데이터 양과 품질을 높일 수 있음
  • 이런 것들을 통해서 데이터 확장, 정제 등 모으고 모아서 성능 더 높일 수 있음

 

fairseq 설치

  • git clone https//github.com/pytorch/fairseq 와 pip install 을 통해 설치

 

학습 데이터 준비


 

  • bitext.ko-ja.tsv 처럼 한국어, 일본어 pair 로 되어 있는 병렬 데이터를 텍스트 처리하여 train.ko, train.ja 로 분할해서 저장
  • 텍스트 처리 : 위 예시에서는 간단하게 음절 단위로 나눔 + 추가적으로 정규화, 필터링, 좋은 토크나이저 등으로 보완 가능

 

fairseq-preprocess

  • 텍스트 형태로 그대로 사용 X, binary 형태로 변환해주어야함
  • 데이터를 바이너리로 변환, 딕셔너리 구축
  • 빠른 로딩 속도와 압축 효과

 

fairseq-train

fairseq-train 이라는 짧은 명령어로 학습 가능

 

 

 

 

 

앙상블(Ensemble) - checkpoint averaging

  • 마지막 checkpoint 를 가지고 추론에 사용해도 되지만, 앙상블을 통해 조금 더 성능 높일 수 있음
  • 다양한 종류의 앙상블 중 가장 단순한 - 여러 개의 checkpoint weight 평균내기

 

 

  • fairseq 에서 제공하는 average_checkpooints.py 통해 가능

 

파인 튜닝(Fine-tuning)

한번 더 모델링 할 수 있는 부분

 

데이터를 모으다 유독 품질이 좋은 데이터가 있을 때 or 상황에 맞게 domain 데이터만 사용하고 싶을 때

  • 부분적인 data 로 학습을 한번 더 진행해주는 것이 fine-tuning
  • 원래 fine-tuning 은 모델의 최상단에 있는 classifier layer 만 재 학습, but 여기서 학습하는 트랜스포머 구조 상 end-to-end 매핑이기 때문에 - 전체를 아예 다시 학습함 = 따라서 아까 fairseq-train 의 명령어 다시 사용

but 인자가 달라짐 - dataloader, optimizer 추가, 결과저장 경로 수정

  • 앙상블, 파인 튜닝 필수는 아님. 상황에 따라 득이 될 수도 아닐 수도 있기 때문에 적절히 잘 선택

 

학습 후 번역 결과 확인

확인 명령어 두가지

 

1) fairseq-interactive

  • raw text 번역
  • 사용자가 interactive 하게 raw text 데이터를 하나씩 확인해볼 수 있음

 

2) fairseq-generate

  • pre-processed text 번역 & 배치모드
  • 대량의 데이터를 한번에 번역할 수 있음
  • binary 데이터를 입력으로 받기 때문에 앞의 pre-process 명령어와 함께 사용해야 함

 

모델 성능 확인

fairseq-score

 

BLEU Score

  • 텍스트를 n-gram 단위로 다 쪼개고, 정답과 출력이 얼마나 많이 겹치느냐에 따라 점수를 매기는 방식
  • BLEU(Bilngual Evaluation Understudy)
  • 기계번역 정량 평가 지표
  • n-gram 기반 점수 측정 & 페널티 (중복 토큰, 짧은 문장 길이)

 

추가) 데이터 정제

 

병렬 데이터 의미적으로 판단하여 정제

 

 

  • 병렬 데이터에서 소스 언어만 추출해서 번역 - 다시 병렬 데이터의 타겟 언어와 번역된 결과를 비교해서 BLEU 스코어 측정 - 측정된 점수가 낮으면 noise
  • 인터넷에 돌아다니는 데이터로 실험 - 평균적으로 약 3.5% 가 오번역 / noise data로 찾아낼 수 있었음

 

 

추가) 데이터 확장(back-translation)

 

단일어 데이터를 모델 통해 그냥 번역 - 그걸 병렬데이터라고 간주하고 사용하는 simple 한 idea

한쪽 언어만 real data - 따라서 생성된 데이터를 가짜 병렬 데이터에서 target 언어에 위치하도록 해야함

  • 학습된 모델이 문자열을 생성할 때 조금 더 자연스럽게 연이어서 생성할 수 있도록 도움
  • 즉, 모델의 유창성 능력을 키우게 해줌

이 process 를 위해 따로 코딩이 아니라 기존 fairseq 명령어들 사용하면 가능

 

 

 Reference

댓글