Comments 29
А как быть с типа объявлений которые на грани запрета находятся? На сколько я понимаю рога косули на многих ресурсах под запретом (какие-то типы). Как вы боретесь с рекомендацией нежелательного контента? На сколько я помню были эксперименты на Youtube что там за 5-6 переходов по рекомендациям можно было на всякую чернуху попасть с абсолютно безобидных роликов.
А что не так с рогами косули?
Классная статья, спасибо!
А можешь подробнее расписать про то, какие данные вы держите в gpu-памяти? Я не до конца понял что именно вы туда загрузили — объявления (но там вроде явно больше 20 чисел) или контакты.
Спасибо за статью, прочитал с большим удовольствием
А сколько времени у вас ушло на реализацию этой новой модели? Начиная от продумывания концепции, и заканчивая введения её в прод?
спасибо за статью. правильно ли я понимаю, что векторы хранятся в базе данных и Sphinx прикручена сверху? если да, то чем не устроил, например, поиск с помощью postgresql/POSTGIS ближайших векторов?
Поделитесь, как можно использовать postgresql/POSTGIS для поиска ближайших векторов?
Можно использовать cube-индекс, мы так делаем для поиска дубликатов объявлений, я хочу после НГ написать статью об этом)
Отлично, буду ждать. А подскажите, размерность куба увеличивали, по умолчананию он позволяет работать только со 100 элементами массива.
> [...] увеличил на 30% контакты с похожих, на 20% контакты с ленты персональных рекомендаций и значимо прирастил байеров на Авито.
Несколько вопросов от «чайника» (только учусь):
1.непонятно что имеется в виду на схеме слоёв нейронной сети, после дропаута. Что-то там странное с размерностью:
196*512, потом после relu 512*128. Что показывает размерность?
И еще понимание осложняется тем, что до дропаута, вектор полученный как конкатенация разных типов фич — имеет другую размерность: 192.
2.Не ясно как имеено происходит обучение, начиная с «шага 3»:
используются вообще только негативные примеры? Так получается из текста: «Выбираем 100 негативных с самым большим скором». Или тут имелось в виду что из всех негативных только 100 самых похожих? Просто это не ясно из описания шагов 3 и 4.
3.Не понятна картинка на шаге 4, для cross-enthropy loss: он считается между 8-битными векторами (128 булевых измерений), полученных из нейронной сети, или я что-то не понял?
На картинке показано сравнение beoolan-type и float-type вектора.
Очень надеюсь на ответы/пояснения
Да, 100 самых похожих выбираем из негативных. Немного поправлю в тексте, спасибо.
Нейронка на выходе дает 128-мерный float вектор. Про bool — это label для примеров. У первого (позитивного) он 1, у остальных (негативных) — 0. А там считаем кросс-энтропию (мультиклассовый logloss ).
К int8 мы приводим уже после обучения, так храним вектора. Ну и во время инференса работаем также с int8.
В остальном — после комментариев понял. Спасибо!
Как мы используем item2vec для рекомендаций похожих товаров