Pytorch tricks
在模型中定义方法init_hidden(),假设模型rnn层数为1,单向rnn,代码如下:
class RNNModel(nn.Module):
...
def init_hidden(self, batchSize, requries_grad=True):
weight = next(self.parameters())
return (weight.new_zeros((1, batchSize, self.hidden_size), requires_grad=requries_grad),
weight.new_zeros((1, batchSize, self.hidden_size), requires_grad=requries_grad))
RNN训练时防止梯度爆炸
GRAD_CLIP = 5.0
optimizer.zero_grad()
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), GRAD_CLIP)
optimizer.step()
RNN训练时随着epoch增加,loss反而变大
其中一种可能是因为学习率过大造成的
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
#学习率减少一半
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, 0.5)
scheduler.step()
语言模型困惑度
对自然数e取loss次幂
print("perplexity: ", np.exp(loss))