首页 > 编程问答 >SBERT 微调总是在完成所有 epoch 之前停止

SBERT 微调总是在完成所有 epoch 之前停止

时间:2024-09-25 11:51:23浏览次数:10  
标签:python machine-learning pytorch nlp bert-language-model

我正在开发一个项目,使用 SBERT 预训练模型(特别是 MiniLM )进行 995 个分类的文本分类项目。我按照 此处列出的步骤 大部分情况进行操作,一切似乎都在运行。

我的问题是在实际训练模型时出现的。无论我在训练参数中设置什么值,训练似乎总是提前结束并且永远不会完成所有批次。例如,我设置 num_train_epochs=1 但它最多只能达到 0.49 epoch。如果 num_train_epochs=4 ,它总是以 3.49 纪元结束。

这是我的代码:

from datasets import load_dataset
from sentence_transformers import (
    SentenceTransformer,
    SentenceTransformerTrainer,
    SentenceTransformerTrainingArguments,
    SentenceTransformerModelCardData,
)
from sentence_transformers.losses import BatchAllTripletLoss
from sentence_transformers.training_args import BatchSamplers
from sentence_transformers.evaluation import TripletEvaluator

model = SentenceTransformer(
    "nreimers/MiniLM-L6-H384-uncased",
    model_card_data=SentenceTransformerModelCardData(
        language="en",
        license="apache-2.0",
        model_name="all-MiniLM-L6-v2",
    )
)

loss = BatchAllTripletLoss(model)
# Loss overview: https://www.sbert.net/docs/sentence_transformer/loss_overview.html
# This particular loss method: https://www.sbert.net/docs/package_reference/sentence_transformer/losses.html#batchalltripletloss


# training args: https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.TrainingArguments
args = SentenceTransformerTrainingArguments(
    # Required parameter:
    output_dir="finetune/model20240924",
    # Optional training parameters:
    num_train_epochs=1,
    max_steps = -1,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    learning_rate=1e-5,
    warmup_ratio=0.1,
    fp16=True,  # Set to False if you get an error that your GPU can't run on FP16
    bf16=False,  # Set to True if you have a GPU that supports BF16
    batch_sampler=BatchSamplers.GROUP_BY_LABEL,  # 
    # Optional tracking/debugging parameters:
    eval_strategy="no",
    eval_steps=100,
    save_strategy="epoch",
   # save_steps=100,
    save_total_limit=2,
    logging_steps=100,
    run_name="miniLm-triplet",  # Will be used in W&B if `wandb` is installed
)

trainer = SentenceTransformerTrainer(
    model=model,
    args=args,
    train_dataset=trainDataset,
    eval_dataset=devDataset,
    loss=loss,
    #evaluator=dev_evaluator,
)
trainer.train()

请注意,我没有使用评估器,因为我们正在创建模型并在事后使用专用的测试值集对其进行测试。我的数据集的结构如下:

Dataset({
    features: ['Title', 'Body', 'label'],
    num_rows: 23961
})

数据集具有相同的结构,只是行数较少。这给出了以下输出: dev 尽管我调整了值,但我无法让它完成所有批次。任何建议将不胜感激!

 [1473/2996 57:06 < 59:07, 0.43 it/s, Epoch 0/1]
Step    Training Loss
100     1.265600
200     0.702700
300     0.633900
400     0.505200
500     0.481900
600     0.306800
700     0.535600
800     0.369800
900     0.265400
1000    0.345300
1100    0.516700
1200    0.372600
1300    0.392300
1400    0.421900

TrainOutput(global_step=1473, training_loss=0.5003972503496366, metrics={'train_runtime': 3427.9198, 'train_samples_per_second': 6.99, 'train_steps_per_second': 0.874, 'total_flos': 0.0, 'train_loss': 0.5003972503496366, 'epoch': 0.4916555407209613})

As much as I adjust the values I cannot get it to complete all of the batches. Any advice would be appreciated!


