Иерархия вместо плоского контекста: WaveNet-подобная модель и рекуррентные сети

Урок 8 из 16 курса «Нейросети с нуля: по открытому коду Андрея Карпати»: неофициальный курс AI University по открытому коду (MIT). Урок входит в платный доступ; первые уроки курса бесплатно.

О чём урок

Восьмой урок возвращает нас к makemore, но меняет угол зрения: до сих пор мы собирали контекст из нескольких предыдущих символов одним махом, через один слой MLP. Сегодня разберём, почему такой «плоский» подход плохо масштабируется на длинный контекст, и посмотрим на три разных способа решить эту проблему: иерархическую свёрточную модель в духе WaveNet (которую мы напишем сами, потому что в репозитории makemore её нет), а также реальные архитектуры RNN, GRU и BoW из makemore.py. После урока вы сможете написать собственный иерархический слой на PyTorch, объяснить, почему BatchNorm в таких архитектурах требует аккуратности с осями, и честно сравнить несколько архитектур makemore по test loss.

Неофициальный курс AI University по открытому коду (MIT). В уроке приводится код из karpathy/makemore © Andrej Karpathy, лицензия MIT; комментарии переведены на русский, объяснения написаны нашей командой. Курс не связан с автором кода и не одобрен им.

В прошлых уроках мы брали block_size предыдущих символов, склеивали их эмбеддинги в один длинный вектор и пропускали через Linear. Для block_size = 3 это работает хорошо: слой видит сразу 3·n_embd чисел и обучается находить в них полезные комбинации. Но что произойдёт, если увеличить контекст до 20 или 50 символов?

Первая проблема: входной вектор первого слоя линейно растёт с block_size, и вместе с ним растёт число параметров block_size * n_embd * n_embd2. Вторая, более тонкая проблема: все символы контекста смешиваются одним слоем сразу, без промежуточных стадий. Сеть должна за один шаг научиться выделять и локальные закономерности (биграммы, триграммы), и закономерности на уровне всей последовательности. Это ставит на один слой слишком много задач одновременно, и обучение получается менее эффективным: грубо говоря, сеть вынуждена одним и тем же набором весов обрабатывать и соседние буквы, и буквы, разделённые десятком позиций.

Естественное решение: не сжимать весь контекст сразу, а делать это постепенно, по уровням, объединяя сначала близкие символы, потом результаты…

План урока

  1. Проблема плоского MLP
  2. Идея иерархии: от WaveNet к дереву объединений
  3. Наш пример: слой FlattenConsecutive и иерархическая модель
  4. Связь со свёртками
  5. Рекуррентные сети в makemore.py: RNN и GRU
  6. BoW как мостик к вниманию
  7. Запуск и честное сравнение моделей
  8. Попробуйте сами

Урок входит в полный доступ. Полный текст и видео открываются после оплаты. Первые уроки каждого курса бесплатны.

Полезные гиды