Como treinar um modelo BERT do zero

Nó Fonte: 1013329

Como treinar um modelo BERT do zero

Conheça o primo italiano de BERT, FiliBERTo.


By James Briggs, Cientista de dados



BERT, mas na Itália — imagem do autor

 

Muitos dos meus artigos foram focados no BERT – o modelo que veio e dominou o mundo do processamento de linguagem natural (NLP) e marcou uma nova era para os modelos de linguagem.

Para aqueles de vocês que podem não ter usado modelos de transformadores (por exemplo, o que é BERT) antes, o processo se parece um pouco com isso:

  • pip install transformers
  • Inicialize um modelo de transformadores pré-treinados — from_pretrained.
  • Teste-o em alguns dados.
  • Talvez afinar o modelo (treiná-lo um pouco mais).

Agora, esta é uma ótima abordagem, mas se apenas fizermos isso, não teremos o entendimento por trás da criação de nossos próprios modelos de transformadores.

E, se não podemos criar nossos próprios modelos de transformadores - devemos confiar que existe um modelo pré-treinado que se ajuste ao nosso problema, nem sempre é esse o caso:



Alguns comentários perguntando sobre modelos BERT não ingleses

 

Portanto, neste artigo, exploraremos as etapas que devemos seguir para construir nosso próprio modelo de transformador - especificamente uma versão mais desenvolvida do BERT, chamada RoBERTa.

Uma visão geral

 
 
Existem algumas etapas no processo, portanto, antes de mergulharmos, vamos primeiro resumir o que precisamos fazer. No total, existem quatro partes principais:

  • Obtendo os dados
  • Construindo um tokenizador
  • Criando um pipeline de entrada
  • Treinando o modelo

Uma vez que tenhamos trabalhado em cada uma dessas seções, pegaremos o tokenizer e o modelo que construímos — e salvaremos ambos para que possamos usá-los da mesma maneira que normalmente faríamos com from_pretrained.

Obtendo os dados

 
 
Como em qualquer projeto de aprendizado de máquina, precisamos de dados. Em termos de dados para treinar um modelo de transformador, realmente temos muitas opções - podemos usar quase todos os dados de texto.



Vídeo passo a passo para baixar o conjunto de dados OSCAR usando a biblioteca de conjuntos de dados do HuggingFace

 

E, se há uma coisa que temos bastante na internet - são dados de texto não estruturados.

Um dos maiores conjuntos de dados no domínio do texto extraído da Internet é o conjunto de dados OSCAR.

O conjunto de dados OSCAR possui um grande número de idiomas diferentes - e um dos casos de uso mais claros para treinamento do zero é para que possamos aplicar o BERT a alguns idiomas menos usados, como Telugu ou Navajo.

Infelizmente, a única língua que posso falar com algum grau de competência é o inglês — mas minha namorada é italiana, então ela — Laura, avaliará os resultados do nosso modelo BERT de língua italiana — FiliBERTo.

Então, para baixar o segmento italiano do conjunto de dados OSCAR, usaremos o HuggingFace's datasets library — que podemos instalar com pip install datasets. Então baixamos OSCAR_IT com:

Vamos dar uma olhada no dataset objeto.

Ótimo, agora vamos armazenar nossos dados em um formato que podemos usar ao construir nosso tokenizer. Precisamos criar um conjunto de arquivos de texto simples contendo apenas o text recurso do nosso conjunto de dados e dividiremos cada amostra usando uma nova linha n.

Mais em nosso data/text/oscar_it diretório encontraremos:


Uma captura de tela exibindo uma janela do Windows Explorer cheia de arquivos .txt — representando os dados OSCAR em texto simples
O diretório que contém nossos arquivos OSCAR de texto simples

 

Construindo um Tokenizer

 
 
O próximo é o tokenizer! Ao usar transformadores, normalmente carregamos um tokenizer, juntamente com seu respectivo modelo de transformador - o tokenizer é um componente chave no processo.



