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

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

11.3.3. Обработка слов как последовательностей: модели последовательностей

Последние.примеры.наглядно.демонстрируют,.что.порядок.слов.имеет.значение:. создание.таких.основанных.на.порядке.признаков,.как.биграммы,.дало.хороший. прирост.точности..Теперь.давайте.вспомним,.чему.учит.история.глубокого.обучения:.необходимо.отходить.от.ручного.проектирования.признаков.и.переходить. к.моделям,.способным.самостоятельно.изучать.признаки,.основываясь.только. на.данных..А.что,.если.вместо.конструирования.вручную.признаков,.учитывающих.порядок.слов,.передать.модели.необработанную.последовательность.слов. и.позволить.ей.самой.определить.наиболее.информативные.признаки?.Именно. так.действуют.модели последовательностей.

Чтобы.реализовать.модель.последовательности,.необходимо.сначала.представить. входные.образцы.в.виде.последовательностей.целочисленных.индексов.(одно. целое.число.соответствует.одному.слову)..Затем.каждое.целое.число.нужно. отобразить.в.вектор,.чтобы.получить.последовательности.векторов..И.наконец,. эти.последовательности.векторов.следует.передать.в.стек.слоев,.которые.смогут. оценить.коррелирующие.признаки.из.соседних.векторов,.как.это.делают,.например,.одномерная.сверточная.сеть,.рекуррентная.нейронная.сеть.или.архитектура. Transformer.

Некоторое.время.тому.назад.(примерно.в.2016–2017.годах).двунаправленные. рекуррентные.сети.(в.частности,.двунаправленные.сети.LSTM).считались. высшим.достижением.методики.моделирования.последовательностей..Вы.уже. знакомы.с.этой.архитектурой.—.поэтому.в.наших.первых.примерах.модели. последовательности.мы.используем.именно.ее..Однако.в.настоящее.время. моделирование.последовательностей.почти.повсеместно.выполняется.с.помощью.архитектуры.Transformer,.о.которой.мы.поговорим.ниже..Как.ни.странно,. одномерные.сверточные.сети.никогда.не.пользовались.особой.популярностью. в.обработке.естественного.языка,.хотя,.по.моему.собственному.опыту,.стек. одномерных.сверток.с.разделением.по.глубине.и.остаточными.связями.может. достигать.уровня,.сопоставимого.с.двунаправленной.сетью.LSTM,.при.значительном.снижении.вычислительных.затрат.

Первый практический пример

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

Затем .сконструируем .модель..Самый .простой .способ .преобразовать .цело- численные.последовательности.в.векторные.—.прямое.кодирование.(каждое. измерение.будет.представлять.одно.возможное.слово.в.словаре)..Поверх.этих. векторов.прямого.кодирования.добавим.простой.двунаправленный.слой.LSTM.

Один вход — последовательность целых чисел

11.3. Два подхода к представлению групп слов    407

Листинг 11.12. Подготовка наборов данных с целочисленными последовательностями

from tensorflow.keras import layers

max_length = 600 max_tokens = 20000

text_vectorization = layers.TextVectorization( max_tokens=max_tokens,

output_mode="int", output_sequence_length=max_length,

)

text_vectorization.adapt(text_only_train_ds)

int_train_ds = train_ds.map(

lambda x, y: (text_vectorization(x), y)), num_parallel_calls=4)

int_val_ds = val_ds.map(

lambda x, y: (text_vectorization(x), y), num_parallel_calls=4)

int_test_ds = test_ds.map(

lambda x, y: (text_vectorization(x), y), num_parallel_calls=4)

Чтобы сохранить контроль над размером входа, мы ограничиваем длину

последовательностей 600 словами. Это разумный выбор, так как средняя длина отзыва составляет 233 слова, и только 5 % отзывов длиннее 600 слов

Листинг 11.13. Модель последовательности, принимающая последовательность векторов прямого кодирования

