TL; ДР: В этом посте дается обзор того, как мы продвигаемся от традиционной системы ASR к системе с архитектурой кодировщика-декодера с вниманием. В нем также упоминаются некоторые недостатки традиционных архитектур и способы их преодоления с помощью архитектур Encoder-Attention-Decoder. Этот пост также дает небольшое введение в новую гибридную архитектуру CTC / Attention.

Автоматическое распознавание речи. Целью исследований в области автоматического распознавания речи (ASR) является разработка устройства / алгоритма, автоматически расшифровывающего естественную речь. Базовая система состоит из акустического процессора и лингвистического декодера¹.

В традиционной системе ASR есть исходный говорящий, который произносит последовательность слов, которая распространяется по каналу (зашумленный канал), и мы озабочены преобразованием этого речевого сигнала в последовательность слов в адресате.

Здесь нас не интересует семантика слов / предложений. Мы просто хотим расшифровать то, что содержится в речевом сигнале.

Традиционно это рассматривается в рамках модели зашумленного канала². Мы хотели бы знать, какое предложение наиболее вероятное из всех предложений на языке L при некотором акустическом вводе O?

Здесь мы рассматриваем акустический вход O как последовательность отдельных наблюдений O = {o_1, o_2, o_3,…, o_T} и определяем предложение как последовательность слов W = {w_1, w_2, w_3,…, w_U}

Речевой сигнал представляет собой одномерный сигнал, обычно дискретизированный с частотой 8 кГц или 16 кГц, причем каждый отсчет обычно является 8-битным или 16-битным.

Есть несколько причин, по которым мы не можем использовать этот одномерный сигнал напрямую для обучения какой-либо модели.

  • Речевой сигнал квазистационарный.
  • Существует вариативность между говорящими и внутри говорящих, то есть одно и то же слово при произнесении разными говорящими дает разные сигналы, а также одно и то же слово, когда оно произносится одним и тем же говорящим в разное время, дает разные сигналы.
  • Изменение скорости речи, высоты тона и громкости может повлиять на модель.

По указанным выше причинам мы обычно извлекаем некоторые признаки из одномерного речевого сигнала.

Самая простая функция, которую мы можем извлечь из речевого сигнала, - это спектрограмма³. Обычно мы извлекаем кратковременный спектр Фурье⁴ (длительность 25 мс). Таким образом, для каждого окна сигнала 25 мс мы получаем некоторое количество функций.

Это показано на рисунке ниже, где для окна 20 мс мы берем логарифм спектра мощности, чтобы получить 1 кадр спектрограммы. Мы повторяем это для всего сигнала, чтобы получить всю спектрограмму сигнала.

Эта функция позже используется для обучения модели машинного обучения расшифровке речи.

Вероятностные значения этих точек:

Мы хотели бы получить такую ​​последовательность слов W из языка L, которая максимизирует следующее условие при акустическом вводе O.

Мы можем использовать правило Байеса, чтобы переписать это как:

Поскольку знаменатель одинаков для каждого предложения-кандидата W, мы можем игнорировать его для argmax:

Перед сквозным ASR

Традиционно системы ASR состояли из множества отдельных блоков, которые нужно было оптимизировать отдельно. На рисунке ниже показан один из примеров традиционной системы ASR. Существует извлечение внешних функций, за которым следуют акустическая модель GMM, HMM (моделирование произношения), а также языковая модель (LM).

Проблемы традиционного ASR и мотивация для сквозного

У такой системы для ASR много недостатков. Как резюмируется в работе S. Watanabe et al., 2017:

  • Пошаговое уточнение. Для создания точного модуля требуется множество процессов, связанных с конкретным модулем. Например, когда мы строим акустическую модель с нуля, мы должны сначала построить скрытую марковскую модель (HMM) и модели гауссовой смеси (GMM), чтобы получить структуру HMM в связанном состоянии и фонетические выравнивания, прежде чем мы сможем обучать глубокие нейронные сети. (DNN).
  • Лингвистическая информация: Чтобы правильно разложить акустические и языковые модели, нам нужна модель лексики, которая обычно основана на вручную созданном словаре произношения для сопоставления слова с последовательностями фонем. Поскольку фонемы созданы с использованием лингвистических знаний, они подвержены человеческим ошибкам, которых может избежать система, полностью управляемая данными. Наконец, некоторые языки не имеют явной границы слова и нуждаются в модулях токенизации.
  • Предположения условной независимости: текущие системы ASR часто используют предположения условной независимости (особенно предположения Маркова) во время вышеуказанной факторизации и используют модели GMM, DNN и n-грамм. Реальные данные не обязательно следуют таким предположениям, что приводит к неправильной спецификации модели.
  • Сложное декодирование: вывод / декодирование должно выполняться путем интеграции всех модулей. Хотя с такой интеграцией часто эффективно справляются преобразователи с конечным числом состояний, создание и реализация хорошо оптимизированных преобразователей очень сложны.
  • Несогласованность в оптимизации. Вышеупомянутые модули оптимизированы отдельно с разными целями, что может привести к несогласованности в оптимизации, когда каждый модуль не обучен для соответствия другим модулям.

