【问题标题】:My training and validation loss suddenly increased in power of 3我的训练和验证损失突然增加了 3 的幂
【发布时间】:2021-11-20 11:06:56
【问题描述】:

训练功能

def train(model, iterator, optimizer, criterion, clip):
    model.train()
    epoch_loss = 0
    for i, batch in enumerate(iterator):
        optimizer.zero_grad()
        output = model(batch.text)
        loss = criterion(output, torch.unsqueeze(batch.labels, 1))
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), clip)
        optimizer.step()
        epoch_loss += loss.item()
    return epoch_loss / len(iterator)

ma​​in_script

def main(
        train_file,
        test_file,
        config_file,
        checkpoint_path,
        best_model_path
    ):
    device = 'cuda' if torch.cuda.is_available() else 'cpu'

    with open(config_file, 'r') as j:
        config = json.loads(j.read())

    for k,v in config['model'].items():
        v = float(v)
        if v < 1.0:
            config['model'][k] = float(v)
        else:
            config['model'][k] = int(v)

    for k,v in config['training'].items():
        v = float(v)
        if v < 1.0:
            config['training'][k] = float(v)
        else:
            config['training'][k] = int(v)

    train_itr, val_itr, test_itr, vocab_size = data_pipeline(
        train_file,
        test_file,
        config['training']['max_vocab'],
        config['training']['min_freq'],
        config['training']['batch_size'],
        device
    )

    model = CNNNLPModel(
        vocab_size,
        config['model']['emb_dim'],
        config['model']['hid_dim'],
        config['model']['model_layer'],
        config['model']['model_kernel_size'],
        config['model']['model_dropout'],
        device
    )
    optimizer = optim.Adam(model.parameters())
    criterion = nn.CrossEntropyLoss()
    num_epochs = config['training']['n_epoch']
    clip = config['training']['clip']
    is_best = False
    best_valid_loss = float('inf')
    model = model.to(device)
    for epoch in tqdm(range(num_epochs)):

        train_loss = train(model, train_itr, optimizer, criterion, clip)
        valid_loss = evaluate(model, val_itr, criterion)

        if (epoch + 1) % 2 == 0:
            print("training loss {}, validation_loss{}".format(train_loss,valid_loss))

我正在训练一个用于二进制文本分类的卷积神经网络。给定一个句子,它会检测到它是否是仇恨言论。训练损失和验证损失一直很好,直到 5 epoch 之后,训练损失和验证损失突然从 0.2 猛增到 10,000

突然损失这么大的原因可能是什么?

【问题讨论】:

  • 你的渐变剪裁值是多少?
  • 渐变剪裁值为 0.1
  • 如果没有模型定义、数据和其他东西,很难猜出问题到底出在哪里。一个很可能的原因是你的学习率很高。顺便说一句,多少钱?另外,请尝试查看梯度和激活统计信息。

标签: deep-learning nlp pytorch conv-neural-network text-classification


【解决方案1】:

Adam 的默认学习率是 0.001,这取决于任务,可能太高了。

看起来你的神经网络没有收敛而是发散了(它离开了之前的 ~0.2 损失最小值并落入了不同的区域)。

在某个时间点(在 50% 或 70% 的训练后)降低学习率可能会解决问题。

通常人们将学习率除以 10(在您的情况下为 0.0001)或除以一半(在您的情况下为 0.0005)。尝试除以一半,看看问题是否仍然存在,一般来说,您希望保持尽可能高的学习率,直到出现分歧,这可能就是这种情况。

这就是schedulers 的用途(gamma 指定学习率乘数,可能需要先将其更改为 0.5)。

可以将较低的学习率阶段视为已经找到的微调解决方案(将权重放置在损失谷的更好区域),并且可能需要一些耐心。

【讨论】:

    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多