|
|
||
|---|---|---|
| .. | ||
| lab | ||
| GenerativePyTorch.ipynb | ||
| GenerativeTF.ipynb | ||
| README.md | ||
README.md
Генеративные сети
Тест перед лекцией
Рекуррентные нейронные сети (RNN) и их модификации с управляемыми ячейками, такие как ячейки долгой краткосрочной памяти (LSTM) и управляемые рекуррентные блоки (GRU), предоставляют механизм для языкового моделирования, так как они могут изучать порядок слов и предсказывать следующее слово в последовательности. Это позволяет использовать RNN для генеративных задач, таких как обычная генерация текста, машинный перевод и даже создание подписей к изображениям.
✅ Подумайте о том, как часто вы пользуетесь генеративными задачами, например, автозаполнением текста при вводе. Исследуйте свои любимые приложения, чтобы узнать, используют ли они RNN.
В архитектуре RNN, которую мы обсуждали в предыдущем модуле, каждая единица RNN выдавала следующее скрытое состояние в качестве выхода. Однако мы также можем добавить еще один выход к каждой рекуррентной единице, что позволит выдавать последовательность (равную по длине исходной последовательности). Более того, мы можем использовать RNN-единицы, которые не принимают входные данные на каждом шаге, а только начальный вектор состояния, и затем генерируют последовательность выходных данных.
Это позволяет создавать различные нейронные архитектуры, которые показаны на изображении ниже:
Изображение из статьи Unreasonable Effectiveness of Recurrent Neural Networks Андрея Карпати (Andrej Karpathy)
- One-to-one — это традиционная нейронная сеть с одним входом и одним выходом.
- One-to-many — это генеративная архитектура, которая принимает одно входное значение и генерирует последовательность выходных значений. Например, если мы хотим обучить сеть для создания подписей к изображениям, которая будет генерировать текстовое описание картинки, мы можем подать изображение на вход, пропустить его через CNN для получения скрытого состояния, а затем использовать рекуррентную цепочку для генерации подписи слово за словом.
- Many-to-one соответствует архитектурам RNN, которые мы описывали в предыдущем модуле, например, для классификации текста.
- Many-to-many, или sequence-to-sequence, соответствует задачам, таким как машинный перевод, где первая RNN собирает всю информацию из входной последовательности в скрытое состояние, а другая RNN разворачивает это состояние в выходную последовательность.
В этом модуле мы сосредоточимся на простых генеративных моделях, которые помогают нам генерировать текст. Для упрощения мы будем использовать токенизацию на уровне символов.
Мы будем обучать эту RNN генерировать текст шаг за шагом. На каждом шаге мы будем брать последовательность символов длиной nchars и просить сеть сгенерировать следующий символ для каждого входного символа:
При генерации текста (во время инференса) мы начинаем с некоторого запроса, который передается через ячейки RNN для генерации промежуточного состояния, а затем из этого состояния начинается генерация. Мы генерируем по одному символу за раз, передаем состояние и сгенерированный символ в следующую ячейку RNN для генерации следующего символа, пока не будет сгенерировано достаточное количество символов.
Изображение автора
✍️ Упражнения: Генеративные сети
Продолжите обучение в следующих ноутбуках:
Мягкая генерация текста и температура
Выход каждого узла RNN — это распределение вероятностей символов. Если мы всегда будем выбирать символ с наивысшей вероятностью в качестве следующего символа в сгенерированном тексте, текст может начать "зацикливаться" на одних и тех же последовательностях символов, как в этом примере:
today of the second the company and a second the company ...
Однако, если мы посмотрим на распределение вероятностей для следующего символа, может оказаться, что разница между несколькими наивысшими вероятностями незначительна, например, один символ может иметь вероятность 0.2, а другой — 0.19 и т.д. Например, при выборе следующего символа в последовательности 'play', следующим символом может быть как пробел, так и e (как в слове player).
Это приводит нас к выводу, что не всегда "справедливо" выбирать символ с наивысшей вероятностью, так как выбор второго по вероятности символа также может привести к осмысленному тексту. Более разумно выбирать случайным образом символы из распределения вероятностей, предоставленного выходом сети. Мы также можем использовать параметр температура, который сглаживает распределение вероятностей, если мы хотим добавить больше случайности, или делает его более крутым, если мы хотим придерживаться символов с наивысшей вероятностью.
Изучите, как реализована эта мягкая генерация текста, в ноутбуках, указанных выше.
Заключение
Хотя генерация текста может быть полезна сама по себе, основное преимущество заключается в возможности генерировать текст с помощью RNN из некоторого начального вектора признаков. Например, генерация текста используется в машинном переводе (sequence-to-sequence, где вектор состояния от энкодера используется для генерации или декодирования переведенного сообщения) или для создания текстового описания изображения (в этом случае вектор признаков поступает от CNN-экстрактора).
🚀 Задание
Пройдите несколько уроков на Microsoft Learn по этой теме:
- Генерация текста с PyTorch/TensorFlow
Тест после лекции
Обзор и самостоятельное изучение
Вот несколько статей для расширения ваших знаний:
- Различные подходы к генерации текста с использованием цепей Маркова, LSTM и GPT-2: статья
- Пример генерации текста в документации Keras
Задание
Мы рассмотрели, как генерировать текст символ за символом. В лабораторной работе вы изучите генерацию текста на уровне слов.

