Aplicando Fine-Tuning em BERT para Classificação de Opiniões Políticas
MOTIVAÇÃO:
Problema: Como facilicar a análise de entrevistas de profundidade sobre opiniões políticas?
Definição da Tarefa: Classificação de textos
INFORMATIONAL SYSTEM THEORY: REPRESENTATION THEORY
A representação da informação envolve a utilização de modelos e estruturas que permitem organizar e classificar dados de maneira que sejam facilmente acessíveis e compreensíveis.
A Teoria da Representação busca garantir que diferentes tipos de informações — sejam elas textuais, numéricas, sociais ou políticas — sejam convertidas em formatos que facilitem o processamento, a análise e a interpretação por métodos computacionais avançados, como redes neurais baseadas em arquiteturas do tipo Transformer.
Pesquisas de opinião sobre o governo Bolsonaro (Abril-2021) com entrevista de profundidade em grupos focais;
Banco de Dados base: 600 frases;
Banco de Dados com Data Agumentation 1: 1400
Banco de Dados com Data Augmentation 2: 4200
Arquitetura Transformer: modelo pré-treinado Bertimbau. Essa arquitetura é caracterizada por mecanismos de atenção (attention layers), que permitem ao modelo capturar dependências contextuais entre palavras de maneira mais eficiente e paralela em comparação a modelos sequenciais tradicionais
Tokenização e Representação do Texto: AutoTokenizer
: transforma strings de texto em tensores numéricos (tokens) adequados para o modelo BERT.Com truncamento, padding e mapeamento para IDs de tokens, resultando em um input padronizado para a rede neural.
Dataset Customizado e DataLoaders do PyTorch: CustomDataset
para organizar o texto e rótulos em um formato compatível com o PyTorch. Além disso, o DataLoader é utilizado para gerar lotes (batches) de dados durante o treinamento, garantindo eficiência e organização no processamento.
Fine-Tuning do BERT com Camadas Extras: CustomBERTModel
que adiciona uma camada linear no topo da saída do BERT para classificação;a) congelamento de camadas: permite apenas o treinamento das últimas 4 camadas, além da camada de classificação final. reduz o custo computacional e evita overfit rápido; b) Camada de dropout é usada para regularização, ajudando a evitar overfitting.
Função de Perda e Desequilíbrio de Classes: CrossEntropyLoss
para lidar com classes desbalanceadas. Eu usei errado porque as classes estavam balanceadas no Banco de Dados 2.
Otimização (AdamW) e Taxa de Aprendizado Ajustada: O otimizador utilizado é o AdamW (variação do gradiente descendente estocástico - SGD), recomendado para Transformers, e a taxa de aprendizado (2e-5) segue as diretrizes comuns no fine-tuning de BERT.
class CustomBERTModel(nn.Module):
def __init__(self, model_name, nclasses):
super(CustomBERTModel, self).__init__()
self.bert = AutoModel.from_pretrained(model_name)
self.dropout = nn.Dropout(0.3)
self.classifier = nn.Linear(self.bert.config.hidden_size, nclasses)
# Congelar todas as camadas do BERT inicialmente
for param in self.bert.parameters():
param.requires_grad = False
# Descongelar as últimas 4 camadas
for param in self.bert.encoder.layer[-4:].parameters():
param.requires_grad = True
# Definir a função de perda com pesos para classes desbalanceadas (ajuste conforme necessário)
class_weights = torch.tensor([1.0, 2.5]).to(device)
loss_fn = nn.CrossEntropyLoss(weight=class_weights)
optimizer = optim.AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=learning_rate)
Col1 | Col2 |
---|---|
NClasses | 2 |
nepochs | 10 |
Batch_size | 16 |
learning_rate | 2e-5 |
max_length: | 360 |
class_weights | 1.0, 2.5 |
Classe | Acc | Recall | F1-score | Suporte |
---|---|---|---|---|
0 | 0.81 | 0.82 | 0.82 | 79 |
1 | 0.80 | 0.79 | 0.79 | 71 |
Acurácia | - | - | 0.81 | 150 |
Macro Avg | 0.81 | 0.81 | 0.81 | 150 |
Weighted Avg | 0.81 | 0.81 | 0.81 | 150 |
F1 (teste): 0.8066, Accuracy (teste): 0.8067 |
Classe | Acc | Recall | F1-score | Suporte |
---|---|---|---|---|
0 | 0.99 | 1.00 | 0.99 | 235 |
1 | 1.00 | 0.99 | 0.99 | 214 |
Acc | - | - | 0.99 | 449 |
Macro Avg | 0.99 | 0.99 | 0.99 | 449 |
Weighted Avg | 0.99 | 0.99 | 0.99 | 449 |
F1 (teste): 0.9933, Accuracy (teste): 0.9933 |
Versão maior do Bertimbau: neuralmind/bert-large-portuguese-cased;
Validação cruzada (StratifiedKFold
com 5 dobras): avaliação mais robusta e menos dependente de uma única divisão do conjunto de dados;
learning_rate = 3e-5; batch_size = 8; nepochs = 5;
Para ajustar gradualmente a taxa de aprendizado ao longo do treinamento, iniciando com um “warmup” e depois decaindo usei get_linear_schedule_with_warmup
(prática comum em treinamentos mais sofisticados de BERT, eu acho rs)
Tirei a utilização de pesos de classe.
learning_rate = 3e-5 batch_size = 8 model_name = 'neuralmind/bert-large-portuguese-cased'
# Cross-validation
k = 5
skf = StratifiedKFold(n_splits=k, shuffle=True, random_state=seed)
X = data.index.values
y = data['contra'].values
scheduler = get_linear_schedule_with_warmup(optimizer,
num_warmup_steps=int(0.1 * total_steps),
num_training_steps=total_steps)
Classe | Acc | Recall | F1-score | Suporte |
---|---|---|---|---|
0 | 0.90 | 0.93 | 0.91 | 157 |
1 | 0.92 | 0.88 | 0.90 | 143 |
Acurácia | - | - | 0.91 | 300 |
Macro Avg | 0.91 | 0.91 | 0.91 | 300 |
Weighted Avg | 0.91 | 0.91 | 0.91 | 300 |
F1 (teste): 0.9065 | Acurácia (teste): 0.9067 | |||
Métrica | Média | Desvio Padrão |
---|---|---|
F1 médio | 0.8774 | +/- 0.0214 |
Acurácia média | 0.8777 | +/- 0.0211 |
Experimentar arquiteturas mais recentes (por exemplo, RoBERTa, DeBERTa, ou T5);
Aplicar o modelo a conjuntos de dados mais diversificados;
Realizar fine-tuning em tarefas específicas, como análise de sentimento ou detecção de discurso de ódio.
https://huggingface.co/RenatoBarreira/BERT-VI
https://github.com/renatobarreira/BERT-VI
Referências:
How to Fine-Tune BERT for Text Classification?
LayerOut: Freezing Layers in Deep Neural Networks
Muito Obrigado
Aprendizado Profundo - Prof. Pedro - PPGI