30 WaveNet
Контекст
Синтез речи (TTS) звучал роботизированно (конкатенативные/параметрические методы). DeepMind заходит радикально — генерировать звук на уровне отдельных сэмплов.
Идея и механизм
Авторегрессионная модель предсказывает каждый следующий аудио-сэмпл (при 16 кГц это 16000 значений в секунду) по всем предыдущим. Чтобы охватить длинный контекст без рекуррентности, используются dilated causal convolutions: causal (свёртка не заглядывает в будущее — корректно для генерации), dilated (между точками фильтра растут промежутки).
обработка сигналов Почему рецептивное поле растёт экспоненциально
Обычная свёртка с фильтром ширины k, сложенная в L слоёв, охватывает L(k−1)+1 точек — линейно по глубине. Dilated-свёртка пропускает d−1 точек между отсчётами фильтра. Если удваивать дилатацию слой за слоем d = 1, 2, 4, …, 2L−1, рецептивное поле:
То есть всего ~10 слоёв охватывают ~1000 сэмплов, а вычислений — лишь линейно по глубине. Causal означает, что выход в момент t зависит только от входов ≤ t (реализуется сдвигом-паддингом) — обязательное условие для авторегрессионной генерации, иначе модель «подсматривала» бы будущее, которого на инференсе ещё нет.
PyTorch Dilated causal convolution
import torch.nn as nn
import torch.nn.functional as F
class CausalConv(nn.Module):
def __init__(self, C, d, k=3):
super().__init__()
self.pad = (k - 1) * d # сдвиг, чтобы не видеть будущее
self.conv = nn.Conv1d(C, C, k, dilation=d)
def forward(self, x):
return self.conv(F.pad(x, (self.pad, 0)))
# стек dilation = 1,2,4,8,… → поле растёт экспоненциально
Почему это важно
Показала, что авторегрессионная генерация работает и для аудио (MOS 4.21 против ~3.7 у прежних методов), и повлияла на последующие генеративные модели звука/музыки. Нюанс: оригинал жутко медленный (сэмпл за раз); production-версия (parallel WaveNet) появилась позже и попала в Google Assistant.
Связи
WaveNet — это свёртки, перенесённые с изображений на одномерный звук и сделанные причинными. Тот же аппарат (фильтры, рецептивные поля), но с трюком дилатации для охвата длинного временного контекста.
Та же задача — длинный контекст в последовательности — но другой ответ: LSTM тянет его рекуррентно (последовательно), WaveNet — стеком dilated-свёрток (параллельно по времени на обучении). Это предвестие того, как Transformer вытеснит рекуррентность и в языке.
WaveNet утвердил авторегрессионную генерацию «по кусочку за раз». Диффузия предложит другой путь генерации (итеративное расшумление вместо посэмплового предсказания), отчасти решая болезнь WaveNet — мучительную медленность последовательной генерации.
Вопросы пытливого ума
Почему генерация по сэмплу так мучительно медленная и как это обошли?
Авторегрессия принципиально последовательна: чтобы выдать сэмпл t, нужен сэмпл t−1 — при 16000/сек это десятки тысяч прогонов на секунду звука. Обошли через дистилляцию в параллельную модель (Parallel WaveNet): обучили быстрый непоследовательный генератор имитировать медленный WaveNet. Та же дилемма «качество vs скорость авторегрессии» всплывёт и в LLM (отсюда спекулятивное декодирование).
Зачем моделировать звук на уровне сэмплов, а не спектрограмм/фонем?
Прежние TTS работали на промежуточных представлениях и теряли в естественности на «склейках». WaveNet генерирует сырую волну напрямую, не выкидывая тонкую структуру (дыхание, призвуки), — отсюда скачок в естественности. Цена — вычислительная: моделировать 16000 точек/сек дороже, чем десяток фонем.
Dilated-свёртки — изобретение WaveNet?
Нет, dilation (atrous convolution) использовали раньше в сегментации изображений, чтобы расширить рецептивное поле без потери разрешения. Заслуга WaveNet — соединить dilated и causal для авторегрессионной генерации звука и показать, что так можно охватить тысячи сэмплов. Часто «новизна» в ML — это удачная пересадка приёма из соседней области.
Что читать в оригинале
Идея простая — конспекта достаточно. Главное усвоить dilated causal convolution и то, как рецептивное поле растёт экспоненциально (мат-блок).