How to Finetune mT5 to Create a Question Generator 🤔(for 100+ Languages)
Its been a month since Google released the massive multilingual model mT5. I was really excited to perform some crazy experiments using mT5. The special quirk about mT5 is its ability to perform any seq-2-seq task in more than 100 languages. I experimented with mT5 on mainly two tasks i.e. for language translations and secondly Question generation. I found the second use case much more interesting. So I created this blog as a tutorial on how to use mT5 for finetuning mT5 to build a question generator.🤩

What is exactly a question generator!

Question generators generate questions. They can be used by teachers and students for generating a variety of questions from a giving text. They can be particularly helpful for comprehension type questions.

Now that we know what is questions generator, let's build one. I will build question generator for Hindi language and you can replicate it on any 101 languages of your choice on which mT5 is trained on. (provided you have the dataset) You can check out supported language here.

Task

Let's define the task. For generating questions we need to input a text context to the mT5 model and expect a question in return.

Here is an example in English:

Context: Donald John Trump (born June 14, 1946) is the 45th and current president of the United States. Before entering politics, he was a businessman and television personality.

Output: Who is Donald Trump?

Since we are mainly focusing on the Hindi language we will have Hindi Context as input and Hindi Question as Output.

Dataset Collection

One another major issue in languages other than English is lack of quality Dataset for training and fine-tuning transformers models. Luckily for us, I found two similar datasets which just fulfil our dataset requirement in the Hindi language.

First is Deepmind Xquad Dataset (Cross-lingual Question Answering Dataset)and Facebook MLQA (MultiLingual Question Answering).

XQuAD (Cross-lingual Question Answering Dataset) is a benchmark dataset for evaluating cross-lingual question answering performance. The dataset consists of a subset of 240 paragraphs and 1190 question-answer pairs from the development set of SQuAD v1.1 (Rajpurkar et al., 2016) together with their professional translations into ten languages: Spanish, German, Greek, Russian, Turkish, Arabic, Vietnamese, Thai, Chinese, and Hindi. MLQA (MultiLingual Question Answering) is a benchmark dataset for evaluating cross-lingual question answering performance. MLQA consists of over 5K extractive QA instances (12K in English) in SQuAD format in seven languages — English, Arabic, German, Spanish, Hindi, Vietnamese and Simplified Chinese. MLQA is highly parallel, with QA instances parallel between 4 different languages on average.

I collected 1190 context-question pairs from Deep Mind Xquad dataset. From Facebook MLQA I concatenated test and dev dataset which consist a total of 5425 context-question pairs.

Since both datasets were originally present in JSON format for the ease of using I converted them CSV format. I divided the overall collected dataset into two sets: A training set with 6500 context-question pairs and testing set with 150 context-question pairs. The reason for keeping such low count testing set is unlike in classification problems, text generation problem doesn’t benefit much from a large testing dataset (since we do not have metric to evaluate generated questions or text generation in general).

Above is the script I created to perform these operations. (Colab notebooks are less convenient than Kaggle as Kaggle provide P100 GPU while Colab has Tesla T4 thus much lesser time while finetuning on Kaggle).

Finetuning mT5 using pytorch-lightning

We’ll be using PyTorch-lightning library for finetuning. Most of the code below is adapted from here. The trainer is generic and can be used for any text-2-text task. You’ll just need to change the dataset. Rest of the code will stay unchanged for all the tasks.

This is the most interesting and powerful thing about the text-2-text format. You can fine-tune the model on a variety of NLP tasks by just formulating the problem in the text-2-text setting. No need to change hyperparameters, learning rate, optimizer or loss function.

I trained the ‘google/mt5-base’ for 10 epochs with a batch size of 8. Here is the link to the fine-tuning script.

If you want to finetune mT5 on any of your tasks you need to take care of two things.

Create your own dataset in CSV format and change the dataset path in the fine-tuning Kaggle notebook. (dataset must have two files train.csv and valid.csv)

Secondly, change the QuestionDataset class in the above Kaggle notebook according to your use case. The input format I used while finetuning is

Input = "Hindi Context: %s" % (input_text)

# input_text is the given input to the model

Inference for Question Generation

Inferencing the model is the easiest part as we have done most of the heavy lifting. Let's check out the results.

from transformers import MT5ForConditionalGeneration, AutoTokenizer

model = MT5ForConditionalGeneration.from_pretrained("../input/mt5-hindi-question-generator")



tokenizer = AutoTokenizer.from_pretrained("google/mt5-base")

Input text (Any paragraph in the Hindi language)

