Случайно наткнулся на следующий необычный эффект при обучении рекуррентной нейросетки.
Преамбула
Занимаюсь тюнингом и экспериментами со своей реализацией Skip-Thoughts модели (
https://github.com/ryankiros/skip-thoughts) на Keras. В принципе, у меня нейросетка достаточно точно воспроизводит архитектуру оригинальной статьи (
http://arxiv.org/abs/1506.06726), за исключением нескольких моментов:
1) тренируемся предсказывать только последующее предложение, а не предыдущее и последующее.
2) слова представлены фиксированными word2vec эмбеддингами, они не меняются в ходе обучения, так как это ухудшает точность.
3) есть early stopping по валидационному набору, поэтому обучение идет не заданное заранее число эпох.
4) размерность векторов слов и предложений значитально меньше, чем в оригинальной модели.
Модель представляет из себя простую рекуррентную sequence 2 sequence сетку. Предложения берутся из большого русскоязычного корпуса с художественной литературой и всякой публицистикой. Исходный код можно найти в репозитории по ссылке
https://github.com/Koziev/chatbot/blob/master/PyModels/train_skip_thoughts.py Валидация эмбеддингов на задаче выбора предпосылки для вопроса
Сами по себе значения loss'а изучаемой модели не информативны, так как ничего не говорят о качестве эмбеддингов, получаемых на кодирующей части seq2seq. Поэтому я для оценки и сравнения с другими моделями использую специальный набор из вопросов и предпосылок-кандидатов. Модель должны выбрать верную предпосылку (см. для справки подход в Quick-Thought модели
https://github.com/lajanugen/S2V,
описанной в статье
https://arxiv.org/pdf/1803.02893.pdf).
Таким образом, энкодер модели skip-thoughts выдает для любой цепочки слов вектор фиксированной длины. Взяв два предложения (вопрос и предпосылку-кандидат), мы определяем их релевантность через косинус между векторами-эмбеддингами (строка 461). Максимальное значение косинуса дает наиболее релевантную предпосылку (строка 466).
Random projections или Extreme Learning Machine
И вот в какой-то момент становится понятно, что если обучать skip-thoughts модель не до упора, когда срабатывает early stopping (примерно 20 эпох для миллиона пар предложений), а только несколько первых эпох, то точность выбора предпосылки через косинусную меру среди кандидатов растет! Оптимум может достигаться на 3-4 эпохах.
И самое интересное - если рекуррентуню сетку со случайной начальной инициализацией весов вообще не обучать, то она:
1) выдает некоторые эмбеддинги предложений (причем любой длины)
2) близкие по лексикону и словосочетаниям предложения прокачались через случайно инициализированные матрицы в LSTM элементах и дали близкие эмбеддинги.
Получилось что-то типа Extreme Learning Machine (
https://en.wikipedia.org/wiki/Extreme_learning_machine) для рекуррентной архитектуры, locality sensitive hashing (
https://ru.wikipedia.org/wiki/Locality-sensitive_hashing) и Random Projections (
http://scikit-learn.org/stable/modules/random_projection.html).
Далее я проверил этот же подход для похожей на InferSent (
https://github.com/facebookresearch/InferSent) задачи, когда эмбеддинги предложений получаются в ходе supervised обучения классификатора релевантности (исходный код на Python/Keras лежит тут
https://github.com/Koziev/chatbot/blob/master/PyModels/nn_relevancy.py) с похожим результатом: необученный, случайно инициализированный рекуррентный энкодер выдает эмбеддинги текста, неплохо работающие с косинусной мерой.