Привет, Хаброжители! Обработка текстов на естественном языке (Natural Language Processing, NLP) — крайне важная задача в области искусственного интеллекта. Успешная реализация делает возможными такие продукты, как Alexa от Amazon и Google Translate. Эта книга поможет вам изучить PyTorch — библиотеку глубокого обучения для языка Python — один из ведущих инструментов для дата-сайентистов и разработчиков ПО, занимающихся NLP. Делип Рао и Брайан Макмахан введут вас в курс дел с NLP и алгоритмами глубокого обучения. И покажут, как PyTorch позволяет реализовать приложения, использующие анализ текста.

В этой книге • Вычислительные графы и парадигма обучения с учителем. • Основы оптимизированной библиотеки PyTorch для работы с тензорами. • Обзор традиционных понятий и методов NLP. • Упреждающие нейронные сети (многослойный перцептрон и другие). • Улучшение RNN при помощи долгой краткосрочной памяти (LSTM) и управляемых рекуррентных блоков • Предсказание и модели преобразования последовательностей. • Паттерны проектирования NLP-систем, используемых в продакшене.

Отрывок. Вложение слов и прочих типов


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

В основе успешного применения глубокого обучения в NLP лежит представление дискретных типов данных (например, слов) в виде плотных (dense) векторов. Термины «обучение представлениям» (representation learning) и «вложение» (embedding) означают обучение отображению/представлению из дискретного типа данных в точку векторного пространства. Если дискретные типы представляют собой слова, то плотное векторное представление называется вложением слов (word embedding). Мы уже встречали примеры методов вложения на основе количества вхождений, например TF-IDF («частотность терма — обратная частотность документа») в главе 2. В этой главе мы сосредоточим внимание на методах вложения на основе обучения и методах вложения на основе предсказания (см. статью Барони и др. [Baroni et al., 2014]), в которых обучение представлениям производится путем максимизации целевой функции для конкретной задачи обучения; например, предсказания слова по контексту. Методы вложения на основе обучения в настоящий момент являются стандартом благодаря широкой применимости и высокой эффективности. На самом деле вложения слов в задачах NLP так распространены, что их называют «сирача NLP» (sriracha of NLP), поскольку можно ожидать, что их использование в любой задаче обеспечит повышение эффективности решения. Но это прозвище немного вводит в заблуждение, ведь, в отличие от сирачи, вложения обычно не добавляются в модель постфактум, а представляют собой ее базовый компонент.

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

Зачем нужно обучение вложениям


В предыдущих главах мы продемонстрировали вам обычные методы создания векторных представлений слов. А именно, вы узнали, как использовать унитарные представления — векторы длиной, совпадающей с размером словаря, с нулями на всех позициях, кроме одной, содержащей значение 1, соответствующее конкретному слову. Кроме того, вы встречались с представлениями количеств вхождений — векторами длиной, равной числу уникальных слов в модели, содержащими количества вхождений слов в предложение на соответствующих позициях. Такие представления называются также дистрибутивными (distributional representations), поскольку их значимое содержание/смысл отражается несколькими измерениями вектора. История дистрибутивных представлений насчитывает уже много десятилетий (см. статью Ферта [Firth, 1935]), они отлично подходят для множества моделей машинного обучения и нейронных сетей. Эти представления конструируются эвристически1, а не обучаются на данных.

Распределенные представления (distributed representation) получили свое название оттого, что слова в них представлены плотным вектором намного меньшей размерности (допустим, d=100 вместо размера всего словаря, который может быть порядка ), а смысл и другие свойства слова распределены по нескольким измерениям этого плотного вектора.