训练提前停止但没有出现错误消息,这表明底层代码中可能出现了问题,导致训练循环提前退出。以下是可能导致此问题的几个原因和要检查的事项:

  1. 数据集大小和批量大小: 请仔细检查训练数据集的大小和 per_device_train_batch_size 。如果数据集大小不能被批量大小整除,那么最后一个 epoch 可能只有部分批次,这会导致训练在达到指定的 epoch 数之前停止。

    • 要尝试的操作:
      • 打印训练数据集的大小: print(len(trainDataset))
      • 确保数据集大小可被 per_device_train_batch_size 整除。如果不是,请考虑调整批量大小或数据集大小,使其可被整除。
  2. 早期停止回调: 虽然没有明确指定,但请确保没有意外启用早期停止回调。早期停止是一种机制,当模型性能在验证集上不再提高时,它会停止训练过程,这可以解释训练为何提前停止。

    • 要尝试的操作:
      • SentenceTransformerTrainingArguments 中,请仔细检查是否没有设置 early_stopping_patience 或任何其他与早期停止相关的参数。
  3. GPU 内存不足: 如果使用的是 GPU,请确保没有遇到 GPU 内存不足错误。当模型或数据对于的 GPU 内存来说太大时,可能会发生这种情况,从而导致训练意外停止。

    • 要尝试的操作:
      • 降低批量大小 ( per_device_train_batch_size ) 以减少 GPU 内存消耗。
      • 监视 GPU 内存使用情况(例如,使用 nvidia-smi ),以查看在训练过程中是否有任何峰值或内存耗尽。
  4. 错误或异常: 请仔细检查训练日志中是否有任何错误或异常。有时,底层代码可能会遇到错误,但不会明确引发异常,从而导致训练循环静默退出。

    • 要尝试的操作:
      • 将日志级别增加到 DEBUG ,以便获取更详细的输出,从而帮助识别任何潜在的错误或警告。可以在 SentenceTransformerTrainingArguments 中将 logging_level 设置为 'debug'
  5. SBERT 库或 Hugging Face Transformers 版本: 在某些情况下,库版本中的错误或不兼容可能会导致意外行为。

    • 要尝试的操作:
      • 尝试将 SBERT ( sentence-transformers ) 和 Hugging Face Transformers ( transformers ) 更新到最新版本,以查看是否解决了问题。可以使用 pip install --upgrade sentence-transformers transformers 来执行此操作。

如果能够提供有关数据集大小、批量大小和训练日志(包括任何警告或错误消息)的更多信息,那将非常有帮助。这将有助于进一步缩小问题范围并提供更具体的建议。

标签:python,machine-learning,pytorch,nlp,bert-language-model
From: 79021064

相关文章

  • Python+requests测试接口、关联接口
    一个通过筛选,一个提取cookie(有两种写法)一、依赖接口(1)第一种方法:requests.session 准备两个接口:一个登录接口,一个用户查询接口登录接口:http://cms.duoceshi.cn/manage/loginJump.do请求体:userAccount:adminloginPwd:123456用户查询接口:http://cms.duoceshi.cn/manage/q......
  • Python模拟鼠标轨迹
    一.鼠标轨迹模拟简介传统的鼠标轨迹模拟依赖于简单的数学模型,如直线或曲线路径。然而,这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现,能够通过深度学习技术,学习并模拟更自然的鼠标移动行为。二.鼠标轨迹算法实现AI大模型通过学习大量的人类鼠标操作数据,能够识别......
  • Python-通过Wind获取股票收盘价并绘制收盘价曲线图及均价水平参考线
    注意事项:需要安装Wind金融客户端并且用windPy权限代码如下:importnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlibasmplimportpandasaspdfromWindPyimport*#设置属性防止中文乱码mpl.rcParams['font.family']='SimHei' #设置字体为黑体mpl.rcPar......
  • [Python手撕]实现哈希映射
    classNode:def__init__(self,key,value,next=None):self.key=keyself.value=valueself.next=nextclassMyHashMap:def__init__(self):self.array=[None]*(10**3)defput(self,key:int,value:int)->......
  • 监控下抽烟检测系统 Python
    监控下抽烟检测系统具有以下优势:监控下抽烟检测系统通过视频监控设备对工地和工厂的作业区域进行实时监测,准确捕捉人员抽烟的行为。监控下抽烟检测系统采用先进的图像识别技术,能够准确识别人员抽烟的动作和烟雾。监控下抽烟检测系统一旦系统发现有人员在禁烟区域内抽烟,将立即触发预......
  • 面向企业应用程序的 Python 配置管理
    配置管理的重要性    在企业应用程序中,配置管理是最被低估的运算符,它使所有内容保持集成并平稳运行。它充当后台经理,确保所有灯光都就位,剧院队列准备就绪,演出可以顺利进行。特别是,在处理多环境部署时,使用紧密的 CI/CD 流程,一个错误的配置可能会带来应用程序范围的关闭风险。......
  • 使用python创建一个微信聊天机器人
    使用python创建一个微信聊天机器人实现的功能如下笑话天气歇后语历史上的今天核心代码:#-*-coding:utf-8-*-fromrandomimportrandintimportitchatimportreimportrequestsemojis_love=["❤️","......
  • 非煤矿山风险监测预警系统 Python
    非煤矿山风险监测预警系统具有以下优势:非煤矿山风险监测预警系统通过在煤矿关键地点安装摄像机等设备利用智能化视频识别技术,能够实时分析人员出入井口的情况,监测矿井人数变化并检测煤矿生产作业状态,在矿井出入口、各作业区域等重要位置进行全方位监测,确保覆盖矿山操作过程中的关键......
  • PyTorch自定义学习率调度器实现指南
    在深度学习训练过程中,学习率调度器扮演着至关重要的角色。这主要是因为在训练的不同阶段,模型的学习动态会发生显著变化。在训练初期,损失函数通常呈现剧烈波动,梯度值较大且不稳定。此阶段的主要目标是在优化空间中快速接近某个局部最小值。然而,过高的学习率可能导致模型跳过潜在的......
  • 基于Python+Vue开发的电影订票管理系统
    项目简介该项目是基于Python+Vue开发的电影订票管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的电影订票管理系统项目,大学生可以在实践中学习和提升自己的......