T5 (굵직굵직한 포인트 세 가지 + 트랜스포머에서 바뀐 점)

안녕하세요, 저는 최근 기계번역 대회를 준비하면서 이런 저런 모델을 공부하고 한번 실습해보고 있습니다. 제가 이번에 공부한 논문은 T5 인데요. 한번 제가 살펴본 T5의 중요 포인트 위주로 정리해보겠습니다. (사실 논문이 62페이지? 가량 되어서 리뷰 글로 공부하고 있을 뿐 정확하게 공부할 엄두도 못 내고 있습니다 😨)

1. Text to Text 형식을 사용하면 각각의 downstream task 에 일일이 파인튜닝할 필요가 없지 않을까 ?

저는 최근까지도 downstream task, upstream task, pretrain, fine tuning 등등의 용어가 몹시 햇갈려서 ‘한국어 임베딩’ 이라는 책을 통해서 정리할 수 있었습니다.

Pretrain : 대규모 말뭉치로 임베딩을 만든다

Fine-tuning / Transfer learning : 이후 임베딩을 입력으로 하는 새로운 딥러닝 모델을 만들고 풀고 싶은 구체적 문제에 맞는 소규모 데이터에 맞게 임베딩을 포함한 모델 전체를 업데이트한다. - ‘한국어 임베딩’

구체적으로, fine-tuning 과 transfer learning 의 차이에 대해서도 알아보았습니다.

Transfer learning is when a model developed for one task is reused to work on a second task. Fine tuning is one approach to transfer learning.

In Fine-tuning, an approach of Transfer Learning, we have a dataset, and we use let’s say 90% of it in training. Then we train the same model with the remaining 10%. Usually, we change the learning rate to a smaller one, so it does not have a significant impact on the already adjusted weights. You can consider the case I said (90% to train, 10% fine-tune) as transfer learning by fine-tuning, where the 10% could have data from a different nature, or simply one different class.

제가 딱히 매끄럽게 번역할 수 있을꺼 같지 않아서 원 정보 그대로 올렸습니다 ;; nlp 에서는 임베딩이라는 목표를 위해 여러 pre-training task 로 학습된 언어모델을 다운스트리밍 태스크를 풀기 위해 사용되므로 대표적인 transfer learning 이라고 할 수 있습니다. 또 언어학습이라는 도메인 내에서 90%의 사전학습에 활용되는 방대한 양의 데이터를 사용하여 언어모델을 통해 임베딩한 후 (feat. Google) 동일 언어 모델(bert 등등) 에서 쇼규모 데이터 (10%) 로classification 등등의 다운스트림 테스크를 풀기도 함으로 fine-tuning 이라고 할 수도 있습니다.

제가 이해한 바에 따르면 어쨌든 대규모 데이터로 사전학습과제를 통해 언어모델에서 임베딩을 시키는데 임베딩시킨 언어모델에서 소규모 데이터로 과제학습을 하면 fine-tuning, 언어모델 임베딩만 가져와서 다른 모델에 적응시키면 transfer learning 이 아닐까 생각합니다.

따라서 이제까지는 임베딩 과제 / 임베딩을 통한 down-streaming 과제가 분리 되었습니다. 임베딩을 잘해놓아도 풀고자하는 과제에 일일이 fine-tuning 해야되는 문제가 있었습니다.

해당 문제가 생긴 원인은 nlp 에서 풀고자하는 과제에 사용하는 데이터가 과제 종류에 따라서 다양한 라벨값을 가지는 labelled data 이기 때문입니다. pretrained 된 bert 를 사용해서 감성분석을 하고 싶다면 정답 값은 0,1인데 반해 개체명 인식 정답 값은 PERSON,FIELD 등등입니다.

한편 Pre-training 과제에서는 모델이 언어능력을 갖게 하기 위해서 (그래서 제대로 임베딩하도록 하기 위해서) 문장 내 특정 단어에 마스크를 뚫어놓고 해당 단어를 맞추게 하기도 하고,단어들을 순차적으로 나열해가면서 문장 내 다음에 올 단어를 맞추게 하기도 합니다. 즉 특정 task 에 fine-tuning 하지 않는다면 text 를 입력으로 하면 어떠한 text 를 내뱉는 방식으로 학습되었습니다.