import tensorflow as tf

inputs = keras.Input(shape=(None,), dtype="int64") embedded = tf.one_hot(inputs, depth=max_tokens) x = layers.Bidirectional(layers.LSTM(32))(embedded) x = layers.Dropout(0.5)(x)

outputs = layers.Dense(1, activation="sigmoid")(x) model = keras.Model(inputs, outputs) model.compile(optimizer="rmsprop",

loss="binary_crossentropy", metrics=["accuracy"])

model.summary()

Кодируем целые числа в 20 000-мерные бинарные векторы

Добавляем

двунаправленный слой LSTM

Наконец, добавляем слой классификации

Теперь.обучим.нашу.модель.

Листинг 11.14. Обучение первой простой модели последовательности

callbacks = [ keras.callbacks.ModelCheckpoint("one_hot_bidir_lstm.keras",

save_best_only=True)

]

model.fit(int_train_ds, validation_data=int_val_ds, epochs=10, callbacks=callbacks)

model = keras.models.load_model("one_hot_bidir_lstm.keras") print(f"Test acc: {model.evaluate(int_test_ds)[1]:.3f}")

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

Первое.наблюдение:.эта.модель.обучается.очень.медленно,.особенно.в.сравнении. с.облегченной.моделью.из.предыдущего.раздела..Причина.в.большом.объеме. входных.данных:.каждый.входной.образец.кодируется.как.матрица.с.формой. (600, 20000).(600.слов,.20.000.возможных.слов).—.а.это.12.000.000.вещественных. чисел.на.один.обзор.фильма..У.нашей.двунаправленной.сети.LSTM.много.работы.. Второе.наблюдение:.модель.достигла.точности.всего.87.%.—.значительно.ниже. нашей.(очень.быстрой).модели,.обученной.на.бинарных.униграммах.

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

Векторные представления слов

Важно.отметить,.что,.выбирая.метод.прямого.кодирования,.вы.принимаете. решение.из.области.конструирования.признаков..Вы.вводите.в.свою.модель. фундаментальное.предположение.о.структуре.пространства.признаков,.утверждая,. что.разные токены не зависят друг от друга,.—.и.действительно,.все.векторы,. получаемые.методом.прямого.кодирования,.друг.другу.ортогональны..Но.в.случае.со.словами.это.предположение.явно.неверное..Слова.образуют.структурированное.пространство:.они.взаимно.обмениваются.информацией..Слова.«кино». и.«фильм».взаимозаменяемы.в.большинстве.предложений,.поэтому.вектор,. представляющий.«кино»,.не.ортогонален.вектору,.представляющему.«фильм»,.—. они.должны.быть.одинаковыми.или.достаточно.близкими.

Говоря.более.абстрактно,.геометрические отношения.между.векторами.должны. отражать.семантические связи.между.соответствующими.им.словами..Например,.от.правильно.сконструированного.пространства.векторных.представлений. разумно.ожидать,.что.синонимы.будут.представлены.похожими.векторами;. и.в.целом.геометрическое.расстояние.(такое.как.косинусное.расстояние.или. L2-расстояние).между.любыми.двумя.векторами.будет.зависеть.от.«семанти- ческого.расстояния».между.соответствующими.словами..Слова.с.далеким.друг. от.друга.смыслом.должны.быть.представлены.далекими.друг.от.друга.точками,. а.слова.со.схожим.смыслом.—.близкими.

Векторные представления.(word.embeddings).обладают.этим.свойством.в.полной.мере:.они.отображают.человеческий.язык.в.геометрическое.пространство.

В.отличие.от.векторов,.полученных.прямым.кодированием,.—.бинарных,.раз- реженных.(почти.полностью.состоящих.из.нулей).и.с.большой.размерностью. (их.размерность.совпадает.с.количеством.слов.в.словаре),.—.векторные.пред- ставления.слов.являются.малоразмерными.векторами.вещественных.чисел. (то.есть.плотными.векторами,.в.противоположность.разреженным),.как.показано.на.рис..11.2..При.работе.с.огромными.словарями.размерность.векторов. слов.нередко.может.достигать.256,.512.или.1024..С.другой.стороны,.прямое.

