Как правильно реализовать RNN в Pytorch?

Вопрос или проблема

Я прочитал о RNN в PyTorch: RNN — документация PyTorch.

Согласно документу, RNN выполняет следующую функцию:

формула

Я посмотрел другой пример RNN (из учебника PyTorch): NLP С НУЛЯ: КЛАССИФИКАЦИЯ ИМЕН С ПОМОЩЬЮ RNN УРОВНЯ СИМВОЛОВ.

И они реализовали RNN как:

import torch.nn as nn

class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()

        self.hidden_size = hidden_size

        self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
        self.i2o = nn.Linear(input_size + hidden_size, output_size)
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden):
        combined = torch.cat((input, hidden), 1)
        hidden = self.i2h(combined)
        output = self.i2o(combined)
        output = self.softmax(output)
        return output, hidden

    def initHidden(self):
        return torch.zeros(1, self.hidden_size)

n_hidden = 128
rnn = RNN(n_letters, n_hidden, n_categories)
  1. Почему реализованная функция отличается от уравнения? (Функция не содержит softmax и содержит смещение, которое не показано в коде)

  2. Почему в коде не используется tanh, как показано в уравнении?

nn.Linear уже по умолчанию должен обучать аддитивное смещение.

Этот пример реализует RNN без активации, вероятно, только в образовательных целях, так как это не создаёт значительной разницы по сравнению с полностью связанными сетями (см. доказательство на https://stackoverflow.com/questions/66726974/pytorch-rnn-with-no-nonlinearity) и ставится под сомнение в других аспектах (https://github.com/pytorch/tutorials/issues/193). tanh обычно предпочтителен в качестве функции активации для соединений RNN, так как он менее подвержен проблеме исчезающих градиентов по сравнению с ReLU (что является серьёзной проблемой при запуске RNN), позволяет как увеличить, так и уменьшить скрытые состояния и, в целом, показывает лучшее поведение сходимости. Выход классификации может использовать любую подходящую функцию активации.

Ответ или решение

Конечно, давайте разберем ваши вопросы касательно реализации RNN в PyTorch.

  1. Почему реализованная функция отличается от уравнения?
    В приведенном вами примере реализации RNN и в уравнении, представленном в документации, есть разница в том, что последняя не учитывает некоторые специфические аспекты, которые делают код более простым и удобным для понимания, особенно для образовательных целей.

Также стоит отметить, что в nn.Linear действительно уже предусмотрены слагаемые для смещения (bias) по умолчанию, поэтому их нужно добавлять вручную, как это обычно делается в математических уравнениях. Однако в реализации RNN, приведенной в примере, отсутствует явное указание на нелинейные активации, такие как softmax, для промежуточных значений, так как этот пример может быть ориентирован на фокусирование на структуре RNN, а не на строгом следовании математическим формам.

  1. Почему в коде не используется tanh, показанный в уравнении?
    Как упоминалось ранее, данный пример может быть упрощен для учебных целей. На практике, использование активационной функции tanh предпочтительно для скрытых слоев RNN, так как она помогает уменьшить проблемы с исчезающим градиентом, которые являются серьезной проблемой при обучении RNN и LSTM. tanh позволяет скрытым состояниям как увеличиваться, так и уменьшаться, что ведет к более стабильной и быстрой сходимости во время обучения.

Следует также отметить, что в зависимости от задачи и предпочтений можно использовать различные функции активации на выходном уровне. Для классификационных задач обычно применяется softmax, чтобы получить вероятности классов.

Рекомендации по реализации RNN в PyTorch:

  1. Используйте встроенные компоненты: PyTorch предоставляет уже готовые модули для работы с RNN (nn.RNN, nn.LSTM, nn.GRU), которые учитывают все особенности, такие как активации и смещения, и часто являются предпочтительным выбором для большинства пользователей.

  2. Настройка параметров: Проверьте, достаточен ли выбраный вами размер скрытого состояния (hidden_size) и других параметров для вашей конкретной задачи.

  3. Обучение и регуляризация: Задумайтесь о том, чтобы применять методы регуляризации, такие как Dropout, чтобы улучшить обобщающую способность вашей модели.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...