Почему форма вывода в простой RNN Элмана зависит от длины последовательности (а форма скрытого состояния - нет)? - PullRequest
0 голосов
/ 17 июня 2020

Я изучаю RNN и пытаюсь закодировать их с помощью PyTorch. У меня проблемы с пониманием выходных размеров

Вот код для простой архитектуры RNN

class RNN(nn.Module):
    def __init__(self, input_size, hidden_dim, n_layers):
        super(RNN, self).__init__()
        self.hidden_dim=hidden_dim
        self.rnn = nn.RNN(input_size, hidden_dim, n_layers, batch_first=True)

    def forward(self, x, hidden):
        r_out, hidden = self.rnn(x, hidden)

        return r_out, hidden

Итак, я понимаю, что hidden_dim - это числовые блоки, которые будут в моем скрытом слой и, по сути, количество функций на выходе и в скрытом состоянии.

Я создаю некоторые фиктивные данные, чтобы проверить их

test_rnn = RNN(input_size=1, hidden_dim=4, n_layers=1)

# generate evenly spaced, test data pts
time_steps = np.linspace(0, 6, 3)
data = np.sin(time_steps)
data.resize((3, 1))

test_input = torch.Tensor(data).unsqueeze(0) # give it a batch_size of 1 as first dimension
print('Input size: ', test_input.size())

# test out rnn sizes
test_out, test_h = test_rnn(test_input, None)
print('Hidden state size: ', test_h.size())
print('Output size: ', test_out.size())

Я получаю

Input size:  torch.Size([1, 3, 1])
Hidden state size:  torch.Size([1, 1, 4])
Output size:  torch.Size([1, 3, 4])

Итак, я понимаю, что форма x определяется так: x = (batch_size, seq_length, input_size) .. итак 1 размер ванны и ввод 1 функции и 3 временных шагов (длина последовательности).
Для скрытого состояния, например, hidden = (n_layers, batch_size, hidden_dim) .. так что у меня был 1 слой, размер пакета 1 и 4 блока в моем скрытом слое.
Чего я не получаю, так это вывода RNN. Из документации r_out = (batch_size, time_step, hidden_size) .. Разве вывод не должен был быть таким же, как и скрытое состояние, выводимое из скрытых модулей? То есть, если у меня есть 4 единицы в моем скрытом слое, я ожидаю, что он выведет 4 числа для скрытого состояния и 4 числа для вывода. Почему шаг по времени является измерением вывода? Потому что каждая скрытая единица принимает некоторые числа, выводит состояние S и вывод Y, и оба они равны, да? Я попробовал схему, вот что у меня получилось. Помогите мне понять, в какой части я делаю неправильно. enter image description here

Итак, TL; DR
Почему форма вывода в простом RNN Элмана зависит от длины последовательности ( а форма скрытого состояния - нет)? Потому что на диаграмме, которую я нарисовал, я вижу, что они оба одинаковые.

1 Ответ

1 голос
/ 17 июня 2020

В API PyTorch выходными данными является последовательность скрытых состояний во время вычисления RNN, т. Е. Существует один скрытый вектор состояния на каждый входной вектор. Скрытое состояние - это последнее скрытое состояние, состояние, в котором RNN заканчивается после обработки ввода, поэтому test_out[:, -1, :] = test_h.

Vector y в ваших диаграммах такое же, как скрытое состояние Ht, он действительно имеет 4 числа, но состояние разное для каждого временного шага, поэтому у вас есть 4 числа для каждого временного шага.

Причина, по которой PyTorch разделяет последовательность выходов = скрытые состояния (это не то же самое и в LSTM) заключается в том, что у вас может быть пакет последовательностей разной длины. В этом случае конечное состояние - это не просто test_out[:, -1, :], потому что вам нужно выбрать конечные состояния на основе длин отдельных последовательностей.

...