首页 > 解决方案 > 第一个 epoch 后模型过拟合

问题描述

我正在尝试使用拥抱脸的 BERT-base-uncased 模型来训练推文上的表情符号预测,似乎在第一个 epoch 之后,模型立即开始过度拟合。我尝试了以下方法:

  1. 增加训练数据(我将这个从 1 倍增加到 10 倍,但没有任何效果)
  2. 改变学习率(没有区别)
  3. 从拥抱脸使用不同的模型(结果再次相同)
  4. 更改批量大小(从 32、72、128、256、512、1024 开始)
  5. 从头开始创建模型,但我遇到了问题并决定先在这里发布,看看我是否遗漏了任何明显的东西。

在这一点上,我担心个别推文没有为模型提供足够的信息来做出好的猜测,但在这种情况下它不会是随机的,而不是过度拟合吗?

此外,在 Colab 的免费 G​​PU 上训练时间似乎约为 4.5 小时,有什么办法可以加快速度吗?我尝试了他们的 TPU,但似乎无法识别。

这是数据的样子

数据集截图

这是我下面的代码:

import pandas as pd
import json
import re
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from sklearn.model_selection import train_test_split
import torch
from transformers import TrainingArguments, Trainer
from transformers import EarlyStoppingCallback
from sklearn.metrics import accuracy_score,precision_score, recall_score, f1_score
import numpy as np

# opening up the data and removing all symbols
df = pd.read_json('/content/drive/MyDrive/computed_results.json.bz2')
df['text_no_emoji'] = df['text_no_emoji'].apply(lambda text: re.sub(r'[^\w\s]', '', text))


# loading the tokenizer and the model from huggingface
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=5).to('cuda')

# test train split
train, test = train_test_split(df[['text_no_emoji', 'emoji_codes']].sample(frac=1), test_size=0.2)

# defining a dataset class that generates the encoder and labels on the fly to minimize memory usage
class Dataset(torch.utils.data.Dataset):    
    def __init__(self, input, labels=None):
        self.input = input
        self.labels = labels

    def __getitem__(self, pos):
        encoded = tokenizer(self.input[pos], truncation=True, max_length=15, padding='max_length')
        label = self.labels[pos]
        ret = {key: torch.tensor(val) for key, val in encoded.items()}

        ret['labels'] = torch.tensor(label)
        return ret

    def __len__(self):
        return len(self.labels)

# training and validation datasets are defined here
train_dataset = Dataset(train['text_no_emoji'].tolist(), train['emoji_codes'].tolist())
val_dataset = Dataset(train['text_no_emoji'].tolist(), test['emoji_codes'].tolist())

# defining the training arguments
args = TrainingArguments(
    output_dir="output",
    evaluation_strategy="epoch",
    logging_steps = 10,
    per_device_train_batch_size=1024,
    per_device_eval_batch_size=1024,
    num_train_epochs=5,
    save_steps=3000,
    seed=0,
    load_best_model_at_end=True,
    weight_decay=0.2,
)

# defining the model trainer
trainer = Trainer(
    model=model,
    args=args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset
)

# Training the model
trainer.train()

结果:在此之后,由于提前停止,训练通常会很快停止

数据集可以在这里找到(39 Mb 压缩)

3个时期的结果

标签: pytorchhuggingface-transformershuggingface-tokenizers

解决方案


推荐阅读