Pull to refresh

Comments 29

А как быть с типа объявлений которые на грани запрета находятся? На сколько я понимаю рога косули на многих ресурсах под запретом (какие-то типы). Как вы боретесь с рекомендацией нежелательного контента? На сколько я помню были эксперименты на Youtube что там за 5-6 переходов по рекомендациям можно было на всякую чернуху попасть с абсолютно безобидных роликов.

Мы на главной странице фильтруем объявления, которые пользователи много раз скрывали. Это позволять отфильтровать нежелательный контент. Однако если объявление только появилось на сайте, то оно может появиться и на главной. Сейчас мы обдумываем как предсказывать нежелательность контента и учитывать это в нашей модели ранжирования.

А что не так с рогами косули?

Нельзя продавать части тел краснокнижных животных.

Настолько подробно не знаю.
А как это понять по рогам? :)

для украшений нет разницы, а вот для «лекарств» нужны с живых…

Классная статья, спасибо!
А можешь подробнее расписать про то, какие данные вы держите в gpu-памяти? Я не до конца понял что именно вы туда загрузили — объявления (но там вроде явно больше 20 чисел) или контакты.

Данные это датасет (пары айтемов) и фичи айтемов. Обычно фичи много памяти занимают. Но в нашем случае это просто числа — локация, регион, id квадрата на координатной плоскости, для заголовка — первые 7 слов. В итоге получается около 20 чисел для одного айтема.
Шаг 4 в «Обучение модели» — кросс-энтропия

Спасибо за статью, прочитал с большим удовольствием
А сколько времени у вас ушло на реализацию этой новой модели? Начиная от продумывания концепции, и заканчивая введения её в прод?

Я думаю чуть меньше года. Но это было параллельно с другими задачами

спасибо за статью. правильно ли я понимаю, что векторы хранятся в базе данных и Sphinx прикручена сверху? если да, то чем не устроил, например, поиск с помощью postgresql/POSTGIS ближайших векторов?

Мы храним вектора в индексах сфинкса. Не пробовали другие базы данных, так как у нас вся инфраструктура настроена на поиске в сфинксе.

Поделитесь, как можно использовать postgresql/POSTGIS для поиска ближайших векторов?

Можно использовать cube-индекс, мы так делаем для поиска дубликатов объявлений, я хочу после НГ написать статью об этом)

Отлично, буду ждать. А подскажите, размерность куба увеличивали, по умолчананию он позволяет работать только со 100 элементами массива.

Не, оставили как есть (dba настоятельно попросили), сделали дополнительный слой в нейронке, который отображает в нужную размерность.

В нашем случае это можно было сделать без заметного влияния на качество, а вычислять в итоге нужно меньше :)

а это за какой период?
> [...] увеличил на 30% контакты с похожих, на 20% контакты с ленты персональных рекомендаций и значимо прирастил байеров на Авито.
По результатам аб теста.
Соответственно, сразу после раскатки.
Спасибо за статью! А где можно почитать про то как хранить вектора в индексах Sphinx и перемножать векторы и искать похожие полным перебором чтоб это быстро работало?

Тут важно учитывать число векторов в одном индексе.


Насколько я помню, по словам Аксёнова порядка 50 ms занимает перебор миллиона 128d-векторов в одном индексе, поэтому данные важно шардировать, если их много.

Спасибо за статью!
Несколько вопросов от «чайника» (только учусь):
1.непонятно что имеется в виду на схеме слоёв нейронной сети, после дропаута. Что-то там странное с размерностью:
196*512, потом после relu 512*128. Что показывает размерность?
И еще понимание осложняется тем, что до дропаута, вектор полученный как конкатенация разных типов фич — имеет другую размерность: 192.

2.Не ясно как имеено происходит обучение, начиная с «шага 3»:
используются вообще только негативные примеры? Так получается из текста: «Выбираем 100 негативных с самым большим скором». Или тут имелось в виду что из всех негативных только 100 самых похожих? Просто это не ясно из описания шагов 3 и 4.

3.Не понятна картинка на шаге 4, для cross-enthropy loss: он считается между 8-битными векторами (128 булевых измерений), полученных из нейронной сети, или я что-то не понял?
На картинке показано сравнение beoolan-type и float-type вектора.

Очень надеюсь на ответы/пояснения
Когда мы стакаем эмбеддинги всех фичей получаем 196 (=64+32+64+16+16). Дропаут никак на размерность не влияет. После него идет линейный слой, который на вход принимает размерность 196, а на выходе — 512. Также и про другие слои.
Да, 100 самых похожих выбираем из негативных. Немного поправлю в тексте, спасибо.
Нейронка на выходе дает 128-мерный float вектор. Про bool — это label для примеров. У первого (позитивного) он 1, у остальных (негативных) — 0. А там считаем кросс-энтропию (мультиклассовый logloss ).
К int8 мы приводим уже после обучения, так храним вектора. Ну и во время инференса работаем также с int8.
64+32+64+16+16 = 192 ))
В остальном — после комментариев понял. Спасибо!
Sign up to leave a comment.