Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

456    Глава 12. Генеративное глубокое обучение

12.1.4. Реализация генерации текста в Keras

Воплотим.эти.идеи.на.практике.в.реализации.с.Keras..Первое,.что.нам.пона- добится,.—.это.много.текстовых.данных,.на.которых.можно.было.бы.обучить. языковую.модель..Для.этого.можно.использовать.любой.большой.текстовый. файл.или.набор.текстовых.файлов,.например.статьи.из.«Википедии»,.роман. «Властелин.колец».и.т..д.

В.данном.примере.мы.продолжим.использовать.набор.данных.IMDB.с.отзывами.о.фильмах.из.предыдущей.главы.и.попробуем.обучить.модель.генерировать.новые.отзывы.к.никогда.не.снимавшимся.фильмам..В.результате. обучения.у.нас.получится.языковая.модель,.обладающая.специфическими. особенностями,.характерными.для.отзывов.о.фильмах,.а.не.обобщенная.модель. английского.языка.

Подготовка данных

Так.же.как.в.предыдущей.главе,.загрузим.и.распакуем.набор.данных.IMDB. с.отзывами.о.фильмах.

Листинг 12.2. Загрузка и распаковка набора данных IMDB с отзывами о фильмах

!wget https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz !tar -xf aclImdb_v1.tar.gz

Вы.уже.знакомы.со.структурой.данных:.у.нас.есть.папка.с.именем.aclImdb,.со- держащая.две.подпапки:.одна.с.негативными.отзывами.о.фильмах.и.одна.—.с.по- ложительными..Каждый.отзыв.хранится.в.отдельном.текстовом.файле..Вызовем. text_dataset_from_directory .с.параметром.label_mode=None,.чтобы.создать. объект.набора.данных,.читающий.эти.файлы.и.возвращающий.их.содержимое.

Листинг 12.3. Создание набора данных из текстовых файлов (один файл = один образец)

 

Удаление HTML-тегов <br />, встречающихся во многих обзорах.

import tensorflow as tf

Это действие не повлияет на качество классификации текста,

но нам не хотелось бы генерировать теги <br /> в примере!

from tensorflow import keras

 

dataset = keras.utils.text_dataset_from_directory(

directory="aclImdb", label_mode=None, batch_size=256)

dataset = dataset.map(lambda x: tf.strings.regex_replace(x, "<br />", " "))

Теперь.используем.слой.TextVectorization .для.составления.словаря,.с.которым.будем.работать..Извлечем.из.каждого.отзыва.только.sequence_length . первых.слов:.слой.TextVectorization.обрежет.все.остальное.при.векторизации. текста.

Создать цели смещением последовательностей на 1

12.1. Генерирование текста    457

Листинг 12.4. Подготовка слоя TextVectorization

from tensorflow.keras.layers import TextVectorization

sequence_length = 100

 

Словарь будет включать только 15 000 наиболее

 

 

употребимых слов — все остальные будут

vocab_size = 15000

 

 

 

 

интерпретироваться как несловарный токен "[UNK]"

 

 

text_vectorization = TextVectorization(

 

 

 

 

 

max_tokens=vocab_size,

 

 

 

 

 

Возвращаться должны

 

 

 

 

 

output_mode="int",

 

 

 

 

 

 

последовательные

 

 

 

 

 

 

output_sequence_length=sequence_length,

 

 

 

 

целочисленные индексы слов

)

 

 

 

 

 

Мы будем работать с входными

text_vectorization.adapt(dataset)

 

 

 

 

 

 

 

 

 

данными и целями длиной 100

 

 

 

 

 

 

(но, поскольку цели будут смещены

 

 

 

 

 

 

на 1, модель фактически будет

 

 

 

 

 

 

видеть последовательности

 

 

 

 

 

 

слов длиной 99)

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

Листинг 12.5. Настройка набора данных для языковой модели

Преобразовать пакет текстовых строк в пакет последовательностей целых чисел

def prepare_lm_dataset(text_batch):

vectorized_sequences = text_vectorization(text_batch) x = vectorized_sequences[:, :-1]

y = vectorized_sequences[:, 1:] return x, y

Создать входные данные удалением последнего слова из последовательности

lm_dataset = dataset.map(prepare_lm_dataset, num_parallel_calls=4)

Модель «последовательность в последовательность» на основе архитектуры Transformer

Наша.цель.—.обучить.модель.прогнозировать.распределение.вероятностей. для.выбора.следующего.слова.в.предложении.с.учетом.некоторого.количества.начальных.слов..После.обучения.модели.мы.дадим.ей.подсказку,.затем. выберем.следующее.слово,.добавим.его.в.конец.подсказки.и.снова.передадим. модели..И .будем .повторять .это .действие .до .тех .пор, .пока .не .сгенерируем. короткий.абзац.

По .аналогии .с .прогнозированием .температуры .в .главе .10 .можно .обучить. модель,.которая.принимает.на.входе.последовательность.из.N.слов.и.просто.

458    Глава 12. Генеративное глубокое обучение

