Научить Алису предсказывать намерения пользователя и разобраться в инфраструктуре Amazon
С 4 по 16 ноября 2019 года Яндекс и Университет «Сириус» проводили практический интенсив для студентов-разработчиков. В течение двух недель участники пробовали воспроизвести результаты последних исследований в сфере машинного обучения, в частности, они занимались симуляцией экспериментов, которые проводились на Большом адронном коллайдере, и распознаванием намерений пользователя при разговоре с голосовым помощником. Три команды разработчиков рассказали Академии Яндекса о проектах и сложностях, возникавших при анализе научных статей.
Архитектура базы данных Open Aurora
Команда Кирилла Никанорова, Полины Гусевой и Вити Калинина воспроизводила архитектуру базы данных Open Aurora, разработанную компанией Amazon. Новая архитектура решила проблему длительного ожидания при синхронной записи данных на диск за счёт замены диска на облачное хранилище, которое уже асинхронно записывало данные и отвечало за их считывание. Благодаря этому количество запросов, обрабатываемых базой за секунду, увеличилось в десять раз.
Полина рассказывает, что выбрала этот проект, так как на работе сталкивалась с базами данных и сетевыми хранилищами и ей было интересно узнать, как они устроены «под капотом». Всем ребятам показался полезным опыт воспроизведения научных статей, который обычно приобретают разработчики-исследователи. Во время смены команда сначала анализировала статью и исходный код, а потом реализовывала и отлаживала своё решение.
«Первые трудности возникли на этапе анализа статьи», — говорит Кирилл Никаноров. Разработчикам нужно было придумать, как в сжатые строки воспроизвести хотя бы основную концепцию новой архитектуры. Помимо этого, при работе над проектом нужно было изменять исходный код базы данных Postgres, применявшейся Amazon. Postgres была разработана на языке С стандарта 1989 года и состоит из 775 000 строк. Команде нужно было самостоятельно разобраться в масштабной архитектуре: в статье было только её описание, но не было комментариев по реализации.
В результате с помощью ментора Андрея Бородина у разработчиков получилась изменённая версия кода Postgres, которая воспроизводила ключевые элементы инфраструктуры Amazon (для того, чтобы реализовать такую инфраструктуру полностью, корпорации понадобилось два года). Теперь они хотят принять участие в разработке схожего проекта в крупной компании, используя больше ресурсов и времени.
Cимуляция экспериментов на Большом адронном коллайдере
Команду Никиты Гущина, Егора Ефимова и Жени Дедова под руководством Никиты Казеева и Фёдора Ратникова объединяет интерес к работе генеративно-состязательных сетей (GAN). Так, Женя занимался генеративными моделями на стажировке в JetBrains, а Егор изучал их работу самостоятельно, но столкнулся с тем, что большинство онлайн-курсов затрагивают эту тему только поверхностно.
Разработчики выбрали статью о симуляции экспериментов, которые проводились на Большом адронном коллайдере. Исследователи БАК изучают очень редкие процессы, чтобы их пронаблюдать, приходится сталкивать миллионы протонов в секунду. Для анализа таких событий нужны сравнимые объёмы симулированных данных. При этом рассматривается виртуальный коллайдер, в котором сталкиваются виртуальные протоны и используется виртуальный детектор. К статье прилагались данные и исходный код, но, несмотря на это, с воспроизведением результата возникли проблемы. Так, в исследовании не была указана конкретная версия кода, соответствующая статье, а предварительная обработка данных и расчет метрик качества производились с помощью библиотеки ROOT, не самой качественной и дружелюбной для пользователей. К тому же, для части приведённых графиков вообще не был приложен код.
Тем не менее, команде удалось заполнить пропуски и воспроизвести ключевые результаты статьи — обученную модель и оценку качества её работы.
Чтобы не скучать, смотря на серые гистограммы, ребята прогоняли их через котофикатор.
У Никиты, Егора и Жени возникло много вопросов, касающихся эффективности методов, использованных в статье. Во-первых, обучение модели и оценка её качества производилась на одном и том же датасете (обычно обучающая и тренировочная выборки разные). Во-вторых, использованная метрика качества χ2 чувствительна к выбросам и недостаточно экспрессивна, чтобы полностью описать разницу между многомерными распределениями. Кроме того, по её значениям тяжело понять, насколько хорошо модель будет работать на реальных задачах. Команда подытоживает, что использование χ2 — неудачный выбор.
«Для обучения алгоритма требуются данные, которые можно было бы использовать вместо модели, — рассказывает Никита. — А аргументов в пользу того, что модель чем-то полезнее датасета, по которому она была обучена, в тексте нет». При этом статья косвенно затрагивает любопытный вопрос: может ли модель машинного обучения быть более информативной, чем данные, на которых она обучалась? Очевидным кажется ответ «нет», однако не всё так просто.
Зачастую необученные свёрточные нейросети, которые инициализированы случайными параметрами, можно успешно использовать для задач анализа изображений. Эта же идея развивается в парадигме few shot learning. Её можно объяснить на примере задачи генерации фотографий животных. При классическом подходе для того, чтобы создавать изображения зверей, нейросети потребуется датасет с большим количеством представителей каждого вида. А особенность few shot learning заключается в таком обучении модели, которое позволяет ей сходу, по одной-двум фотографиям генерировать фотографии животного, которого она раньше не «видела».
Предсказание намерений пользователя и классификация слов в голосовых помощниках
Дарья Виноградова, Полина Таранцова и Игорь Медведев рассматривали сразу две статьи: о предсказании намерений при разговоре с диалоговым ассистентом и о классификации слов в запросах пользователя (например, сюда относится присвоение слову «Сочи» тега «локация»). Участники команды не в первый раз работали с речью: Игорь изучал NLP, Полина занималась распознаванием голоса в Tinkoff, а Даша стажировалась в команде Алисы и еще в школе начала интересоваться лингвистикой.
Изначально ребята планировали заниматься только воспроизведением статьи о предсказании намерений. Intent prediction — это, по сути, задача классификации, где каждой реплике в диалоге присваивается одна или несколько меток класса. Например, если пользователь вводит запрос «какая погода в Сочи», то намерением будет «прогноз погоды». Эта информация даст помощнику понять, что нужно открыть сайт с погодой. А вопросу «сколько ехать до Абхазии» будет присвоен интент «расстояние на карте», и ассистент с большой вероятностью запустит приложение Карты. Таким образом, выделение намерения помогает понять, чего пользователь хочет, и выбрать подходящий сценарий дальнейшего взаимодействия.
Но в первый же день команда столкнулась с проблемой: у них не было ни доступа к закрытым данным, нужным для экспериментов, ни понимания, когда он появится. Даша, Полина и Игорь решили не ждать и выбрать другую статью, датасет для которой лежит в открытом доступе. В ней помимо задачи intent prediction решалась также задача slot filling, которая классифицирует каждое слово в сообщении пользователя. Однако через три дня после начала смены разработчикам прислали данные для первой статьи — и они решили заниматься обеими.
К материалам прилагался код на GitHub: можно было бы разобраться с ним, запустить его и попробовать улучшить отдельные моменты в его работе. Но участники команды посоветовались с ментором и решили, что намного полезнее будет написать всю предобработку данных, описание моделей и эксперименты с нуля самостоятельно, опираясь только на текст статьи.
По ходу работы над проектом ребята столкнулись с типичной проблемой: авторы статьи опускали многие важные детали.
Например, в первой работе они не написали ни слова о гиперпараметрах, которые использовались в части моделей. А во второй статье не было явного описания слоёв нейронной сети.
«Даже если авторы приложили свой код к статье, это ещё не значит, что его удастся запустить и получить заявленные цифры», — рассказывают разработчики. В задаче с распознаванием намерений у ребят не сошёлся результат работы модели.
Авторский код для второй статьи и вовсе не удалось открыть: сперва потому что в нём были баги, а потом оказалось, что для запуска программы нужен какой-то файл, которого нет в репозитории и о котором не упоминалось в исследовании.
Несмотря на это, в конце проекта команде удалось приблизиться к результатам, которые были представлены в статьях, и даже обогнать их. Ребята говорят, что участие в интенсиве помогло им понять, насколько важна слаженная работа в команде, помогло улучшить навыки написания архитектур нейросетей, работы с данными и описания экспериментов.
«Мы столкнулись с большим числом сложностей и ошибок, с которыми так или иначе встретились бы в будущем. Но лучше сейчас и на учебном проекте, чем при работе с реальной задачей».