У Яндекса есть сервис разработки поисковых компонентов, который строит поисковую базу данных с помощью MapReduce, предоставляет данные макета для рендеринга, генерирует алгоритмы и структуры данных, решает задачи ML повышения качества.
Алексей Шлюнькин, руководитель одной из групп этого сервиса, объясняет, из чего состоит время выполнения поиска и как мы им управляем.
Если вы хотите поработать с ML, дерзайте.— Что такое поиск сегодня? Яндекс начал с создания поиска и развивал его.Если вам нужен только MapReduce, хорошо.
Если вам нужно время выполнения, то время выполнения.
Прошло 20 лет. У нас есть поисковая база данных, содержащая сотни миллиардов документов.
Документом мы называем любую страницу в Интернете, но, собственно, не только ее.
А еще — его содержимое, различная статистика о том, какие пользователи его любят посещать, сколько их.
Плюс данные, которые мы рассчитали.
Это еще и десятки тысяч экземпляров, которые в ответ на каждый запрос обрабатывают данные, что-то ищут и обогащают поисковый ответ. Какие-то экземпляры ищут картинки, какие-то обычные текстовые документы, какие-то видео и т. д. То есть на каждый ваш запрос активируются десятки тысяч машин.
Все они пытаются что-то найти и улучшить тот результат, который вам показывают. Соответственно, десятки тысяч машин обслуживают тысячи запросов в секунду.
Эти десятки тысяч экземпляров объединяются в сотни сервисов, призванных решить какую-то задачу.
Есть поисковое ядро — служба веб-поиска.
А есть сервис поиска видео и т. д. Соответственно, есть штука, которая объединяет ответы с разных поисков и пытается выбрать, что и в каком порядке лучше показать пользователю.
Если это какой-то запрос о музыке, то, наверное, лучше сначала показать Яндекс.
Музыку, а потом, например, страницу об этой музыкальной группе.
Это называется блендер.
Таких сервисов уже сотни, и они тоже что-то делают по каждому запросу и стараются как-то помочь пользователям.
И, конечно же, все это использует машинное обучение всех видов: от какой-то простой статистики, линейных моделей до повышения градиента, нейронных сетей и так далее.
Теперь я буду говорить как об инфраструктуре, так и об ML. Моя группа называется новой группой разработки среды выполнения, она является частью службы разработки компонентов поиска.
Чтобы дать вам представление, расскажу немного о том, чем занимается наш сервис.
Фактически, каждый.
Если представить себе поиск, то мы приложили руку практически ко всему, начиная с создания поисковой базы данных.
То есть у нас есть MapReduce, где мы собираем все данные о документах, провариваем их, строим всякие структуры данных, чтобы при запросе к ним можно было что-то эффективно посчитать.
Соответственно, мы работаем с самого низу, когда документ к нам только попадает, с первого этапа, когда эти документы извлекаются и ранжируются, и до самого верха, где лейаут получает условный JSON и отрисовывает его со всеми картинками.
и красавицы.
Снизу вверх, по всему стеку, мы что-то разрабатываем.
Но мы не только пишем код и, соответственно, делаем все это инфраструктурно.
На самом деле мы обучаем нейронные сети, CatBoost. А также мы учим другим вещам ML, которые вы только можете себе представить и которые будут полезны.
А еще, поскольку у нас большие нагрузки, большие данные, мы, конечно, возимся с алгоритмами и структурами данных и никогда не отказываемся их где-то реализовать.
Например, мы используем деревья сегментов в нескольких местах.
У нас есть своя компрессия индексов, которая строит бор и по ней просчитывает динамику, как лучше строить словари.
В общем, имея дело с такой большой махиной, как поиск, нам надоели такие простые задачи.
Поэтому, конечно, мы обожаем что-то сложное, новое, что-то, что бросает нам вызов.
И мы не просто пошли и написали десять строк кода, как обычно.
Нам нужно подумать об этом и провести несколько экспериментов.
Вообще задачи, которые мы перед собой ставим, зачастую находятся на грани фантастики.
Иногда думаешь: это, наверное, невозможно.
Но тут ты, возможно, как-то поэкспериментировал – эксперименты могут занять целый год – но в итоге что-то получается.
Потом начинаем что-то внедрять и переделывать.
И помимо всяких проектов, навыков и так далее, вообще мы одна из самых амбициозных и быстрорастущих команд в Яндексе.
Например, я приехал два года назад и был девятым человеком в нашей службе.
Сейчас в нашей службе работает почти 60 человек.
Это, по сути, со стажерами, но в целом за два года мы выросли в четыре раза.
Это для того, чтобы вы имели примерное представление о том, чем занимается наш сервис.
Теперь я хочу немного поговорить о наших задачах и направлении, которое, как мне кажется, будет для нас все более актуальным в ближайшем будущем.
Но для этого мы должны сначала кратко объяснить, как работает самый простой уровень поиска.
В общем, все работает очень просто.
У нас есть наша поисковая база данных, у нас есть все документы, и мы делим все эти документы более-менее поровну на N частей.
Их называют осколками.
И по шарду запускается программа под названием «Базовый поиск».
Ее задача — выполнить поиск соответственно на этом участке интернета.
То есть она умеет искать по нему и больше ничего не знает о другом Интернете.
И таких осколков у нас N. Над ними бегут базовые поиски, и, соответственно, выше этого находится метапоиск.
В него сбрасывается запрос пользователя и соответственно он просто идет по всем шардам, и каждый шард выполняет поиск, потом каждый возвращает результат, а он выполняет какое-то слияние и дает ответ. Примерно так строился поиск почти все 20 лет, и вообще долгое время думали, что он останется примерно таким же, и ничего лучшего сделать нельзя.
Но все меняется, появляются новые технологии, и машинное обучение теперь позволяет не только повышать качество, но и позволяет решать некоторые инфраструктурные проблемы.
В последнее время в наших поисках все чаще появляются проекты на стыке инфраструктуры и машинного обучения.
При слиянии двух таких мастодонтов получаются очень интересные результаты.
Недавно появились нейронные сети.
У нас есть текст запроса, есть текст документа.
Мы хотим получить некоторый вектор чисел из запроса и некоторый вектор чисел из документа, чтобы скалярное произведение предсказывало нужное нам значение.
Например, мы хотим обучить скалярное произведение прогнозировать вероятность того, что пользователь нажмет на этот документ. Это вполне объяснимая вещь.
Это работает примерно так.
Грубо говоря, у нас есть несколько слов на нижнем слое, а затем есть несколько слоев сети.
Каждый слой, по сути, принимает на вход какой-то вектор.
То есть нижний слой представляет собой разреженный вектор, где каждое слово представляет собой запрос.
Он умножает его на матрицу, получает какой-то вектор, а затем, соответственно, к каждой составляющей применяет какую-то нелинейность, и делает это несколько раз.
И последний слой, это называется именно тот вектор, по которому мы только что взяли запрос, применили такие слои, и последний слой — это тот самый вектор запроса.
Соответственно, эти нейросети в последние годы активно внедрялись в поиск и принесли массу преимуществ по качеству.
Но у них есть одна проблема: все значения, которые мы хотим предсказать, хорошие, но достаточно грубые, потому что для обучения такой нейронной сети нижний слой очень большой — все слова из десятков миллионов слов.
, поэтому вам нужно иметь возможность отправить в него несколько миллиардов входных данных.
Например, мы можем обучиться некоторым кликам пользователей и так далее.
Но главный сигнал, который в наших поисках считается самым важным – это ручная маркировка специальными людьми.
Берут запрос, берут документ, читают, понимают, насколько он хорош и ставят оценку, то есть насколько этот документ соответствует этому запросу.
Долгое время мы не могли спрогнозировать такое значение с помощью нейронных сетей, потому что у нас еще есть несколько миллионов оценок, потому что нанимать всю планету, чтобы постоянно все это отмечать, очень дорого.
Итак, мы немного взломали.
Нейронная сеть нейронных сетей.
За последние годы у нас накопилось довольно много своеобразных нейросетей, предсказывающих хорошие сигналы, но немного более грубые, чем оценка специальных людей.
Соответственно, мы решили, что готовые векторы этих сетей передадим нижнему слою, а затем обучим нейронную сеть прогнозировать нашу релевантность поиска на меньшем наборе данных.
Получилась очень хорошая модель.
Он преобразует запросы документов в вектор, и их скалярное произведение предсказывает реальную релевантность, которую мы давно хотели предсказать.
Тогда нам пришла в голову идея, как немного переделать поиск.
Проект называется KNN-base (англ.
k-ближайшие соседи, метод k-ближайших соседей).
Основная идея такова.
У нас есть вектор запроса и вектор документа.
Нам нужно найти ближайший.
В нашем случае каждый документ представлен вектором.
Выделим N кластеров, которые характеризуют все пространство документа.
Грубо говоря.
Гораздо меньше, чем количество документов, но они, например, характеризуют темы.
Если говорить простым языком, то есть кластер про кошек, кластер про машины, кластер про программирование и так далее.
Соответственно, мы не будем разбрасывать документы хаотично по шардам, как раньше, а разместим документ в том шарде, то есть центроид которого ближе всего к документу.
Соответственно, в нашем шарде у нас будут такие документы, сгруппированные по темам.
А то просто по запросу, теперь мы не можем обращаться ко всем шардам, а только к какой-то небольшой подгруппе тех, кто наиболее близок к этому запросу.
Соответственно, у нас была следующая схема: во всех шардах включен метапоиск.
И теперь ему нужно посещать гораздо меньше мест, а мы при этом еще будем искать ближайшие документы.
Что мы на самом деле получаем от такой конструкции? Это существенно снижает потребление вычислительных ресурсов просто потому, что мы переходим на меньшее количество кластеров.
Это, как я уже сказал, я считаю одной из изюминок нашего сервиса, это слияние инфраструктуры и машинного обучения, дающее результаты, о которых раньше никто и подумать не мог.
И, в конце концов, это просто довольно забавная вещь, потому что вы получили модели здесь, а потом пошли и переделали весь поиск, переместили петабайты данных, и ваш поиск работает, он использует в десять раз меньше ресурсов.
Вы сэкономили компании миллиард долларов, все довольны.
Я рассказал об одном из проектов, который всплывает в наших поисках и который реализуется и делается вместе со всеми экспериментами уже около года.
Другая наша типичная задача — удвоить поисковую базу, потому что Интернет постоянно растет и мы хотим его догонять и искать по всем страницам в Интернете.
И конечно, это ускорение базового слоя, у которого больше всего экземпляров, больше всего аппаратного обеспечения.
Например, ускорение базового поиска на один процент может сэкономить примерно миллион долларов.
Также мы занимаемся поисковой деятельностью в качестве стартап-инкубатора.
Я объясню.
Поиски продолжались 20 лет. Много чего в нем уже сделано, много раз мы заходили в какой-то тупик и думали, что больше ничего сделать нельзя.
Дальше была длинная серия экспериментов.
Мы снова вышли из этого тупика.
И за это время мы накопили массу опыта, как делать большие и крутые дела.
Соответственно, сейчас большинство новых трендов в Яндексе делается в поиске, потому что люди в поиске уже все это умеют, и логично попросить их спроектировать хотя бы какую-то новую систему.
И хотя бы пойти и сделать это самому.
Теперь, надеюсь, вы имеете некоторое представление о нашей работе.
Быстро расскажу тематическую часть своего рассказа, о стажерах нашего сервиса.
Мы их очень любим.
У нас их много, прошлым летом только в моей группе было 20 стажеров, и я считаю, что это хорошо.
Когда берешь одного-трех стажеров, они чувствуют себя немного одиноко, иногда боятся спросить старших товарищей.
А когда их много, они общаются друг с другом как товарищи по несчастью.
Если они боятся что-то спросить у разработчиков, они пойдут и перешептываются в углу.
Такая атмосфера помогает делать все качественно.
Заданий у нас миллион, команда не очень большая, поэтому наши стажеры загружены по полной.
Мы не просим стажера постоянно сидеть, парсить лог, писать тесты, рефакторить код, а сразу даем какую-то сложную производственную задачу: ускорить поиск, улучшить сжатие индекса.
Конечно, мы помогаем.
Мы знаем, что все это окупается, поэтому мы рады поделиться своим опытом.
Поскольку наша сфера деятельности достаточно обширна, каждый найдет занятие по душе.
Если вы хотите поработать с ML, дерзайте.
Если вам нужен только MapReduce, хорошо.
Если вам нужно время выполнения, то время выполнения.
Есть все, что вы хотите.
Что вам нужно, чтобы попасть к нам? Мы делаем все в основном на C++ и Python. Вам не обязательно знать оба, вы можете знать одно или другое.
Знание алгоритмов приветствуется.
Это создает определенный стиль мышления, и это очень помогает. Но это тоже не обязательно: повторюсь, мы готовы всему научить, мы готовы вкладывать свое время, потому что знаем, что это окупается.
Самое главное требование, которое мы предъявляем, наш девиз – ничего не бояться и много хвастаться.
Не бойтесь бросать производство, не бойтесь начинать делать что-то сложное.
Поэтому нам нужны люди, которые тоже ничего не боятся и которые тоже готовы горы свернуть.
Большое спасибо.
Теги: #Машинное обучение #Алгоритмы #Поисковые технологии #нейронные сети #алгоритмы и структуры данных #индекс #время выполнения #Яндекс.
поиск #поисковая база данных #knn
-
Поддерживайте Отношения С Помощью Чата
19 Oct, 24 -
Тестирование Хранилища Данных
19 Oct, 24 -
В Индии Заблокировано Более 30 Веб-Сайтов
19 Oct, 24 -
Охрана Периметра: Скизел Против Скайнета
19 Oct, 24 -
Как Стать Программистом 1С
19 Oct, 24