Detecção Automática de Idiomas com XLM-RoBERTa e LoRA
O objetivo principal do projeto foi criar um classificador de idiomas altamente preciso, capaz de detectar 20 idiomas diferentes. O modelo resultante foi avaliado com métricas de acurácia e pontuação F1, alcançando uma precisão impressionante de 99,43%
nos dados de teste.
Descrição do Modelo
O modelo utilizado neste projeto é baseado no [XLM-RoBERTa]https://huggingface.co/xlm-roberta-base), um modelo transformer com uma camada de classificação no topo (uma camada linear sobre a saída agrupada). Ele foi treinado em cima do conjunto de dados de Identificação de Idioma, que consiste em sequências de texto em 20 idiomas diferentes. A abordagem LoRA foi utilizada para ajustar apenas um pequeno número de parâmetros do modelo (extras), o que reduziu significativamente os custos computacionais e de armazenamento.
Usos Pretendidos e Limitações
O modelo criado pode ser diretamente utilizado como um detector de idiomas, ou seja, para tarefas de classificação de sequências. Atualmente, ele suporta os seguintes 20 idiomas: árabe (ar), búlgaro (bg), alemão (de), grego moderno (el), inglês (en), espanhol (es), francês (fr), hindi (hi), italiano (it), japonês (ja), holandês (nl), polonês (pl), português (pt), russo (ru), suaíli (sw), tailandês (th), turco (tr), urdu (ur), vietnamita (vi) e chinês (zh).
Conjunto de Dados de Treinamento e Avaliação
O modelo foi ajustado usando o conjunto de dados de Identificação de Idioma, que contém sequências de texto em 20 idiomas diferentes. O conjunto de treinamento possui 70.000 amostras, enquanto os conjuntos de validação e teste têm 10.000 amostras cada. A acurácia média nos dados de teste é de 99,4%, e isso corresponde ao F1-score médio ponderado do conjunto de teste, que é perfeitamente equilibrado. Uma avaliação mais detalhada é fornecida na tabela abaixo:
Idioma | Precisão | Recall | F1-score | Suporte |
---|---|---|---|---|
árabe | 1.000 | 0.998 | 0.999 | 500 |
búlgaro | 0.992 | 1.000 | 0.996 | 500 |
alemão | 1.000 | 1.000 | 1.000 | 500 |
grego | 1.000 | 1.000 | 1.000 | 500 |
inglês | 0.992 | 0.992 | 0.992 | 500 |
espanhol | 0.994 | 0.992 | 0.993 | 500 |
francês | 0.998 | 0.998 | 0.998 | 500 |
hindi | 0.945 | 1.000 | 0.972 | 500 |
italiano | 1.000 | 0.984 | 0.992 | 500 |
japonês | 1.000 | 1.000 | 1.000 | 500 |
holandês | 0.996 | 0.992 | 0.994 | 500 |
polonês | 0.992 | 0.988 | 0.990 | 500 |
português | 0.988 | 0.986 | 0.987 | 500 |
russo | 0.998 | 0.996 | 0.997 | 500 |
suaíli | 0.992 | 0.994 | 0.993 | 500 |
tailandês | 1.000 | 1.000 | 1.000 | 500 |
turco | 1.000 | 1.000 | 1.000 | 500 |
urdu | 1.000 | 0.964 | 0.982 | 500 |
vietnamita | 1.000 | 1.000 | 1.000 | 500 |
chinês | 1.000 | 1.000 | 1.000 | 500 |
Resultados de Benchmark
Para comparar o desempenho do modelo xlm-roberta-base-lora-language-detection
, foi utilizado o modelo de referência da biblioteca Python langid, que já vem pré-treinado em 97 idiomas. O conjunto de idiomas foi ajustado para os 20 idiomas do nosso projeto. O modelo langid alcançou uma acurácia média de 98,5% nos dados de teste. Detalhes adicionais estão disponíveis na tabela abaixo:
Idioma | Precisão | Recall | F1-score | Suporte |
---|---|---|---|---|
árabe | 0.990 | 0.970 | 0.980 | 500 |
búlgaro | 0.998 | 0.964 | 0.981 | 500 |
alemão | 0.992 | 0.944 | 0.967 | 500 |
grego | 1.000 | 0.998 | 0.999 | 500 |
inglês | 1.000 | 1.000 | 1.000 | 500 |
espanhol | 1.000 | 0.968 | 0.984 | 500 |
francês | 0.996 | 1.000 | 0.998 | 500 |
hindi | 0.949 | 0.976 | 0.963 | 500 |
italiano | 0.990 | 0.980 | 0.985 | 500 |
japonês | 0.927 | 0.988 | 0.956 | 500 |
holandês | 0.980 | 1.000 | 0.990 | 500 |
polonês | 0.986 | 0.996 | 0.991 | 500 |
português | 0.950 | 0.996 | 0.973 | 500 |
russo | 0.996 | 0.974 | 0.985 | 500 |
suaíli | 1.000 | 1.000 | 1.000 | 500 |
tailandês | 1.000 | 0.996 | 0.998 | 500 |
turco | 0.990 | 0.968 | 0.979 | 500 |
urdu | 0.998 | 0.996 | 0.997 | 500 |
vietnamita | 0.971 | 0.990 | 0.980 | 500 |
chinês | 1.000 | 1.000 | 1.000 | 500 |
Utilizando o Modelo para Inferência
O modelo treinado pode ser utilizado para detectar automaticamente o idioma de um texto em uma tarefa de classificação de sequências. Abaixo está um exemplo de código Python para utilizar o modelo para inferência:
# pip install -q loralib transformers
# pip install -q git+https://github.com/huggingface/peft.git@main
import torch
from peft import PeftConfig, PeftModel
from transformers import (
AutoConfig,
AutoModelForSequenceClassification,
AutoTokenizer,
pipeline,
)
peft_model_id = "dominguesm/xlm-roberta-base-lora-language-detection"
# Load the Peft model config
peft_config = PeftConfig.from_pretrained(peft_model_id)
# Load the base model config
base_config = AutoConfig.from_pretrained(peft_config.base_model_name_or_path)
# Load the base model
base_model = AutoModelForSequenceClassification.from_pretrained(
peft_config.base_model_name_or_path, config=base_config
)
# Load the tokenizer
tokenizer = AutoTokenizer.from_pretrained(peft_config.base_model_name_or_path)
# Load the inference model
inference_model = PeftModel.from_pretrained(base_model, peft_model_id)
# Load the pipeline
pipe = pipeline("text-classification", model=inference_model, tokenizer=tokenizer)
def detect_lang(text: str) -> str:
# This code runs on CPU, so we use torch.cpu.amp.autocast to perform
# automatic mixed precision.
with torch.cpu.amp.autocast():
# or `with torch.cuda.amp.autocast():`
pred = pipe(text)
return pred
detect_lang(
"Cada qual sabe amar a seu modo; o modo, pouco importa; o essencial é que saiba amar."
)
# [{'label': 'pt', 'score': 0.9959434866905212}]
Procedimento de Treinamento
O ajuste fino do modelo foi realizado usando a API Trainer
. O código do treinamento pode ser encontrado neste Jupyter notebook.
Hiperparâmetros de Treinamento
Os seguintes hiperparâmetros foram utilizados durante o treinamento:
- learning_rate: 2e-05
- train_batch_size: 64
- eval_batch_size: 128
- optimizer: Adam com betas=(0.9, 0.999) e epsilon=1e-08
- num_epochs: 2
Resultados do Treinamento
Os resultados de validação na divisão valid
do conjunto de dados de Identificação de Idioma são resumidos abaixo:
Loss de Treinamento | Epoch | Passo | Loss de Validação | Acurácia | F1 |
---|---|---|---|---|---|
1.4403 | 1.0 | 1094 | 0.0591 | 0.9952 | 0.9952 |
0.0256 | 2.0 | 2188 | 0.0272 | 0.9955 | 0.9955 |
Em resumo, os seguintes resultados foram alcançados no conjunto de validação:
- Loss: 0.0298
- Acurácia: 0.9946
- F1: 0.9946
Versões das Bibliotecas Utilizadas
- torch 1.13.1+cu116
- datasets 2.10.1
- sklearn 1.2.1
- transformers 4.27.0.dev0
- langid 1.1.6
- peft 0.3.0.dev0
Nota
Este projeto foi completamente baseado e inspirado no modelo xlm-roberta-base-language-detection, desenvolvido por Luca Papariello.