PT-BR Moderation BERTimbau V1
Classificador multirrótulo para moderação de textos em português brasileiro. O modelo é um ajuste fino do BERTimbau Base e produz doze escores independentes, um por categoria da política de moderação. Cada escore passa por uma sigmoide e é comparado ao limiar da sua categoria.
Status
Esse modelo é uma versão 1 experimental, usada como avaliação MVP para um sistema onde o ambiente tinha recursos computacionais limitados e alta concorrência. Devido a isso, o modelo apresenta limitações como a truncagem em 128 tokens.
Arquitetura
| Item | Value |
|---|---|
| Class | BertForSequenceClassification |
| Base | BERTimbau Base |
| Parameters | ~109 M |
| Layers | 12 |
| Hidden size | 768 |
| Attention heads | 12 |
| Positions | 512 |
| Weight precision | float32 |
| Labels | 12 |
| Decision rule | sigmoid and per-category threshold |
Categorias e limiares
| Índice | Rótulo | Limiar |
|---|---|---|
| 0 | hate | 0,693 |
| 1 | hate/threatening | 0,491 |
| 2 | sexual | 0,95 |
| 3 | sexual/minors | 0,619 |
| 4 | illicit | 0,583 |
| 5 | illicit/violent | 0,5 |
| 6 | violence | 0,785 |
| 7 | self-harm | 0,785 |
| 8 | self-harm/instructions | 0,362 |
| 9 | self-harm/intent | 0,73 |
| 10 | harassment | 0,932 |
| 11 | harassment/threatening | 0,564 |
Um rótulo é positivo quando o escore é maior ou igual ao limiar.
Avaliação
Para a avaliação foi utilizado a configuração default do PT-BR Moderation Eval, revisão 949b41541412abf718987bbec166a904b59587f1, com 2.202 textos. Truncamento em 128 tokens. Pesos em float32. Entram no cálculo apenas as categorias listadas em annotated_categories. O F1 micro agrega todas as decisões enquanto o F1 macro é a média das doze categorias, com zero_division=0. Vale ressaltar que pesos e limiares não foram alterados.
Resultados.
| Conjunto | Textos | F1 micro | F1 macro |
|---|---|---|---|
| Completo | 2.202 | 57,57% | 54,17% |
| Manual | 2.024 | 59,45% | 51,98% |
| Sintético | 178 | 36,92% | 42,29% |
No conjunto completo, a precisão micro é 56,38% e o recall micro é 58,81%. Sem os registros marcados como ambíguos (1.978 textos), o F1 micro é 57,60% e o F1 macro é 55,08%.
| Categoria | Precisão | Recall | F1 | Positivos | Textos anotados |
|---|---|---|---|---|---|
| Ódio | 63,58% | 83,33% | 72,13% | 132 | 1.921 |
| Ódio com ameaça | 89,11% | 75,00% | 81,45% | 120 | 1.921 |
| Conteúdo sexual | 90,00% | 66,39% | 76,42% | 122 | 2.024 |
| Sexual com menores | 100,00% | 1,71% | 3,36% | 117 | 2.141 |
| Atividade ilícita | 85,25% | 22,32% | 35,37% | 233 | 1.982 |
| Ilícitos violentos | 76,19% | 29,36% | 42,38% | 109 | 1.982 |
| Violência | 86,91% | 61,60% | 72,10% | 388 | 1.947 |
| Autolesão | 91,22% | 81,30% | 85,98% | 230 | 1.921 |
| Instruções de autolesão | 29,39% | 77,00% | 42,54% | 100 | 1.921 |
| Intenção de autolesão | 36,27% | 88,61% | 51,47% | 79 | 1.921 |
| Assédio | 27,42% | 64,81% | 38,53% | 162 | 1.921 |
| Assédio com ameaça | 37,93% | 66,38% | 48,28% | 116 | 1.921 |
As métricas medem concordância com os rótulos disponíveis.
Uso
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
model_id = "HRB25/pt-br-moderation-bertimbau-v1"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSequenceClassification.from_pretrained(model_id)
model.eval()
thresholds = {
"hate": 0.693,
"hate/threatening": 0.491,
"sexual": 0.95,
"sexual/minors": 0.619,
"illicit": 0.583,
"illicit/violent": 0.5,
"violence": 0.785,
"self-harm": 0.785,
"self-harm/instructions": 0.362,
"self-harm/intent": 0.73,
"harassment": 0.932,
"harassment/threatening": 0.564,
}
text = "O relatório descreve o procedimento de avaliação do classificador."
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=128)
with torch.no_grad():
scores = torch.sigmoid(model(**inputs).logits)[0]
for index, score in enumerate(scores.tolist()):
label = model.config.id2label[index]
print(label, round(score, 4), score >= thresholds[label])
Para reproduzir a avaliação publicada, use max_length=128. A ordem dos rótulos em config.json é a mesma de categorias.json.
Treinamento
Corpus. Cerca de 21 mil exemplos, em sua maioria textos públicos, com uma parcela de exemplos sintéticos. Grande parte dos rótulos são pré-rótulos automáticos, revisados em etapas de análise e correção. O corpus de treinamento é disjunto do conjunto de avaliação e não é distribuído com o modelo.
Configuração. AdamW, taxa de aprendizado 1e-5, decaimento de peso 0,05, cinco épocas, lote de 16, aquecimento de 15% dos passos e parada antecipada com paciência 3. A calibração escolhe o limiar de cada categoria pelo F1 na validação.
Pesos. SHA-256 de model.safetensors: b188fad37563982bc0821dd026a5caedab75f4a143db43af00a8bf34e191e16a, o mesmo arquivo avaliado.
Após a avaliação, dois arquivos foram alterados:
config.json:LABEL_0…LABEL_11substituídos pelos nomes das categorias, na ordem original.tokenizer_config.json:model_max_lengthdefinido como 512, o limite de posições do BERT.
tokenizer.json e categorias.json não mudaram. A avaliação define max_length=128 explicitamente, então a alteração de model_max_length não modifica as previsões.
Limitações
- O modelo analisa cada texto isolado. Dessa forma, ironia, citação e relato podem receber escore semelhante ao de um endosso.
- Em assédio, a precisão é 27,42%. Em instruções de autolesão, é 29,39%. Na maior parte das previsões positivas, o rótulo anotado não coincide.
- Em
sexual/minors, o recall é 1,71%. A precisão de 100% se baseia em um número pequeno de previsões positivas.
Licença
Pesos e cartão: MIT, a mesma licença do BERTimbau. O conjunto de avaliação tem repositório próprio e o acesso ao conteúdo sensível é autorizado separadamente.
Souza, F., Nogueira, R. e Lotufo, R. BERTimbau: pretrained BERT models for Brazilian Portuguese. In: Brazilian Conference on Intelligent Systems, 2020.