Как сделать классификацию последовательностей с помощью pytorch nn.Transformer? - PullRequest
0 голосов
/ 25 сентября 2019

Я делаю задачу классификации последовательности, используя nn.TransformerEncoder().Чей конвейер похож на nn.LSTM().

Я попробовал несколько методов объединения временных характеристик:

  1. Выбор конечных выходов в качестве представления всей последовательности.

  2. Использование аффинного преобразования для объединения этих функций.

  3. Классификация последовательности кадр за кадром, а затем выберите максимальные значения для категориився последовательность.

Но все эти 3 метода получили ужасную точность, только 25% для классификации по 4 категориям.Используя nn.LSTM с последним скрытым состоянием, я могу легко достичь точности 83% .Я перепробовал множество гиперпараметров nn.TransformerEncoder(), но без каких-либо улучшений для точности.

Я понятия не имею, как сейчас настроить эту модель.Не могли бы вы дать мне несколько практических советов?Спасибо.

Для LSTM: forward():

    def forward(self, x_in, x_lengths, apply_softmax=False):

        # Embed
        x_in = self.embeddings(x_in)

        # Feed into RNN
        out, h_n = self.LSTM(x_in) #shape of out: T*N*D

        # Gather the last relevant hidden state
        out = out[-1,:,:] # N*D

        # FC layers
        z = self.dropout(out)
        z = self.fc1(z)
        z = self.dropout(z)
        y_pred = self.fc2(z)

        if apply_softmax:
            y_pred = F.softmax(y_pred, dim=1)
        return y_pred

Для transformer:

    def forward(self, x_in, x_lengths, apply_softmax=False):

        # Embed
        x_in = self.embeddings(x_in)

        # Feed into RNN
        out = self.transformer(x_in)#shape of out T*N*D

        # Gather the last relevant hidden state
        out = out[-1,:,:] # N*D

        # FC layers
        z = self.dropout(out)
        z = self.fc1(z)
        z = self.dropout(z)
        y_pred = self.fc2(z)

        if apply_softmax:
            y_pred = F.softmax(y_pred, dim=1)
        return y_pred

1 Ответ

0 голосов
/ 25 сентября 2019

Точность, которую вы упомянули, указывает на то, что что-то не так.Поскольку вы сравниваете LSTM с TransformerEncoder, я хочу указать на некоторые важные различия.

  1. Позиционные вложения : Это очень важно, поскольку у трансформатора нет концепции повторения, и поэтому он не собирает информацию о последовательности.Поэтому убедитесь, что вы добавили информацию о местоположении вместе с вложенными вложениями.

  2. Архитектура модели : d_model, n_head, num_encoder_layers важны.Используйте размер по умолчанию, который используется в Vaswani et al., 2017. (d_model=512, n_head=8, num_encoder_layers=6)

  3. Оптимизация : во многихВ сценариях было обнаружено, что Transformer необходимо обучать с меньшей скоростью обучения, большим размером пакета, WarmUpScheduling.

Последнее, но не менее важное, для проверки работоспособности, просто убедитесь, чтоПараметры модели обновляются.Вы также можете проверить точность обучения, чтобы убедиться, что она продолжает расти.

Хотя трудно сказать, что именно не так в вашем коде, но я надеюсь, что приведенные выше пункты помогут!

...