Разбудить Алису: обучение моделей для голосовой активации
Два ШАДа
Я работаю в команде, которая занимается голосовой активацией. Пришёл сюда стажёром, здесь же писал диплом, а с недавнего времени руковожу этой командой.
Я родился в небольшом городе под Минском и учился в Белорусском государственном университете на программиста. На первом курсе я узнал про минское отделение ШАДа, сдал вступительные испытания и прошёл. Отучился два года и попал на стажировку в Яндекс, в команду голосовой активации. Тогда я заканчивал бакалавриат и думал о том, куда поступать дальше. В итоге я приехал в Москву и поступил в магистратуру НИУ ВШЭ на Факультет компьютерных наук, где была часть дисциплин из ШАДа. Можно сказать, что я побывал в ШАДе целых два раза — в Минске и во время учёбы в магистратуре.
К этому времени я уже прошёл стажировку и стал младшим разработчиком. Голосовой активацией на тот момент занимались ребята и из Москвы, и из Минска, поэтому было неважно, в каком городе я нахожусь.
Голосовая активация
Если бы мне потребовалось объяснить пятилетнему ребёнку, что такое голосовая активация, я бы сказал так: «Есть колонка с Алисой, и, чтобы с ней поговорить, её нужно сначала разбудить. Тот момент, когда человек говорит "Алиса" и запускает общение с колонкой, и есть голосовая активация».
Владельцы колонок знают, что Алиса услышит зов, даже если интернет не работает, но ответит, что подключения к сети нет. Это означает, что голосовая активация происходит не на серверах Яндекса, а на самом устройстве. Для этого понадобилось создать нейросетевую модель, которая поместится в Станцию и будет исправно работать на довольно небольшом процессоре. Колонка слышит весь звук, но обрабатывать речь начинает только когда кто-то позовёт Алису: после этого звук отправляется на серверы Яндекса.
Всё, что человек говорит после активации, — команды, вопросы, вызов навыков и сценариев — отправляется на распознавание. После этого в зависимости от команды выбирается нужный сценарий: колонка включает фильмы или музыку, ищет информацию в интернете, запускает специальные навыки или умный дом.
Голосовую активацию не стоит путать с распознаванием речи:
— Для активации нужно распознавать отдельные слова, а не весь текст.
— Модель голосовой активации работает на самом устройстве, поэтому должна на это устройство помещаться. Для распознавания речи требуется большая серверная модель, которую на колонке с небольшим процессором трудно научить работать в реальном времени.
— Распознавание речи не обязательно происходит в реальном времени: чаще всего аудиокусок записывается, а потом распознаётся. А модель голосовой активации должна быть стриминговой, то есть уметь выделять в бесконечном потоке звуков нужную активационную фразу с минимальной задержкой.
Работа над дипломом
Когда пришло время писать диплом, я уже работал в команде, которая занимается голосовой активацией, поэтому решил выбрать тему, которая связана с моей работой. Обучение модели на малом количестве примеров показалось мне довольно интересной задачей.
Так совпало, что моим научным руководителем стал мой руководитель в Яндексе, преподаватель ШАДа Алексей Колесов. Дело в том, что вне Яндекса трудно найти специалиста, который занимался бы задачами, связанными с голосовой активацией. Даже распознаванием речи занимается не так много людей, как компьютерным зрением или NLP, а голосовой активацией — и того меньше.
Сама задача состояла в следующем: сделать так, чтобы пользователь мог назначить собственную активационную фразу. В теории всё просто: можно сделать какую-нибудь общую модельку, в которую «скармливается» активационная фраза — пользователь вписывал бы её в приложении и произносил несколько раз. А дальше он мог бы активировать колонку любой фразой, какой хочется.
Тут мы и сталкиваемся с основной сложностью. Для обучения моделей обычно используются датасеты с большим количеством примеров. Но заставлять пользователя произносить одну и ту же фразу пару сотен или тысяч раз было бы бесчеловечно. Поэтому можно попросить его произнести активационную фразу несколько раз, например десять. И уже эти десять записей использовать для обучения модели.
Почему недостаточно произнести фразу 1-2 раза? Потому что, даже если мы говорим одно и то же, мы каждый раз произносим слова немного по-разному. Меняется скорость речи, интонация, расстояние от колонки до говорящего. Поэтому хорошо иметь в запасе хотя бы 10 вариантов.
Важно понимать, что ни одна модель с нуля на таком объёме данных, конечно, не обучится, поэтому мы берём уже обученную модель, которой заранее «скормили» огромное количество примеров из обучающего датасета, который состоит из набора записей того, как произносятся разные слова. При этом выбранная пользовательская фраза может встречаться в датасете часто, может — редко, а может и вовсе не встречаться.
Модели голосовой активации, которые стоят на колонках, учатся распознавать только те звуки, которые нужны для активации. Например, модель Алисы умеет распознавать звуки, которые есть в слове «Алиса». Чтобы дообучить модель, нужно, чтобы она изначально умела распознавать и другие звуки.
Целью моей дипломной работы и стало обучение такой модели. В дипломе я разобрал разные способы обучения на малом количестве данных: эта задача встречается не только в работах, связанных со звуком, по этой теме существует довольно много статей. Чаще всего эти статьи предлагают какой-нибудь особый метод предварительного обучения модели на большом датасете, чтобы после этого она легче доучивалась на маленьком.
Один из методов — MAML, Model-Agnostic Meta-Learning. Он помогает модели за небольшое количество шагов градиентного спуска прийти в нужное для выбранной задачи состояние. Во время обучения отбираются отдельные маленькие классы, под которые модель можно будет доучивать в дальнейшем.
Представим, что у нас есть модель, которая должна распознать на картинке тигра, а обучили мы её на датасете, в котором есть только собаки, кошки и мыши. Суть метода MAML в том, чтобы на каждой итерации обучения модель стремилась к состоянию, из которого она легко сможет научиться распознавать новое животное. Тогда на одном шаге модель придёт к состоянию, из которого легко научится распознавать котика, на следующем — к состоянию, из которого научится распознавать собаку и т. д. А после этого обучения научить её распознавать тигра будет уже проще.
На самом деле есть куда более простые методы, которые работают лучше. Один из них заключается в том, что для такой задачи достаточно обучить модель с хорошим внутренним представлением, а потом поверх дообучить ещё один слой нейронной сети.
Внутреннее представление — это те признаки, которые модель считает важными для решения поставленной задачи. Такая модель будет собирать новую активационную фразу из звуков, которые уже знает.
Статьи про обучение таких моделей до этого уже выходили, но я предложил явно задать таким внутренним представлением именно фонемы языка. Так можно обучить модель отличать разные фонемы языка, а не надеяться, что она выучит хорошее внутреннее представление.
Более того, если задавать внутренние представления явно, то вместо дообучения слоя нейросети можно агрегировать их более простыми эвристическими алгоритмами, которые хорошо работают с малым числом примеров.
Работает это так: новое слово, например «бадабумц», разбивается на фонемы. На выбранных фонемах дообучаются отдельные гиперпараметры того, как вероятности произнесения фонем складываются в вероятность произнесения искомого слова.
Этот метод оказался наиболее эффективным для решения задачи обучения на малом количестве данных для голосовой активации.
В работе над дипломом я пробовал не только разные методы, но и разную архитектуру моделей. Но существенной разницы в качестве обучения это не дало.
Работа над дипломом заняла около пяти месяцев, процесс был таким:
1. Я изучал данные и собирал датасет, на котором собирался обучать свои модели.
2. Писал код, чтобы обучать модели с помощью разных методов.
3. Проводил эксперименты и дописывал код под них.
4. И наконец, когда были собраны результаты разных экспериментов, описал задачу и ход работы.
В подготовке диплома сильно помогло то, что у меня есть доступ к рабочим инструментам Яндекса. Дальше самого диплома мои наработки пока не пошли, но в целом они применимы для создания голосового помощника с активацией на пользовательскую фразу. Это рабочий способ получить какую-нибудь модель голосовой активации на малом числе примеров. Например, это бы пригодилось для технических гиков, которые не используют готовые решения, а хотят делать всё своими руками.
Мне кажется, здравая доля фанатизма важна в любом деле. Например, будущим выпускникам я бы посоветовал выбирать именно ту тему диплома, работать над которой лично им будет интересно. На такую работу не жалко времени, а результат оставит ощущение важного достижения, даже если диплом не будет связан с будущей профессиональной деятельностью.