NLP | Como treinar um modelo de Question Answering em qualquer linguagem baseado no BERT large, melhorando o desempenho do modelo utilizando o BERT base? (estudo de caso em português)

Pierre Guillou
8 min readJun 18, 2021

--

Exemplo de sequência de palavras de um texto que constitui a resposta à uma questão (BERT large) (texto da Wikipedia https://pt.wikipedia.org/wiki/Pandemia_de_COVID-19, 18/06/2021)
Exemplo de sequência de palavras de um texto que constitui a resposta à uma questão (BERT large) (texto da Wikipedia https://pt.wikipedia.org/wiki/Pandemia_de_COVID-19, 18/06/2021)

Após o tutorial com o BERT base, este tutorial apresenta um método universal para treinar um modelo BERT large para encontrar uma resposta a uma pergunta em um texto (se chama BERT QA ou BERT Question Answering), o tipo de modelo usado pelo… Google Search! O método usa as bibliotecas transformers da Hugging Face e DeepSpeed ​​da Microsoft. É aplicado ao caso português e o modelo resultante supera o desempenho do modelo BERT base QA treinado com o mesmo dataset (SQuAD 1.1 em português). Ele é publicado no Model Hub da Hugging Face, enquanto seu notebook de treinamento está disponível no GitHub (versão nbviewer). Obrigado a todas as organizações (ver parágrafo “Agradecimentos”) que tornaram possível obter um modelo de NLP (PLN: Processamento de Linguagem Natural) tão eficiente!

  • Link para testar online e baixar o modelo:

Sumário

  • O que faz um modelo QA?
  • Contexto
  • transformers (Hugging Face) + DeepSpeed
  • Minhas adições
  • Resultados
  • Exemplo de uso | Nosso modelo BERT QA em português vs a pandemia de COVID-19
  • >> Quando começou a pandemia de Covid-19 no mundo?
  • >> Outras perguntas
  • Aviso
  • Agradecimentos

O que faz um modelo QA?

Um modelo Question Answering (QA) é um modelo de linguagem natural (BERT, por exemplo) adaptado à tarefa de responder a perguntas, seja um modelo capaz de extrair de um texto (o contexto) a sequência de palavras que constitui a resposta a uma pergunta.

exemplo de uso de um modelo NLP de Question-Answering (QA)
exemplo de uso de um modelo NLP de Question-Answering (QA)

Contexto

Publiquei no dia 12 de fevereiro de 2021 um tutorial e um notebook no Google Colab e GitHub (versão nbviewer) explicando como treinar no Google Colab um modelo de Question Answering (QA) em qualquer idioma baseado no BERT base.

Ao aplicar esse tutorial em português, consegui publicar um tal modelo no Model Hub da Hugging Face.

Parece que esse modelo atendeu às expectativas, pois no mês passado já foi baixado quase 3000 vezes!

Quase 3000 downloads do modelo Portuguese BERT base cased QA (Question Answering), finetuned on SQUAD v1.1 no dia 18/06/2021
Quase 3000 downloads do modelo Portuguese BERT base cased QA (Question Answering), finetuned on SQUAD v1.1 no dia 18/06/2021

Top… mas como parte desses downloads corresponde a um uso profissional, é natural questionar se é possível treinar um modelo ainda mais eficiente, por exemplo a partir de um BERT large (345 milhões de parâmetros contra 110 para o BERT base).

A resposta é sim e vamos ver como.

transformers (Hugging Face) + DeepSpeed

Em fevereiro de 2021, eu já havia apresentado a biblioteca DeepSpeed ​​após sua primeira integração com a biblioteca transformers da Hugging Face (leia Fit More and Train Faster With ZeRO via DeepSpeed and FairScale).

Essa biblioteca (DeepSpeed) tornou-se essencial para treinar modelos pesados ​​de Deep Learning, como os do NLP. Ela não só permite o uso de um único GPU (o que é o caso da maioria das pessoas, e muitas vezes das empresas), mas também reduz significativamente o tempo de treinamento desses modelos.

Com os recentes anúncios do Hugging Face (veja os tweets abaixo de Stas Bekman e a documentação Trainer Deepspeed Integration), vi que a integração entre as 2 bibliotecas continuou e a recente atualização no dia 10 de junho do notebook transformers + deepspeed CLI que mostra como configurar transformers + DeepSpeed ​​para funcionar no Colab me decidiu a treinar um BERT large para a tarefa de QA (Question-Answering) em português.

Minhas adições

Portanto, adaptei o notebook do Stas Bekam à tarefa de Question-Answering (QA) por um BERT large usando o script run_qa.py da Hugging Face e DeepSpeed ZeRO-2, que permitem ajustar (fine-tune) um modelo de linguagem para a tarefa de QA (aqui, fiz um ajuste fino do modelo BERT large cased em português da Neuralmind).

Por isso, usei de novo o dataset SQuAD 1.1 em português (versão em português do dataset SQuAD v1.1 inglês cuja tradução foi feita pelo grupo Deep Learning Brasil: squad-pt.tar.gz no Google Drive (fonte)).

Para permitir o uso futuro do meu notebook com qualquer outro dataset e qualquer outra configuração dos parâmetros de treinamento, eu voluntariamente deixei o código de configuração do dataset e fiz todos os parâmetros aparecerem no código.

Além disso, adicionei o código necessário para visualizar os outputs do treinamento em TensorBoard, o código que permite redefinir os valores dos parâmetros do modelo treinado para float32 (leia Getting The Model Weights Out), e o código que permite preparar o modelo a ser transferido para o Model Hub de Hugging Face (leia Model sharing and uploading).

Por fim, adicionei o código para testar o modelo treinado com um texto e perguntas seja nas cédulas, seja numa interface Gradio (leia Using & Mixing Hugging Face Models with Gradio 2.0), e publiquei o modelo treinado no Model Hub de Hugging Face e meu notebook no github de acordo com as boas práticas sobre o compartilhamento de modelos de NLP.

Et voilà :-)

Resultados

Aqui está o notebook no GitHub (versão nbviewer): question_answering_BERT_large_cased_squad_v11_pt.ipynb

O modelo superou o desempenho do BERT base QA:

f1 = 84.43 # base: 82.50
exact match = 72.68 # base 70.49

O modelo BERT QA resultante foi publicado no Model Hub da Hugging Face no dia 18/06/2021:

Exemplo de uso | Nosso modelo BERT QA em português vs a pandemia de COVID-19

Quando começou a pandemia de Covid-19 no mundo?

Vamos pegar o exemplo desta pergunta “Quando começou a pandemia de Covid-19 no mundo?” com o texto da página da Wikipedia no dia 18/06/2021 :

A pandemia de COVID-19, também conhecida como pandemia de coronavírus, é uma pandemia em curso de COVID-19, uma doença respiratória causada pelo coronavírus da síndrome respiratória aguda grave 2 (SARS-CoV-2). O vírus tem origem zoonótica e o primeiro caso conhecido da doença remonta a dezembro de 2019 em Wuhan, na China. 
Em 20 de janeiro de 2020, a Organização Mundial da Saúde (OMS) classificou o surto como Emergência de Saúde Pública de Âmbito Internacional e, em 11 de março de 2020, como pandemia.
Em 18 de junho de 2021, 177 349 274 casos foram confirmados em 192 países e territórios, com 3 840 181 mortes atribuídas à doença, tornando-se uma das pandemias mais mortais da história.
Os sintomas de COVID-19 são altamente variáveis, variando de nenhum a doenças com risco de morte. O vírus se espalha principalmente pelo ar quando as pessoas estão perto umas das outras. Ele deixa uma pessoa infectada quando ela respira, tosse, espirra ou fala e entra em outra pessoa pela boca, nariz ou olhos.Ele também pode se espalhar através de superfícies contaminadas. As pessoas permanecem contagiosas por até duas semanas e podem espalhar o vírus mesmo se forem assintomáticas.

Podemos ler no caderno no GitHub que o nosso modelo encontrou a resposta correta:

Answer: 'dezembro de 2019', core: 0.5087, start: 290, end: 306

E o que é ainda mais interessante, é que a resposta não depende da formulação da questão (não depende das palavras chave)! Com a questão “Qual é a data de início da pandemia Covid-19 em todo o mundo?”, o nosso modelo encontrou também a resposta correta:

Answer: 'dezembro de 2019', score: 0.4988, start: 290, end: 306

Outras perguntas

Usando o mesmo conteúdo, podemos ler no caderno no GitHub que nosso modelo encontrou as respostas corretas para todas as perguntas.

Por exemplo: “Como se espalha o vírus?

Answer: 'principalmente pelo ar quando as pessoas estão perto umas das outras', score: 0.3173, start: 818, end: 886

Aviso

Nosso modelo funciona bem, mas é importante lembrar que os modelos em inglês alcançam um desempenho ainda melhor. Para atingir os mesmos níveis, seria necessário, por exemplo, usar um conjunto de dados de QA em português com mais exemplos.

No entanto, o método explicado nesse tutorial será aplicado da mesma maneira.

Agradecimentos

A publicação online de modelos de NLP é hoje extremamente facilitada por vários órgãos de IA que publicam em Open Source ou que disponibilizam ferramentas online como scripts e plataformas GPU:

Por fim, gostaria de agradecer o AI Lab, laboratório em Inteligência Artificial da Universidade de Brasilia (UnB), do qual faço parte como pesquisador e docente em Deep Learning, e que me permite de atualizar meu conhecimento em Deep Learning, e em NLP em particular.

Et voilà! Sem esses atores, gerar um modelo QA eficiente em português e acessível a todos seria muito mais complicado e certamente impossível devido à complexidade do código para digitar e aos custos de tal projeto (recursos humanos, plataformas com GPU, tempo de computação…).

Lista de organizações que possibilitaram a geração de um modelo BERT large de Question Answering em português. Obrigado
Lista de organizações que possibilitaram a geração de um modelo BERT large de Question Answering em português. Obrigado

Sobre o autor: Pierre Guillou é consultor de IA no Brasil e na França, pesquisador em Deep Learning e NLP do AI Lab (Unb) e professor de Inteligência Artificial (UnB). Entre em contato com ele por meio de seu perfil no LinkedIn.

--

--

Pierre Guillou

AI, Generative AI, Deep learning, NLP models author | Europe (Paris, Bruxelles, Liège) & Brazil