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

432    Глава 11. Глубокое обучение для текста

(отношение.12.500),.предпочтительнее.взять.кодировщик.Transformer..Взглянем. на.задачу.классификации.отзывов.к.фильмам.IMDB.в.свете.этой.закономерности..У.нас.имелось.20.000.обучающих.образцов.с.233.словами.в.среднем,.поэтому.согласно.нашему.эмпирическому.правилу.стоило.использовать.модель. биграмм.—.что.и.подтвердилось.на.практике.

Причина.этого.интуитивно.понятна:.входные.данные.моделей.последовательностей.определяют.более.богатое.и.сложное.пространство,.поэтому.необходимо. больше.данных.для.его.отображения;.простое.множество.(мешок).терминов.—. это.настолько.простое.пространство,.что.на.нем.можно.обучить.логистическую. регрессию,.используя.всего.несколько.сотен.или.тысяч.образцов..Кроме.того,. чем.короче.образцы,.тем.в.меньшей.степени.модель.может.позволить.себе.от- брасывать.какую-либо.информацию.—.в.частности,.порядок.слов.приобретает. дополнительную.важность.и.его.отбрасывание.может.создать.двусмысленность..

Предложения.This movie is the bomb.и.This movie was a bomb1 .имеют.очень.близкие. представления.униграмм,.что.может.запутать.модель.мешка.слов,.но.модель. последовательностей.точно.укажет,.какое.из.них.отрицательное,.а.какое.положительное..С.увеличением.длины.образцов.статистика.по.словам.становится. более.надежной,.а.тема.или.эмоциональная.окраска.—.более.очевидными.

Имейте.в.виду,.что.наше.правило.было.разработано.специально.для.классификации.текстов..Оно.может.не.соответствовать.другим.задачам.обработки.есте- ственного.языка.—.например,.в.машинном.переводе.архитектура.Transformer. справляется.с.очень.длинными.последовательностями.намного.лучше,.чем. рекуррентная.сеть..Кроме.того,.данная.эвристика.является.лишь.эмпирическим. правилом,.а.не.научным.законом,.поэтому.можно.ожидать,.что.она.будет.работать. в.большинстве.случаев,.но.не.во.всех.

11.5. ЗА ГРАНИЦАМИ КЛАССИФИКАЦИИ ТЕКСТА: ОБУЧЕНИЕ «ПОСЛЕДОВАТЕЛЬНОСТЬ В ПОСЛЕДОВАТЕЛЬНОСТЬ»

Теперь.у.вас.есть.все.необходимое.для.решения.большинства.задач.обработки.естественного.языка..Однако.вы.видели.практическое.применение.этих.инструментов. только.на.примере.одной.задачи:.классификации.текста..Это.чрезвычайно.популярный.случай;.тем.не.менее.сфера.обработки.естественного.языка.гораздо.шире. и.включает.не.только.классификацию..Далее.вы.приобретете.дополнительный.опыт,. познакомившись.с.моделями.типа.«последовательность.в.последовательность».

Модель.«последовательность.в.последовательность».принимает.последовательность.на.входе.(например,.предложение.или.абзац).и.преобразует.ее.в.другую.

1. Словосочетание.a bomb.носит.отрицательный.оттенок.в.отношении.кино,.а.the.bomb,.напротив,.выражает.восхищение..Фраза.This movie was a bomb.переводится.как.«Этот.фильм. потерпел.крах»,.а.This movie is the bomb.—.как.«Этот.фильм.—.бомба!»..—.Примеч. пер.

11.5. За границами классификации текста    433

последовательность..Данная.задача.лежит.в.основе.многих.успешных.приложений.обработки.естественного.языка:

.машинный перевод.—.преобразование.абзаца.на.исходном.языке.в.его.экви- валент.на.целевом.языке;

.обобщение текста.—.преобразование.длинного.документа.в.более.короткую. версию.с.сохранением.наиболее.важной.информации;

. ответы на вопросы.—.преобразование.входного.вопроса.в.ответ.на.него;