предсказывает.слово.N +.1..Однако.этот.подход.имеет.некоторые.проблемы. в.контексте.генерации.последовательностей.

Во-первых,.такая.модель.сможет.делать.прогнозы,.только.когда.доступно.N.слов,. но.было.бы.полезно.иметь.возможность.начать.прогнозирование.с.количеством. слов.меньше.N..В.противном.случае.мы.будем.вынуждены.брать.только.относительно.длинные.подсказки.(в.нашей.реализации.N =.100.слов)..В.главе.10.мы. не.были.ограничены.таким.требованием.

Во-вторых,.многие.из.обучающих.последовательностей.будут.в.значительной. степени.перекрываться..Возьмем.для.примера.N =.4.и.текст.«Законченное.предложение.должно.содержать.как.минимум.три.члена:.подлежащее,.сказуемое. и.дополнение».для.создания.следующих.обучающих.последовательностей:

. «Законченное.предложение.должно.содержать»;

. «предложение.должно.содержать.как»;

. «должно.содержать.как.минимум»;

. и.т..д..до.последовательности.«подлежащее,.сказуемое.и.дополнение».

Модели,.интерпретирующей.каждую.такую.последовательность.как.независимый.образец,.пришлось.бы.выполнять.много.лишней.работы,.повторно.кодируя. подпоследовательности,.которые.она.уже.видела.раньше..В.главе.10.это.не.было. большой.проблемой,.ведь.у.нас.изначально.не.было.такого.количества.обучающих. образцов.и.нам.нужно.было.протестировать.полносвязные.и.сверточные.модели,. для.которых.переделка.работы.каждый.раз.—.единственный.возможный.вариант..

Мы.могли.бы.попытаться.решить.проблему.избыточности,.выбирая.подпосле- довательности.с.некоторым.шагом.—.пропуская.несколько.слов.между.двумя. последовательными.образцами..Но.это.уменьшило.бы.количество.обучающих. образцов.и.лишь.частично.решило.бы.проблему.

Чтобы.решить.обе.проблемы,.используем.модель «последовательность в последовательность»: .мы .будем .передавать .в .модель .последовательности .из. N .слов.(индексированных.от.0.до.N).и.предсказывать.последовательность,. смещенную.на.единицу.(от.1.до.N +.1)..При.этом.будем.использовать.каузальную.маскировку,.дабы.убедиться,.что.для.любого.i .модель.будет.брать.только. слова.от.0.до.i.при.предсказании.слова.i.+.1..Таким.образом,.мы.обучаем.модель. одновременно.решать.N.во.многом.перекрывающихся,.но.все.же.разных.задач:. предсказание.следующих.слов.по.последовательности.из.1 <= i <= N.предыдущих. слов.(рис..12.3)..На.этапе.генерации,.даже.если.вы.предложите.модели.только. одно.слово,.она.сможет.дать.распределение.вероятностей.для.следующих.возможных.слов.

12.1. Генерирование текста    459

Рис. 12.3. По сравнению с простым предсказанием следующего слова, при моделировании «последовательность в последовательность» оптимизируется решение сразу нескольких задач предсказания

Обратите.внимание,.что.мы.могли.бы.использовать.аналогичную.модель.«последовательность.в.последовательность».для.решения.задачи.прогнозирования.температуры.в.главе.10:.научить.модель.на.основе.последовательности.из. 120.почасовых.точек.генерировать.последовательность.из.120.температур.со. смещением.на.24.часа.в.будущем..Такая.модель.решала.бы.не.только.исходную. задачу,.но.и.119.связанных.задач.прогнозирования.температуры.за.24.часа. с.учетом.1 <= i < 120 .предыдущих.почасовых.точек.данных.

Попробовав.обучить.рекуррентную.сеть.из.главы.10.в.конфигурации.«последовательность.в.последовательность»,.вы.получили.бы.похожие,.но.постепенно. ухудшающиеся­. .результаты,.потому.что.ограничение,.требующее.решения.той.же. моделью.дополнительных.119.задач,.немного.мешает.работе.над.задачей,.которая. представляет.основной.интерес.

В.предыдущей.главе.вы.познакомились.с.обобщенным.подходом.к.обучению. типа.«последовательность.в.последовательность»,.при.котором.исходная.последовательность.передается.на.вход.кодировщика,.а.полученная.от.него.закодированная.последовательность.вместе.с.целевой.идет.в.декодер,.который. пытается.предсказать.ту.же.самую.целевую.последовательность.со.смещением. на.один.шаг..Когда.выполняется.генерация.текста,.исходная.последовательность. отсутствует:.модель.просто.пытается.предсказать.следующие.токены.в.целевой. последовательности,.учитывая.предыдущие,.что.можно.сделать,.используя. только.декодер..И.благодаря.каузальному.дополнению.декодер.будет.смотреть. только.на.слова.0....N,.чтобы.предсказать.слово.N .+ .1.

Давайте.реализуем.нашу.модель..Для.этого.повторно.используем.строительные. блоки,.созданные.в.главе.11:.PositionalEmbedding .и.TransformerDecoder.