Всеобщее увлечение нейросетевыми технологиями и глубинным обучением не обошло стороной и компьютерную лингвистику — автоматическую обработку текстов на естественном языке. На недавних конференциях ассоциации компьютерной лингвистики ACL, главном научном форуме в этой области, подавляющее большинство докладов было посвящено применению нейронных сетей как для решения уже известных задач, так и для исследования новых, которые не решались с помощью стандартных средств машинного обучения. Повышенное внимание лингвистов к нейронным сетям обусловлено несколькими причинами. Применение нейронных сетей, во-первых, существенным образом повышает качество решения некоторых стандартных задач классификации текстов и последовательностей, во-вторых, снижает трудоемкость при работе непосредственно с текстами, в-третьих, позволяет решать новые задачи (например, создавать чат-боты). В то же время нейронные сети нельзя считать полностью самостоятельным механизмом решения лингвистических проблем.
Первые работы по глубинному обучению (deep learning) относятся к середине XX века. В начале 1940-х годов Уоррен Маккаллок и Уолтер Питтс предложили формальную модель человеческого мозга — искусственную нейронную сеть, а чуть позже Фрэнк Розенблатт обобщил их работы и создал модель нейронной сети на компьютере. Первые работы по обучению нейронных сетей с использованием алгоритма обратного распространения ошибки относятся к 1960-м годам (алгоритм вычисляет ошибку предсказания и минимизирует ее с помощью методов стохастической оптимизации). Однако оказалось, что, несмотря на красоту и изящество идеи имитации мозга, обучение «традиционных» нейронных сетей занимает много времени, а результаты классификации на небольших наборах данных сопоставимы с результатами, полученными более простыми методами, например машинами опорных векторов (Support Vector Machine, SVM). В итоге нейронные сети были на 40 лет забыты, но сегодня снова стали востребованы при работе с большими объемами неструктурированных данных, изображений и текстов.
С формальной точки зрения нейронная сеть представляет собой направленный граф заданной архитектуры, вершины или узлы которого называются нейронами. На первом уровне графа находятся входные узлы, на последнем — выходные узлы, число которых зависит от задачи. Например, для классификации на два класса на выходной уровень сети можно поместить один или два нейрона, для классификации на k классов — k нейронов. Все остальные уровни в графе нейронной сети принято называть скрытыми слоями. Все нейроны, находящиеся на одном уровне, связаны ребрами со всеми нейронами следующего уровня, каждое ребро обладает весом. Каждому нейрону ставится в соответствие функция активации, моделирующая работу биологических нейронов: они «молчат», когда входной сигнал слаб, а когда его значение превышает некий порог, срабатывают и передают входное значение дальше по сети. Задача обучения нейронной сети на примерах (то есть на парах «объект — правильный ответ») заключается в поиске весов ребер, наилучшим образом предсказывающих правильные ответы. Ясно, что именно архитектура — топология строения графа нейронной сети — является ее важнейшим параметром. Хотя формального определения для «глубинных сетей» пока нет, принято считать глубинными все нейронные сети, состоящие из большого числа слоев или имеющие «нестандартные» слои (например, содержащие только избранные связи или использующие рекурсию с другими слоями).
Примером наиболее успешного применения нейронных сетей пока является анализ изображений, однако нейросетевые технологии коренным образом изменили и работу с текстовыми данными. Если раньше каждый элемент текста (буква, слово или предложение) нужно было описывать с помощью множества признаков различной природы (морфологических, синтаксических, семантических и т. д.), то теперь во многих задачах необходимость в сложных описаниях пропадает. Теоретики и практики нейросетевых технологий часто говорят об «обучении представлению» (representation learning) — в сыром тексте, разбитом только на слова и предложения, нейронная сеть способна найти зависимости и закономерности и самостоятельно составить признаковое пространство. К сожалению, в таком пространстве человек ничего не поймет — во время обучения нейронная сеть ставит каждому элементу текста в соответствие один плотный вектор, состоящих из неких чисел, представляющих обнаруженные «глубинные» взаимосвязи. Акцент при работе с текстом смещается от конструирования подмножества признаков и поиска внешних баз знаний к выбору источников данных и разметке текстов для последующего обучения нейронной сети, для которого требуется существенно больше данных по сравнению со стандартными методами. Именно из-за необходимости использовать большие объемы данных и из-за слабой интерпретируемости и непредсказуемости нейронные сети не востребованы в реальных приложениях промышленного масштаба, в отличие от других, хорошо зарекомендовавших себя алгоритмов обучения, таких как случайный лес и машины опорных векторов. Тем не менее нейронные сети используются в целом ряде задач автоматической обработки текстов (рис. 1).
Рис. 1. Архитектуры нейронных сетей, используемые в автоматической обработке текстов |
Одно из самых популярных применений нейронных сетей — построение векторов слов, относящихся к области дистрибутивной семантики: считается, что значение слова можно понять по значению его контекста, по окружающим словам. Действительно, если нам незнакомо какое-то слово в тексте на известном языке, то в большинстве случаев можно угадать его значение. Математической моделью значения слова служат вектора слов: строки в большой матрице «слово-контекст», построенной по достаточно большому корпусу текстов. В качестве «контекстов» для конкретного слова могут выступать соседние слова, слова, входящие с данным в одну синтаксическую или семантическую конструкцию, и т. д. В клетках такой матрицы могут быть записаны частоты (сколько раз слово встретилось в данном контексте), но чаще используют коэффициент положительной попарной взаимной информации (Positive Pointwise Mutual Information, PPMI), показывающий, насколько неслучайным было появление слова в том или ином контексте. Такие матрицы вполне успешно могут быть использованы для кластеризации слов или для поиска слов, близких по смыслу к искомому слову.
В 2013 году Томаш Миколов опубликовал работу [1], в которой предлагал использовать нейронные сети для обучения векторам слов, но для меньшей размерности: по кортежам (слово, контексты) обучалась нейронная сеть простейшей архитектуры, на выходе каждому слову в соответствие ставился вектор из 300 элементов. Оказалось, что такие вектора лучше передают семантическую близость слов. Например, на них можно определить арифметические операции сложения и вычитания смыслов и получить следующие уравнения: «Париж – Франция + Россия = Москва»; «король – мужчина + женщина = королева». Или найти лишнее слово в ряду «яблоко, груша, вишня, котенок». В работе [1] были представлены две архитектуры, skip-gram и CBOW (Continuous Bag of Words), под общим названием word2vec. Как позже было показано в [2], word2vec — это не что иное, как факторизация матрицы «слово-контекст» с весами PPMI. Сейчас принято относить word2vec к дистрибутивной семантике, а не к глубинному обучению [3], однако исходным толчком для создания этой модели послужило применение нейронной сети. Кроме того, оказалось, что вектора word2vec служат удобным представлением смысла слова, которое можно подавать на вход глубинным нейронным сетям, используемым для классификации текстов.
Задача классификации текстов — одна из самых актуальных для маркетологов, особенно когда речь идет об анализе мнений или отношения потребителя к какому-то товару или услуге, поэтому исследователи постоянно работают над повышением качества ее решения. Однако анализ мнений является задачей классификации скорее предложений, а не текстов — в положительном отзыве пользователь может написать одно-два отрицательно окрашенных предложения, и их тоже важно уметь определять и анализировать. Известная трудность в классификации предложений заключается в переменной длине входа — поскольку предложения в текстах бывают произвольной длины, непонятно, как подать их на вход нейронной сети. Один из подходов заимствован из области анализа изображений и заключается в использовании сверточных нейронных сетей (convolutional neural network, CNN) (рис. 2).
Рис. 2. Сверточная нейронная сеть для классификации предложения по тональности (на два класса: позитивный и негативный) |
На вход сверточной нейронной сети подается предложение, в котором каждое слово уже представлено вектором (вектор векторов). Как правило, для представления слов векторами используются заранее обученные модели word2vec. Сверточная нейронная сеть состоит из двух слоев: «глубинного» слоя свертки и обычного скрытого слоя. Слой свертки, в свою очередь, состоит из фильтров и слоя «субдискретизации». Фильтр — это нейрон, вход которого формируется при помощи окон, передвигающихся по тексту и выбирающих последовательно некоторое количество слов (например, окно длины «три» выберет первые три слова, слова со второго по четвертое, с третьего по пятое и т. д.). На выходе фильтра формируется один вектор, агрегирующий все вектора слов, в него входящих. Затем на слое субдискретизации формируется один вектор, соответствующий всему предложению, который вычисляется как покомпонентный максимум из всех выходных векторов фильтров. Сверточные нейронные сети просты в обучении и реализации. Для их обучения используется стандартный алгоритм обратного распространения ошибки, а за счет того, что веса фильтров равномерно распределены (вес i-го слова из окна одинаков для любого фильтра), число параметров у сверточной нейронной сети невелико. С точки зрения компьютерной лингвистики сверточные нейронные сети — мощный инструмент для классификации, за которым, впрочем, не стоит никакой языковой интуиции, что существенно затрудняет анализ ошибок алгоритма.
Классификация последовательностей — это задачи, в которых каждому слову нужно поставить в соответствие одну метку: морфологический разбор (каждому слову ставится в соответствие часть речи), извлечение именованных сущностей (определение того, является ли каждое слово частью имени человека, географического названия и пр.) и т. д. При классификации последовательностей используются методы, позволяющие учитывать контекст слова: если предыдущее слово — часть имени человека, то текущее тоже может быть частью имени, но вряд ли будет частью названия организации. Реализовать это требование на практике помогают рекуррентные нейронные сети, расширяющие идею языковых моделей (language model), предложенных в конце прошлого века. Классическая языковая модель предсказывает вероятность того, что слово i встретится после слова i-1. Языковые модели можно использовать и для предсказания следующего слова: какое слово с наибольшей вероятностью встретится после данного?
Рис. 3. Рекуррентная нейронная языковая модель |
Для обучения языковых моделей нужны большие корпусы — чем больше обучающий корпус, тем больше пар слов модель «знает». Использование нейронных сетей для разработки языковых моделей позволяет сократить объем хранимых данных. Представим себе простую архитектуру сети, в которой на вход поступают слова i-2 и i-1, а на выходе нейронная сеть предсказывает слово i. В зависимости от числа скрытых слоев и количества нейронов на них, обученная сеть может быть сохранена как некоторое количество плотных матриц относительно небольшой размерности. Иначе говоря, вместо обучающего корпуса и всех пар слов в нем можно хранить лишь несколько матриц и список уникальных слов. Однако такая нейронная языковая модель не позволяет учитывать длинные связи между словами. Эту проблему решают рекуррентные нейронные сети (рис. 3), в которых внутреннее состояние скрытого слоя не только обновляется после того, как на вход приходит новое слово, но и передается на следующий шаг. Таким образом, скрытый слой рекуррентной сети принимает входы двух типов: состояние скрытого слоя на предыдущем шаге и новое слово. Если рекуррентная нейронная сеть обрабатывает предложение, то скрытые состояния позволяют запоминать и передавать длинные связи в предложениях. Экспериментально неоднократно было проверено, что рекуррентные нейронные сети запоминают род субъекта в предложении и выбирают правильные местоимения (она — ее, он — его) при генерации предложения, однако показать в явном виде, как именно такого рода информация хранится в нейронной сети или как она используется, до сих пор не удалось.
Рекуррентные нейронные сети служат и для классификации текстов. В этом случае выходы на промежуточных шагах не используются, а последний выход нейронной сети возвращает предсказанный класс. Сегодня двунаправленные (передающие скрытое состояние не только «направо», но и «налево») рекуррентные сети, имеющие несколько десятков нейронов на скрытом слое, стали стандартным инструментом для решения задач классификации текстов и последовательностей, а также генерации текстов и по сути вытеснили другие алгоритмы.
Развитием рекуррентных нейронных сетей стали архитектуры вида Seq2seq, состоящие из двух соединенных рекуррентных сетей, одна из которых отвечает за представление и анализ входа (например, вопроса или предложения на одном языке), а вторая — за генерацию выхода (ответа или предложения на другом языке). Сети Seq2seq лежат в основе современных систем «вопрос-ответ», чат-ботов и систем машинного перевода.
Кроме сверточных нейронных сетей, для анализа текстов применяются так называемые автокодировщики, используемые, например, для создания эффектов на изображениях в Photoshop или Instagram и нашедшие применение в лингвистике в задаче снижения размерности (поиск проекции вектора, представляющего текст, на пространство заведомо меньшей размерности). Проекция на двумерное пространство делает возможным представление текста в виде точки на плоскости и позволяет наглядно изобразить коллекцию текстов как множество точек, то есть служит средством предварительного анализа перед кластеризацией или классификацией текстов. В отличие от задачи классификации, в задаче снижения размерности нет четких критериев качества, однако изображения, получаемые при использовании автокодировщиков, выглядят достаточно «убедительно». С математической точки зрения автокодировщик — это нейронная сеть без учителя, которая обучается линейной функции f(x) = x и состоит из двух частей: кодировщика и декодировщика. Кодировщик — это сеть с несколькими скрытыми слоями с уменьшающимся количеством нейронов. Декодировщик — аналогичная сеть с увеличивающимся количеством нейронов. Их соединяет скрытый слой, на котором столько нейронов, сколько должно быть размерностей в новом пространстве меньшей размерности, и именно он отвечает за снижение размерности. Как и сверточные нейронные сети, автокодировщик не имеет никакой лингвистической интерпретации, поэтому может считаться скорее инженерным, чем аналитическим инструментом.
***
Несмотря на впечатляющие результаты, нейронная сеть не может считаться самостоятельным инструментом для анализа текста (поиска закономерностей в языке) и тем более для понимания текста. Да, нейронные сети позволяют находить скрытые связи между словами и обнаруживать закономерности в текстах, но пока эти связи не представлены в интерпретируемом виде, нейронные сети будут оставаться достаточно тривиальными инструментами машинного обучения. Кроме того, в промышленных аналитических решениях глубинное обучение пока еще не востребовано, поскольку требует неоправданных затрат на подготовку данных при непредсказуемости результатов. Даже в исследовательском сообществе высказывается критическое отношение к попыткам сделать нейронные сети универсальным инструментом. В 2015 году Крис Маннинг, глава группы компьютерной лингвистики в Стэнфорде и президент ACL, четко очертил круг применимости нейронных сетей [4]. В него он включил задачи классификации текстов, классификации последовательностей и снижения размерности. Однако благодаря маркетингу и популяризации глубинного обучения возросло внимание собственно к компьютерной лингвистике и ее новым приложениям.
Литература
- Tomas Mikolov et. al. Efficient Estimation of Word Representations in Vector Space, arxiv.org. URL: http://arxiv.org/pdf/1301.3781.pdf (дата обращения: 18.05.2017).
- Levy Omer, Yoav Goldberg, Ido Dagan. Improving distributional similarity with lessons learned from word embeddings. Transactions of the Association for Computational Linguistics 3. — 2015. — P. 211–225. URL: https://www.transacl.org/ojs/index.php/tacl/article/view/570/124 (дата обращения: 18.05.2017).
- Павел Велихов. Машинное обучение для понимания естественного языка // Открытые Системы.СУБД. — 2016. — № 1. — С.18–21. URL: https://www.osp.ru/os/2016/01/13048649 (дата обращения: 18.05.2017).
- Christopher Manning. Computational linguistics and deep learning. Computational Linguistics. — 2016. URL: http://www.mitpressjournals.org/doi/full/10.1162/COLI_a_00239#.WQH8MBhh2qA (дата обращения: 18.05.2017).
Дмитрий Ильвовский (dilvovsky@hse.ru) — сотрудник Международной лаборатории интеллектуальных систем и структурного анализа, Екатерина Черняк (echernyak@hse.ru) — преподаватель центра непрерывного образования, факультет компьютерных наук, НИУ ВШЭ (Москва). Работа выполнена в рамках Программы фундаментальных исследований НИУ ВШЭ.