О чём урок
Восьмой урок возвращает нас к 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. Вторая, более тонкая проблема: все символы контекста смешиваются одним слоем сразу, без промежуточных стадий. Сеть должна за один шаг научиться выделять и локальные закономерности (биграммы, триграммы), и закономерности на уровне всей последовательности. Это ставит на один слой слишком много задач одновременно, и обучение получается менее эффективным: грубо говоря, сеть вынуждена одним и тем же набором весов обрабатывать и соседние буквы, и буквы, разделённые десятком позиций.
Естественное решение: не сжимать весь контекст сразу, а делать это постепенно, по уровням, объединяя сначала близкие символы, потом результаты…
План урока
- Проблема плоского MLP
- Идея иерархии: от WaveNet к дереву объединений
- Наш пример: слой FlattenConsecutive и иерархическая модель
- Связь со свёртками
- Рекуррентные сети в makemore.py: RNN и GRU
- BoW как мостик к вниманию
- Запуск и честное сравнение моделей
- Попробуйте сами
Урок входит в полный доступ. Полный текст и видео открываются после оплаты. Первые уроки каждого курса бесплатны.