Привет, Хабр! Меня зовут Роман, я работаю в Сбере в блоке HR исследователем данных. Мне и моим коллегам часто приходится иметь дело с персональными данными сотрудников (далее ПДн). А получить допуск к использованию этих данных в различных контурах банка очень непросто: в Сбере серьёзно относятся к безопасности ПДн. Ситуация усложняется тем, что для решения разных задач требуются разные наборы данных. Каждый раз запрашивать допуск — можно, но это долго. Поэтому для упрощения и ускорения работы с использованием ПДн мы решили разработать пайплайн, который анонимизирует данные сотрудников, позволяя проверять их влияние на разные метрики без доступа к чувствительной информации. Результатом работы этого механизма является эмбеддинг.
В статье я показываю особенности работы одной из частей утилиты «Генератор эмбеддингов» в конкретной задаче — поиск похожего сотрудника внутри компании. Подобная задача имеет массу прикладных направлений в бизнесе: поиск преемника, оперативный поиск сотрудника на место уволившегося, профилирование должностей и др. Без использования ПДн здесь, к сожалению, не обойтись. Так, например, для многих сотрудников важную роль играет удалённость офиса банка. И для того чтобы предложить оптимальный вариант работы, нужно учитывать место проживания человека, что уже является ПДн. «Генератор эмбеддингов» помогает оптимизировать этот процесс.
В Сбере работает порядка 281 000 человек. Каждый член команды — профессионал, чья работа важна для компании. Представим ситуацию, что одному из специалистов нужно найти временную замену. Это непросто, ведь новичка нужно обучить, ввести в курс дела, провести адаптацию. Ну а теперь представим, что замену нужно найти не одному сотруднику, а всем сразу. Соответственно, нужно оперативно организовать поиск новых 281 000 специалистов. Это, конечно, теоретическая ситуация, задача, реализация которой поможет понять пользу «Генератора».
Ищем замену специалисту по стандартной модели
Условия задачи: сопоставить каждому из 281 000 человек по 281 000 потенциальных преемников, а затем отранжировать подходящих кандидатов от наиболее подходящего к наименее подходящему. Даже при ограничении на один функциональный блок (отдел, группа или др.), в котором работает сотрудник, сложность решения колоссальная. Время, которое потребуется на расчёты с использованием стандартных моделей ранжирования, например LightGBMRanker библиотеки lightGBM, — огромное.
Для примера возьмём типичное оборудование, на котором и будет работать модель. Это сервер со стандартным процессором:
процессор: Intel(R) Xeon(R) Gold 6336Y;
количество ядер: 24;
частота: 2,40 ГГц;
максимальная частота: 3,6 ГГц.
Сервер с запущенной моделью LightGBMRanker выполнил расчёт поиска одного сотрудника в соответствии с условиями задачи за 9 секунд.
Формализуем задачу. Имеем набор данных (см. рис. 1): ПДн сэмпла (сотрудник Сбера), функциональный опыт сотрудника и другие признаки, ПДн другого сотрудника, который ставится в соответствие первому, его функциональный опыт и др. фичи. В качестве таргета используем 0 или 1, где 0 (negative sample) — если пара сотрудников не подходит на роли руководителя и преемника и 1 (positive sample) — в противоположном случае. В текущей постановке подразумевается, что преемник может быть только один. Чтобы не получить сильный дисбаланс классов в сторону 0-таргета, в качестве negative sampling будем использовать случайных N человек. N — гиперпараметр, в зависимости от его значения может измениться эффективность модели, т. к. ограничивая N, мы ограничиваем вариацию неподходящих сотрудников. В то же время эффект от ограничения может быть и противоположный — просто в N не попадёт ещё один сотрудник, который гипотетически может быть преемником.
В нашем примере возьмём N = 100. Это значение является рациональным при формировании набора данных для обучения модели по скорости обучения и по полученным на валидационной выборке метрикам. Соответственно, на каждого преемника у нас приходится 100 «непреемников».
Обучим нашу модель и применим в реальных условиях. Для этого нам нужно проскорить 281 000 человек на каждого сотрудника, что при выбранных мощностях займёт 25 дней при работе сервера в режиме 24/7. С учётом того, что мы решаем бизнес-задачу, а не обучаем GPT-3, попробуем сократить количество потенциальных преемников. Это можно сделать, выбрав функциональный блок сотрудника и дополнительно ограничив выборку по cosine similarity. После проведённых манипуляций с различными метриками измерения расстояния между векторами и подбора оптимального количества сотрудников в выборке получаем, что большая часть (порядка 70%) преемников теряется в процессе подобного отсева. Часть преемников работает в других блоках, часть отвалилась из-за проверки по similarity. Такие потери критичны для нашей задачи, поэтому используем альтернативный подход.
Решаем ту же задачу при помощи «Генератора эмбеддингов»
Давайте попробуем оптимизировать задачу с помощью «Генератора», а именно — генерации эмбеддингов с использованием сиамской нейронной сети. Кроме этого, я использовал и генерацию эмбеддингов с помощью архитектуры encoder-decoder, преобразование матрицы значений признаков с помощью PCA и TSVD с вариабельным параметром размерности выходной матрицы. Но наилучший результат показал именно метод с сиамской нейронной сетью.
Давайте разберёмся, что представляет из себя ядро модуля сети и как подготовить набор данных для такой нейронной сети. Начнём с формирования датасета. Предположим, что исходные данные были обработаны (заполнены пропущенные значения, исключены или сглажены аномалии) и нормализованы. Также предположим, что текстовые данные были лемматизированы и преобразованы в численные данные с помощью tf-idf либо другого инструмента преобразования текстовых данных в численные. Для корректной работы сиамской сети набор данных должен состоять из триплетов:
объекта, содержащего эталонный образец, с которым будет проводиться сравнение (anchor — A);
примера, который похож на эталон (positive sample — PS);
примера, который не похож на эталон (negative sample — NS).
Спроецируем схему на нашу задачу — сформируем триплеты (см. рис. 2). В один триплет войдут руководитель, его преемник и случайно выбранный сотрудник. Таких триплетов будет N = 100 (гиперпараметр, который мы подобрали ранее) на каждого руководителя, а преемник у нас один, поэтому в каждой сотне (группе) будут одинаковые A и PS и разные, случайно выбранные NS.
Набор данных готов, перейдём к построению архитектуры нейронной сети.
Имеем 3 канала — A, PS, NS — каждый из них имеет одинаковый тип данных,
используем блок полносвязных слоёв для формирования сжатого векторного
представления. Воспользуемся упрощённой схемой модели и единым блоком для
каждого участника триплета A, PS, NS (см. рис. 3). Тестирование альтернатив в
данной задаче, например схемы с использованием уникального блока преобразования
для каждого элемента (A, PS, NS), показало результат, сопоставимый с упрощённой
схемой. Поэтому я решил выбрать упрощённую схему.
Интересно, что на вход сиамской сети в виде триплетов могут поступать разнородные данные (как для мультимодальных НС). Например, в качестве A можно передать картинку с пиццей, в качестве PS — предложение со словом «пицца», а в качестве NS — предложение без слова «пицца». Для таких данных блок преобразования исходного сэмпла (триплета) в эмбеддинг будет разделён на 3, так что использовать упрощённую схему уже будет нельзя. Для каждого столбца A, PS, NS будет работать свой блок преобразования. Таким образом, оказывается, что мы ещё и используем модные ныне мультимодальные нейросетевые решения.
Используем полученные эмбеддинги для вычисления расстояния между парами (A, PS), которое должно быть невелико, а также парами (A, NS), которое должно быть существенно. В качестве функции расстояния между векторами используем euclidian distance (рекомендуемая метрика — default). Также в процессе разработки используем альтернативные метрики измерения векторного расстояния, например cosine, для выходного слоя сиамской сети, но в результате получаем увеличение значения используемой функции потерь. Оформим оба этих требования в дифференцируемую и непрерывную функцию потерь — margin loss or triplet loss (1):
Оптимизируя данную функцию потерь, сформируем веса нашего блока преобразования данных в эмбеддинги в соответствии с таргетом нашей задачи. Итак, на выходе будем иметь сжатые векторные представления, привязать которые к исходным признакам нет возможности (это в том числе и минус). При отсутствии весов блока преобразования нет возможности восстановить из них оригинальные признаки. Соответственно, задача анонимизации признаков выполнена.
Посмотрим, как наши эмбеддинги могут помочь ускорить отработку модели поиска преемников. Есть несколько путей использования полученных векторов.
Первый — использовать их в качестве дополнительных фичей при построении модели ранжирования. Существует вероятность переобучения, ведь эмбеддинги обучались на базе триплетов, которые были получены на базе таргета исходной модели. В ходе проверки данная гипотеза не подтвердилась, качество на тестовой выборке выросло: приросты HitRate@1 составили 5%, HitRate@5 — 3%.
Второй — используем эмбеддинги как средство первичного отсева, как в случае с применением ограничений на функциональный блок и по distance, similarity. Выделим для каждого условного руководителя 5 000, 10 000, 15 000 потенциальных преемников и проверим реальное присутствие в данных подвыборках истинного преемника. При рассмотрении подвыборки в 10 000 потенциальных преемников вхождение реального преемника составило уже более 90%, что намного выше, чем при использовании отсева с помощью оригинальных фичей. Соответственно, получилось сократить пул потенциальных преемников с 281 000 до 10 000. В конечном счёте удалось сократить время исполнения модели на одного сотрудника минимум в 3 раза.
И это ещё не всё
Нет предела совершенству, а значит, есть возможность ещё больше сократить время отработки для каждого сотрудника и также повысить качество самой модели подбора преемника. Для этого в перспективе мы планируем дополнить наши данные с помощью графовых данных о коммуникациях сотрудников. Кстати, для работы с графовыми данными и получения позиционных нодовых эмбеддингов в нашем «Генераторе эмбеддингов» также есть модуль, после применения которого можно получить расширенный набор данных. Далее при работе с уже обновлённым набором данных можно воспользоваться усложнённой схемой сиамской нейронной сети. Если вам стало интересно, что у нас получится в результате апдейта нашего пайплайна, пожалуйста, напишите в комментариях, мы с радостью продолжим делиться нашими продвижениями).
Если у вас возникнут идеи и предложения относительно того, какие ещё методы можно добавить в «Генератор эмбеддингов» либо как улучшить текущие, пожалуйста, пишите в комментариях.
fk0
A про что статья, я что-то не понял?
osj
Чем мы хуже Amazon?
sergeyns
"У мене внутре… гм… не… неонка». ... Внутре смотрите, где у неё анализатор и думатель "