Passo a passo em vídeo para construir nosso tokenizer personalizado

 

Ao construir nosso tokenizer, iremos alimentá-lo com todos os nossos dados OSCAR, especificar o tamanho do nosso vocabulário (número de tokens no tokenizer) e quaisquer tokens especiais.

Agora, os tokens especiais RoBERTa são assim:

Então, nós nos certificamos de incluí-los dentro do special_tokens parâmetro do nosso tokenizer train chamada de método.

Nosso tokenizer está pronto e podemos salvá-lo para uso posterior:

Agora temos dois arquivos que definem nosso novo FiliBERTo tokenizador:

  • mesclagens.txt — executa o mapeamento inicial de texto para tokens
  • vocabulário.json — mapeia os tokens para IDs de token

E com eles, podemos passar a inicializar nosso tokenizer para que possamos usá-lo como usaríamos qualquer outro from_pretrained tokenizador.

Inicializando o Tokenizer

 
 
Primeiro inicializamos o tokenizer usando os dois arquivos que construímos antes — usando um simples from_pretrained:

Agora que nosso tokenizer está pronto, podemos tentar codificar algum texto com ele. Ao codificar, usamos os mesmos dois métodos que normalmente usaríamos, encode e encode_batch.

Do objeto de codificações tokens estaremos extraindo o input_ids e attention_mask tensores para uso com FiliBERTo.

Criando o pipeline de entrada

 
 
O pipeline de entrada do nosso processo de treinamento é a parte mais complexa de todo o processo. Consiste em pegarmos nossos dados brutos de treinamento OSCAR, transformá-los e carregá-los em um DataLoader pronto para o treinamento.



Passo a passo de vídeo do pipeline de entrada de MLM

 

Preparando os dados

 
 
Começaremos com uma única amostra e trabalharemos na lógica de preparação.

Primeiro, precisamos abrir nosso arquivo - os mesmos arquivos que salvamos como .txt arquivos anteriores. Dividimos cada um com base em caracteres de nova linha n pois isso indica as amostras individuais.

Em seguida, codificamos nossos dados usando o tokenizer — certificando-se de incluir parâmetros-chave como max_lengthpaddingtruncation.

E agora podemos passar para a criação de nossos tensores — estaremos treinando nosso modelo por meio de modelagem de linguagem mascarada (MLM). Então, precisamos de três tensores:

  • input_ids - nosso token_ids com ~15% dos tokens mascarados usando o token de máscara <mask>.
  • atenção_máscara - um tensor de 1areia 0s, marcando a posição de tokens 'reais'/tokens de preenchimento — usados ​​em cálculos de atenção.
  • Labels - nosso token_ids de não mascaramento.

Se você não está familiarizado com o MLM, eu expliquei SUA PARTICIPAÇÃO FAZ A DIFERENÇA.

Nosso attention_mask e labels tensores são simplesmente extraídos do nosso batch. O input_ids os tensores requerem mais atenção no entanto, para este tensor nós mascaramos ~ 15% dos tokens — atribuindo-lhes o ID do token 3.

Na saída final, podemos ver parte de um codificado input_ids tensor. O primeiro ID de token é 1 - O [CLS] símbolo. Pontilhados ao redor do tensor temos vários 3 IDs de token — estes são nossos recém-adicionados [MASK] fichas.

Construindo o DataLoader

 
 
A seguir, definimos nossa Dataset class — que usamos para inicializar nossos três tensores codificados como PyTorch torch.utils.data.Dataset objetos.

Finalmente, o nosso dataset é carregado em um PyTorch DataLoader object — que usamos para carregar nossos dados em nosso modelo durante o treinamento.

Treinando o modelo

 
 
Precisamos de duas coisas para treinar, nosso DataLoader e um modelo. O DataLoader temos - mas nenhum modelo.



Inicializando o modelo

 
 
