26 319 10

Language Detection LoRa

Detecção de idiomas precisa com XLM-RoBERTa e LoRA para 20 idiomas, alcançando 99.4% de acurácia.

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:

IdiomaPrecisãoRecallF1-scoreSuporte
árabe1.0000.9980.999500
búlgaro0.9921.0000.996500
alemão1.0001.0001.000500
grego1.0001.0001.000500
inglês0.9920.9920.992500
espanhol0.9940.9920.993500
francês0.9980.9980.998500
hindi0.9451.0000.972500
italiano1.0000.9840.992500
japonês1.0001.0001.000500
holandês0.9960.9920.994500
polonês0.9920.9880.990500
português0.9880.9860.987500
russo0.9980.9960.997500
suaíli0.9920.9940.993500
tailandês1.0001.0001.000500
turco1.0001.0001.000500
urdu1.0000.9640.982500
vietnamita1.0001.0001.000500
chinês1.0001.0001.000500

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:

IdiomaPrecisãoRecallF1-scoreSuporte
árabe0.9900.9700.980500
búlgaro0.9980.9640.981500
alemão0.9920.9440.967500
grego1.0000.9980.999500
inglês1.0001.0001.000500
espanhol1.0000.9680.984500
francês0.9961.0000.998500
hindi0.9490.9760.963500
italiano0.9900.9800.985500
japonês0.9270.9880.956500
holandês0.9801.0000.990500
polonês0.9860.9960.991500
português0.9500.9960.973500
russo0.9960.9740.985500
suaíli1.0001.0001.000500
tailandês1.0000.9960.998500
turco0.9900.9680.979500
urdu0.9980.9960.997500
vietnamita0.9710.9900.980500
chinês1.0001.0001.000500

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 TreinamentoEpochPassoLoss de ValidaçãoAcuráciaF1
1.44031.010940.05910.99520.9952
0.02562.021880.02720.99550.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.