11.3. Два подхода к представлению групп слов    409

кодирование.слов.обычно.влечет.создание.векторов.с.числом.измерений.20.000. или.больше.(при.использовании.словаря.с.20.000.токенов,.как.в.данном.случае).. Иначе.говоря,.векторное.представление.слов.позволяет.уместить.больший.объем. информации.в.меньшее.число.измерений.

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

размерностей, тогда как векторные представления — плотные, относительно малоразмерные и конструируются на основе данных

Векторные.представления.слов.не.только.плотные,.но.также.структурированные,.

и.их.структура.формируется.на.основе.данных..Похожие.слова.не.только.ока-

зываются.поблизости.друг.от.друга,.но.также.наделяют.

 

определенным.смыслом.конкретные.направления.в.про-

 

странстве.векторов..Поясню.это.на.примере.

 

На .рис..11.3 .изображена .двумерная .плоскость .с .че-

 

тырьмя .векторными .представлениями .слов: .кошка,.

 

собака,.волк.и.тигр..С.выбранными.здесь.векторными.

 

представлениями.некоторые.семантические.отношения.

 

между.словами.можно.выразить.в.виде.геометрических.

 

преобразований..Например,.один.и.тот.же.вектор.позво-

Рис. 11.3. Упрощенный

ляет.перейти.от.кошки.к.тигру.и.от.собаки.к.волку:.этот.

пример векторного

вектор.можно.было.бы.интерпретировать.как.вектор.

пространства слов

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

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

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

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

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

.Загрузить.в.модель.векторные.представления,.полученные.с.использованием. другой.задачи.машинного.обучения,.отличной.от.решаемой..Такие.представления.называют.предварительно обученными векторными представлениями слов.

Рассмотрим.оба.способа.

Конструирование векторных представлений слов с помощью слоя Embedding

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

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

11.3. Два подхода к представлению групп слов    411

ошибки.помогает.легко.добиться.этого,.а.Keras.еще.больше.упрощает.реализацию..Речь.идет.об.обучении.весов.слоя:.в.данном.случае.слоя.Embedding.

Листинг 11.15. Создание слоя Embedding

embedding_layer = layers.Embedding(input_dim=max_tokens, output_dim=256)

Слой Embedding принимает как минимум два аргумента: количество возможных токенов и размерность пространства (в данном случае 256)

Слой.Embedding .лучше.всего.воспринимать.как.словарь,.отображающий.целочисленные.индексы.(обозначающие.конкретные.слова).в.плотные.векторы..

Он.принимает.целые.числа.на.входе,.отыскивает.их.во.внутреннем.словаре. и.возвращает.соответствующие.векторы..Это.эффективная.операция.поиска. в.словаре.(рис..11.4).

Рис. 11.4. Слой Embedding

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

При.создании.слоя.Embedding .его.веса.(внутренний.словарь.векторов.токенов). инициализируются.случайными.значениями,.как.в.случае.с.любым.другим.слоем..В.процессе.обучения.векторы.слов.постепенно.корректируются.посредством. обратного.распространения.ошибки,.и.пространство.превращается.в.структурированную.модель,.пригодную.к.использованию..После.полного.обучения.пространство.векторов.приобретет.законченную.структуру,.специализированную. под.решение.конкретной.задачи.

Давайте.построим.модель,.включающую.слой.Embedding,.и.применим.ее.для. решения.нашей.задачи.

Листинг 11.16. Модель, использующая слой Embedding, и ее обучение с нуля

inputs = keras.Input(shape=(None,), dtype="int64")

