Спикер о вебинаре:
“В последнее время псевдо-разметка для обучения с частичным учителем продемонстрировала свою эффективность для распознавания речи. Было также показано, что итеративная псевдо-разметка (IPL), которая учит непрерывно одну модель с помощью псевдо-разметки, итеративно сгенерированной в течение обучения этой модели, далее улучшает качество распознавания речи. В текущей работе мы улучшили IPL алгоритм: во время обучения модели мы итеративно генерируем транскрипцию для аудио с помощью hard меток (наиболее вероятностный токен) без использования лингвистической модели.
Один из ключевых компонентов предложенного алгоритма slimIPL — это динамический кэш для псевдо-разметки, который уменьшает чувствительность к гиперпараметрам псевдо-разметки и стабилизирует обучение. slimIPL очень эффективен и требует 3.5-4x меньше вычислительных ресурсов для обучения чем другие state-of-the-art методы.
При использовании только 10 часов размеченных данных slimIPL показывает близкие результаты к state-of-the-art; без использования какой бы то ни было лингвистической модели во время тестирования и генерации псевдо-разметки slimIPL является state-of-the-art при использовании 100 часов размеченных данных.”
Материалы:
https://arxiv.org/abs/2010.11524
Запись: https://youtu.be/tteZFBpAJqM
Презентация: https://drive.google.com/file/d/1oBl_DoQEhFIWh-IAcaw_5nX0suMrf9QX/view?usp=sharing
(00:00:00) (Начало записи.)
Николай Михайловский: Добрый день! Я Николай Михайловский. К сожалению, я не могу в связи с personal emergency являться полноценным ведущим данного вебинара. Тем не менее, я приветствую Татьяну Лихоманенко, Facebook AI Research, которая нам сегодня будет рассказывать продолжение своей работы про slimIPL – итерактивную псевдо-разметку без использования языковой модели. И, вероятно, еще про что-нибудь интересное нам тоже расскажет.
Мне помогает вести этот вебинар Анна Куртукова, дата-саентист компании «НТР» (00:00:44). Я передаю вам слово. И я постараюсь незримо присутствовать в течение всего вебинара, но дальше руль будет у Татьяны и у Анны. Спасибо.
Татьяна Лихоманенко: Спасибо за представление. Где-то полгода назад я выступала здесь же, рассказывала про нашу первую работу про псевдо-разметки. Сейчас буду рассказывать про одну из последних статей, которая была принята на Interspeech 2021. Так что, если будет интересно еще раз побеседовать, welcome в сентябре в Чехии, или онлайн.
(00:01:33)
Краткий курс для тех, кто не сильно знаком с распознаванием речи. У нас есть аудио. Как правило, мы обучаем сейчас акустическую модель. И далее с помощью Beam-Search Decoder мы комбинируем акустическую модель вместе с лингвистической моделью, и получаем финальную транскрипцию. Как правило, акустическая модель у нас может учиться на различные токены, а именно предсказывать вероятность для текущего фрейма, чтобы он был фонемой, буквой, куском слова или даже целым словом.
Измеряем мы ошибку с помощью word error rate так называемой, которая меряет расстояние между предсказанной транскрипцией и истинной транскрипцией с помощью операции удаления, вставки и постановки.
Сегодня я буду рассказывать про эксперименты на LibriSpeech, который является стандартным бенчмарком в распознавании речи, который содержит в себе речь, записанную путем чтения книжек. Довольно чистая речь, но всё равно в ней содержится два тестовых датасета, один из которых – чистая речь, а второй – более зашумленная речь.
В качестве данных обучения у нас будет всего лишь либо 10 часов, либо 100 часов. Это так называемый режим low resource обучения.
И у нас будет два датасета, на которых мы меряем наши качества – валидация и тест. И чистая речь и зашумленная речь.
Мотивация всей серии работ была на то, что мы хотим использовать неразмеченные данные для того, чтобы обучать нашу систему распознавания речи. Цель – иметь самый простой практический алгоритм.
Мы решили сфокусироваться на самой простой идее псевдо-разметки, которая была известна очень давно, но раньше она не показывала сильно хороших результатов. Однако после того, как у нас появились новые модели, новые способы аугментации и новые датасеты в плане большого количества неразмеченных данных, псевдо-разметка стала хорошо работать в практике.
Самый главный вопрос для данной статьи – это был получить результат псевдо-разметки для low resource setting, когда у нас дано очень мало размеченных данных.
Полгода назад на первом нашем вебинаре я рассказывала про нашу первую статью, где мы показали, что если вы используете просто пример подхода «учитель-ученик», когда обучаете акустическую модель, затем генерируете псевдо-разметку на неразмеченных данных, объединяете два датасета вместе, учите новую модель, и продолжаете это несколько раз, то это довольно неплохо работает.
(00:05:05)
Здесь стоит заметить, что псевдо-разметка генерируется с помощью лингвистической модели. Чем лучше лингвистическая модель используется, тем лучше псевдо-разметка, соответственно, лучше получается финальная модель. Однако с увеличением итеративных повторений улучшение качества уменьшается.
Далее мы предложили метод итеративного псевдообучения, который позволял бы нам сократить количество ресурсов, которое мы используем, потому что в режиме ученик-учитель мы учим каждую очередную акустическую модель с нуля. И понимаете, что если у нас данных очень много, то каждый раз вы учите абсолютно новую модель. Это очень дорого.
В итеративной псевдо-разметке мы учим одну модель. И через какой-то период времени мы перегенерируем псевдо-разметку с помощью той же самой модели, и продолжаем ее учить. Самая сложность в том, как сделать так, чтобы она могла бутстрепиться сама в себя, могла учиться в таком режиме. Но это можно сделать.
Теперь что мы предлагаем с новой итерацией алгоритма? Это всё та же итеративная псевдо-разметка. Мы имеем только одну модель, которая учится в течение всего нашего периода обучения. Мы точно также перегенерируем псевдо-разметку в течение нашего курса обучения. Но теперь, так как мы не знали нормальную динамику, что происходит с моделью, то изучили более детально динамику и предложили использовать динамический кеш, где будем сохранять нашу псевдо-разметку, и с некоторой вероятностью P будем ее перегенерировать.
И самый важный момент, что мы теперь генерируем нашу псевдо-разметку без участия лингвистической модели.
Вероятность и динамический кеш позволяют нам делать очень эффективное перегенерирование псевдо-разметки, а исключение лингвистической модели позволяет еще более ускорять генерирование самой псевдо-разметки.
И самый важный момент, что этот режим теперь работает в случае low resource setting, когда доступно всего 10 часов с размеченными данными.
Прежде чем рассказывать slimIPL, напомню про сам IPL алгоритм, потому что текущий алгоритм в некотором смысле базируется на основе его.
Входом являются размеченные данные и неразмеченные данные, и мы хотим обучить акустическую модель. Прежде всего, мы предобучаем нашу модель только на размеченных данных. Далее мы повторяем следующий процесс.
Некоторое подмножество неразмеченных данных – нам не нужно размечать все неразмеченные данные, – и с помощью экспериментов мы показали, что можно брать всего лишь 20–40% от неразмеченных данных, при том режиме, в котором у нас был дата сет. И этого достаточно, чтобы достичь примерно такого же качества.
Далее мы применяем Beam-Search Decoder с текущей акустической моделью, которая у нас есть, и с лингвисти… (00:08:56) …псевдо-разметку. И с помощью дополнительных экспериментов было показано, что если мы не используем лингвистическую модель, то качество, на самом деле, будет сильно-сильно хуже.
Далее мы объединяем теперь размеченный датасет и неразмеченный датасет псевдо-разметкой, и применяем аугментацию данных для последующего обучения. С помощью дополнительных экспериментов было показано, что если мы не используем аугментацию, то модель будет сильно-сильно хуже учиться. Здесь два ключевых момента – лингвистическая модель и аугментация данных.
В таком режиме мы можем эффективно выполнить больше чем 25 перегенераций псевдо-разметки. Примерно мы их делаем каждые 10–20 эпох.
Теперь к slimIPL. Вспоминая нашу цель, мы хотим простой и практический алгоритм. Но в IPL мы не исследовали детально, какие же гиперпараметры у нас должны быть, а именно когда мы должны начинать обучение с использованием неразмеченных данных, через какое количество эпох мы должны перегенерировать, почему 20–40% нам достаточно брать как подмножество.
Более того, не очень понятно было, какая все-таки должна быть пропорция между размеченными и неразмеченными данными.
(00:10:40)
Следующий момент, который мы заметили – переобучение модели к лингвистической модели. Поскольку мы псевдо-разметку генерируем с использованием лингвистической модели, то можно ожидать, что мы будем переобучаться. И, более того, для того, чтобы модель хорошо сходилась, нам нужно было ограничивать вес лингвистической модели при генерации псевдо-разметки – то же, что является не очень приятным моментом для практического применения, сидеть и тюнить дополнительные параметры.
И всё еще. Beam-Search сам по себе – это дорогая вещь при генерации псевдо-разметки.
Был вопрос: можем ли мы вообще брать лингвистическую модель из псевдо-разметки? Да, можем. Всё равно алгоритм будет работать. И мы расширили применимость итеративной псевдо-разметки на low resource режим.
Как мы дизайним псевдо-разметку? Мы оптимизируем следующую функцию. Мы хотим объединить результат акустической модели и результат лингвистической модели. Теперь мы будем просто использовать так называемые хард-метки, когда мы просто используем argmax от предсказания акустической модели.
У нас генерация псевдо-разметки – это дорогой процесс. И мы переобучаемся к лингвистической модели.
Так выглядит пайплайн до того, как мы решили убрать лингвистическую модель. Теперь он выглядит сильно проще, и меньше понял с тем, как генерировать саму псевдо-разметку.
Проблема состоит в том, что алгоритм может расходиться. И для того, чтобы его стабилизировать, мы предложили идею динамического кеша.
У нас есть акустическая модель. Мы берем какой-то батч неразмеченных данных. Мы генерируем псевдо-разметку, и мы не используем эти данные прямо сейчас, мы кладем их в динамический кеш.
Лямбда здесь – это будет пропорция между размеченными и неразмеченными данными.
Когда акустическая модель учится на очередном батче, она будет запрашивать псевдо-разметку из этого динамического кеша. При этом мы можем ввести еще дополнительную вероятность, с которой мы будем апдейтить наш кеш. Эта вероятность позволяет нам еще больше ускорить обучение, потому что в этом случае мы не тратим время на дополнительную перегенерацию псевдо-разметки.
Анна Куртукова: Нам пришел вопрос по самому IPL. Правильно понимаю, что мы делаем псевдо-разметку для обучения на ней как на как бы размеченных данных?
Татьяна Лихоманенко: Да.
Анна Куртукова: Виталий, вопрос закрыт? Думаю, да. Если что, позже еще вернёмся к нему.
Татьяна Лихоманенко: У нас есть размеченные данные и неразмеченные данные. Для неразмеченных данных мы генерируем псевдо-разметку, то есть мы их размечаем текущей моделью. А дальше во время обучения мы используем теперь обе размеченные и неразмеченные данные. Для неразмеченных данных мы используем эту псевдо-разметку, которую мы сгенерировали.
И самый главный момент, почему это работает – ну, раньше было, – потому что, первое, псевдо-разметка сгенерирована с помощью лингвистической модели, а акустическая модель сама учится без лингвистической модели. Правильно? То есть вы дополнительно вложили Байес как бы в саму разметку, поэтому модель немножко другое будет предсказывать.
А второй момент – это то, что у вас есть аугментация, когда вы аугментируете неразмеченные данные, и понятно, что ваша акустическая модель уже предскажет совершенно другие предсказания, нежели то, что вы сгенерировали как псевдо-разметку. Это такая интуиция, почему это может работать, и оптимизация всё еще происходит.
Анна Куртукова: Спасибо. На вопрос ответили. Можем продолжать.
Татьяна Лихоманенко: ОК. Теперь более детально про то, как slimIPL работает. У нас есть на вход размеченные данные и неразмеченные, и у нас есть акустическая модель, которую мы хотим обучить.
Сначала мы вводим параметр M, который будет отвечать за то, через какое количество апдейтов, не эпох – мы полностью теперь переходим на апдейты, – через какое количество апдейтов мы начинаем использовать неразмеченные данные. То есть в течение M апдейтов мы учим на размеченных данных, применяя аугментацию и dropout модели, нашу акустическую модель.
Затем у нас наступает такой этап, когда нам необходимо заполнить наш динамический кеш.
Чтобы заполнить его различным состоянием моделей, мы делаем следующую вещь. Мы вытаскиваем случайный батч из неразмеченных данных, генерируем псевдо-разметку теперь с помощью хард-меток, сохраняем текущий батч в кеше, и делаем один апдейт на размеченных данных. Таким образом у нас кеш будет заполнен, и его размер C у нас, он будет заполнен C различными состояниями модели. То есть C различных состояний модели будет использовано для предсказания псевдо-разметки, и они все будут от разных состояний.
(00:16:48)
Далее мы уменьшаем dropout модели. Это делается для того, чтобы увеличить capacity модели, поскольку у нас будет теперь использоваться гораздо больше данных для всего обучения. То есть теперь будут размеченные и неразмеченные данные.
Далее теперь идет итеративное обучение следующим образом. Мы теперь учим модель на смеси размеченных и неразмеченных данных. Для размеченных данных мы вводим параметр NL, который означает, сколько апдейтов мы будем делать на размеченных данных, и NU – параметр, который означает, сколько апдейтов мы будем делать на неразмеченных данных. Наша пропорция лямбда (какая пропорция неразмеченных и размеченных данных), здесь она будет NU поделить на NL, то есть оба эти параметра здесь участвуют, и мы теперь можем это контролировать.
На размеченных данных мы делаем, как обычно, обучение, применяем аугментацию и делаем оптимизацию. А на неразмеченных данных мы делаем следующую вещь. Мы берем случайный батч из кеша. С вероятностью P мы этот батч будем убирать из кеша и заменять его новым другим батчом. Новый другой батч мы вытаскиваем случайно из всего множества неразмеченных данных. Это может быть в том числе тот же самый батч. И генерируем для него псевдо-разметку с помощью текущего состояния модели.
А тот батч, который мы вытащили из кеша, мы применяем аугментацию к нему и делаем оптимизационный шаг.
Какое отличие теперь с IPL? Первое – мы генерируем псевдо-разметку с хард-метками. Но мы по-прежнему применяем аугментацию на размеченные и неразмеченные данные.
И теперь вместо того, чтобы перегенерировать псевдо-разметку, например, после каждого апдейта – этот подход мы назовем «наивный подход» и будем с ним сравниваться, – мы будем использовать динамический кеш, который позволяет нам сэкономить время, как часто мы его апдейтим, что может ускорить нам обучение. Потому что, если мы делаем наивный подход, мы будем перегенерировать это каждый апдейт, то есть у вас на каждый апдейт будет дополнительный forward pass модели проходить. Если же мы используем динамический кеш, поскольку у нас есть вероятность P, то мы это будем делать только, допустим, если P – это 0.1, то мы будем раз в 10 итераций делать дополнительный forward pass.
(00:19:59)
Теперь перейдем к экспериментам, и что у нас с этим получилось. Как я уже говорила, данные будут 10 часов – это Libri-Light, но можно трактовать это как 10 часов исходного LibriSpeech и 10 часов train-clean как разменные данные. Остальной LibriSpeech используется как неразмеченные данные.
В качестве акустической модели мы рассматриваем трансформер-модель. Трансформер-блоки – это в принципе, это обычный, стандартный трансформер. И единственное, что перед применением трансформер блоков у нас стоит один конволюционный слой со страйдом 3 для того, чтобы уменьшить количество фреймов от исходной аудиоволны. И обучаемся мы на стандартных фильтр-банках.
(00:20:50)
В качестве токенов мы используем буквы. И учим с помощью только SpecAugment с помощью CTC loss.
По поводу близких работ. Самой первой работой по такому итеративному обучению _____ (00:21:13) была работа из Amazon. В нашем исследовании мы ее называем в качестве baseline «наивный подход». Что они делали? Если мы IPL учили итеративно модель, но они перегенерируют псевдолейблы с помощью хард-меток после каждой итерации. И в их ресерче они больше сфокусировались на изучении шума, как будет работать SpecAugment, и SpecPertubation (00:21:47) и другие возможные варианты. По сравнению с ними мы не изучаем, насколько качество модели варьируется от того, какой шум мы используем… какую аугментацию мы используем. Но, что интересно, мы попытались сначала применить их метод, и увидели, что он очень нестабилен. В своих экспериментах они говорят, что всё хорошо работает. Мы же видим, что модель может очень часто расходиться, может даже иногда вернуться к тому, что у нас сходится. Но это поведение очень-очень странное. Динамический кеш позволяет нам стабилизировать обучение, почему мы его и разработали.
Анна Куртукова: У нас еще один вопрос наступил тоже по подходам, но по подходам аугментации данных. Мы бы хотели узнать подробнее о том, какие подходы использовались.
Татьяна Лихоманенко: В нашей работе или до этого?
Анна Куртукова: Думаю, все-таки в наших. Уточните, пожалуйста, вопрос.
Подождем. У нас еще один вопрос есть.
Какие методы подхода этих новых параметров для метода с кешем имеются?
Татьяна Лихоманенко: Сейчас я буду рассказывать.
Анна Куртукова: Хорошо. Тогда предлагаю к тому вопросу вернуться позже.
Татьяна Лихоманенко: Хорошо. Другая работа была из Google. У них отличие, что модель была seq to seq (00:23:22), и у них было пять итераций «ученик-учитель», каждый раз обучая модель с нуля. Они тоже использовали лингвистическую модель при генерации псевдо-разметки. Если сравнивать с ними, можно увидеть, что количество ресурсов, которые они используют, чем то, которое теперь мы можем делать.
И нашумевшая Wav2vec 2.0, про которую в прошлый раз у меня много спрашивали. Это unsupervised предобучение (без учителя). Оно дает серьезное улучшение качества в low resource режиме. Цель этой статьи было показать, что мы можем быть примерно так же, как и Wav2vec 2.0 на low resource режиме.
Wav2vec 2.0 состоит из двух шагов. Мы сначала предобучаем модель на неразмеченных данных с помощью contrastive обучения. А затем мы файнтюним нашу модель с помощью размеченных данных. И основной момент, не очень хороший с точки зрения практики – первое, что очень много гиперпараметров, которые здесь нужно оптимизировать… Если вы переходите с задачи с LibriSpeech на другую задачу, то нужно быть очень осторожным, эти параметры могут быть очень важны. Второй момент, что contrastive обучение само по себе требует очень большие батчи, что вынуждает обучать на очень большом количестве ресурсов. Про это поговорим позже.
(00:25:15)
Теперь переходим к самим результатам.
Сначала, прежде чем делать slimIPL, мы хотели получить самую лучшую модель обучения только на размеченных данных, чтобы знать, потенциально насколько мы в действительности улучшаем нашу возможную модель. Поэтому мы обучили на трансформер-модели на 10 часах и на 100 часах размеченных данных, и получили новый state of the art. Слева можем видеть 10 часов, справа 100 часов. И видно, что на 10 часах бенчмарк был только с Libri-Light, когда мы опубликовали статью про датасет, и всё про него. На 100 часах мы улучшили очень серьезно все предыдущие результаты, которые на данный момент были.
(00:26:19)
Анна Куртукова: Нам поступило уточнение по поводу того вопроса про аугментацию данных. Правильно ли понимают, что SpecAugment – это единственный подход, который использовался?
Татьяна Лихоманенко: Да. Мы использовали только SpecAugment, ничего больше не применяли.
Анна Куртукова: Спасибо.
Татьяна Лихоманенко: Во всех наших работах мы использовали только SpecAugment как самый работающий метод. Я знаю, что SpecPertubation тоже довольно неплохо работает, но оно не дает такого сильного улучшения, как SpecAugment. То есть можно попробовать применить. Да, скорее всего, будет чуть-чуть лучше, но, может быть, 0,02% WER всего лишь, что-то примерно такое что бы ожидала.
(00:27:11)
Теперь у нас есть supervised модель. Что мы теперь делаем, чтобы обучать slimIPL? Мы используем идентичные архитектуры. Мы ничего не меняем, точно так же, как и в supervised режиме. И на практике мы просто берем самую лучшую supervised модель, которая у вас есть, и просто навешиваем поверх динамический кеш и это итеративное обучение с генерацией псевдо-разметки. Единственное, что мы меняем – это уменьшаем dropout, как только неразмеченные данные начинают использоваться.
(00:27:47)
Теперь к результатам о 10 часах. Слева будет WER до использования финальной лингвистической модели, а справа будет дополнительный, если мы используем лингвистическую модель с декодером.
Желтым помечено качество supervised модели. Это сделано для того, чтобы видеть, насколько использование неразмеченных данных может улучшить нам исходные supervised модели.
На 10 часах мы до этого делали эксперименты с IPL тоже, но теперь slimIPL, нам видно, что является самым лучшим по качеству среди всех алгоритмов, которые были до этого по поводу псевдо-разметки. И можно заметить, что мы серьезно улучшились по сравнению с предыдущими результатами по IPL.
Если мы смотрим теперь на Wav2vec 2.0, который показывает суперкрутые результаты на low resource режиме, то мы видим, что практически закрыли гэп с ними. Если до этого у нас было серьезное отставание, то теперь мы отстаем примерно на 2–3% по сравнению с Wav2vec 2.0 в режиме 10 часов.
По результатам на 100 часах желтым опять выделена supervised модель, и если мы посмотрим на slimIPL до использования лингвистической модели, напомню, что в процессе обучения slimIPL мы не используем вообще нигде лингвистическую модель, мы видим, что мы state of the art среди моделей без использования лингвистической модели. В этом режиме мы имеем даже лучше качество, чем Wav2vec 2.0.
(00:29:56)
Если мы теперь переходим к моменту, что происходит с лингвистической моделью, то видим, что мы примерно такие же, как и Wav2vec 2.0. Качество практически одинаковое.
Из этого можно заметить, что мы всё еще продолжаем переобучаться на лингвистическую модель. То есть до декодера у нас качество лучше, чем Wav2vec 2.0, а после декодера мы имеем такое же качество. То есть всё еще у нас происходит трансфер лингвистического знания во время использования псевдо-разметки. Потенциально с этим нужно всё еще тоже продолжать бороться.
(00:30:35)
Теперь по поводу эффективности методов. Здесь представлено, какое количество ресурсов использовано для обучения каждого метода для полной сходимости. Все методы кроме Improved T/S (работа Google с 5 раундами псевдо-лейблинга), все остальные использовали GPU, а гугловая работа использовала TPU. Здесь количество ресурсов для TPU помечено. И можно видеть, что по сравнению с остальными методами slimIPL очень эффективен, требует гораздо меньше ресурсов. И если сравнить с Wav2vec 2.0, то тоже улучшение в качестве использования ресурсов очень серьезное. И да, мы даже лучше, чем предыдущий IPL. Это связано с тем, что мы теперь более контролируем, как часто мы перегенерируем псевдо-разметку. А второе – это что мы убрали лингвистическую модель, которая была тоже довольно дорогой частью всей псевдо-разметки.
Теперь к ablations по поводу того, какие параметры нужно выбирать в slimIPL.
Наивный подход нестабилен и вызывает либо полную расходимость метода, либо иногда расходятся, снова сходятся, и непонятно, насколько ваш оптимизационный процесс хорош, и хорошо ли он в конце сойдется.
slimIPL благодаря динамическому кешу не расходится. То есть мы не видим расхождения метода, начиная с размера кеша от 10.
Вот примеры, как расхождение происходит.
Анна Куртукова: Там видим вопрос по предыдущему слайду, или даже по 50-му. Sup. – это результат обучения на 100 часах или на всем датасете?
Татьяна Лихоманенко: На 100 часах. Здесь везде сравнение – supervised модель обучена только на размеченных данных, тех же самых, которые мы будем использовать при псевдо-разметке, потому что мы хотим сравниться, насколько дополнение неразмеченных данных будет улучшать нам наш supervised baseline.
Анна Куртукова: Еще один вопрос. Насколько правильно сравнивать скорость обучения flashlight slimIPL и Wav2vec 2.0 в PyTorch? Или Wav2vec 2.0 уже и в PyTorch реализован?
Татьяна Лихоманенко: Wav2vec 2.0 не реализован в PyTorch. Но мы сравнивали на стандартных архитектурах скорость форварда и бэкварда. В принципе, из-за того, что основные методы вы используете всё равно QDNN (00:33:47), в принципе, примерно одинаково.
Flashlight может быть иногда на каких-то операциях чуть-чуть быстрее, но существенного качества в ресурсах оно давать не будет. То есть довольно честное сравнение, будем говорить, по поводу количества ресурсов. Больше тут связано с тем, что мы обучали все модели на 16 GPU, в то время как Wav2vec 2.0 обучает на 128 GPU. Существенное отличие, что нам не нужны большие батчи. Для Wav2vec 2.0 нужны очень большие батчи. Соответственно, вы будете Wav2vec 2.0 учить на большом количестве параллельных GPU. В нашем методе это не нужно. Вы можете учить на 8 GPU. То есть supervised baseline вы на каком количестве учите, на том количестве можете учить slimIPL.
Анна Куртукова: Еще вопрос. Не получилось сравнение Wav2vec во flashlight?
Татьяна Лихоманенко: У нас была предыдущая работа по улучшению Wav2vec оптимизации, что мы будем использовать CPC loss и CTC loss. Значит, у нас есть имплементация этого внутри Wav2vec. И она давала примерно те же результаты по скорости, как и Wav2ve, который в PyTorch. То есть если мы будем сравнивать с тем обучением, то скорость примерно та же самая.
Анна Куртукова: Спасибо. Еще один вопрос. Сейчас динамический кеш обновляется псевдоразмеченными примерами, из того же распределения, что и размеченные данные. Есть ли смысл тестировать схемы, в которых кеш постепенно заполняется данными из другого распределения для перехода с одного домена на другой, например, из книг на телефонные записи?
Татьяна Лихоманенко: Да, это имеет смысл делать. В наших экспериментах мы делали только на LibriSpeech. Могу сказать, что дополнительно я делала на SwitchBoard, например, и это работало.
(00:36:25)
Первое. С Libri Works, например, это тоже работает. В Libri-Light гораздо больше данных… Да, это всё еще red speech (00:36:33), но вариативность самих данных сильно больше, и метод тоже работает.
Если мы будем делать _____ (00:36:40) main transfer, то, да, это должно помогать, и тоже модель тогда будет учить более качественно какие-то вещи.
Единственное, что может быть – здесь нужно быть осторожным с проверкой, что ваши данные неразмеченные содержат тишину, что нет речи. Потому что если у вас будут примеры, которые содержат пустоту, то есть нет никакой транскрипции, то в этом случае это может сломать оптимизационный процесс. Единственное, что нужно делать – дополнительно фильтровать такие данные из неразмеченных данных, и тогда всё должно быть более-менее хорошо. И лучше адаптироваться к conversational speech, например.
Анна Куртукова: Спасибо. Тут поступил комментарий, что вы интригуете, как и полгода назад. Хочется сразу проверить.
Татьяна Лихоманенко: (Смеется.) ОК. Долго работали для того, чтобы сделать практическое… Наша основная цель была – сделать практический алгоритм. Мне просто после предыдущего talk задавали вопрос по поводу low resource 10 часов, и как же делать. Мы хотели доработать, чтобы это была практическая работающая вещь. Пока что все, кто пользовался из коллег – пока вроде работает. Так что жду дополнительных проверок.
Анна Куртукова: И еще один вопрос по динамическому кешу. Вы упоминали, что динамический кеш повышает стабильность модели, но не совсем понятно, за счет чего так происходит. Благодаря кешу мы можем реже генерировать псевдо-разметку и повышаем эффективность использования ресурсов, но непонятно, как повышать стабильность.
Татьяна Лихоманенко: Сейчас про это поговорю.
(00:38:44)
В случае 10 часов здесь зеленый пример – это slimIPL, а красный и синий – это два запуска наивного подхода без динамического кеша, когда вы генерируете псевдо-разметку на каждой итерации для текущего батча, и делаете шаг.
На 10 часах наш наивный подход вообще не работает, он просто расходится, как только вы начинаете генерировать псевдо-разметку. Что происходит в этом случае? При 10 часах проблема в том, что 10 часов недостаточно для того, чтобы… это маленькое количество размеченных данных для того, чтобы направлять модели в правильное русло оптимизации. И что происходит? Начинается генерация просто пустых предсказаний для модели в виде псевдо-разметки. То есть ваша псевдо-разметка становится пустой, и из-за того, что вы делаете один к одному апдейты между размеченными и неразмеченными данными, у вас модель просто начинает генерировать пустую псевдо-разметку везде и всюду, и на нее переобучается, и теперь генерирует для любого input пустую разметку.
В случае 100 часов эффект тоже может наблюдаться. Она может разойтись. То есть это проблемы именно оптимизации, что какие-то данные у вас сгенерированы в виде пустой разметки, и модель на них переобучается и начинает просто генерировать пустоту, и больше ничего.
Иногда же она может внезапно разойтись, потом снова сойтись, разойтись. И в итоге может, в принципе, сойтись.
(00:40:40)
Интересный момент, что в случае, когда у нас модель все-таки сошлась с таким наивным подходом, она дала то же самое качество, что и с динамическим кешем. По крайней мере кеш дает нам в итоге тот же самый результат, но при этом стабилизирует обучение, что не будет у вас холостых запусков, когда модель просто разошлась, и дестабилизация обучения может привести к плохим результатам в итоге.
Причина, почему кеш стабилизирует, с одной стороны, простая, с другой стороны, может быть сложной. Мы до конца еще не понимаем, почему так происходит. Интуитивное объяснение следующее.
Что мы делаем в кеше? Сохраняем псевдо-разметку от разных состояний модели. А именно, длина кеша, например, 100 – это означает, что мы имеем 100 батчей, каждый батч предсказан отдельным состоянием модели. Если мы постоянно апдейтим кеш с вероятностью 1, то это означает, что 100 последних моделей – или даже побольше, 150, то, что мы случайно вытаскиваем из кеша, то есть необязательно самый старый батч будет вытаскиваться туда, – примерно 150 последних состояний модели использованы для того, чтобы сгенерировать эту псевдо-разметку. Таким образом получаем, что состояние моделей разное. Это можно трактовать как ансамблирование.
В случае ансамблирования мы знаем, что у нас более стабильная оценка, то есть когда мы используем в градиентном бустинге, например, ансамблирование деревьев. Каждое дерево может быть в отдельности очень-очень слабым, а суммарно среднее получается очень хорошим. Примерно эта интуиция здесь и работает.
Если в какой-то момент модель была не очень хорошей, то следующий батч будет, может быть, получше, и плюс дополнительный разброс по тому, насколько близко текущее состояние модели к предыдущим состояниям модели. Из-за того, что мы сгенерировали 150 их разных состояний, то оно дает нам вариативность и дополнительный шум в псевдо-разметку, благодаря чему мы будем более стабильны. То есть это зацикливание на генерацию пустоты у нас не происходит.
(00:43:25)
Надеюсь, что я постаралась как-то объяснить интуицию. Но, опять-таки, машинное обучение не всё обычно, как мы думаем. Может быть, оно совсем не так.
Анна Куртукова: Какова роль dropout в этом?
Татьяна Лихоманенко: Dropout в том числе дает нам различные состояния модели.
(00:43:59)
Когда мы генерируем псевдо-разметку, dropout мы отключаем. Все батчи, которые у нас находятся в кеше, они сгенерированы разными состояниями модели, но они все находились в состоянии инференса, а не обучения. В этом смысле dropout на псевдо-разметку саму не влияет.
Влияет он в том смысле, что когда мы делаем теперь обучение на этих псевдоразмеченных батчах, у нас dropout включен, а это означает, что еще одна стохастичность внутри модели. То есть то, что модель будет предсказывать при включенном dropout, оно будет немного другое, нежели то, что мы сгенерировали псевдо-разметки. Здесь два вида шума.
Третий шум идет из того, что мы еще применяем аугментацию. То есть батчи дополнительно еще аугментируются, и только потом мы делаем forward pass. Это вносит еще одну стохастичность.
Интересно, что я смотрела этот наивный подход. Вы всё еще используете аугментацию, вы всё еще используете dropout, но этого недостаточно. Стохастичности не хватает для того, чтобы стабилизировать обучение. Особенно это заметно в режиме 10 часов, когда очень мало размеченных данных, и нам не хватает правильной навигации модели в течение оптимизации. То есть видно, что в 100 часах у нас размеченных данных много по сравнению с 10 часами, и модель способна себя направлять в правильное направление оптимизации, не сваливаться в этот локальный минимум, когда мы генерируем просто пустоту.
Анна Куртукова: Спасибо. У нас еще появилось несколько вопросов. В кеш попадают просто аугментированные данные с псевдо-разметкой, верно? То есть ранее участвовала лингвистическая модель, а сейчас просто аугментация.
Татьяна Лихоманенко: Нет, мы убрали лингвистическую модель, и аугментация тоже не участвует.
Вы берете случайный батч из неразмеченных данных. У модели вы отключаете аугментацию, вы отключаете dropout, вы переходите в режим evaluation. И вы не используете лингвистическую модель. Таким образом вы предсказываете свою псевдо-разметку.
Анна Куртукова: И какой размер кеша является оптимальным?
Татьяна Лихоманенко: Следующий слайд будет про это.
Анна Куртукова: Тогда еще пара вопросов. Какие параметры SpecAug вы использовали для 100 isp (00:46:32), и исследовали ли зависимость на другие low resource _____ (00:46:40)?
Татьяна Лихоманенко: Пока мы делали эксперименты только на английском языке для 10 часов. Сотые эксперименты в прогрессе, скажем так.
По поводу SpecAugment. SpecAugment в 100 часах мы использовали тот же самый, как обычно во всех наших статьях, который Google репортил, что довольно хорошо работает на LibriSpeech. Для 10 часов требуются отдельные трюки по регуляризации. Потому что что происходит в 10 часах? Это переобучение в размеченные данные. И в этом случае имеет смысл, я экспериментировала со SpecAugment, и он немножко поменьше, чем для 100 часов. То есть не усиливать, чтобы больше регуляризировать, а наоборот, сделать его послабее, потому что, видимо, размеченных данных мало, шума и так много, и псевдо-разметка сама по себе шумная. И это немного улучшает обучение.
Анна Куртукова: Еще вопрос по sequence to sequence. Фильтрация sequence to sequence при длине N-грамной модели (00:47:54) исчезла из-за кеша, как я понял. В какой момент вы поняли, что фильтрацию делать больше не надо? Пробовали ли кеш и фильтрацию?
И еще. Вроде как фильтрация была не нужна, и там сходимость так сильно не нарушалась. Кеш и тут как-то улучшил сходимость?
Татьяна Лихоманенко: В мы делаем фильтрацию, потому что… Если мы используем лингвистическую модель, то мы делаем фильтрацию, потому что декодим просто для sequence to sequence, а он имеет свои проблемы с генерацией повторов N-грамных кусков.
Я рассказывала, что если мы переходим к состоянию без использования лингвистической модели, то можем в принципе не делать фильтрацию. Но можем ее еще делать, потому что в seq to seq опять даже Витерби путь может давать какие-то артефакты в связи с этим.
Для seq to seq кеш здесь не имеет отношения в плане стабилизации. По поводу фильтрации. А фильтрацию всё равно нужно будет делать, скорее всего.
slimIPL (последний вариант) мы не делали для seq to seq модели, мы делали больше для CTC (00:49:13). Но будет следующая вещь.
Первое. Вы должны будете всё равно делать фильтрацию псевдо-лейблов, то есть, например, делать реджект добавления в кеш, если батч плохой, в плане Витерби путь зацикливание дает. Что-то в этом роде.
Стабилизация для slimIPL, она больше по поводу того, как часто мы должны апдейтить псевдо-разметку. В IPL мы делали это каждые 10–20 эпох. В первом варианте slimIPL, который я прошлый раз немного упоминала, когда мы делали фильтрацию, мы тоже делали апдейты каждые 10–20 эпох. Динамический кеш нам нужен для того, чтобы стабилизировать обучение, если мы хотим делать не каждые 10–20 эпох, а использовать это как дополнительный параметр, и знать, когда будет стабильность.
Если мы начнем в предыдущей версии алгоритма использовать не 10–20 эпох, а допустим каждые 10 апдейтов, то это может расходиться. Динамический кеш позволяет нам стабилизировать именно этот параметр, как часто мы должны перегенерировать.
Анна Куртукова: Пропустила важное уточнение, что для CTC фильтрация была не нужна. И вопрос как как раз о ней.
Татьяна Лихоманенко: ОК, для CTC фильтрация не нужна. Я не делала экспериментов, чтобы фильтровать дополнительно CTC. Недавно вышла статья, ребята говорят, что вроде как фильтрация немного помогает. Для CTC я в этом сильно не уверена. По крайней мере могу точно сказать, что если вы не делаете фильтрацию, всё будет довольно неплохо. Может быть, можно поисследовать, что будет с фильтрацией дополнительно. Но с фильтрацией, тут нужно будет фильтровать, например, по тому, насколько лингвистическая модель хорошо вам говорит перплексию текущего батча. Возможно, это и не нужно. А возможно, это нужно только в конце. Всё сильно сложнее начинается, и ни очень понятно, какая будет динамика. Пока мое ощущение, что фильтрация для CTC точно не нужна, он без этого вполне себе хорошо справляется. Всю фильтрацию, которую до этого вводили, по крайней мере для speech recognition – это было больше именно про CTC, потому что он нестабильно выдает предсказания транскрипции.
Анна Куртукова: То есть фильтрация для seq to seq всё еще нужна, просто scope статьи не включает seq to seq?
Татьяна Лихоманенко: Да.
Анна Куртукова: Хорошо. Еще два вопроса, и давайте продолжать.
Переход к софт лейблам псевдо-разметки может дать какой-то буст качеству по сравнению с хард лейблами, или нет?
Татьяна Лихоманенко: Может. Может быть. Не могу ответить. Делала эксперименты. Пока ничего особо не работало, поэтому про это не рассказываю.
Анна Куртукова: Хорошо. И еще есть предложение. Может быть, имеет смысл для 10 часов обучать несколько моделей с нуля с разной инициализацией? С их помощью заполнять буфер, а затем просто продолжать с одной из них. Это как вариант регуляризации и развития идей ансамблирования.
Татьяна Лихоманенко: Можно делать, но проблема, например, если у вас только размеченных данных 1 час. В этом случае пока end to end модели не учатся на таком количестве часов. Большие модели, с которых мы будем потом бутстрепить. Можно учить маленькую модельку, разметить, а потом стартовать. Да, можно. Вопрос: помним про практическое применение и простоту. Мы хотим быть совсем ленивыми и взять только одну модель, и я обучил supervised baseline, и всё. Я запустил дополнительный unsupervised эксперимент и ушел. И потом оно всё готово, я могу в продакшен всё катить. Если мы говорим с точки зрения этого, то вопрос.
Вопрос ресурсов тоже. Мы хотим обучить несколько разных моделей, стартануть, посмотреть, какая из них сойдется, какая нет.
Да, с точки зрения ресерча, с точки зрения лучшего качества, которое мы хотим получить, может работать. Скорее всего, будет работать, потому что явно всё еще проблема с оптимизацией и с переобучением на лингвистическую модель. А если мы стартуем с разных инициализаций и делаем другие способы ансамблирования, потенциально это может работать.
Другой вариант, который тоже сейчас… Недавняя самая статья была – это можно использовать exponential moving averaging. То есть сейчас генерируем текущим состоянием модели, а можем мы дополнительно трэкировать exponential moving averaging весов нашей модели, и использовать его для генерации текущего батча псевдо-разметки. Это тоже хорошо работает. Про это я тоже немножко поговорю в конце.
То есть много разных вариантов. Вопрос: что будет работать и что будет самым простым методом? Хотелось исключить всё по-максимуму и сделать самое-самое простое, что даже ленивому человеку захочется запустить.
Анна Куртукова: Тут еще вопрос насчет базовой модели IPL, но лучше отложим его на завершение вебинара. А пока продолжим.
(00:55:10)
Татьяна Лихоманенко: Теперь про параметры slimIPL, какие они должны быть, насколько они стабильны. Сначала про размер динамического кеша. Меньше 10 я не пробовала, честно говоря, но даже если вы поставите размер 10, чтобы 10 батчей всего лишь сохранять, то это вполне себе отлично работает, всё сходится, никаких проблем с расходимостью ни в одном эксперименте я не видела. Слева будет результат 10 часов, справа – 100 часов.
(00:55:43)
В случае 10 часов кеш размера 10 работает, то есть мы не расходимся, всё хорошо. Но качество не очень хорошее. Это означает, что дополнительная интуиция о том, что у нас происходит некоторое ансамблирование благодаря кешу. Здесь показано, что если у нас маленькое число моделей, которые мы ансамблируем, оно не очень хорошо работает в случае low resource режима.
В случае же 100 часов кеш даже размера 10 очень хороший. Это означает, что нам достаточно 100 часов размеченных данных для навигации обучения нашей модели в правильную сторону оптимизации.
И, в принципе, если мы сравним 100, 1000 и 10 в случае еще 100 часов, то мы видим, что размер кеша влияет не очень сильно, и, в принципе, дает довольно близкие результаты. Про кеш 10 я как раз сказала.
(00:56:46)
Теперь переходим к вероятности апдейта нашего кеша. Здесь три магнетуды: вероятность 1, вероятность 0,5 и вероятность 0,1. Вероятность 0,1 примерно имитирует наши предыдущие результаты с IPL. Это примерно раз в 10 апдейтов вы это перегенерируете. С учетом того, какой размер батчей у нас был, количество ресурсов, которые мы используем, получалось, что оно соответствует 10 эпохам IPL. В этом случае мы видим, что понижение вероятности апдейта кеша, оно даже улучшает обучение. Особенно сильно это видно в случае 10 часов. Опять-таки, это позволяет сделать ансамблирование более длинным. То есть у вас не то, что увеличилось количество моделей в ансамблировании, но увеличился промежуток между состоянием моделей. Это регуляризирует больше нашу оптимизацию, и мы получаем лучше качество. Такая интуиция.
В случае 100 часов мы видим, что, в принципе, дает похожие результаты, но всё равно вероятность 0,1 работает в итоге на Витерби немного лучше, что и хорошо, потому что чем меньше вероятность, тем быстрее мы будем учиться, потому что нам не нужно дополнительно опираться на дополнительный форвард-путь.
При этом видно, что результаты после декодера, когда мы добавили еще лингвистическую модель в конце, они все примерно одинаковые. То есть мы с меньшей вероятностью апдейта кеша мы можем просто чуть сильнее переобучиться на лингвистическую модель. То есть улучшить Витерби, но в итоге суммарная модель остается примерно такой же.
Практические рекомендации на применение – это поставить кеш 1000, 100 примерно, а вероятность поставить 0,1, и запускать в таком режиме. Дальше можно смотреть в соседние точки, но, скорее всего, это будет работать хорошо.
Использовать псевдо-разметку, генерировать состояние кеша и использовать кеш.
В случае 10 часов это оказалось очень критическим параметром. И мы видим, что если мы начинаем бутстрепить модели в 90% WER или 70%, то мы получаем не очень хорошее качество.
70% – в принципе, тоже рабочий вариант, потому что после декодера мы видим, что качество близко к самому лучшему, которое мы получили.
В случае с 5 часов всё равно, с какой точки вы начнете стартовать. Даже 80% работ вы можете стартануть с этого качества модели, и всё будет хорошо, вы обучитесь примерно до того же самого качества, как и в случае, если модель будет супер-суперхорошо обучена, и только тогда вы стартуете псевдо-разметку.
(01:00:32)
У меня есть подозрение, что если вы будете стартовать с очень и очень хорошей модели, то есть если вы дообучите ее до 20%, 15% качества как supervised модель, то, скорее всего, будет не очень хорошо в практике, потому что слишком сильно свалились в локальный минимум supervised модели, и теперь сложно из него вылезать. Лучше стартовать, когда модель еще очень плохая.
В случае 10 часов проблема состоит именно в том, что недостаточно размеченных данных, чтобы направлять модель для обучения. И мы очень быстро начинаем переобучаться к этим размеченным данным. И пока открытый вопрос, еще нерешенный – как нам следует регуляризировать обучение, чтобы, может, добиться более качественного локального минимума при обучении.
(01:01:28)
Теперь по поводу пропорции размеченных и неразмеченных данных. Мы переобучаемся на 10 часов очень быстро. То есть если вы будете считать качество на размеченных данных и на неразмеченных данных, то увидите, что loss на размеченных данных супербыстро уходит в ноль, и в тот момент, когда он становится почти нулем, модель перестает учиться.
Один из способов регуляризировать это обучение в том числе – это увеличить пропорцию неразмеченных данных. И здесь видно, что путем регулирования этой пропорции мы можем немножечко улучшить наше обучение в случае 10 часов.
В случае 100 часов – любую пропорцию, какую хотим. Единственное, что нужно помнить – что если мы используем supervised размеченных данных пропорцию больше, чем неразмеченных данных, то в этом случае сходимость очень медленная, и в итоге мы сойдемся к хуже модели.
Теперь эффект dropout. Единственная вещь, которую нужно сделать – это уменьшить dropout, как только мы начинаем использовать неразмеченные данные.
Мы делали ablation на модели, когда сказали, что «Давайте использовать dropout тот же самый, какой был в supervised модели». И в итоге получаем, что в случае 10 часов очень большое различие между моделями, если мы меняем или не меняем этот dropout. В случае 100 часов он чуть-чуть поменьше, но тоже довольно видимое различие. То есть там действительно нужно уменьшать capacity модели, когда мы начинаем использовать неразмеченные данные.
Наверное, возникнет вопрос: «Можно ли как-то по-другому это делать?». Можно пытаться делать динамический dropout, когда он во время обучения постепенно уменьшается, уменьшается, уменьшается. Но хотелось бы самого простого решения. Самое простое решение – просто его уменьшить один раз, оно, в принципе, довольно неплохо работает на практике.
(01:04:07)
Подводя итог. Если у вас достаточно размеченных данных – а это режим примерно 100 часов, и я думаю, что 50 часов тоже будет работать, 30–40 часов, думаю, тоже, – то slimIPL довольно робастен к гиперпараметрам. Можно взять те, которые самые лучшие на LibriSpeech, и использовать их, стартовать прямо с них. И почти наверное это будет работать, если только не возникает может быть с генерацией пустых транскрипций в силу того, что данные очень, содержат в себе пустые транскрипции. Или что-то совсем экстраординарное произошло исходно с данными.
(01:04:59)
В случае, когда размеченных данных у нас сильно мало – режим 100 часов, – то в этом случае кеш должен быть довольно большой. Когда мы начинаем генерировать псевдолейблы, то нужно быть уверенным, что качество имеет, условно, 70%. Чуть получше – еще лучше. И регулировать пропорцию между размеченными и неразмеченными данными, то есть ставить больше апдейтов, больше итераций на неразмеченные данные, чтобы избежать переобучения. Но это, на самом деле, можно трекировать очень легко: вы смотрите на loss размеченных данных, и смотрите, чтобы он у вас совсем не ушел в ноль. А если он уходит в ноль, то пытаться это каким-то образом регуляризировать. В частности можно уменьшать SpecAugment, и в этом случае это тоже немножко помогло.
(01:05:55)
Начали работать над одним из аблэйшенов Exponential Moving Averaging. Что мы можем делать? Можем использовать наивный подход, но теперь говорить, что мы будем генерировать псевдо-разметку не текущей моделью, а текущей средней моделью. В этом случае мы в экспериментах сделали просто decay фактор, имея примерно 0,999, что соответствует размеру кеша и истории в 1000. И посмотрели, как это будет себя вести.
Что мы видим? Первое – что EMA тоже стабилизирует обучение. То есть вместо того, чтобы использовать кеш, мы можем стабилизировать таким усреднением. Это может служить доказательством того, что динамический кеш выполняет своего рода ансамблирование, потому что EMA – это тоже своего рода ансамблирование.
Мы видим, что EMA тоже стабилизирует обучение и сходится. И, более того, если мы теперь можем соединить два подхода вместе – EMA и кеш, – и использовать их вместе. Но пока мы не видим никакой разницы между кешом и кеш+EMA. Дает примерно одни и те же результаты.
При этом что хорошо в slimIPL, динамическом кеше? То, что позволяет ускорять обучение. Если мы используем EMA, то мы этого ускорения не имеем, а дополнительно имеем расход еще на сохранение EMA модели. Это может быть много, а может быть немного. Зависит от ваших экспериментов.
Если мы используем вместе кеш и EMA, тогда мы имеем профит от того, что мы эффективнее перегенерируем псевдо-лейблы в плане скорости обучения, но при этом мы еще сохраняем дополнительно второе состояние модели. Решать вам, что использовать. С EMA вполне себе рабочий вариант, тоже работает и сходится.
(01:08:34)
Подводя итог. Мы начали с того, что у нас был подход «ученик-учитель», где мы делали несколько раундов переобучения модели с нуля.
Затем мы перешли к итеративному обучению псевдо-разметкой, показали, что этот метод работает, и нам не нужно переобучать модель каждый раз с нуля, и мы можем одну модель учить просто итеративно, что сохраняет нам кучу-кучу ресурсов и головной боли. При этом псевдо-разметка у нас соревнуется со state of the art моделями, и вполне себе хороший практический метод.
(01:09:14)
И теперь мы показали дополнительно, что мы можем еще более ускорить и улучшить нашу итеративную псевдо-разметку, а именно исключить лингвистическую модель и предложить динамический кеш, который нам стабилизирует обучение, и мы теперь лучше контролируем, когда и что мы делаем с нашими неразмеченными данными.
Плюс дополнительно нам динамический кеш дает возможность контролировать вероятность его апдейта, что позволяет еще более ускорить обучение.
В итоге мы смогли показать, что псевдо-разметка может соревноваться со state of the art на low resource режиме 10, 100 часов.
На этом всё. Можно обсуждать вопросы.
(01:10:07)
Анна Куртукова: Большое спасибо, Татьяна! У нас появилось много вопросов.
Как насчет уменьшения силы аугментации вместо уменьшения dropout?
Татьяна Лихоманенко: Почему мы уменьшаем dropout? Чтобы увеличить размер модели мы dropout оставляем тем же самым, это означает…
Предположим, что у нас 100 млн параметров у модели. Если dropout 0,1, тогда это у нас будет 90 млн параметров у модели. Если dropout 0,5 – 50 млн параметров. Изменяя dropout, мы говорим, что теперь вместо 50 млн параметров в случае 10 часов, когда мы использовали dropout 0,5, мы будем использовать 100 млн параметров.
Если мы изменяем SpecAugment, это нам ничего с размером модели не меняет. И мы знаем, что если у нас увеличилось количество данных, то лучше увеличить количество параметров для модели. То есть если у нас было 10 часов, а теперь у нас 1000 часов, то нам точно нужно увеличить размер модели для того, чтобы более точно поймать все зависимости внутри такого большого количества данных. Мы не будем переобучаться в этом случае.
Да, SpecAugment нам тоже регуляризирует переобучение, но это вопрос о том, для supervised модели что у нас лучше: использовать сильный SpecAugment и большую модель, или использовать более маленькую модель и поменьше SpecAugment. Скорее, наверное, тут вопрос: какая лучшая supervised модель у вас будет.
Опять-таки, при обучении slimIPL мы ничего не меняем по сравнению с supervised режимом. Мы используем тот же самый SpecAugment, мы используем ту же самую модель, изменяя только dropout. Поэтому, если вы найдете, что для supervised режима у вас модель поменьше, но с меньшей регуляризацией, на SpecAugment работает лучше, то применяем ее, и, скорее всего, получим результат лучше.
Анна Куртукова: Спасибо. Еще интересный вопрос. Делали ли вы исследование, когда slimIPL работает в режимах, когда количество размеченных данных большое: тысячи, десятки или сотни тысяч часов? А если неразмеченных данных – скажем, все доступные аудиозаписи в интернете: подкасты, Youtube, аудиокниги и фильмы?
Татьяна Лихоманенко: Сам по себе slimIPL, мы тестировали его предыдущую версию, когда мы еще не вводили динамический кеш. Но по динамике получается примерно одно и то же. Мы сейчас просто упростили схему того, как тюнить параметры, и более простой параметр самой имплементации алгоритма. То да, он работает в режиме, когда у нас, например, 1000 часов LibriSpeech, и весь Libri-Light, который примерно 60 тыс. часов. С бо́льшим количеством мы не тестили пока. В этом режиме оно работает и дает примерно те же самые улучшения, как IPL или Teacher-Student 5 раундов. Я бы сказала, что проблема, что в режиме, когда много размеченных данных и много неразмеченных данных, мы, на самом деле, у границы… то есть оно может улучшить например, генерализацию, трансфер, но на текущем in the main (01:14:01) датасете оно несильно, скорее всего, улучшит. По крайней мере мы это видим на LibriSpeech. Может быть, в реальных данных это будет немножко по-другому, но на LibriSpeech, мы явно видим, что мы достигли лимита. То есть, да, улучшение есть, оно не очень большое, и дальше мы не улучшаемся. Все методы показывают примерно одно и то же. Если посмотрите на сравнение Wav2vec, Teacher-Student, IPL, slimIPL и 2–3 раундов, то все они дают примерно одно и то же (в рамках погрешности 0,1 WER), какая уже как бы статпогрешность (01:14:43), в общем-то.
Анна Куртукова: Спасибо.
(01:14:54)
Еще вопрос. Планируется ли реализация фарсек?
Татьяна Лихоманенко: Наверное, над этим работать у меня времени не будет, но я не думаю, что реализация будет очень сложной. Если у вас есть весь пайплайн Speech Recognition, в любом фреймворке это можно легко заимплементить. Почему?
Первое. Потому что в качестве псевдо-разметки участвуют просто хард лейблы вашей акустической модели, то есть никакой Beam Search вам не нужен, никакие разные виды лингвистических моделей вам не нужны. Единственное, что нужно реализовать – это динамический кеш. Но кажется, что он не такой сложный. Когда я делала эксперименты, примерно заимплементировать, у меня на это ушло несколько дней, ввиду специфики, как у нас prefetch датасет работает. Но если у вас всё с этим хорошо и хорошо задизайнено, то должно быть просто. То есть никакой специфики к нашему фреймворку, в котором мы делали эксперименты, или дополнительно, как я сказала про лингвистическую модель Beam Search, этого ничего нет. Единственное – динамический кеш.
Анна Куртукова: Спасибо. Несколько вопросов мы оставили по ходу доклада.
Первый из них. Насколько важен выбор базовой модели для IPL? Мы не проводили экспериментов с другими моделями, не трансформерами?
Татьяна Лихоманенко: Если посмотреть, допустим, на разные модели, даже если остаться в рамках трансформера, посмотреть на разные loss функции CTC против seq to seq, и посмотреть «буквы против кусков слов», то даже здесь уже видно, что есть расхождение. Оно именно зависит от того, какая supervised модель была. Мы знаем, что на 100 часах CTC, который предсказывает не буквы, а куски слов, он работает сильно хуже, чем тот, который предсказывает буквы. Это выливается в то, что в результате после использования псевдо-разметки и неразмеченных данных у нас модели на кусках слов работают хуже.
Да, здесь прямая зависимость от вашей supervised модели. Чем лучше ваша supervised модель, тем лучше будет результат с псевдо-разметкой. Единственное, важный момент – почему-то все считают, что важно дообучить… Это пришло из «Ученик-учитель», что вы полностью обучаете модель, а потом генерируете псевдо-разметку. Это необязательно делать. И я даже верю, что это плохо делать, потому что вы сильно сваливаетесь в локальный минимум, а потом пытаетесь из него что-то вытащить дополнительно с неразмеченными данными.
Единственная рекомендация, если используете slimIPL, то не начинать генерацию псевдо-разметки с супер-суперобычной supervised модели. Мы можем ее же использовать, но делать условно 10 тыс. итераций, получать качество 50%, и после этого начинать ее использовать в неразмеченных данных.
Чем лучше модель, тем лучше будет, скорее всего, финальный результат.
Анна Куртукова: Спасибо.
Там была, видимо, табличка «Когда начинать размечать псевдо-разметку». И вопрос: что означают проценты и цифры рядом с ними?
Татьяна Лихоманенко: До слеша 5k, 10k – это после какого количества итераций началась псевдо-разметка. Так как это связано с конкретным датасетом, с конкретным количеством ресурсов и размером батчей, то дополнительно через слеш я написала, какое было качество модели на dev. other (01:19:15), то есть на зашумленной части валидационного датасета, чтобы было примерно понятно, какое качество имеет модель. 5k/91% означает, что мы после 5 тыс. итераций начинаем псевдо-разметку, и в этот момент у модели на dev. other был 91% WER.
Анна Куртукова: Думаю, на вопрос ответили.
Следующий вопрос. Если в обучении будет отсутствовать фоновый шум, как тогда модель будет реагировать на фоновые шумы в реальной ситуации?
Татьяна Лихоманенко: Как всегда: если у нас нет каких-то данных в обучении, мы на них плохо работаем. Если у нас нет имитации какого-то шума… В этом случае нужно делать дополнительные аугментации.
(01:20:09)
У нас недавно была работа по поводу того, что если вы объедините кучу разных публичных датасетов – SwitchBoard, Тэбью, LibriSpeech, VSG и Common Voice (01:20:26), то тогда вы можете обучить модель, которую можете хорошо использовать для domain transfer, потому что у вас много самых разных данных. И с файнтюнингом только на 10 часах, в принципе, вы можете сделать полностью domain transfer, и модель будет работать хорошо.
Дополнительно вы показали из последних результатов, что можно использовать аддитивные reverberation шумы, которые улучшают робастность модели и ее трансфер. Все техники, которые вы можете найти по подготовке робастной модели, просто используйте для своей supervised модели и для своих unsupervised данных.
То есть мы показали, что работает аддитивный и reverberative noise. Мы теперь берем и используем это дополнительно при обучении нашей supervised модели и для псевдо-разметки.
Анна Куртукова: Спасибо. В чате есть большой вопрос. Может быть, на слух будет не совсем удобно воспринимать.
Вы в EMA усредняете модели веса или предсказание метки? Услышал, что строится EMA модель, а усреднение меток предсказаний не пробовали. Так получается?
Татьяна Лихоманенко: Да. EMA делается на основе усреднения весов модели. У нас было одно состояние, мы взяли веса модели, взяли второе состояние веса модели. Усреднили и получили среднюю модель. Но не предсказание. Предсказание мы не усредняли.
Про усреднение предсказаний. Да, можно делать. Скорее всего, тоже будет работать. То есть я не думаю, что разница будет сильно прямо большая. Возможно, имеет смысл следующее, про EMA. Мы используем decay фактор. Вопрос: как вы будете усреднять предсказания? Если брать просто среднее предсказание, то оно работать так не будет. EMA мы начинаем прямо с первой итерации. Это означает, что в самом начале модель – просто какая-то фигня. И в этом случае ваша модель будет выдавать фигню. Может быть, какие-то пикируемые точки всё равно будут, и они могут вносить какой-то шум.
Если мы будем усреднять предсказания с помощью… по типу EMA экспоненциального среднего, то да, это будет работать. Не вижу большой разницы между усреднением весов и усреднением предсказаний. На практике оно бы давало примерно одно и то же. А если мы будем просто усреднять, то, скорее всего, оно не будет работать. То есть нужно какое-то экспоненциальное сглаживание, потому что в этом случае мы говорим, что мы забываем про очень старые состояния модели, и используем более новые состояния модели.
Анна Куртукова: Спасибо. Тут же у нас вопрос по графику с соотношением размеченных и неразмеченных данных. Получается, это очень существенный параметр, причем зависимость не монотонная, и выбор другого неоптимального значения приводит к деградации более значимой, чем выигрыш вашего метода по сравнению с другим. Или что-то не так понял. Прокомментируйте, пожалуйста. Этого графика в статье нет.
Татьяна Лихоманенко: При 100 часах единственное требование – это чтобы число апдейтов на неразмеченных данных было больше либо равно, чем на размеченных данных. В случае, если мы больше начинаем делать шагов на размеченных данных, то в этом случае качество будет хуже. Просто модель начинает сходиться медленнее. Это из экспериментов наблюдение.
Если мы теперь говорим, что будет один к одному, или один к двум, один к трем, один к четырем, то, в принципе, чтобы прямо побить Wav2vec, у меня в статье написано, что 1 к 4 дает нам прямо самый лучший результат. Но если мы говорим о практическом применении, то разность в 0,2%, 0,3%, 0,4% WER, я бы не сказала, что для реальных сценариев это супербольшое. Улучшение на 1–2% – это более реалистичные вещи.
Про то, что она не монотонная – я бы сказала, что скорее это будет как парабола. Чтобы увеличить 1 к 1 с одного конца, 1 к 5 — 1 к 10 с другого конца. И где-то в середине будет между ними какое-то оптимальное значение.
В случае 10 часов я бы сказала, что 5 к 10, 10 к 1 и 20 к 1 дали примерно одинаковый результат. 10 к 1 – оптимальный. В итоге в статье для финальных цифр я использовала, по-моему, 10 к 1. 20 к 1 не давал сильного прироста – давал примерно то же самое.
(01:25:44)
Анна Куртукова: Тут уточнение, что на графике разница не 0,1%, а 1%.
Татьяна Лихоманенко: В 1 к 2 который.
Давайте будем смотреть на результаты после декодинга, потому что мы всё равно Beam Search Decoding с лингвистической моделью применяем. Мы смотрим на левом и на правом графике на две последних колонки. В этом случае для 10 часов 1 к 1 плохо, потому что мы слишком переобучаемся к размеченным данным. Если мы посмотрим на три остальных, то там точно меньше 1%. Можно перепроверить в статье, но, кажется, это было меньше 1%.
Если мы смотрим теперь на 100 часов, то 1 к 2 – это плохо, потому что у нас supervised на размеченных данных больше происходит итераций, и мы просто очень медленно сходимся.
Если мы посмотрим теперь на 1 к 1, 2 к 1, 3 к 1, 4 к 1, то они все дают примерно одинаковые числа. Там разница была в 0,1% при разном ratio.
Анна Куртукова: Спасибо. У нас еще два вопроса.
На экспериментах с прошлой версией IPL мы заметили, что на хорошо обученной модели loss на валидации подрастает, и потом крайне неохотно падает назад. Но вот вопрос: может быть, этого подъема достаточно, чтобы сделать псевдо-разметку на уже хорошо обученной модели?
Татьяна Лихоманенко: Эффекты ухудшения loss… Мы знаем, что WER и loss не коррелируют друг с другом. Они коррелируют, но не на 100%. Это означает, что мы часто видим, что на валидации в какой-то момент у нас loss начинает расти, а WER продолжает падать.
Очень сложно сказать, что конкретно происходит. Это зависит от того, что в действительности внутри loss происходит. При определенных условия, да, возможно, имеет смысл делать WER псевдоразметку, и будет нормальный шум, который поможет нам обучаться. А может и нет. Я такие эксперименты не делала, но эффект ухудшения loss из тех, что мы продолжаем обучаться, он больше связан с тем, что у нас loss и WER друг с другом не сильно скоррелированы.
Анна Куртукова: Здесь комментарий, что WER тоже подрастает.
Татьяна Лихоманенко: А, вы имеете в виду режим переобучения, когда у нас?.. М-м…
ОК, можно делать. Но вопрос в том, что это слишком частный случай. У нас много чего может происходить во время обучения. В какой момент там делать переразметку. Да, можно попробовать. Не знаю, что будет. Может, будет работать. Подлавливать какой-то… Просто думайте с точки зрения практики. Вам действительно это удобно делать? Что вы подлавливаете какой-то момент, когда модель стала переобучаться, и вы подождете еще чуть-чуть, когда она переобучится, и потом начинаете делать псевдо-разметку. Вопрос в том, что динамика будет очень сложная, и непонятно, насколько один эксперимент или несколько экспериментов дадут вам хорошее представление о том, что в действительности будет происходить, и будет ли оно хорошо обобщаться.
Анна Куртукова: Еще вопрос. Сравнивались ли с Wav2vec на сравнимых датасетах?
Татьяна Лихоманенко: Что значит «на сравнимых датасетах»?
Анна Куртукова: Может быть, сейчас пояснят.
Татьяна Лихоманенко: У Wav2vec есть бенчмарки на 10 часах, на 100 часах, на всем LibriSpeech. На всем LibriSpeech уже неинтересно сравниваться, потому что там лимиты всеми предыдущими методами все показывают примерно одинаковые результаты. На 10 часах и 100 часах сравниваемся с Wav2vec. Пока что в режиме LibriSpeech, LibriVox (01:30:28) я пока еще не закончила эксперименты, поэтому их пока не рассказываю.
Анна Куртукова: Спасибо. Пока зачитаю комментарий.
«Большое спасибо за рассказ. Радует, что такие крутые статьи от больших компаний появляются на таких семинарах. Чувство, что и до нас тоже снизошли».
Согласна полностью. Очень интересный доклад.
В таком случае, если вопросов больше нет, думаю, можем тогда завершать.
Татьяна Лихоманенко: Если у кого-то еще появятся вопросы или хотите что-то дополнить, узнать детали и прочее – всегда welcome, пишите на почту. Рада буду ответить. Всегда рада получить письма после доклада.
Анна Куртукова: Вот еще поступил вопрос.
Есть какой-нибудь wild guess (01:31:12) по поводу того, можно ли это перенести на другие домены?
Анна Куртукова: Я пробовала прямо Out of the box использовать, если заменить фронтенд с фильтра банков на raw wave (01:31:32), или попробовать это применить на Switch Board, и это работает. В Out of the box я взяла те же самые параметры, как на LibriSpeech. У меня в статье самые лучшие написаны. Запустила. Да, оно работает, показывает улучшение. Вопрос только: улучшение вашей supervised модели, чтобы побить state of the art, но на conversational speech работала.
На другом языке я не пробовала. То есть на языках, которые близки к английскому по структуре, должно работать, никаких проблем с этим не должно быть.
Какой-нибудь китайский – не знаю. Китайский, тайский, японский – может быть, какие-то отдельные артефакты самого языка будут. Но, в принципе, не вижу каких-то ограничений, почему это не должно работать. Еще раз: самый главный момент – следить за тем, чтобы не генерировались пустые транскрипции. Если такое происходит, то нужно более детально изучать, почему и как это происходит. Но если этого не происходит, то должно работать.
Анна Куртукова: Спасибо. Вроде бы вопросов по докладу больше нет.
Что касается записи, да, конечно, ее выложим, как обычно. Следите за нашим Telegram, Youtube. И транскрипцию тоже выложим.
Спасибо, Татьяна. Очень интересный и актуальный доклад.
Татьяна Лихоманенко: Всем спасибо!
(01:33:00) (Конец записи.)