NLP | Modelo de Question Answering em qualquer idioma baseado no BERT base (estudo de caso em português)
Este tutorial apresenta um método universal (e gratuito!) para treinar um modelo BERT base 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 é aplicado ao caso do português e o modelo resultante é publicado no Model Hub da Hugging Face enquanto o seu caderno de treinamento está disponível no Google Colab e GitHub (versão nbviewer). Obrigado a todas as organizações (veja o paragrafo “Agradecimentos”) que tornaram possível obter tal modelo eficiente de PLN (Processamento de Linguagem Natural)!
- Link para testar online e baixar o modelo:
- Link para o segundo post sobre BERT large QA:
Sumário
- Contexto
- Objetivo: modelo BERT QA em português
- Agradecimentos
- O que faz um modelo QA?
- Método para treinar um modelo QA
- Etapas do treinamento do modelo BERT base QA base em português
- Exemplo de uso | Nosso modelo BERT QA em português vs o BERT QA do Google Search
- Outros exemplos de uso
- Aviso
Contexto
Qual é a utilidade de conhecer um idioma? É claro que é essencial para a atividade humana, permitindo-nos em particular a pesquisa diária de informações (Qual é previsão do tempo para hoje? Quais são as principais manchetes das notícias? Que horas são? Quanto custa este produto? Quando começou a pandemia de Covid-19 no mundo?… ).
No entanto, essa funcionalidade não é mais reservada exclusivamente para humanos. Graças à revolução do PLN (NLP em inglês) por meio de modelos Transformer como o BERT, é possível treinar um modelo para entender uma linguagem (modelo de linguagem natural), mas também para realizar uma tarefa específica, como buscar uma resposta em um texto (modelo de Question Answering, seja modelo QA).
Por exemplo, o Google Search incluiu em seu algoritmo de busca um modelo BERT QA no final de 2019, o que permite publicar a resposta a uma pesquisa diretamente no topo da página de resultados :-)
A questão é se uma pessoa, órgão público ou empresa também pode ter acesso a esse modelo de QA em português?
Nota: existem outras tarefas que os modelos PNL recentes podem realizar. Para ver uma lista delas, bem com dos modelos correspondentes, consulte esta página: https://huggingface.co/models
Objetivo: modelo BERT QA em português
Na verdade, devido à importância dessa funcionalidade de QA, a pesquisa nesta área é muito ativa (consulte a lista de artigos no arxiv.org), mas parece se concentrar mais em modelos QA em inglês.
No mínimo, no Model Hub da Hugging Face (HF), não existiam tais modelos BERT QA em português até o dia 10 de fevereiro de 2021.
Este artigo preenche este vazio publicando um modelo BERT QA em português no Model Hub da HF de acordo com as boas práticas sobre o compartilhamento de modelos de PLN e usando apenas recursos online sem taxas de uso.
Agradecimentos
A publicação online de modelos de PLN é 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:
- O Google Brain (hoje, Google AI), que ao desenvolver a arquitetura do Transformer em 2017 (artigo “Attention is all you need”) e depois o modelo BERT em 2018, permitiu a publicação de modelos de linguagem natural eficientes em diferentes idiomas.
- A Hugging Face (HF), que ao fornecer uma biblioteca de PLN (Transformers), scripts e um Model Hub, permite o compartilhamento de modelos existentes e seus treinamentos para novas linguagens e/ou novas tarefas.
- A Neuralmind, que em 2019 criou um corpus geral em português (BrWaC (Brazilian Web as Corpus)) e que com ele, treinou 2 modelos BERT (base e large) para entender a língua portuguesa e os disponibilizou no Model Hub de HF.
- O grupo Deep Learning Brasil, que disponibilizou em 2020 o dataset SQUAD em português, que usei par ajustar o modelo BERT base para a tarefa de QA em português (usando um script da HF) e cujo link foi publicado no fórum do AI Lab.
- O Google Colab que permitiu de treinar gratuitamente esse modelo BERT QA base em português.
- O GitHub (Microsoft) que permitiu de publicar online o caderno de treinamento.
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 PLN 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…).
O que faz um modelo QA?
Um modelo 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.
Método para treinar um modelo QA
O método de 4 etapas a seguir requer um modelo de linguagem natural na língua portuguesa, bem como um dataset de QA em português. Ele segue a identificação de boas práticas para o compartilhamento de modelos de PLN.
- Baixe um modelo de linguagem natural já treinado em um corpus geral da língua portuguesa a partir do Model Hub da Hugging Face (HF).
- Baixe um dataset de QA em português.
- Ajuste (fine-tuning) esse modelo para a tarefa de QA em português usando esse dataset e o caderno question_answering.ipynb da HF.
- Publique esse último modelo no Model Hub da HF junto com o seu caderno de treinamento no GitHub e/ou Google Colab.
Nota: entre as etapas 2 e 3, a gente poderia ajustar o modelo de linguagem natural aos textos que constituem o corpus do dataset de QA usando os cadernos de language-modeling da HF. Isso poderia ser interessante no caso de um corpus técnico (por exemplo, na medicina ou no jurídico). Para obter um modelo QA atuando com eficiência nos textos gerais (por exemplo, textos da Wikipedia), não é necessário.
Etapas do treinamento do modelo BERT base QA em português
De acordo com esse método, segui as seguintes etapas para obter meu modelo BERT QA base em português:
Etapa 1 — Modelo de linguagem natural em português
Aqui está a lista dos modelos de linguagem natural na língua portuguesa no Model Hub da Hugging Face:
https://huggingface.co/models?filter=pt,fill-mask
Resolvi baixar o modelo BERT base cased da Neuralmind que é o mais usado e que foi treinado com textos de um corpus geral (BrWaC (Brazilian Web as Corpus)): neuralmind/bert-base-portuguese-cased
Etapa 2 — Dataset de QA em português
O dataset mais usado no mundo de idioma inglês para trainar modelos QA é o SQUAD (Stanford Question Answer Dataset) dataset consistindo em perguntas feitas por crowdworkers em um conjunto de artigos da Wikipedia, onde a resposta para cada pergunta é um segmento de texto, ou extensão, da passagem de leitura correspondente (mais de 100.000 pares de perguntas e respostas em mais de 500 artigos).
No Brasil, o grupo Deep Learning Brasil publicou uma versão em português, usando uma tradução automática pelo Google Tradutor do dataset SQuAD v1.1 em inglês e ficou uns 2 meses fazendo revisão e algumas correções: squad-pt.tar.gz no Google Drive. (fonte)
Etapa 3— Caderno de treinamento
A gente modificou só um pouquinho o caderno question_answering.ipynb da HF para adaptá-lo a esse dataset SQUAD pt.
- Aqui está esse caderno modificado no Google Colab: colab_question_answering_BERT_base_cased_squad_v11_pt.ipynb
- Aqui está esse caderno modificado no GitHub (versão nbviewer): colab_question_answering_BERT_base_cased_squad_v11_pt.ipynb
A plataforma usada foi o Google Colab que permitiu ajustar o modelo BERT base cased em português da Neuralmind para a tarefa QA em 2 horas e 30 minutos em apenas um GPU (Tesla T4, 15GB RAM) e gratuitamente.
Aqui estão as versões das bibliotecas e do GPU usadas:
Python version: 3.6.9 (default, Oct 8 2020, 12:12:24)Pytorch: 1.7.0+cu101Successfully installed datasets-1.3.0 fsspec-0.8.5 huggingface-hub-0.0.2 pyarrow-3.0.0 sacremoses-0.0.43 tokenizers-0.10.1 transformers-4.3.2 xxhash-2.0.0!nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243!nvidia-smi
NVIDIA-SMI 460.39
Driver Version: 460.32.03
CUDA Version: 11.2
Tesla T4, 15109MiB
Etapa 4 — Modelo QA publicado
f1 = 82.50
exact match = 70.49
O modelo BERT QA resultante foi publicado no Model Hub da Hugging Face no dia 12/02/2021:
Exemplo de uso | Nosso modelo BERT QA em português vs o BERT QA do Google Search
Vamos pegar o exemplo da pergunta feita ao Google Search no início desta postagem (“Quando começou a pandemia de Covid-19 no mundo?”) com o texto da página da Wikipedia onde a pesquisa do Google encontrou a resposta correta:
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 aguda causada pelo coronavírus da síndrome respiratória aguda grave 2 (SARS-CoV-2).
A doença foi identificada pela primeira vez em Wuhan, na província de Hubei, República Popular da China, em 1 de dezembro de 2019, mas o primeiro caso foi reportado em 31 de dezembro do mesmo ano.
Acredita-se que o vírus tenha uma origem zoonótica, porque os primeiros casos confirmados tinham principalmente ligações ao Mercado Atacadista de Frutos do Mar de Huanan, que também vendia animais vivos.
Em 11 de março de 2020, a Organização Mundial da Saúde declarou o surto uma pandemia. Até 8 de fevereiro de 2021, pelo menos 105 743 102 casos da doença foram confirmados em pelo menos 191 países e territórios, com cerca de 2 308 943 mortes e 58 851 440 pessoas curadas.
Podemos ler no caderno no GitHub que o nosso modelo encontrou a resposta correta:
Answer: '1 de dezembro de 2019', score: 0.713, start: 328, end: 349
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: '1 de dezembro de 2019', score: 0.4922, start: 328, end: 349
Outros exemplos de uso
Usando o mesmo conteúdo, podemos ler no caderno no GitHub que nosso modelo encontrou as respostas corretas para todas as perguntas:
question = “O qué a pandemia de Covid-19?”
Answer: ‘uma doença respiratória aguda’, score: 0.0429, start: 110, end: 139question = “A Covid-19 tem algo a ver com animais?”
Answer: ‘Acredita-se que o vírus tenha uma origem zoonótica’, score: 0.3732, start: 418, end: 468question = “Onde foi descoberta a Covid-19?”
Answer: ‘Wuhan, na província de Hubei, República Popular da China’, score: 0.4265, start: 266, end: 322question = “Quantos casos houve?”
Answer: ‘105 743 102’, score: 0.4607, start: 750, end: 761question = “Quantos mortes?”
Answer: ‘2 308 943’, score: 0.7313, start: 850, end: 859question = “Quantos paises tiveram casos?”
Answer: ‘191’, score: 0.4053, start: 810, end: 813question = “Quantas pessoas foram curadas?”
Answer: ’58 851 440', score: 0.9288, start: 869, end: 879
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 modelo de linguagem natural mais eficiente como o BERT large da Neuralmind em português e um conjunto de dados de QA em português com mais exemplos.
No entanto, o método explicado neste tutorial será aplicado da mesma maneira.
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.