Adr*_*ian 7 nlp machine-learning recurrent-neural-network pytorch
我对pytorch语言建模中的以下代码有疑问:
print("Training and generating...")
for epoch in range(1, config.num_epochs + 1):
total_loss = 0.0
model.train()
hidden = model.init_hidden(config.batch_size)
for ibatch, i in enumerate(range(0, train_len - 1, seq_len)):
data, targets = get_batch(train_data, i, seq_len)
hidden = repackage_hidden(hidden)
model.zero_grad()
output, hidden = model(data, hidden)
loss = criterion(output.view(-1, config.vocab_size), targets)
loss.backward()
Run Code Online (Sandbox Code Playgroud)
请检查第 5 行。
init_hidden 函数如下:
def init_hidden(self, bsz):
weight = next(self.parameters()).data
if self.rnn_type == 'LSTM': # lstm?(h0, c0)
return (Variable(weight.new(self.n_layers, bsz, self.hi_dim).zero_()),
Variable(weight.new(self.n_layers, bsz, self.hi_dim).zero_()))
else: # gru & rnn?h0
return Variable(weight.new(self.n_layers, bsz, self.hi_dim).zero_())
Run Code Online (Sandbox Code Playgroud)
我的问题是:
为什么我们需要在每个 epoch 中 init_hidden ?不应该是模型继承了上一个时期的隐藏参数并继续对其进行训练。
答案在于 init_hidden。它不是隐藏层权重,而是 RNN/LSTM 中的初始隐藏状态,即公式中的 h0。对于每个 epoch,我们应该重新初始化一个新的初学者隐藏状态,这是因为在测试期间,我们的模型将没有关于测试语句的信息,并且初始隐藏状态为零。
隐藏状态根据对当前序列中先前标记的预测存储 RNN 的内部状态,这允许 RNN 理解上下文。隐藏状态由前一个标记的输出决定。
当您预测任何序列的第一个标记时,如果您要保留前一个序列的隐藏状态,您的模型将执行,好像新序列是旧序列的延续,这会产生更差的结果。对于第一个标记,您初始化一个空的隐藏状态,然后将填充模型状态并用于第二个标记。
可以这样想:如果有人让你对一个句子进行分类,然后递给你美国宪法(不相关的信息),或者如果有人给你一些关于这个句子的背景背景,然后让你对这个句子进行分类。
| 归档时间: |
|
| 查看次数: |
1947 次 |
| 最近记录: |