article = '''Hindi context:पूरे विश्व भर में भारत एक प्रसिद्ध देश है। भौगोलिक रुप से, हमारा देश एशिया महाद्वीप के दक्षिण में स्थित है।

भारत एक अत्यधिक जनसंख्या वाला देश है साथ ही प्राकृतिक रुप से सभी दिशाओं से सुरक्षित है। पूरे विश्व भर में अपनी महान संस्कृति और पारंपरिक मूल्यों के लिये ये एक प्रसिद्ध देश है।

इसके पास हिमालय नाम का एक पर्वत है जो विश्व में सबसे ऊँचा है। ये तीन तरफ से तीन महासागरों से घिरा हुआ है जैसे दक्षिण में भारतीय महासागर, पूरब में बंगाल की खाड़ी और पश्चिम में अरेबिक सागर से।

भारत एक लोकतांत्रिक देश है जो जनसंख्या के लिहाज से दूसरे स्थान पर है। भारत में मुख्य रूप से हिंदी भाषा बोली जाती है परंतु यहां लगभग 22 भाषाओं को राष्ट्रीय रुप से मान्यता दी गयी है।

'''

For decoding, we can either use greedy decoding with single question generation or top_kp decoding with multiple questions generation.

Here are the results obtained

start = time.time()

encoding = tokenizer.encode_plus(article, return_tensors="pt")

input_ids, attention_masks = encoding["input_ids"].to(device), encoding["attention_mask"].to(device)

print(article)

output = greedy_decoding(input_ids,attention_masks)

print ("Greedy decoding::

",output)

end = time.time()

print ("

Time elapsed ", end-start)

print ("

")

Output :

Hindi context:पूरे विश्व भर में भारत एक प्रसिद्ध देश है। भौगोलिक रुप से, हमारा देश एशिया महाद्वीप के दक्षिण में स्थित है।

भारत एक अत्यधिक जनसंख्या वाला देश है साथ ही प्राकृतिक रुप से सभी दिशाओं से सुरक्षित है। पूरे विश्व भर में अपनी महान संस्कृति और पारंपरिक मूल्यों के लिये ये एक प्रसिद्ध देश है।

इसके पास हिमालय नाम का एक पर्वत है जो विश्व में सबसे ऊँचा है। ये तीन तरफ से तीन महासागरों से घिरा हुआ है जैसे दक्षिण में भारतीय महासागर, पूरब में बंगाल की खाड़ी और पश्चिम में अरेबिक सागर से।

भारत एक लोकतांत्रिक देश है जो जनसंख्या के लिहाज से दूसरे स्थान पर है। भारत में मुख्य रूप से हिंदी भाषा बोली जाती है परंतु यहां लगभग 22 भाषाओं को राष्ट्रीय रुप से मान्यता दी गयी है।



Greedy decoding::

भारत में कितनी भाषाएं बोली जाती हैं?



Time elapsed 1.0903606414794922

So the question generated seems pretty legit😇😇.

Here is the top_kp output for multiple questions

Hindi context:पूरे विश्व भर में भारत एक प्रसिद्ध देश है। भौगोलिक रुप से, हमारा देश एशिया महाद्वीप के दक्षिण में स्थित है।

भारत एक अत्यधिक जनसंख्या वाला देश है साथ ही प्राकृतिक रुप से सभी दिशाओं से सुरक्षित है। पूरे विश्व भर में अपनी महान संस्कृति और पारंपरिक मूल्यों के लिये ये एक प्रसिद्ध देश है।

इसके पास हिमालय नाम का एक पर्वत है जो विश्व में सबसे ऊँचा है। ये तीन तरफ से तीन महासागरों से घिरा हुआ है जैसे दक्षिण में भारतीय महासागर, पूरब में बंगाल की खाड़ी और पश्चिम में अरेबिक सागर से।

भारत एक लोकतांत्रिक देश है जो जनसंख्या के लिहाज से दूसरे स्थान पर है। भारत में मुख्य रूप से हिंदी भाषा बोली जाती है परंतु यहां लगभग 22 भाषाओं को राष्ट्रीय रुप से मान्यता दी गयी है।



Topkp decoding::

['भारत कहाँ स्थित है?', 'भारत के पास कितनी भाषाएँ हैं?', 'भारत की मुख्य भाषा क्या है?', 'भारत में मुख्य रूप से कौन सी भाषाएं बोली जाती हैं?', 'भारत में कितनी भाषाएँ बोली जाती हैं?', 'भारत की दूसरी लोकतांत्रिक सरकार क्या है?', 'भारत का हिस्सा किस महाद्वीप के दक्षिण में है?', 'भारत में कौन सी भाषा बोली जाती है?', 'हिंदी भाषा की कौन सी संस्कृति सबसे अधिक लोकप्रिय है?', 'भारत की जनसंख्या क्या है?']



Time elapsed 1.3107168674468994

So as you can see few questions are grammatically incorrect but if we check the overall quality its good for basic uses.

If you want to experiment more with my Hindi question generator check out my notebook on Kaggle.

So I conclude my blog on the question generator using mT5. You can now finetune mT5 on the various task in various languages. All the Kaggle notebooks and dataset used is set to public (anyone can use). I have given references for so many notebooks which might be confusing so if you have any question you may ask in comments. So are you ready to experiment with mT5?🤔🤔🤔

References:

Original Suraj Patil Colab on Finetuning T5
['Parth Chokhra']
['Machine Learning', 'Artificial Intelligence', 'Google', 'Technology', 'Programming']