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:
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_length
, padding
e truncation
.
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
- "
- &
- Todos os Produtos
- analítica
- por aí
- artigo
- artigos
- auto
- construir
- Prédio
- chamada
- comentários
- componente
- conteúdo
- Criar
- criador
- dados,
- ciência de dados
- cientista de dados
- dia
- deep learning
- Diretor
- engenheiro
- Engenheiros
- Inglês
- Característica
- Finalmente
- financiar
- Primeiro nome
- formato
- freelance
- cheio
- Bom estado, com sinais de uso
- GPUs
- ótimo
- cabeça
- SUA PARTICIPAÇÃO FAZ A DIFERENÇA
- Como funciona o dobrador de carta de canal
- Como Negociar
- HTTPS
- enorme
- imagem
- Internet
- IT
- Itália
- Chave
- língua
- Idiomas
- APRENDER
- aprendizagem
- Biblioteca
- carregar
- London
- aprendizado de máquina
- Fazendo
- mapas
- máscara
- ML
- modelo
- modelagem
- mover
- Linguagem Natural
- Processamento de linguagem natural
- PNL
- online
- aberto
- open source
- Outros
- Texto simples
- jogador
- Abundância
- projeto
- pytorch
- Cru
- Resultados
- rever
- Ciência
- cientistas
- conjunto
- Tamanho
- So
- divisão
- começo
- loja
- Histórias
- teste
- ensaio
- testes
- tempo
- token
- Tokens
- topo
- Training
- transformando
- Uk
- UN
- us
- casos de uso
- Vídeo
- Assistir
- QUEM
- Windows
- dentro
- Atividades:
- mundo
- escritor
- X
- Youtube