В дополнение к вышеупомянутым пунктам, традиционный конвейер, даже несмотря на то, что он хорошо настраивается, очень сложно заставить работать нормально. Исторически сложилось так, что каждая часть системы имеет свой собственный набор проблем (например, выбор правильных представлений функций).

Проблема речи

В большинстве проблем, которые мы пытаемся решить с помощью машинного обучения / глубокого обучения, у нас есть набор входных данных, которые мы хотели бы сопоставить с набором выходных данных. В основном каждый вход соответствует выходу.

Мы предполагаем, что существует некоторая функция f (), которая может отображать все эти входы на соответствующие им выходы.

Проблема с речью в том, что наши векторы признаков берутся из краткосрочных спектров речевого сигнала. Это означает, что у нас есть вектор признаков на каждые 20–25 мс или около того.

Проблема в том, что мы не знаем, где проходит граница между одним звуком (фонемой) и другим. Если бы вы могли открыть речевой сигнал в любом программном обеспечении для обработки сигналов, сократить сигнал до ~ 200–300 мс и прослушать его без какого-либо контекста, то невозможно отличить, какой это звук. Обратите внимание, данные, которые у нас есть, - это речевой сигнал и соответствующая расшифровка на уровне слов. То есть у нас нет данных о том, где заканчивается слово (или фонема), а где начинается другое.

Как обучить модель, если мы даже не знаем пары x-y?

Популярные функции потерь (кросс-энтропия, среднеквадратичная ошибка) предполагают взаимно однозначное соответствие между выходными и целевыми метками сети. Но что, если нет однозначного соответствия? (Распознавание речи, машинный перевод, распознавание почерка).

Нам нужен способ найти соответствие между выходами сети и целевыми метками. Традиционно это делается с помощью бутстрэппинга (встроенной переоценки).

В сквозном контексте это можно сделать несколькими способами, такими как модели CTC, Attention, seq2seq.

Кодировщик

В большинстве сквозных систем есть общий модуль - сеть Encoder.

Если мы возьмем двунаправленный кодировщик LSTM, он берет последовательность векторов признаков, предыдущее скрытое состояние и преобразует их в скрытую (закодированную) последовательность векторов с помощью некоторой функции кодировщика.

Каждое закодированное представление ht содержит информацию о входной последовательности с фокусом на t ^ th входе последовательности.

- это скрытое состояние в момент времени t, где Encoder () - это некоторая функция, которую кодировщик реализует для обновления своего скрытого представления.

Этот кодировщик может быть глубоким по своей природе, то есть у нас может быть глубокий кодировщик BLSTM, где каждый последующий уровень преобразует выходные данные из предыдущих уровней. Мы хотели бы использовать двунаправленную сеть в речи, потому что то, как мы произносим слово, также зависит от фонем будущего.

Например, фонема к в словах «автомобиль» и «клептомания» произносится по-разному. Простое знание того, что в клептомании есть фонема l после первого k, меняет наше произношение фонема k. Используя двунаправленную сеть, мы можем уловить эти эффекты и из будущего, что помогает лучше моделировать речевой сигнал.

CTC

Пожалуйста, обратитесь к этой замечательной статье о дистилляции о СТС для подробного обсуждения этой темы.

Большинство из нас знает, как работает DNN: учитывая вектор признаков x, он преобразует его в целевой вектор y посредством некоторых преобразований на каждом уровне. Кодировщик LSTM работает аналогично. Для каждого вектора признаков x он генерирует целевой вектор y, но этот вектор не полностью зависит от входных данных. Это имеет некоторый эффект из прошлого (и будущего в случае двунаправленного).

На рисунке ниже показан однонаправленный LSTM, который создает один целевой вектор для каждого входного вектора признаков. Это эквивалентно получению повторяющихся выводов символов из модели. Нам нужен способ свернуть эти повторяющиеся выходные данные в удобочитаемую форму. Вот где на сцену выходит CTC.

В коннекционистской временной классификации проблема выравнивания решается путем интеграции по всем возможным выравниваниям символов и времени.

Пример: если слово «привет», а выходные данные модели - 3 целевых вектора. Мы хотим отобразить эти 3 вектора в расшифровку «привет» с буквами 2.

CTC вычисляет, сколько возможных способов существует для этого сопоставления. Возможный C такой, что k (C) = W: hhi, hii, _hi, h_i, hi_. Где «_» - пустой символ.

