Загрузка 0
ПОДЕЛИТЬСЯ

Мой блог

Листай вниз

Распознавание крымскотатарской речи: LoRA за полтора часа и подбор декодера

Распознавание крымскотатарской речи: LoRA за полтора часа и подбор декодера

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

Итоговые результаты замеров на отложенном тесте (893 клипа общей длительностью 1.86 часа от двух новых дикторов) демонстрируют заметный прогресс: базовая модель whisper-large-v3 с предварительным тюнингом дает WER 0.3463 и CER 0.1188; применение LoRA снижает WER до 0.2010 и CER до 0.0938; а последующий подбор параметров декодирования без изменения весов доводит метрики до WER 0.1701 и CER 0.0702. Давайте разберем этот путь по шагам.

График обучения модели
Динамика изменения показателей качества в процессе тренировки адаптера.
Конфигурация оборудования
Показатели потребления памяти видеокарты во время выполнения скрипта.
Параметры генерации гипотез
Результаты тестирования различных комбинаций флагов генерации текста.

Сначала тест, потом модель

Наличие готовой модели, якобы понимающей крымскотатарский язык, не означает честного качества. Первым делом я занялся формированием надежного тестового сплита и харнесса. Случайное разбиение по клипам здесь категорически не работает: соседние фрагменты принадлежат одной сессии записи с тем же микрофоном, а автоматический выравниватель нередко делит одно предложение на части. Случайное перемешивание заставило бы модель распознавать акустический тракт, а не саму речь.

Реклама

Поэтому холд-аут был сформирован целыми книгами. В отложенный тест вошли две книги и два диктора, совершенно отсутствующие в обучающей выборке (893 клипа / 1.86 часа). Всего в проекте задействовано три датасета: тренировочный пул (7508 клипов / 15.54 часа), dev-набор для выбора чекпоинтов и конфигураций (255 клипов / 0.54 часа, проверявшийся десятки раз) и неизменный тестовый набор, декодируемый ровно один раз на финальное решение.

Правило выбора победителя по минимальному dev WER было зафиксировано заранее. Попытки многократно гонять тест и брать лучший результат приводят лишь к выбору самой удачливой, но не воспроизводимой цифры. Единый харнесс обрабатывает как seq2seq архитектуры (Whisper), так и CTC (Wav2Vec2), используя одинаковую нормализацию из TTS-пайплайна. Отдельно в отчетах фиксируется количество петель декодера, когда число правок превышает длину эталона.

Утечка, которую не видно по именам файлов

Перед запуском обучения я проверил пересечение тестового материала с обучающей выборкой по идентификаторам и именам файлов — оно оказалось нулевым. Однако проверка текстовых совпадений по общим словным 6-граммам выявила серьезную проблему: четыре аудиокниги присутствовали в корпусе дважды под разными именами и с разной нарезкой.

Для тестовой книги совпадение составило 96.9% (651 клип из 672). Если бы этот дубликат остался в train, модель успешно сдала бы экзамен по заранее известным билетам с теми же голосами и предложениями. Обнаружение утечки до начала обучения позволило избежать ложных восторгов. В низкоресурсных проектах, собираемых из ограниченного числа записей разными инструментами, пересегментированные дубликаты являются нормой, а не исключением. После этого был введен жесткий запрет на использование идентичных текстовых фрагментов в dev и train выборках.

Бейзлайн и особенности его оценки

Сравнение базовых моделей whisper-large-v3-crh и wav2vec2-xls-r-300m-crh требует правильной интерпретации метрик. Модель CTC демонстрирует высокий WER (0.8229) в основном из-за потери границ слов и склеивания их в длинные последовательности, поэтому объективнее опираться на CER. У Whisper показатель CER составляет 0.1188, что примерно вдвое лучше конкурента.

Диакритические знаки крымскотатарского языка не вызывают критических проблем: значения folded CER отличаются от обычных всего на один процентный пункт. Небольшое занижение метрик Whisper связано с тем, что модель записывает числа цифрами, тогда как в эталонах они расшифрованы прописью. Кроме того, в небольшой части клипов Whisper склонен обрезать начало фразы из-за особенностей генерации.

Полтора часа обучения — самая скучная часть

Полный файнтюн модели нецелесообразен, поскольку стирает накопленные базовые знания. Было решено использовать метод LoRA.

Параметры обучения и аппаратные ограничения

Настройка затрагивала проекции q_proj, k_proj, v_proj и out_proj с рангом r=32. Обучаемых параметров оказалось около 31.5 миллиона (примерно 2% от общего объема). Процесс выполнялся в формате bf16 с весами LoRA в fp32 и включенным градиентным чекпоинтингом на ноутбучной видеокарте RTX 5090.

Реклама

Оптимальный размер батча подбирался экспериментально. Значение batch 32 потребовало около 10.4 ГБ VRAM и позволило сократить количество шагов оптимизатора. Ограничение VRAM задавалось программно через внутренние вызовы PyTorch, так как стандартные переменные окружения конфликтули с конфигурацией WSL2.

Лестница чекпоинтов на dev-наборе

Анализ промежуточных чекпоинтов показал, что на сотом шаге качество временно ухудшается, так как адаптер еще не закрепился в структуре сети. Начиная с двухсотого шага метрики стабилизируются: вся полезная информация усваивается в пределах первой эпохи, а последующие эпохи не приносят существенного прироста. Итоговый перенос лучшего чекпоинта на тест снизил WER на 42% относительно базы.

Вторая половина пути: ни одного изменённого веса

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

Сравнение результатов базовой модели, после LoRA и после декодирования
Слева направо: расшифровка базовой модели, результат после применения LoRA и финальный вариант после настройки параметров декодирования.

Перебор конфигураций на dev-наборе выявил эффективность beam search. Использование лучевого поиска с шириной 4 дало ощутимый прирост качества, в то время как увеличение ширины до 5 не принесло преимуществ. Параметр no_repeat_ngram_size при этом продемонстрировал неожиданно негативный эффект, а температурный fallback не задействовался из-за особенностей разметки dev-набора.

В результате комбинация beam search без жесткого запрета n-граммов позволила довести итоговый WER на тесте до 0.1701 при сохранении неизменных весов нейросети.

Честный разбор: откуда взялись эти 15%

Снижение WER на 15% за счет настроек декодера складывается из двух принципиально разных факторов. Около 39% общего выигрыша обеспечили всего три «петлевых» клипа, в которых жадный декодер уходил в бесконечное повторение одного слова, а beam search полностью устранил этот дефект.

Остальные 61% приходятся на общее повышение аккуратности распознавания обычной речи. Хотя замедление обработки выросло примерно в 3.1 раза, исчезновение катастрофических ошибок полностью оправдывает вычислительные затраты при обработке больших аудиоархивов.

Факторы реального мира и акустические условия

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

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

Реклама
01.