У низкоразмерных плотных представлений, полученных в результате обучения, есть несколько преимуществ по сравнению с унитарными и содержащими количества вхождений векторами, с которыми мы сталкивались в предыдущих главах. Во-первых, понижение размерности эффективно с вычислительной точки зрения. Во-вторых, представления на основе количества вхождений приводят к векторам высокой размерности с излишним кодированием одной и той же информации в различных измерениях, и их статистическая мощность не слишком велика. В-третьих, слишком большая размерность входных данных может привести к проблемам при машинном обучении и оптимизации — феномен, часто называемый проклятием размерности (http://bit.ly/2CrhQXm). Для решения этой проблемы с размерностью применяются различные способы понижения размерности, например сингулярное разложение (singular-value decomposition, SVD) и метод главных компонентов (principal component analysis, PCA), но, по иронии судьбы, эти подходы плохо масштабируются на размерности порядка миллионов (типичный случай в NLP). В-четвертых, представления, усвоенные из (или подогнанные на основе) относящихся к конкретной задаче данных, оптимально подходят именно для этой задачи. В случае эвристических алгоритмов вроде TF-IDF и методов понижения размерности наподобие SVD непонятно, подходит ли для конкретной задачи целевая функция оптимизации при таком способе вложения.

Эффективность вложений


Чтобы понять, как работают вложения, рассмотрим пример унитарного вектора, на который умножается матрица весов в линейном слое, как показано на рис. 5.1. В главах 3 и 4 размер унитарных векторов совпадал с размером словаря. Вектор называется унитарным потому, что содержит 1 на позиции, соответствующей конкретному слову, указывая таким образом на его наличие.


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

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

Еще одно, последнее примечание относительно эффективности вложений: несмотря на пример с рис. 5.1, где размерность матрицы весов совпадает с размерностью входного унитарного вектора, так бывает далеко не всегда. На самом деле вложения часто применяются для представления слов из пространства меньшей размерности, чем понадобилось бы при использовании унитарного вектора или представления количества вхождений. Типичный размер вложений в научных статьях — от 25 до 500 измерений, причем выбор конкретного значения сводится к объему доступной памяти GPU.

Подходы к обучению вложениям слов


Задача этой главы — не научить вас конкретным методикам вложений слов, а помочь разобраться, что такое вложения, как и где их можно применять, как лучше использовать их в моделях, а также каковы их ограничения. Дело в том, что на практике редко приходится писать новые алгоритмы обучения вложениям слов. Однако в данном подразделе мы сделаем краткий обзор современных подходов к такому обучению. Обучение во всех методах вложения слов производится с помощью одних только слов (то есть немаркированных данных), однако с учителем. Это становится возможно благодаря созданию вспомогательных задач обучения с учителем, в которых данные маркируются неявно, из тех соображений, что оптимизированное для решения вспомогательной задачи представление должно захватывать множество статистических и лингвистических свойств корпуса текста, чтобы приносить хоть какую-то пользу. Вот несколько примеров подобных вспомогательных задач.

  • Предсказать следующее слово по заданной последовательности слов. Носит также название задачи моделирования языка (language modelling).
  • Предсказать пропущенное слово по словам, расположенным до и после него.
  • Предсказать слова в рамках определенного окна, независимо от позиции, по заданному слову.

Конечно, этот список не полон и выбор вспомогательной задачи зависит от интуиции разработчика алгоритма и вычислительных затрат. В числе примеров GloVe, непрерывное мультимножество слов (Continuous Bag-of-Words, CBOW), Skipgrams и т. д. Подробности можно найти в главе 10 книги Голдберга (Goldberg, 2017), но модель CBOW мы вкратце обсудим здесь. Впрочем, в большинстве случаев вполне достаточно воспользоваться предобученными вложениями слов и подогнать их к имеющейся задаче.

Практическое применение предобученных вложений слов


Основная часть этой главы, а также остальная часть книги касается использования предобученных вложений слов. Предобученные с помощью одного из множества описанных выше методов на большом корпусе — например, на полном корпусе Google News, «Википедии» или Common Crawl1 — вложения слов можно свободно скачать и использовать. Далее в главе мы покажем, как грамотно находить и загружать эти вложения, изучим некоторые свойства вложений слов и приведем примеры применения предобученных вложений слов в задачах NLP.

Загрузка вложений


Вложения слов стали настолько популярными и распространенными, что для скачивания доступно множество различных их вариантов, начиная с первоначального Word2Vec2 до стэнфордского GloVe (https://stanford.io/2PSIvPZ), в том числе FastText3 компании Facebook (https://fasttext.cc/) и многие другие. Обычно вложения поставляются в следующем формате: каждая строка начинается со слова/типа, за которым идет последовательность чисел (то есть векторное представление). Длина этой последовательности равна размерности представления (размерности вложения). Размерность вложений обычно порядка сотен. Количество типов токенов чаще всего равно размеру словаря и составляет порядка миллиона. Например, вот первые семь измерений векторов dog и cat из GloVe.


Для эффективной загрузки и обработки вложений мы опишем вспомогательный класс PreTrainedEmbeddings (пример 5.1). В нем создается хранимый в оперативной памяти индекс всех векторов слов для упрощения быстрого поиска и запросов ближайших соседей с помощью пакета приближенного вычисления ближайших соседей, annoy.

Пример 5.1. Использование предобученных вложений слов



В этих примерах мы используем вложения слов GloVe. Их необходимо скачать и создать экземпляр класса PreTrainedEmbeddings, как показано в Input[1] из примера 5.1.

Связи между вложениями слов


Ключевое свойство вложений слов — кодирование синтаксических и семантических связей, проявляющихся в виде закономерностей использования слов. Например, о котах и собаках обычно говорят очень схоже (обсуждают своих питомцев, особенности кормления и т. п.). В результате вложения для слов cats и dogs гораздо ближе друг к другу, чем к вложениям для названий других животных, скажем уток и слонов.

Изучать семантические связи, закодированные во вложениях слов, можно по-разному. Один из самых популярных методов — использовать задачу на аналогию (один из частых видов задач на логическое мышление на таких экзаменах, как SAT):

Слово1: Слово2 :: Слово3: ______

В этой задаче необходимо по заданным трем словам определить четвертое, отвечающее связи между первыми двумя. С помощью вложений слов эту задачу можно кодировать пространственно. Во-первых, вычитаем Слово2 из Слово1. Вектор разности между ними кодирует связь между Слово1 и Слово2. Эту разность затем можно прибавить к Слово3 и получить в результате вектор, ближайший к четвертому, пропущенному слову. Для решения задачи на аналогию достаточно выполнить запрос ближайших соседей по индексу с помощью этого полученного вектора. Соответствующая функция, показанная в примере 5.2, делает в точности описанное выше: она с помощью векторной арифметики и приближенного индекса ближайших соседей находит недостающий элемент в аналогии.

Пример 5.2. Решение задачи на аналогию с помощью вложений слов




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

Пример 5.3. Кодирование с помощью вложений слов множества лингвистических связей на примере задач на аналогии SAT



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

Пример 5.4. Пример, иллюстрирующий опасность кодирования смысла слов на основе совместной встречаемости, — иногда это не работает!


Пример 5.5 иллюстрирует одно из самых распространенных сочетаний при кодировании гендерных ролей.

Пример 5.5. Осторожнее с защищаемыми атрибутами, например с гендером, кодируемыми вложениями слов. Они могут приводить к нежелательной предвзятости в дальнейших моделях


Оказывается, довольно сложно различить закономерности языка и закоренелые культурные предубеждения. Например, доктора отнюдь не всегда мужчины, а медсестры не всегда женщины, но подобные предубеждения настолько устоялись, что отразились в языке, а в результате и в векторах слов, как показано в примере 5.6.

Пример 5.6. «Зашитые» в векторы слов культурные предубеждения


Не следует забывать о возможных систематических ошибках во вложениях с учетом роста их популярности и распространенности в NLP-приложениях. Искоренение систематических ошибок во вложениях слов — новая и очень интересная сфера научных исследований (см. статью Болукбаши и др. [Bolukbasi et al., 2016]). Рекомендуем заглянуть на сайт ethicsinnlp.org, где можно найти актуальную информацию по вопросам интерсекциональности этики и NLP.

Об авторах


Делип Рао — основатель консалтинговой компании Joostware из Сан-Франциско, специализирующейся на машинном обучении и исследованиях в области NLP. Один из соучредителей Fake News Challenge — инициативы, призванной объединить хакеров и исследователей в области ИИ над задачами проверки фактов в СМИ. Ранее Делип занимался связанными с NLP исследованиями и программными продуктами в компаниях Twitter и Amazon (Alexa).

Брайан Макмахан — научный сотрудник в компании Wells Fargo, занимающийся преимущественно NLP. Ранее работал в компании Joostware.

» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок

Для Хаброжителей скидка 25% по купону — PyTorch

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.