embedded = layers.Embedding(input_dim=max_tokens, output_dim=256)(inputs) x = layers.Bidirectional(layers.LSTM(32))(embedded)

x = layers.Dropout(0.5)(x)

outputs = layers.Dense(1, activation="sigmoid")(x) model = keras.Model(inputs, outputs) model.compile(optimizer="rmsprop",

loss="binary_crossentropy",

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

metrics=["accuracy"])

model.summary()

callbacks = [ keras.callbacks.ModelCheckpoint("embeddings_bidir_gru.keras",

save_best_only=True)

]

model.fit(int_train_ds, validation_data=int_val_ds, epochs=10, callbacks=callbacks)

model = keras.models.load_model("embeddings_bidir_gru.keras") print(f"Test acc: {model.evaluate(int_test_ds)[1]:.3f}")

Эта.модель.обучается.намного.быстрее.модели.с.прямым.кодированием.(потому. что.слой.LSTM.обрабатывает.лишь.256-мерные.векторы.вместо.20.000-мерных). и.достигла.сопоставимой.точности.на.контрольных.данных.(87.%)..Однако.мы. все.еще.далеки.от.уровня.базовой.биграммной.модели..Причина.отчасти.заключается.в.том,.что.эта.модель.получает.немного.меньше.данных:.модель.на.основе. биграмм.обрабатывала.полные.обзоры,.тогда.как.модель.последовательностей. ограничивала.последовательности.600.словами.

Заполнение и маскировка

Есть.еще.одно.обстоятельство,.вредящее.модели,.—.наши.входные.последова- тельности.полны.нулей..Это.обусловлено.использованием.параметра.output_ sequence_length=max_length.в.конструкторе.слоя.TextVectorization.(со.значением. max_length,.равным.600):.отзывы.длиннее.600.токенов.усекаются.до.этой.величины,. а.отзывы.короче.600.токенов.дополняются.в.конце.нулями,.чтобы.их.можно.было. объединить.с.другими.последовательностями.в.непрерывные.пакеты.

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

Нам.нужен.какой-то.способ.сообщить.слою,.что.он.должен.пропустить.подобные. итерации..И.такой.способ.есть:.API.маскирования.

Слой.Embedding .способен.сгенерировать.маску,.соответствующую.его.входным. данным..Она.имеет.вид.тензора.из.единиц.и.нулей.(или.логических.значений.

True/False).с.формой.(размер_пакета, длина_последовательности),.элемент. mask[i, t] .которого.указывает,.следует.ли.пропустить.временной.шаг.t .в.образце.i .(временной.шаг.пропускается,.если.элемент.mask[i, t] .равен.0 .или.False,. и.обрабатывается.в.противном.случае).

11.3. Два подхода к представлению групп слов    413

По.умолчанию.эта.возможность.отключена.—.ее.можно.включить,.передав. параметр.mask_zero=True .слою.Embedding..Получить.маску.можно.с.помощью. метода.calculate_mask():

>>>embedding_layer = Embedding(input_dim=10, output_dim=256, mask_zero=True)

>>>some_input = [

...

[4,

3,

2,

1, 0, 0, 0],

...

[5,

4,

3,

2, 1, 0, 0],

...

[2,

1,

0,

0, 0, 0, 0]]

>>> mask

= embedding_layer.compute_mask(some_input)

<tf.Tensor: shape=(3, 7), dtype=bool, numpy=

array([[

True,

True, True, True, False, False, False],

 

[

True,

True, True, True, True, False, False],

 

[

True,

True, False, False, False, False, False]])>

На.практике.вам.редко.придется.управлять.масками.вручную:.Keras.автоматически.передает.маску.каждому.слою,.готовому.ее.обработать.(в.виде.фрагмента. метаданных,.прикрепленного.к.последовательности,.которую.он.представляет).. Эта.маска.будет.использоваться.рекуррентными.слоями.для.пропуска.замаскированных.шагов..Если.модель.возвращает.всю.последовательность,.то.маску. также.применит.функция.потерь.для.пропуска.замаскированных.шагов.в.выходной.последовательности.

