BERT-VI

Aplicando Fine-Tuning em BERT para Classificação de Opiniões Políticas

Renato Barreira

Introdução

  • 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

Introdução

  • 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.

BANCO DE DADOS

  • 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

MODELO BASE

  • 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.

MODELO BASE

  • 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.

Códigos

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

Códigos

# 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)

Primeiro experimento Hiper Parâmetros

Col1 Col2
NClasses 2
nepochs 10
Batch_size 16
learning_rate 2e-5
max_length: 360
class_weights 1.0, 2.5

Resultados

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

Resultados 2 Dataframe de 4200

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

Modificações na Rede (deconvnet)

  • 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.

Modificações na Rede (deconvnet)

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)

Resultados 3 Banco de Dados 1400

Desempenho no conjunto de teste (melhor resultado)

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

Resultados 3 Banco de Dados 1400

=== Resultados Médios da Validação Cruzada ===

Métrica Média Desvio Padrão
F1 médio 0.8774 +/- 0.0214
Acurácia média 0.8777 +/- 0.0211

Próximos Passos:

  • 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.

LINKS

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

Towards Transfer Learning Techniques—BERT, DistilBERT, BERTimbau, and DistilBERTimbau for Automatic Text Classification from Different Languages: A Case Study

Muito Obrigado

Aprendizado Profundo - Prof. Pedro - PPGI