그래서 t5에서는 각 downstream task 에 사용되는 데이터를 text to text 형식으로 바꾸면 일일이 과제에 따라서 다르게 fine-tuning 할 필요가 없지 않을까 아이디어를 낸 것입니다 ! (발상의 전환)

모든 downstream task 데이터는 pre-train 한 모델에서 바로 사용할 수 있게끔 text to text 형식으로 집어넣어집니다. 과제가 5개라고 치면 이제 각 과제에 맞는 모델 5개를 모두 만들어줄 필요가 없습니다. 대신 모든 5개의 과제에 사용되는 데이터를 text to text 형식으로 pre-train 한 모델(=Transfer Transforemr) 에 집어넣습니다.

그러면, 그래도 데이터 형식만 text to text 로 같고 과제의 성격은 다른데 그게 가능할까 ? 라는 의문이 생길 수 있습니다.

그래서 input_text 맨 앞에 어떠한 과제인지를 명시해줍니다.

스크린샷 2021-02-11 오후 1 14 41

그러면 pretrain 에 사용할 수 있는 과제도 매우 다양한데 그 중 어떤 것을 사용할지도 정말 많은 실험을 해주었습니다. 결과적으로 corrupting spans 가 제일 효과적이어서 이를 활용했다고 합니다.

스크린샷 2021-02-11 오후 1 35 40

2. C4 데이터 셋

그러면 pre-train 에 학습할 데이터는 무엇을 썼는지도 매우 중요할 것입니다. 해당 부분도 T5의 두드러진 장점을 가져다 준 핵심이라고 여겨집니다.

Common Crawl 은 매달 각종 웹페이지에서 20TB 의 데이터 셋을 긁어서 만들어집니다. 매우 방대하고 정제되어있지 않은 unlabelled 데이터 셋이라고 할 수 있습니다.

저는 컴퓨터에 대해서 아직 잘 몰라서 사실 mb,gb,tb 이런 식으로 말하면 감을 잘 잡지 못합니다. 그래서 좀 더 가늠을 해보기 위해서 알아보았습니다.

컴퓨터는 0 하고 1 만을 나타낼 수 있습니다. 1비트 단위로 이를 표현합니다.

8비트가 모이면 1바이트가 됩니다. 즉 8자리의 공간 각각에 1 또는 0을 넣을 수 있는 양입니다.

1gb는 1000^3 바이트입니다.

1tb는 1000 gb 입니다.

넵 그러니까 매달 20TB 이라고 하면 대충 가늠만 해도 어마어마한 양인 것 같습니다.

C4 는 이를 매우 섬세하게 정제한 데이터 셋입니다.

