我的训练和验证损失突然增加了 3 的幂

My training and validation loss suddenly increased in power of 3

训练函数

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)

main_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

涨幅这么大是什么原因突然亏损了?

Adam 的默认学习率为 0.001,根据任务,该值可能过高。

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

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

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

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

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