Продолжаю. До боевого решения мы додумались в четверг - не помню точно, как, но мне кажется, когда вечером ходили за мороженым. Четверг был максимально продуктивным, в пятницу уже дообучали на последних данных и нервно оформляли решение в докер-контейнер (!) (все решение целиком - https://github.com/webgeist/deephack).
До этого у нас были две модели:
1) модели ребят с предварительного раунда на GBM (они и пошли в прод, только с попарным обучением)
2) посимвольная нейронная сеть, про которую расскажу чуть подробнее.
Реплики каждого из бота разбиваются на символы (180 в словаре), для каждого символа обучается свой embedding (шарятся между ботами), которые подаются на вход или LSTM, или Conv1D + Global Max Pooling (последняя в финальном варианте), конкатенируются и еще через несколько слоев доходят до выходов. Получается монстрик, как на картинке.
Выходов четыре и это достаточно важно - если сразу предсказывать оценки за себя и того парня плюс вероятности бот/не бот обоих - получается лучше. Аналогичную штуку использовали парни из Сегменто, которые заняли третье место (хотя и у них сеть в прод не пошла, хотя, как я знаю, потом дала хороший результат, может [id10042517|Сергей] расскажет?) - им было обидно проиграть :)
В середине пробовали разные вещи - брали усредненные GloVe контекста и первых реплик, считали их косинусную меру и ее же объединяли с выходами предыдущих слоев. Очень полезен hyperopt - просто задавал структуру вида - добавить слой, а если добавить, то попробовать такие параметры и ставил подбираться. Данных мало, обучается быстро, так же как и оверфитится :) Грязный подход, который в условиях ограниченного времени должен решать.
Часть 1 - о чем это все?: https://vk.com/kalaidin?w=wall143978_1455
Часть 2 - решение: https://vk.com/kalaidin?w=wall143978_1460
#deephack
До этого у нас были две модели:
1) модели ребят с предварительного раунда на GBM (они и пошли в прод, только с попарным обучением)
2) посимвольная нейронная сеть, про которую расскажу чуть подробнее.
Реплики каждого из бота разбиваются на символы (180 в словаре), для каждого символа обучается свой embedding (шарятся между ботами), которые подаются на вход или LSTM, или Conv1D + Global Max Pooling (последняя в финальном варианте), конкатенируются и еще через несколько слоев доходят до выходов. Получается монстрик, как на картинке.
Выходов четыре и это достаточно важно - если сразу предсказывать оценки за себя и того парня плюс вероятности бот/не бот обоих - получается лучше. Аналогичную штуку использовали парни из Сегменто, которые заняли третье место (хотя и у них сеть в прод не пошла, хотя, как я знаю, потом дала хороший результат, может [id10042517|Сергей] расскажет?) - им было обидно проиграть :)
В середине пробовали разные вещи - брали усредненные GloVe контекста и первых реплик, считали их косинусную меру и ее же объединяли с выходами предыдущих слоев. Очень полезен hyperopt - просто задавал структуру вида - добавить слой, а если добавить, то попробовать такие параметры и ставил подбираться. Данных мало, обучается быстро, так же как и оверфитится :) Грязный подход, который в условиях ограниченного времени должен решать.
Часть 1 - о чем это все?: https://vk.com/kalaidin?w=wall143978_1455
Часть 2 - решение: https://vk.com/kalaidin?w=wall143978_1460
#deephack
0
У записи 26 лайков,
2 репостов,
6994 просмотров.
2 репостов,
6994 просмотров.
Эту запись оставил(а) на своей стене Павел Калайдин