Это показано в статье о CTC, как показано ниже.

Таким образом, в нашем кодировщике LSTM каждое измерение целевого вектора соответствует вероятности появления символа на этом временном шаге. На рисунке ниже вы можете увидеть вероятность появления символа «B» на временном шаге 17.

Таким образом, вычисление вероятности CTC - это вычисление вероятности каждой возможной последовательности меток и их сложение. Если мы обучаем высказывание «Привет», мы вычисляем индивидуальную вероятность каждой последовательности меток, которая отображается на «Привет», и суммируем их. Это параметр, который мы хотели бы максимизировать.

Мы обновляем параметры сети, чтобы максимизировать вероятность правильной последовательности меток.

Кодер-декодер

В структуре Encoder-Decoder кодировщик пытается суммировать всю входную последовательность в векторе фиксированной размерности ht. Сам кодировщик представляет собой рекуррентную нейронную сеть (RNN / LSTM / BLSTM / GRU), которая принимает каждый вектор входных признаков xt и переключает его внутреннее состояние, чтобы представить (суммировать) последовательность до этого времени внутри ht.

Мы могли бы использовать ht на каждом временном шаге, чтобы сделать прогноз (или нет), но мы подождем до конца последовательности в момент времени T и возьмем представление hT, чтобы начать генерацию нашей выходной последовательности. Это связано с тем, что мы не знаем границ слова / буквы / фонемы и надеемся, что кодировщик сможет резюмировать последовательность ввода полностью внутри hT.

Мы передаем в качестве входа ‹sos› - начало токена последовательности в декодер для согласованности и начала генерации выходных символов. Декодер - это еще одна рекуррентная нейронная сеть (не двунаправленная), которая каждый раз переключает свое внутреннее состояние, чтобы предсказать результат.

На каждом временном шаге мы подаем вывод из предыдущего временного шага, чтобы предсказать текущий вывод.

- это скрытое состояние декодера при прогнозировании выходного символа i ^ th, где Decoder () - некоторая функция, которую декодер LSTM реализует для обновления своего скрытого представления.

На рисунке ниже показан пример работы сети кодировщика-декодера.

Мы прекратим создание выходной последовательности символов, когда декодер сгенерирует ‹eos› - маркер конца последовательности.

Учитывая скрытое представление декодера s (i-1) (из предыдущего времени вывода) и выходной символ y (i-1) (предыдущий выходной символ), мы может предсказать выходной символ на текущем временном шаге как:

Где g () - вся функция декодера. Вероятность полной выходной последовательности yy может быть вычислена как:

Возможные проблемы с кодировщиком-декодером

  • Нейронная сеть должна иметь возможность сжимать всю необходимую информацию входной последовательности векторов признаков в вектор фиксированной размерности.
  • Когда последовательность длинная, особенно когда входная последовательность во время тестирования значительно длиннее обучающих, производительность базовой сети кодировщика-декодера ухудшается.
  • Кроме того, я считаю, что принуждение кодировщика суммировать всю последовательность векторов признаков в вектор фиксированной размерности зависит от размера вектора (чем длиннее предложение - тем длиннее вектор), который мы не можем исправить, поскольку длина последовательности может существенно различаются.

Внимание

Одно из предлагаемых людьми решений упомянутых выше проблем - это использование внимания. Внимание - это расширение фреймворка Encoder-Decoder.

Каждый раз, когда модели требуется сгенерировать выходной символ, она (программно) ищет набор позиций во входной последовательности векторов признаков, где наиболее релевантная информация концентрируется.

Теперь мы заботимся о том, чтобы модель точно выбирала набор позиций во входной последовательности. Основное отличие от фреймворка Encoder-Decoder заключается в том, что здесь мы не пытаемся суммировать всю входную последовательность в вектор фиксированной размерности.

Здесь вместо загрузки скрытого представления hT, давайте выберем подмножество h, которое наиболее актуально для конкретного контекста, чтобы помочь сети декодера генерировать выходные данные.

Мы линейно смешиваем этот релевантный ht, чтобы получить то, что мы называем вектором контекста Ci.

Внимание. В некотором смысле модель обслуживает подмножество входных функций, наиболее релевантных текущему контексту.

Во всех методах глубокого обучения мы хотели бы, чтобы функции были дифференцируемыми, чтобы мы могли изучать их с помощью обратного распространения. Чтобы сделать этот метод внимания к подмножеству дифференцируемым, мы обращаем внимание на все входные векторы признаков, но с разным весом!

