pytorch - 第一个 epoch 后模型过拟合
问题描述
我正在尝试使用拥抱脸的 BERT-base-uncased 模型来训练推文上的表情符号预测,似乎在第一个 epoch 之后,模型立即开始过度拟合。我尝试了以下方法:
- 增加训练数据(我将这个从 1 倍增加到 10 倍,但没有任何效果)
- 改变学习率(没有区别)
- 从拥抱脸使用不同的模型(结果再次相同)
- 更改批量大小(从 32、72、128、256、512、1024 开始)
- 从头开始创建模型,但我遇到了问题并决定先在这里发布,看看我是否遗漏了任何明显的东西。
在这一点上,我担心个别推文没有为模型提供足够的信息来做出好的猜测,但在这种情况下它不会是随机的,而不是过度拟合吗?
此外,在 Colab 的免费 GPU 上训练时间似乎约为 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 压缩)
解决方案
推荐阅读
- python - 属性错误:无法获取属性“BrainSet”
在朱庇特 - git - 一个实例中的 IntelliJ Git 结帐损坏了另一个实例中打开的项目
- python - 函数递归 TypeError 中的 DataFrame.duplicated() 错误:duplicated() 为参数“keep”获取了多个值
- java - JTA中事务管理器的具体流程是什么
- c# - 如何节省统一花费的最少时间?
- azure-active-directory - MS Teams Bot:对于来自 BotBuilder-Samples 的 Teams 对话机器人,网络聊天中的测试未经授权
- javascript - 打算在完全执行的其他 js 文件中加载 JQuery 一次函数
- typescript - 当值已设置为 false 时,是否需要在 typescript 中指定数据类型 boolean?
- wpf - WPF:单击时不会关闭列表框或菜单(在 Telerik Splitbutton 内)
- swift - RxSwift:如何响应一系列通知?