.чат-боты.—.преобразование.фразы.собеседника.в.диалоге.в.ответ.на.нее.или. всего.предыдущего.диалога.в.следующую.реплику;

.генерация текста.—.преобразование.текстовой.подсказки.в.абзац,.заверша- ющий.эту.подсказку,.и.др.

Общий.шаблон.моделей.«последовательность.в.последовательность».показан. на.рис..11.12..Во.время.обучения:

.модель.кодировщика.превращает.исходную.последовательность.в.промежуточное.представление;

.декодер.обучается.предсказывать.следующий.токен.i .в.целевой.последовательности,.просматривая.предыдущие.токены.(от.0 .до.i - 1).и.закодированную.исходную.последовательность.

Рис. 11.12. Обучение типа «последовательность в последовательность»: исходная последовательность обрабатывается кодировщиком и затем отправляется в декодер. Декодер просматривает целевую последовательность, созданную к настоящему моменту, и прогнозирует следующий шаг в будущем. Во время

прогнозирования модель генерирует целевые токены по одному и возвращает их обратно в декодер

434    Глава 11. Глубокое обучение для текста

Во.время.прогнозирования.у.нас.нет.доступа.к.целевой.последовательности.—.мы. пытаемся.предсказать.ее.с.нуля,.поэтому.ее.придется.генерировать.по.одному. токену.за.раз.

1.. Сначала.мы.получаем.от.кодировщика.закодированную.исходную.последовательность.

2.. Декодер.начинает.с.просмотра.закодированной.исходной.последовательности,.а.также.начального.токена.(например,.строки."[start]"),.и.использует. их.для.предсказания.первого.токена.в.выходной.последовательности.

3.. Прогнозируемая.в.данный.момент.последовательность.возвращается.обратно.в.декодер,.который.генерирует.следующий.токен,.и.т..д.,.пока.не.будет. сгенерирован.конечный.токен.(например,.строка."[end]").

Для.создания.модели.нового.типа.вам.пригодится.все,.что.вы.узнали.к.насто­ ящему.моменту..Углубимся.в.детали.

11.5.1. Пример машинного перевода

Рассмотрим.моделирование.типа.«последовательность.в.последовательность». на.примере.задачи.машинного.перевода..Именно.для.нее.была.разработана. архитектура.Transformer!.Начнем.с.рекуррентной.модели.последовательности. и.затем.перейдем.к.полной.архитектуре.Transformer.

За.основу.возьмем.набор.данных.переводов.с.английского.языка.на.испанский,. доступный.по.адресу.www.manythings.org/anki/..Загрузим.его:

!wget http://storage.googleapis.com/download.tensorflow.org/data/spa-eng.zip !unzip -q spa-eng.zip

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

text_file = "spa-eng/spa.txt" with open(text_file) as f:

lines = f.read().split("\n")[:-1]

text_pairs = []

Обход всех строк в файле

for line in lines:

english, spanish = line.split("\t") spanish = "[start] " + spanish + " [end]" text_pairs.append((english, spanish))

Каждая строка содержит фразу на английском языке, за которой следует

символ табуляции и затем — эквивалентная фраза на испанском языке

В начало и в конец фразы на испанском языке добавим токены

"[start]" и "[end]" соответственно, как отмечено на рис. 11.12

Подготовка функции стандартизации
строк для слоя TextVectorization, обрабатывающего текст на испанском языке: она должна сохранить квадратные скобки [ и ], но удалить ¿ (а также все другие символы из strings.punctuation)

11.5. За границами классификации текста    435

Вот.как.должно.выглядеть.содержимое.text_pairs:

>>>import random

>>>print(random.choice(text_pairs)) ("Soccer is more popular than tennis.",

"[start] El fútbol es más popular que el tenis. [end]")

Теперь.перемешаем.пары.и.разобьем.их,.как.обычно,.на.обучающий,.проверочный.и.контрольный.наборы:

import random random.shuffle(text_pairs)

num_val_samples = int(0.15 * len(text_pairs)) num_train_samples = len(text_pairs) - 2 * num_val_samples train_pairs = text_pairs[:num_train_samples]