Чем внимание отличается от кодировщика-декодера

  • В сети Encoder-Decoder, которую мы обсуждали в предыдущем посте, скрытое состояние Decoder вычисляется как:

  • В расширении Attention мы берем вектор Context при вычислении скрытого состояния декодера:

  • Вектор контекста - это сводка только наиболее релевантных входных векторов признаков. Чтобы зафиксировать эту релевантность, давайте рассмотрим переменную αα, где αiαi представляет собой вес закодированного представления (также называемого аннотацией) hi в вектор контекста Ci - для прогнозирования выходных данных во время ii. Учитывая это αα, мы можем вычислить вектор контекста как:

  • Чтобы вычислить альфа (i, j), нам понадобится e (i, j) - важность вектора аннотации j ^ th для прогнозирования символ вывода i ^ th. Это то, что производит функция совместимости. Вес альфа (i, j) каждой аннотации hj вычисляется как:

  • Где e (i, j) = AttentionFunction (si − 1, hj) - это функция совместимости, которая вычисляет важность каждой аннотации hj. со скрытым состоянием декодера s (i-1).

Во всех наших моделях Attention эта функция AttentionFunction () будет отличаться. AttentionFunction () определяет, какой это тип внимания.

На рисунке ниже показан пример внимания при распознавании речи. На самом нижнем рисунке показан вектор входных характеристик (спектрограмма), на рисунке выше показано, где модель концентрируется на каждом временном шаге на выходе, 3-й рисунок показывает веса внимания на каждом временном шаге, а 4-й рисунок показывает полную распределение веса внимания по всей последовательности ввода-вывода.

Если вы видите веса внимания до обучения модели (в эпоху 0), все веса внимания являются случайными, и, следовательно, вектор контекста Ci содержит ненужный шум от нерелевантных входных векторов признаков. Это приводит к снижению производительности модели. Совершенно очевидно, что хорошая модель внимания дает лучший вектор контекста, что приводит к лучшей производительности модели.

В абстрактной форме это можно показать следующим образом. Каждая последовательность векторов признаков смешивается с некоторым весом и затем передается в сеть декодера для принятия решения. Веса, с которым объединяются эти функции, определяет AttentionFunction.

Мы также могли видеть, как веса внимания меняются с течением времени (эпохи), чтобы получить более глубокое понимание того, как обучается модель. Я сделал это, объединив все веса внимания каждой эпохи в гифку. Вот как это выглядит:

В литературе широко используются многие модели внимания. Такой инструментарий, как ESPnet, имеет около 13 механизмов внимания, с которыми мы можем легко начать экспериментировать.

Наконец, давайте рассмотрим пример одного из этих механизмов внимания - точечного продукта внимания и посмотрим, как внимание работает от начала до конца, чтобы генерировать вектор контекста Ci.

Beyond Attention - Совместная архитектура CTC / Attention

ASR на основе внимания может быть подвержен ошибкам удаления и вставки из-за своего свойства гибкого выравнивания, которое может учитывать любую часть последовательности состояний кодера для прогнозирования следующей метки, как обсуждается в Разделе II-C этой статьи. Поскольку внимание генерируется сетью декодера, она может преждевременно предсказать конец последовательности, даже если она не обратила внимание на все кадры кодера, что делает гипотезу слишком короткой. С другой стороны, он может с высокой вероятностью предсказать следующий ярлык, уделив внимание тем же частям, что и предыдущие. В этом случае гипотеза становится очень длинной и включает повторения одной и той же последовательности меток.

По этой и многим другим причинам была предложена совместная архитектура CTC / Attention, которая эффективно использует преимущества обеих архитектур как при обучении, так и при декодировании. Во время обучения мы используем многокритериальную структуру обучения, чтобы повысить надежность и добиться быстрой конвергенции. Во время декодирования мы выполняем совместное декодирование, комбинируя оценки на основе внимания и CTC в однопроходном алгоритме поиска луча, чтобы дополнительно устранить нерегулярные выравнивания.

Заключение

В этом посте дается обзор того, как мы продвигаемся от традиционной системы ASR к системе с архитектурой кодировщика-декодера с вниманием. В нем также упоминаются некоторые недостатки традиционных архитектур и способы их преодоления с помощью архитектур Encoder-Attention-Decoder. Этот пост также дает небольшое введение в новую гибридную архитектуру CTC / Attention.

использованная литература

[1] Л. Р. Баль, Ф. Елинек и Р. Л. Мерсер, «Подход максимального правдоподобия к распознаванию непрерывной речи», IEEE Trans. Pattern Anal. Мах. Интел., т. ПАМИ-5, № 2. С. 179–190, 1983.

[2] https://en.wikipedia.org/wiki/Noisy_channel_model

[3] С. Ватанабе и др., «Гибридная архитектура CTC / Attention для сквозного соединения», т. 11, вып. 8. С. 1240–1253, 2017.

[4] Ханнун Моделирование последовательности с помощью CTC 2017 https://distill.pub/2017/ctc/