Data/Information

Hugging Face, Translation

neulvo 2022. 3. 17. 01:04
 

Main NLP tasks - Hugging Face Course

Let’s now dive into translation. This is another sequence-to-sequence task, which means it’s a problem that can be formulated as going from one sequence to another. In that sense the problem is pretty close to summarization, and you could adapt what we

huggingface.co

sequence-to-sequence task인 translation에 대해 학습해보자.

 

task에 맞는 dataset을 불러오고 그 안의 샘플을 뽑아보았다.

 

pipeline을 활용해 translator를 빌드해주었다.

pipeline을 통해 번역한 결과

영어 단어인 thread가 그대로 출력되는 것을 볼 수 있는데 (dataset에서는 fils de discussion과 pair)

이는 model에서 해당 언어를 그대로 출력하는 것을 택했기 때문이다. plugin도 마찬가지다.

 

targets 데이터가 있을 경우, tokenizer를 context manager인, as_target_tokenizer() 안에 넣어주어야 한다.

context manager는 두 연결된 operations이 pair로 실행되게 도와주며, with 함수() : 로 표현된다.

만약, context manager 안에서 targets를 tokenize 하는 것을 깜빡했다면,

input tokenizer 기준으로 tokenize가 되기 때문에,

기대되는 tokens이 다르게 나온다. (target 언어의 단어를 모르기 때문에)

 

위의 공정을 함수로 작성한 다음에,

map 함수를 활용해서 일괄 처리해주었다.

 

Trainer의 subclass인 Seq2SeqTrainer를 사용하여

outputs을 predict하는 generator() 함수를 쓰고자 한다.

그에 맞게,

model과 data collator를 세팅해주었다.

labels에 padding value인 -100이 padding된 것을 볼 수 있다.

special token을 집어넣은 input_ids에서도 이를 볼 수 있다.

 

번역 성능을 평가하기 위해 SacreBLEU 라이브러리를 설치 후 불러주었다.

SacreBLEU는 다른 tokenizer를 사용하는 model간의 비교가 어렵다는

BLEU의 단점을 극복하기 위해 tokenization step을 표준화해서 metric을 계산해준다.

아래 두 예시는 한 단어가 반복적으로 등장할 때와

문장의 한 부분만 등장할 때 SacreBLEU score가 어떻게 나오는지 보여주는 예시이다.

score가 높을 수록 좋다. (0 to 100)

 

bleu metric을 산출해주는 함수이다.

 

TrainingArguments의 subclass 인 Seq2SeqTrainingArguments를 사용하여

fine-tuning을 해준다.

그리고 Trainer에 인자값들을 전달한 후,

train하기 전에 evalute하여 모델의 성능을 확인한다.

 

Train 후 Evaluate 해보았다.

BLEU score가 52로 종전의 39보다 꽤 오른 것을 확인할 수 있다.

train() 전에 evaluate를 하고 후에 또 evaluate를 하니

뭐가 문제인지 앞의 evaluate에서 멈춰있길래

커널을 다시 시작하고 train()부터 다시 돌려줬다.

 

이번에는 다른 NLP 문제를 해결했을 때처럼

accelerator()를 사용해서 train loop을 customize하는 방법에 대해 살펴보겠다.

 

optimzer를 세팅하고

accelerator() 및 scheduler를 작성해주었다.

 

Evaluate의 간편화를 위해 postprocess() 함수를 작성해주었다.

위에서 살펴본 compute_metrics 함수와 유사하다.

metric 도출 전 단계까지 진행한 것이라 보면 된다.

 

train 부분을 작성하였는데

accelerator.unwrap_model(model).generate() 부분이 다른 nlp 과제들과 다르다.

accelerator.unwrap_model(model)을 써서 모델이 저장되기 전에

model을 unwrap 해줬다.

그 후, generate() 함수를 써서 outputs을 뽑아주었다.

 

모델은 에폭 하나를 돌고 터졌다. ㅠㅠ

 

이처럼 파이프라인을 이용해서 간편하게 문제를 해결할 수도 있다.

728x90