val_pairs = text_pairs[num_train_samples:num_train_samples + num_val_samples] test_pairs = text_pairs[num_train_samples + num_val_samples:]

Далее.подготовим.два.отдельных.слоя.TextVectorization:.один.для.английского. и.один.для.испанского.языка..Нужно.настроить.предварительную.обработку. строк:

.мы.должны.сохранить.добавленные.нами.токены."[start]" .и."[end]";.по. умолчанию.символы.[ .и.] .будут.удаляться,.но.их.следует.оставить,.чтобы. различать.слово.start.и.начальный.токен."[start]";

.в.разных.языках.используются.разные.правила.пунктуации!.В.слое.TextVec­ torization .для.испанского.языка,.если.будут.удаляться.знаки.препинания,. также.следует.предусмотреть.удаление.символа.¿.

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

Листинг 11.26. Векторизация пар предложений на английском и испанском языках

import tensorflow as tf import string

import re

strip_chars = string.punctuation + "¿" strip_chars = strip_chars.replace("[", "") strip_chars = strip_chars.replace("]", "")

def custom_standardization(input_string): lowercase = tf.strings.lower(input_string) return tf.strings.regex_replace(

lowercase, f"[{re.escape(strip_chars)}]", "")

Предложения на испанском языке следует генерировать с одним дополнительным токеном, потому что во время обучения нужно сместить предложение на один шаг
Слой для обработки строк на английском языке
Слой для обработки строк на испанском языке

436    Глава 11. Глубокое обучение для текста

Для простоты ограничим словарь 15 000 наиболее часто используемых слов в каждом языке, а длину

vocab_size = 15000 предложений — 20 словами sequence_length = 20

source_vectorization = layers.TextVectorization( max_tokens=vocab_size,

output_mode="int", output_sequence_length=sequence_length,

)

target_vectorization = layers.TextVectorization( max_tokens=vocab_size,

output_mode="int", output_sequence_length=sequence_length + 1, standardize=custom_standardization,

)

train_english_texts = [pair[0] for pair in train_pairs] train_spanish_texts = [pair[1] for pair in train_pairs] source_vectorization.adapt(train_english_texts)

target_vectorization.adapt(train_spanish_texts)

Конструирование словаря для каждого языка

Наконец,.мы.преобразуем.наши.данные.в.конвейер.tf.data,.возвращающий. кортеж.(inputs, target),.где.inputs .—.это.словарь.с.двумя.ключами:.вход.для. кодировщика.(предложение.на.английском).и.вход.для.декодера.(предложение. на.испанском),.а.target .—.предложение.на.испанском,.смещенное.на.один.шаг. вперед.

Листинг 11.27. Подготовка наборов данных для задачи машинного перевода

batch_size = 64

 

 

 

 

def format_dataset(eng, spa):

 

 

 

 

eng = source_vectorization(eng)

 

 

 

 

spa = target_vectorization(spa)

 

Входное предложение на испанском языке

return ({

 

 

"english": eng,

 

не включает последний токен, чтобы входные

"spanish": spa[:, :-1],

 

 

данные и цели имели одинаковую длину

 

 

 

 

 

}, spa[:, 1:])

 

 

Целевое испанское предложение на один

 

 

 

 

 

def make_dataset(pairs):

 

шаг впереди. Оба имеют одинаковую

 

длину (20 слов)

 

eng_texts, spa_texts = zip(*pairs)

 

 

 

 

eng_texts = list(eng_texts)

 

 

 

 

spa_texts = list(spa_texts)

 

 

 

 

dataset = tf.data.Dataset.from_tensor_slices((eng_texts, spa_texts))

dataset = dataset.batch(batch_size)

 

 

 

 

dataset = dataset.map(format_dataset, num_parallel_calls=4)

return dataset.shuffle(2048).prefetch(16).cache()

 

Применение кеширования

 

 

 

 

 

 

train_ds = make_dataset(train_pairs)

 

 

 

в памяти для увеличения

 

 

 

скорости обработки

val_ds = make_dataset(val_pairs)