[начало тут
http://kelijah.livejournal.com/212124.html]
1.1 Простейший multilayer perceptron
Для начала попробуем развернуть список векторов символов предложения в один длинный вектор (очень длинный). Этот длинный вектор, точнее пара векторов для обоих вопросов, затем анализируется несколькими простыми полносвязными слоями. Получается незамысловатая feed forward сетка:
Будем использовать результаты этой сетки как грубую нижнюю оценку наших ожиданий для более продвинутых моделей.
Достаточно быстро выясняется, что это самая быстрая модель среди всех рассматриваемых. Ее даже можно обучать на CPU! Но это ее единственное достоинство, так как она самая неточная, и крайне склонна к переобучению. Последнее свойство отвечает на вопрос, зачем вообще нужны всякие сложные архитектуры, которые используются в других моделях.
У этой сетки есть еще одно любопытное свойство. Модель в ходе обучения отрабатывает только 5-8 эпох, а затем validation loss перестает улучшаться и после нескольких эпох срабатывает early stopping (см.
https://keras.io/callbacks/). Остальные модели обучаются намного дольше - по 10-30 эпох. Выглядит кривая обучения примерно так:
Исходный текст модели - файл
https://github.com/Koziev/QuoraQuestionPairs/blob/master/final_char_solver_0.pyДлительность обучения ~6 эпох, 10 минут
val_loss=0.3336
public_score=0.3868
Для сравнения аналогичная архитектура нейросети, но на уровне слов, достигает точности ~0.29 при валидации в ходе обучения и дает примерно 0.33 при сабмите. Файл этой модели -
https://github.com/Koziev/QuoraQuestionPairs/blob/master/final_word_solver_0.py.
В качестве эксперимента я сделал feed forward модель с добавочными слоями, реализующими “внимание” (см.
https://github.com/Koziev/QuoraQuestionPairs/blob/master/final_char_solver_0_attention.py). Но этот механизм не дает никакой прибавки в точность и сходимость модели.