В языковом моделировании, почему я должен весить init_hidden перед каждой новой эпохой обучения?(Pytorch) - PullRequest
1 голос
/ 26 марта 2019

У меня есть вопрос по поводу следующего кода в моделировании языка 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()  

Пожалуйста, проверьте строку 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_())

Мой вопрос:

Зачем нам нужно init_hidden каждую эпоху?Не должно ли быть так, что модель унаследует скрытые параметры из прошлой эпохи и продолжит обучение по ним.

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Скрытое состояние хранит внутреннее состояние RNN из прогнозов, сделанных на предыдущих токенах в текущей последовательности, это позволяет RNN понимать контекст.Скрытое состояние определяется выводом предыдущего токена.

Когда вы прогнозируете для первого токена любой последовательности, если вы хотите сохранить скрытое состояние из предыдущей последовательности, ваша модель будет работать так, как если бы новая последовательность была продолжением старой последовательности, что дало бы худшие результаты,Вместо этого для первого токена вы инициализируете пустое скрытое состояние, которое затем будет заполнено состоянием модели и использовано для второго токена.

Подумайте об этом так: если кто-то попросил вас классифицировать предложение и вручил вам конституцию США (неактуальная информация) против того, если бы кто-то дал вам базовый контекст о предложении, а затем попросил вас классифицировать предложение,

1 голос
/ 26 марта 2019

Ответ лежит в init_hidden. Это не веса скрытого слоя, а начальное скрытое состояние в RNN / LSTM, которое в формулах равно h0. Для каждой эпохи мы должны заново инициализировать новое скрытое состояние новичка, потому что во время тестирования наша модель не будет иметь информации о тестовом предложении и будет иметь нулевое начальное скрытое состояние.

...