1

TL; DR: Является двунаправленным RNN полезным для простой классификации текста и является дополнением к злу?(двунаправленный) RNN для простой классификации текста

В моей недавней работе я создал модель LSTM и модель BLSTM для одной и той же задачи, то есть классификацию текста. Модель LSTM проделала неплохую работу, но я решил дать BLSTM выстрел, чтобы увидеть, может ли она даже повысить точность. В конце концов, я обнаружил, что BLSTM намного медленнее сходится и на удивление, он перегружен, хотя я применил исключение с вероятностью 50%.

В реализации я использовал развернутый RNN для LSTM и BLSTM, ожидая более быстрого обучения. Чтобы выполнить это требование, я вручную заполнил входные тексты на фиксированную длину.

Предположим, у нас есть предложение «Я спал поздно утром и пропустил интервью с Навуходоносором», который затем дополняется 0 в конце, когда он преобразуется в массив индексов предварительно обученных вложений слов. Итак, мы получаем что-то вроде [21, 43, 25, 64, 43, 25, 6, 234, 23, 0, 0, 29, 0, 0, 0, ..., 0]. Обратите внимание, что «th» (должно быть «the») является опечаткой, а имя «Nebuchadnezzar» слишком редок, поэтому оба они не присутствуют в словаре, поэтому мы заменяем его также 0, что соответствует специальному полнотекстовому описанию, вектор нулевого слова.

Вот мои размышления:

  1. Некоторые люди предпочитают изменения неизвестных слов в специальное слово как «< УНКА>» перед подачей в корпусе перчатку или модели Word2Vec. Означает ли это, что мы должны сначала создать словарь и сменить некоторые низкочастотные слова (в соответствии с настройкой количества минут) на «< unk>» перед тренировкой? Это лучше, чем изменение неизвестных слов на 0 или просто удаление их при обучении RNN?

  2. Конечные 0s, переданные в сети LSTM или BLSTM, насколько я могу судить о выходе. Несмотря на отсутствие новой информации извне, состояние ячейки по-прежнему обновляется для каждого последующего шага, поэтому на выходе конечной ячейки будут сильно влиять длинные конечные 0s. И, на мой взгляд, BLSTM будет влиять еще больше, так как он также обрабатывает текст из обратного порядка, что-то вроде [0, 0, 0, ..., 0, 321, 231], особенно если мы установим начальную забудьте ворота в 1.0, чтобы воспитывать память в начале. Я вижу, что многие люди используют прописку, но не могут ли это привести к катастрофе, если тексты заполнены на большой длины, а в случае BLSTM?

Любая идея по этим вопросам? : -o

ответ

0

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

Что касается заполнения ваших последовательностей, вы попробовали пополнить свои последовательности по-разному? Например, введите начало вашей последовательности для прямого LSTM и конца последовательности для обратного LSTM. Поскольку вы заполняете нулями, активация не будет такой сильной (если таковая имеется), и ваши LSTM теперь заканчиваются вашей последовательностью, а не нулями, которые могут перезаписать вашу память LSTM.

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

Cheers.

1

Я согласен в основном с ответом Фабрицио выше, но добавить несколько замечаний:

  1. Вы никогда не должны использовать один и тот же маркер с УНК и САП. Большинство библиотек глубокого обучения маскируют PAD, поскольку он не предоставляет никакой информации. UNK, с другой стороны, предоставляет информацию вашей модели (здесь есть слово, мы просто не знаем, что это такое, и это, вероятно, особое слово), поэтому вы не должны маскировать это. Да, это означает, что на отдельном этапе предварительной обработки вы должны пройти через свои данные обучения/тестирования, построить словарь, например, 10 000 наиболее распространенных слов и переключить все остальное на UNK.

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

Смежные вопросы