Para treinamento, precisamos de um raw (não pré-treinado) BERTLMHeadModel. Para criar isso, primeiro precisamos criar um objeto de configuração RoBERTa para descrever os parâmetros com os quais gostaríamos de inicializar o FiliBERTo.

Em seguida, importamos e inicializamos nosso modelo RoBERTa com um cabeçote de modelagem de linguagem (LM).

Preparação do treinamento

 
 
Antes de passar para o nosso loop de treinamento, precisamos configurar algumas coisas. Primeiro, configuramos o uso de GPU/CPU. Em seguida, ativamos o modo de treinamento do nosso modelo e, finalmente, inicializamos nosso otimizador.

Training

 
 
Finalmente — tempo de treino! Nós treinamos como normalmente treinamos via PyTorch.

Se formos para o Tensorboard, encontraremos nossa perda ao longo do tempo - parece promissor.



Perda / tempo — várias sessões de treinamento foram agrupadas neste gráfico

 

O Teste Real

 
 
Agora é hora do teste real. Montamos um pipeline de MLM – e pedimos a Laura para avaliar os resultados. Você pode assistir à revisão em vídeo às 22:44 aqui:



Primeiro inicializamos um pipeline objeto, usando o 'fill-mask' argumento. Então comece a testar nosso modelo assim:

"tchau como vai?” é a resposta certa! Isso é o mais avançado que meu italiano pode chegar – então, vamos passar para Laura.

Nós começamos com “buongiorno, vem va?” - ou "bom Dia como você está?":

A primeira resposta, “buongiorno, chi va?” significa "bom dia, quem está aí?" — por exemplo, sem sentido. Mas, nossa segunda resposta está correta!

Em seguida, uma frase um pouco mais difícil, “ciao, pomba ci incontriamo oggi pomeriggio?” - ou "Oi, onde vamos nos encontrar esta tarde?":

E retornamos alguns resultados mais positivos:

✅ "hi, where do we see each other this afternoon?"
✅ "hi, where do we meet this afternoon?"
❌ "hi, where here we are this afternoon?"
✅ "hi, where are we meeting this afternoon?"
✅ "hi, where do we meet this afternoon?"

Finalmente, mais uma frase mais difícil, “cosa sarebbe sucesso se avessimo scelto un altro giorno?” — ou “o que teria acontecido se tivéssemos escolhido outro dia?”:

Retornamos algumas boas e mais boas respostas aqui também:

✅ "what would have happened if we had chosen another day?"
✅ "what would have happened if I had chosen another day?"
✅ "what would have happened if they had chosen another day?"
✅ "what would have happened if you had chosen another day?"
❌ "what would have happened if another day was chosen?"

No geral, parece que nosso modelo passou nos testes de Laura — e agora temos um modelo de língua italiana competente chamado FiliBERTo!

Isso é tudo para este passo a passo de treinar um modelo BERT do zero!

Cobrimos muito terreno, desde obter e formatar nossos dados – até o uso de modelagem de linguagem para treinar nosso modelo BERT bruto.

Espero que tenha gostado deste artigo! Se você tiver alguma dúvida, me avise através Twitter ou nos comentários abaixo. Se você quiser mais conteúdo como este, eu posto no YouTube demasiado.

Obrigado pela leitura!

 

70% de desconto! Processamento de linguagem natural: PNL com transformadores em Python

Modelos de transformadores são o padrão de fato na PNL moderna. Eles provaram ser os mais expressivos…
 

*Todas as imagens são do autor, exceto onde indicado de outra forma

 
Bio: James Briggs é cientista de dados especializado em processamento de linguagem natural e trabalha no setor financeiro, com sede em Londres, Reino Unido. Ele também é um mentor freelance, escritor e criador de conteúdo. Você pode entrar em contato com o autor por e-mail (jamescalam94@gmail.com).

Óptimo estado. Original. Republicado com permissão.

Relacionado:

Fonte: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Carimbo de hora:

Mais de KDnuggetsGenericName