Нейросетевые модели для определения перефразировок вопросов (7)

Jul 04, 2017 10:17

[начало тут http://kelijah.livejournal.com/212124.html]

Часть 1 char-level deep neural networks

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

"Find the remainder when [math]23^{24}[/math] is divided by 24,23?"

Концовка вопроса допускает неоднозначную трактовку. Имел ли ввиду автор альтернативу “делить на 24 или делить на 23”, или тут запись числа с дробной частью “24.23”? Обращу внимание, что в датасете очень много чисел, записанных через запятую, и не всегда можно достоверно сказать, перечисление ли это двух чисел или запись одного с отделением дробной части.

Рекуррентные сетки, работающие с цепочками символов, решают этот вопрос кардинально и бескомпромиссно, перенося вывод правил токенизации внутрь себя в той степени, в которой это необходимо для классификации. Ну, по крайней мере, идея именно такова. Даже приведение символов к нижнему регистру можно не делать, избегая сложностей с токенами типа “IT” и “US”! Я делал эксперименты с различными нормализациями текста перед подачей на вход сеток и пришел к выводу, что дополнительная обычно не окупается.

Все описываемые ниже нейросетевые архитектуры выполняют кодирование символов с помощью специального слоя Embedding (https://keras.io/layers/embeddings/). После создания нейросети каждому символу присваивается случайный вектор заданной разерности (см. далее). Затем по мере обучения компоненты вектора для каждого символа меняются так, чтобы обеспечить максимально эффективное представление символов, то есть минимизировать заданную функцию потерь. Вместо Embedding можно было бы использовать 1-hot кодирование символов, если бы не слишком большой размер получающихся векторов. В рамках решаемой задачи необходимо кодировать почти две тысячи символов, в результате получится огромное количество параметров, которые модель должна настроить. Кодирование символов с помощью векторов умеренного размера (я использовал размерность от 16 до 64) слоем Embedding снимает проблему переобучения.

За размер векторов для представления символов во всех скриптах отвечает настроечный гиперпараметр CHAR_DIMS. Его подбор следует выполнять аккуратно, так как простое увеличение дает видимое улучшение результатов модели при обучении, но сабмит показывает крайне неоднозначные результаты, то есть модели начинают сильно переобучаться. Я остановился на компромиссном значении 32.

соревнования, character language model, kaggle, machine learning

Previous post Next post
Up