我的训练和验证损失突然增加了 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)。
人们可以将较低的学习率阶段视为微调已经找到的解决方案(将权重放在损失谷的更好区域)并且可能需要一些耐心。
训练函数
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)。
人们可以将较低的学习率阶段视为微调已经找到的解决方案(将权重放在损失谷的更好区域)并且可能需要一些耐心。