어떻게 정제했는지에 대해서는 이와 같이 설명되어있었습니다. 사실 상식적으로는 특별한게 없는 내용인 것 같은데 이 방대한 양의 데이터를 이렇게 깔끔하게 정제했다는게 포인트인 것 같습니다.

  1. Retaining sentences that end only with a valid terminal punctuation mark (a period, exclamation mark, question mark, or end quotation mark).
  2. Removing any page containing offensive words that appear on the “List of Dirty, Naughty, Obscene or Otherwise Bad Words”.
  3. “JavaScript must be enabled” type warnings are removed by filtering out any line that contains the word JavaScript.
  4. Pages with placeholder text like “lorem ipsum” are removed.
  5. Source codes are removed by removing any pages that contain a curly brace “{” (since curly braces appear in many well-known programming languages).
  6. For removing duplicates, three-sentence spans are considered. Any duplicate occurrences of the same 3 sentences are filtered out.
  7. Finally, since the downstream tasks are mostly for English language, langdetect is used to filter out any pages that are not classified as English with a probability of at least 0.99.

This resulted in a 750GB dataset which is not just reasonably larger than the most pre-training datasets but also contains a relatively very clean text.

T5:Text-To-Text Transfer Transformer

3. mT5 , mc4

mc4 는 제가 해당 논문을 살펴보게 된 계기이기도 합니다. 구글은 c4를 만들고 t5를 학습시키는데 그치지 않고 multilingual model 까지도 해당 모델을 확장하고 싶어합니다. 🌎

The mT5 is a multilingual variant of Google’s T5 model that was pre-trained over a dataset of more than 101 languages and contains between 300 million and 13 billion parameters. While explicitly-designed C4 dataset for English only, mC4 includes 107 languages along with 10,000 and more web pages over 71 monthly scrapes till date.

What is mT5?

실제 코드 학습할 때 mc4로 학습한 mT5 를 활용하기 위해서 hugging face 튜토리얼 사이트에 들어가보니까 t5 튜토리얼에서 선택 옵션만 mt5로 주면 사용이 가능했습니다.

4. 아키텍처 자체가 트랜스포머와 다른 부분

T5 는 명백한 트랜스포머계 모델입니다. 하지만 아키텍처 자체가 트랜스포머와 완전히 똑같지는 않은데 바로 relative position encoding 부분이 다릅니다. 각 토큰의 위치 정보를 알려주는 position encoding 값을 relative (다른 토큰들과의 위치관계를 고려하여서) 하게 주는 것입니다. 스칼라 값이므로 어텐션까지 다 거친 후 나온 스칼라값에다 더해줍니다. 따라서 임베딩할 때 위치 정보를 주는 형태로 들어가지 않고 어텐션 수행 후 더해주는 차이가 있습니다.

해당 내용 공부는 T5-relative position encoding 여기 블로그에서 큰 도움을 받았습니다. 🙇🏻‍♀️

5. mt5 간단한 코드 구현

tqdm 에러가 계속 떠서 이슈 페이지를 본 후 버전을 4.47.0 으로 조정해주었습니다.

데이터 셋은 캐글에서 가져왔습니다.

training data - HindiEnglish Corpora

evaluation data - Hindi English Sentence Pairs

튜토리얼이 hugging face 에 잘 나와있습니다.

T5 Model

사실 코랩에서 돌리니까 환경이 안 받쳐줘서 많은 어려움을 겪었습니다. 제대로 돌리려면 gpu가 있어야할 듯 합니다.

!pip install tqdm==4.47.0
!pip install simpletransformers
import os
import pandas as pd
import logging
import pandas as pd
import simpletransformers.t5 
from simpletransformers.t5 import T5Model, T5Args
eval_data=pd.read_csv('hindeng.csv',encoding='utf-8',header=None)
eval_data.head()
0 1 2
0 Wow! वाह! CC-BY 2.0 (France) Attribution: tatoeba.org #5...
1 Help! बचाओ! CC-BY 2.0 (France) Attribution: tatoeba.org #4...
2 Jump. उछलो. CC-BY 2.0 (France) Attribution: tatoeba.org #6...
3 Jump. कूदो. CC-BY 2.0 (France) Attribution: tatoeba.org #6...
4 Jump. छलांग. CC-BY 2.0 (France) Attribution: tatoeba.org #6...
hind_eval=eval_data[1].astype(str)
eng_eval=eval_data[0].astype(str)
eval_transform=[]
for hindi,english in zip(hind_eval,eng_eval):
    eval_transform.append(["translate hindi to english",hindi,english])
    eval_transform.append(["translate english to hindi",english,hindi])
final_data_eval=pd.DataFrame(eval_transform,columns=["prefix","input_text","target_text"])
final_data_eval
prefix input_text target_text
0 translate hindi to english वाह! Wow!
1 translate english to hindi Wow! वाह!
2 translate hindi to english बचाओ! Help!
3 translate english to hindi Help! बचाओ!
4 translate hindi to english उछलो. Jump.
... ... ... ...
5543 translate english to hindi Democracy is the worst form of government, exc... लोकतंत्र सरकार का सबसे घिनौना रूप है, अगर बाकी...
5544 translate hindi to english अगर मेरा बेटा ट्रेफ़िक हादसे में नहीं मारा गया... If my boy had not been killed in the traffic a...
5545 translate english to hindi If my boy had not been killed in the traffic a... अगर मेरा बेटा ट्रेफ़िक हादसे में नहीं मारा गया...
5546 translate hindi to english जब मैं बच्चा था, मुझे कीड़ों को छूने से कोई पर... When I was a kid, touching bugs didn't bother ...
5547 translate english to hindi When I was a kid, touching bugs didn't bother ... जब मैं बच्चा था, मुझे कीड़ों को छूने से कोई पर...

5548 rows × 3 columns

</div>

final_data_eval.to_csv("final_data_eval.csv")
data=pd.read_csv('mt5_test.csv')
data.head()
source english_sentence hindi_sentence
0 ted politicians do not have permission to do what ... राजनीतिज्ञों के पास जो कार्य करना चाहिए, वह कर...
1 ted I'd like to tell you about one such child, मई आपको ऐसे ही एक बच्चे के बारे में बताना चाहू...
2 indic2012 This percentage is even greater than the perce... यह प्रतिशत भारत में हिन्दुओं प्रतिशत से अधिक है।
3 ted what we really mean is that they're bad at not... हम ये नहीं कहना चाहते कि वो ध्यान नहीं दे पाते
4 indic2012 .The ending portion of these Vedas is called U... इन्हीं वेदों का अंतिम भाग उपनिषद कहलाता है।
english_sentence=data['english_sentence'].astype(str)
hindi_sentence=data['hindi_sentence'].astype(str)
data_transform=[]
for hindi,english in zip(hindi_sentence,english_sentence):
    data_transform.append(["translate hindi to english",hindi,english])
    data_transform.append(["translate english to hindi",english,hindi])
final_data=pd.DataFrame(data_transform,columns=["prefix","input_text","target_text"])
final_data
prefix input_text target_text
0 translate hindi to english राजनीतिज्ञों के पास जो कार्य करना चाहिए, वह कर... politicians do not have permission to do what ...
1 translate english to hindi politicians do not have permission to do what ... राजनीतिज्ञों के पास जो कार्य करना चाहिए, वह कर...
2 translate hindi to english मई आपको ऐसे ही एक बच्चे के बारे में बताना चाहू... I'd like to tell you about one such child,
3 translate english to hindi I'd like to tell you about one such child, मई आपको ऐसे ही एक बच्चे के बारे में बताना चाहू...
4 translate hindi to english यह प्रतिशत भारत में हिन्दुओं प्रतिशत से अधिक है। This percentage is even greater than the perce...
... ... ... ...
255209 translate english to hindi As for the other derivatives of sulphur , the ... जहां तक गंधक के अन्य उत्पादों का प्रश्न है , द...
255210 translate hindi to english Zरचना-प्रकिया को उसने एक पहेली में यों बांधा है . its complicated functioning is defined thus in...
255211 translate english to hindi its complicated functioning is defined thus in... Zरचना-प्रकिया को उसने एक पहेली में यों बांधा है .
255212 translate hindi to english हाल ही में उन्हें सरकारी ठेका मिला है करीब सौ ... They've just won four government contracts to ...
255213 translate english to hindi They've just won four government contracts to ... हाल ही में उन्हें सरकारी ठेका मिला है करीब सौ ...

255214 rows × 3 columns

final_data.to_csv("final_data_train.csv")
train_df=pd.read_csv("final_data_train.csv").astype(str)
eval_df=pd.read_csv("final_data_eval.csv").astype(str)
del train_df["Unnamed: 0"]
del eval_df["Unnamed: 0"]
train_df
prefix input_text target_text
0 translate hindi to english राजनीतिज्ञों के पास जो कार्य करना चाहिए, वह कर... politicians do not have permission to do what ...
1 translate english to hindi politicians do not have permission to do what ... राजनीतिज्ञों के पास जो कार्य करना चाहिए, वह कर...
2 translate hindi to english मई आपको ऐसे ही एक बच्चे के बारे में बताना चाहू... I'd like to tell you about one such child,
3 translate english to hindi I'd like to tell you about one such child, मई आपको ऐसे ही एक बच्चे के बारे में बताना चाहू...
4 translate hindi to english यह प्रतिशत भारत में हिन्दुओं प्रतिशत से अधिक है। This percentage is even greater than the perce...
... ... ... ...
255209 translate english to hindi As for the other derivatives of sulphur , the ... जहां तक गंधक के अन्य उत्पादों का प्रश्न है , द...
255210 translate hindi to english Zरचना-प्रकिया को उसने एक पहेली में यों बांधा है . its complicated functioning is defined thus in...
255211 translate english to hindi its complicated functioning is defined thus in... Zरचना-प्रकिया को उसने एक पहेली में यों बांधा है .
255212 translate hindi to english हाल ही में उन्हें सरकारी ठेका मिला है करीब सौ ... They've just won four government contracts to ...
255213 translate english to hindi They've just won four government contracts to ... हाल ही में उन्हें सरकारी ठेका मिला है करीब सौ ...

255214 rows × 3 columns

```python eval_df ```
prefix input_text target_text
0 translate hindi to english वाह! Wow!
1 translate english to hindi Wow! वाह!
2 translate hindi to english बचाओ! Help!
3 translate english to hindi Help! बचाओ!
4 translate hindi to english उछलो. Jump.
... ... ... ...
5543 translate english to hindi Democracy is the worst form of government, exc... लोकतंत्र सरकार का सबसे घिनौना रूप है, अगर बाकी...
5544 translate hindi to english अगर मेरा बेटा ट्रेफ़िक हादसे में नहीं मारा गया... If my boy had not been killed in the traffic a...
5545 translate english to hindi If my boy had not been killed in the traffic a... अगर मेरा बेटा ट्रेफ़िक हादसे में नहीं मारा गया...
5546 translate hindi to english जब मैं बच्चा था, मुझे कीड़ों को छूने से कोई पर... When I was a kid, touching bugs didn't bother ...
5547 translate english to hindi When I was a kid, touching bugs didn't bother ... जब मैं बच्चा था, मुझे कीड़ों को छूने से कोई पर...

5548 rows × 3 columns

```python logging.basicConfig(level=logging.INFO) transformers_logger=logging.getLogger("transformers") transformers_logger.setLevel(logging.WARNING) ``` ```python model_args = T5Args() model_args.max_seq_length = 96 #maximum sequence length the model will support model_args.train_batch_size = 29 #the training batch size model_args.eval_batch_size = 20 #the evaluation batch size model_args.num_train_epochs = 1 #the number of epochs the model will be trained for model_args.evaluate_during_training = False #Set to True to perform evaluation while training models. Make sure eval data is passed to the training method if enabled. #model_args.evaluate_during_training_steps = 100 #Perform evaluation at every specified number of steps. A checkpoint model and the evaluation results will be saved. model_args.use_multiprocessing = False #If True, multiprocessing will be used when converting data into features. Enabling can speed up processing, but may cause instability. Defaults to False. model_args.fp16 = False #Whether or not fp16 mode should be used. Requires NVidia Apex library. model_args.save_steps = -1 #Save a model checkpoint at every specified number of steps. Set to -1 to disable. model_args.save_eval_checkpoints = False #Save a model checkpoint for every evaluation performed. model_args.no_cache = True #Cache features to disk. model_args.reprocess_input_data = True #If True, the input data will be reprocessed even if a cached file of the input data exists in the cache_dir. model_args.overwrite_output_dir = True #If True, the trained model will be saved to the ouput_dir and will overwrite existing saved models in the same directory. model_args.preprocess_inputs = False #If preprocess_inputs is set to True in the model args, then the ` < /s> token (including preceeding space) is automatically added to each string in the list. Otherwise, the strings must have the < /s>` (including preceeding space) must be included. model_args.num_return_sequences = 1 #whether to do beam search or not #model_args.wandb_project = "MT5 Sinhala-English Translation" #Name of W&B project. This will log all hyperparameter values, training losses, and evaluation metrics to the given project. ``` ```python model = T5Model("mt5", "google/mt5-base", args=model_args,use_cuda=False) ``` ```python model.train_model(train_df,eval_data=eval_df) ``` ```python results = model.eval_model(eval_df, verbose=True) # If verbose, results will be printed to the console on completion of evaluation. ```