Попробуем.переобучить.нашу.модель.с.включенной.маскировкой.

Листинг 11.17. Использование слоя Embedding с включенной маскировкой

inputs = keras.Input(shape=(None,), dtype="int64") embedded = layers.Embedding(

input_dim=max_tokens, output_dim=256, mask_zero=True)(inputs) x = layers.Bidirectional(layers.LSTM(32))(embedded)

x = layers.Dropout(0.5)(x)

outputs = layers.Dense(1, activation="sigmoid")(x) model = keras.Model(inputs, outputs) model.compile(optimizer="rmsprop",

loss="binary_crossentropy", metrics=["accuracy"])

model.summary()

callbacks = [ keras.callbacks.ModelCheckpoint("embeddings_bidir_gru_with_masking.keras",

save_best_only=True)

]

model.fit(int_train_ds, validation_data=int_val_ds, epochs=10, callbacks=callbacks)

model = keras.models.load_model("embeddings_bidir_gru_with_masking.keras") print(f"Test acc: {model.evaluate(int_test_ds)[1]:.3f}")

Модель.достигла.точности.88.%.на.контрольных.данных.—.небольшое,.но.за- метное.улучшение.

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

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

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

Такие.векторные.представления.обычно.вычисляются.с.использованием.статистик.встречаемости.слов.(наблюдений.совместной.встречаемости.слов.в.предложениях.или.документах).и.применением.разнообразных.методик:.иногда. с.привлечением.нейронных.сетей,.иногда.—.нет..Идея.плотных,.малоразмерных. пространств.векторных.представлений.слов,.обучаемых.без.учителя,.первона- чально.была.исследована.Йошуа.Бенгио.с.коллегами.в.начале.2000-х.годов1,.но. более.основательное.ее.изучение.и.практическое.применение.начались.только. после.выхода.одной.из.самых.известных.и.успешных.схем.реализации.векторного.представления.слов:.алгоритма.Word2Vec.(https://code.google.com/archive/p/ word2vec),.разработанного.в.2013.году.Томасом.Миколовым.из.компании.Google..

Измерения.Word2Vec.охватывают.такие.семантические.признаки,.как.пол.

Существует.множество.разнообразных.предварительно.обученных.векторных. представлений.слов,.которые.можно.загрузить.и.использовать.в.слое.Embedding.. Word2Vec.—.одно.из.них..Другое.популярное.представление.называется.«гло- бальные.векторы.представления.слов».(Global.Vectors.for.Word.Representation,. GloVe,.https://nlp.stanford.edu/projects/glove).и.разработано.исследователями.из. Стэнфорда.в.2014.году..Это.представление.основано.на.факторизации.матрицы. статистик.совместной.встречаемости.слов..Его.создатели.включили.в.представление.миллионы.токенов.из.английского.языка,.полученных.из.«Википедии». и.данных.компании.Common.Crawl.

Давайте.посмотрим,.как.можно.использовать.представления.GloVe.в.моделях. Keras..Ту.же.методику.можно.применить.к.Word2Vec.и.другим.предварительно. обученным.векторным.представлениям.слов..Начнем.с.загрузки.файлов.GloVe.

1. Bengio Y. et al..A.Neural.Probabilistic.Language.Model.//.Journal.of.Machine.Learning. Research,.2003.

11.3. Два подхода к представлению групп слов    415

и.их.анализа..Затем.загрузим.векторы.слов.в.слой.Embedding,.который.будем. использовать.для.построения.новой.модели.

Прежде.всего.загрузим.векторные.представления,.предварительно.обученные. на.данных.из.англоязычной.«Википедии».за.2014.год..Этот.ZIP-архив.размером. 822.Мбайт.с.именем.glove.6B.zip .содержит.100-мерные.векторы.с.400.000.слов. (а.также.токенов,.не.являющихся.словами).

!wget http://nlp.stanford.edu/data/glove.6B.zip !unzip -q glove.6B.zip

Обработаем.распакованный.файл..txt.и.создадим.индекс,.отображающий.слова. (в.виде.строк).в.их.векторные.представления.

Листинг 11.18. Обработка файла с векторными представлениями слов GloVe

import numpy as np

path_to_glove_file = "glove.6B.100d.txt"

embeddings_index = {}

with open(path_to_glove_file) as f: for line in f:

word, coefs = line.split(maxsplit=1)

coefs = np.fromstring(coefs, "f", sep=" ") embeddings_index[word] = coefs

print(f"Found {len(embeddings_index)} word vectors.")

Теперь.создадим.матрицу.векторных.представлений,.которую.можно.будет. передать.на.вход.слоя.Embedding..Это.должна.быть.матрица.с.формой.(макси-

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

Листинг 11.19. Подготовка матрицы векторных представлений слов GloVe

embedding_dim = 100

Получаем словарь, проиндексированный

 

 

 

 

Используем его, чтобы

 

 

 

 

нашим предыдущим слоем TextVectorization

 

 

 

 

создать словарь,

 

 

 

 

 

vocabulary = text_vectorization.get_vocabulary()

 

 

 

 

 

 

отображающий

 

 

 

 

 

слова в их индексы

word_index = dict(zip(vocabulary, range(len(vocabulary))))

 

 

в vocabulary

 

embedding_matrix = np.zeros((max_tokens, embedding_dim))

 

Подготавливаем

 

for word, i in word_index.items():

 

 

 

 

 

 

 

 

матрицу

if i < max_tokens:

 

 

 

 

 

 

 

 

для заполнения

embedding_vector = embeddings_index.get(word)

 

 

 

 

векторами GloVe

if embedding_vector is not None:

 

 

 

Заполняем i-й элемент матрицы

embedding_matrix[i] = embedding_vector

 

 

 

 

 

 

 

 

вектором слова с индексом i.

 

 

 

 

 

Векторы для слов, не найденных

 

 

 

 

 

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

 

 

 

 

 

будут заполнены нулями

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

Наконец,.мы.используем.инициализатор.Constant.для.загрузки.предварительно. обученных.векторных.представлений.в.слой.Embedding..Чтобы.не.разрушить. эти .представления .во .время .обучения, .заморозим .слой, .добавив .параметр. trainable=False:

embedding_layer = layers.Embedding( max_tokens,

embedding_dim, embeddings_initializer=keras.initializers.Constant(embedding_matrix), trainable=False,

mask_zero=True,

)

Теперь.мы.готовы.обучить.новую.модель.—.идентичную.предыдущей,.но.ис- пользующую.100-мерные.предварительно.обученные.векторные.представления. GloVe.вместо.128-мерных.представлений,.сконструированных.нами.

Листинг 11.20. Модель, использующая предварительно обученный слой Embedding

inputs = keras.Input(shape=(None,), dtype="int64") embedded = embedding_layer(inputs)

x = layers.Bidirectional(layers.LSTM(32))(embedded) x = layers.Dropout(0.5)(x)

outputs = layers.Dense(1, activation="sigmoid")(x) model = keras.Model(inputs, outputs) model.compile(optimizer="rmsprop",

loss="binary_crossentropy", metrics=["accuracy"]) model.summary()

callbacks = [ keras.callbacks.ModelCheckpoint("glove_embeddings_sequence_model.keras",

save_best_only=True)

]

model.fit(int_train_ds, validation_data=int_val_ds, epochs=10, callbacks=callbacks)

model = keras.models.load_model("glove_embeddings_sequence_model.keras") print(f"Test acc: {model.evaluate(int_test_ds)[1]:.3f}")

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