Эпоха 4 · Архитектуры и масштаб · 2016

30 WaveNet

WaveNet: A Generative Model for Raw Audio · van den Oord и др. · DeepMind
🟦 хватит конспекта~30–40 миноригинал ↗
Суть за 20 секунд. Генерирует сырой звук авторегрессионно — по сэмплу за раз. Ключ — dilated causal convolutions: рецептивное поле растёт экспоненциально с глубиной, охватывая тысячи сэмплов без рекуррентности. Новая планка естественности синтеза речи.

Контекст

Синтез речи (TTS) звучал роботизированно (конкатенативные/параметрические методы). DeepMind заходит радикально — генерировать звук на уровне отдельных сэмплов.

Идея и механизм

Авторегрессионная модель предсказывает каждый следующий аудио-сэмпл (при 16 кГц это 16000 значений в секунду) по всем предыдущим. Чтобы охватить длинный контекст без рекуррентности, используются dilated causal convolutions: causal (свёртка не заглядывает в будущее — корректно для генерации), dilated (между точками фильтра растут промежутки).

обработка сигналов Почему рецептивное поле растёт экспоненциально

Обычная свёртка с фильтром ширины k, сложенная в L слоёв, охватывает L(k−1)+1 точек — линейно по глубине. Dilated-свёртка пропускает d−1 точек между отсчётами фильтра. Если удваивать дилатацию слой за слоем d = 1, 2, 4, …, 2L−1, рецептивное поле:

R = 2L  (растёт экспоненциально с глубиной)

То есть всего ~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,… → поле растёт экспоненциально
вход (сэмплы) dilation 2 dilation 4 рецептивное поле удваивается с каждым слоем
Каждый следующий слой с большей дилатацией «дотягивается» вдвое дальше. Несколько слоёв охватывают огромный контекст без рекуррентности.
Аналогия. Чтобы охватить взглядом всю улицу, не нужно идти вдоль каждого дома — достаточно подняться по этажам: с первого видишь соседние подъезды, со второго — целый двор, с десятого — весь район. Дилатация — это «подъём на этаж»: с каждым слоем обзор удваивается, а шагов (вычислений) добавляется чуть-чуть.

Почему это важно

Показала, что авторегрессионная генерация работает и для аудио (MOS 4.21 против ~3.7 у прежних методов), и повлияла на последующие генеративные модели звука/музыки. Нюанс: оригинал жутко медленный (сэмпл за раз); production-версия (parallel WaveNet) появилась позже и попала в Google Assistant.

Связи

← опирается на9. LeNet / CNN

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

↔ альтернатива11. LSTM

Та же задача — длинный контекст в последовательности — но другой ответ: LSTM тянет его рекуррентно (последовательно), WaveNet — стеком dilated-свёрток (параллельно по времени на обучении). Это предвестие того, как Transformer вытеснит рекуррентность и в языке.

→ ведёт к46. DDPM (Diffusion)

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 и то, как рецептивное поле растёт экспоненциально (мат-блок).