Идиот или гений? Как работает и на что способен искусственный интеллект — страница 13 из 19

Искусственный интеллект и естественный язык

Глава 11В компании слов

Пора рассказать вам одну историю.

Ресторан

Мужчина вошел в ресторан и заказал гамбургер “с кровью”. Когда ему принесли заказ, гамбургер оказался пережарен до хруста. К столику гостя подошла официантка. “Вам нравится бургер?” – спросила она. “О, он просто великолепен”, – ответил мужчина, отодвинул стул и гневно зашагал прочь, не оплатив счет. Официантка крикнула ему вслед: “Эй, а кто платить будет?” Она пожала плечами и буркнула себе под нос: “И что он так раскипятился?”[227]

Теперь позвольте мне задать вам вопрос: съел ли мужчина гамбургер?

Полагаю, вы уверены в ответе, хотя напрямую в истории об этом не говорится. Нам, людям, легко читать между строк. В конце концов, понимание языка – включая недосказанности – фундаментальный компонент человеческого разума. Неслучайно Алан Тьюринг сделал знаменитую “имитационную игру” состязанием в генерации и понимании языка.

В настоящей части книги речь пойдет об обработке естественного языка, то есть “попытках научить компьютеры работать с человеческим языком”. (На жаргоне ИИ “естественный” значит “человеческий”.) Обработка естественного языка (ОЕЯ) включает такие направления, как распознавание речи, поиск в интернете, создание вопросно-ответных систем и машинный перевод. Подобно тому, что мы увидели в предыдущих главах, движущей силой большинства недавних прорывов в сфере ОЕЯ стало глубокое обучение. Я опишу некоторые из этих прорывов, используя историю о ресторане, чтобы проиллюстрировать ряд серьезных проблем, с которыми сталкиваются машины при использовании и понимании человеческого языка.

Тонкости языка

Допустим, мы хотим создать программу, которая может прочитать фрагмент текста и ответить на вопросы о нем. Сегодня вопросно-ответные системы – одно из основных направлений исследований в сфере ОЕЯ, потому что люди хотят общаться с компьютерами при помощи естественного языка (вспомните Siri, Alexa, Google Now и других “виртуальных помощников”). Однако, чтобы отвечать на вопросы о таком тексте, как история о ресторане, программе потребуются продвинутые лингвистические навыки и основательные знания об устройстве мира.

Съел ли мужчина гамбургер? Чтобы с уверенностью ответить на этот вопрос, гипотетической программе нужно знать, что гамбургеры входят в категорию “пища”, а пищу можно есть. Программа должна понимать, что если человек заходит в ресторан и заказывает гамбургер, то обычно он планирует его съесть. Кроме того, ей следует знать, что после подачи заказа в ресторане гамбургер становится доступен для еды и что если человек заказывает гамбургер “с кровью”, то ему, скорее всего, не захочется есть “пережаренный” гамбургер. Программа должна понимать, что в словах “он просто великолепен” кроется сарказм, “он” здесь означает “бургер”, а “бургер”, в свою очередь, служит синонимом “гамбургера”. Программе нужно догадаться, что человек, который “зашагал прочь” из ресторана, не заплатив, вряд ли съел заказанное блюдо.

Сложно представить все фоновые знания, которые необходимы программе, чтобы уверенно отвечать на вопросы об истории. Оставил ли мужчина чаевые официантке? Программе нужно знать о традиции давать чаевые в ресторанах с целью вознаградить официантов за хорошее обслуживание. Почему официантка спросила: “А платить кто будет”? Программе следует понять, что “платить” нужно не за новую куртку и не за свои прегрешения, а за блюдо. Поняла ли официантка, что мужчина разозлился? Программе необходимо установить, что в вопросе “И что он так раскипятился?” “он” – это мужчина, а слово “раскипятился” употреблено в значении “рассердился”. Поняла ли официантка, почему мужчина ушел из ресторана? Программе было бы полезно узнать, что жест “пожала плечами” говорит, что официантка не поняла, почему мужчина убежал.

Представляя, какие знания нужны гипотетической программе, я вспоминаю о своих попытках ответить на бесчисленные вопросы, которые задавали мне дети, когда были совсем маленькими. Однажды, когда моему сыну было четыре года, я взяла его с собой в банк. Он задал мне простой вопрос: “Что такое банк?” Мой ответ породил, казалось, бесконечный каскад вопросов “почему?” и “зачем?”. “Зачем людям деньги?” “Почему люди хотят, чтобы у них было много денег?” “Почему они не могут хранить деньги дома?” “Почему нельзя печатать собственные деньги?” Все это хорошие вопросы, но ответить на них, не объясняя множество вещей, незнакомых четырехлетнему ребенку, весьма нелегко.

С машинами дело обстоит еще хуже. Слушая историю о ресторане, ребенок уже имеет представление о таких понятиях, как “человек”, “стол” и “гамбургер”. У детей есть зачатки здравого смысла: так, они понимают, что, выходя из ресторана, мужчина перестает быть внутри ресторана, хотя столы и стулья, вероятно, остаются на месте. А когда гамбургер “приносят”, его, вероятно, приносит официантка (а не загадочные “они”). Современные машины не умеют оперировать детализированными, взаимосвязанными понятиями и здравым смыслом, к которому при понимании языка прибегает даже четырехлетний ребенок.

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

Распознавание речи и последние 10 %

Автоматическое распознавание речи – транскрибирование устной речи в текст в реальном времени – стало первым крупным успехом глубокого обучения в ОЕЯ, и можно даже сказать, что на текущий момент это самый серьезный успех ИИ в любой области. В 2012 году, когда глубокое обучение производило революцию в компьютерном зрении, исследовательские группы из Университета Торонто, Microsoft, Google и IBM опубликовали знаковую статью о распознавании речи[228]. Эти группы разрабатывали глубокие нейронные сети для различных аспектов распознавания речи: распознавания фонем по акустическим сигналам, предсказания слов на основе комбинаций фонем, предсказания фраз на основе комбинаций слов и так далее. По словам специалиста по распознаванию речи из Google, применение глубоких сетей привело к “самому значительному прогрессу за 20 лет исследования речи”[229]. В тот же год появилась созданная на основе глубокой сети новая система распознавания речи, которая сначала стала доступна пользователям Android, а через два года – пользователям iPhone. Один из инженеров Apple при этом отметил: “В этой сфере произошел такой значительный скачок [производительности], что тесты пришлось повторять, чтобы убедиться, что никто не потерял десятичную запятую”[230].

Если вы пользовались технологией распознавания речи до и после 2012 года, то наверняка заметили ее резкое улучшение. Распознавание речи, которое до 2012 года часто оборачивалось огромным разочарованием и лишь изредка приносило умеренную пользу, вдруг стало демонстрировать почти идеальные результаты в определенных обстоятельствах. Теперь я могу диктовать тексты и письма приложению для распознавания речи, установленному на моем телефоне: всего несколько минут назад я прочитала телефону историю о ресторане на обычной для себя скорости, и он верно транскрибировал каждое слово.

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

При этом автоматическое распознавание речи – вопреки некоторым сообщениям прессы – еще не вышло на “человеческий уровень”. Фоновый шум по-прежнему существенно снижает точность работы систем: в движущемся автомобиле они гораздо менее эффективны, чем в тихой комнате. Кроме того, эти системы периодически спотыкаются о необычные слова и фразы, тем самым наглядно демонстрируя, что не понимают транскрибируемую речь. Например, я сказала: Mousse is my favorite dessert (“Мусс – мой любимый десерт”), – но мой телефон (на Android) записал: Moose is my favorite dessert (“Лось – мой любимый десерт”). Я сказала: The bareheaded man needed a hat (“Мужчине с непокрытой головой нужна была шапка”), – но телефон записал: The bear headed man needed a hat (“Мужчине с головой медведя нужна была шапка”). Нетрудно найти предложения, которые приведут систему в замешательство. Но при распознавании обиходной речи в тихой среде точность подобных систем, на мой взгляд, составляет примерно 90–95 % от человеческой[231]. Шум и другие осложнения значительно ухудшают показатели.

Как известно, в любом сложном инженерном проекте действует правило: на первые 90 % проекта уходит 10 % времени, а на последние 10 % – 90 % времени. Думаю, в некотором виде это правило применимо ко многим областям ИИ (привет, беспилотные автомобили!) и оправдает себя также в сфере распознавания речи. Последние 10 % – это не только работа с шумом, непривычными акцентами и незнакомыми словами, но и решение проблемы неоднозначности и контекстуальности языка, которая осложняет интерпретацию речи. Что нужно, чтобы справиться с этими последними 10 %, которые не желают поддаваться исследователям? Больше данных? Больше сетевых слоев? Или же, осмелюсь спросить, эти последние 10 % потребуют истинного понимания речи говорящего? Я склоняюсь к последнему, хотя и знаю, что уже ошибалась раньше.

Системы распознавания речи довольно сложны: чтобы пройти путь от звуковых волн к предложениям, нужно провести несколько этапов обработки данных. В современных передовых системах распознавания речи используется несколько различных компонентов, включая ряд глубоких нейронных сетей[232]. Другие задачи ОЕЯ, например перевод текстов или создание вопросно-ответных систем, на первый взгляд кажутся проще: входные и выходные сигналы в них состоят из слов. И все же в этих сферах основанный на данных метод глубокого обучения не привел к такому прогрессу, как в распознавании речи. Почему? Чтобы ответить на этот вопрос, давайте рассмотрим несколько примеров применения глубокого обучения к важным задачам ОЕЯ.

Классификация тональности

В первую очередь обратим внимание на область, называемую классификацией тональности текста. Прочтите несколько коротких отзывов на фильм “Индиана Джонс и храм судьбы”[233]:

“Сюжет тяжел, и очень не хватает юмора”.

“На мой вкус, немного мрачновато”.

“Кажется, продюсеры старались сделать фильм как можно более тревожным и жутким”.

“Развитие персонажей и юмор в «Храме судьбы» весьма посредственны”.

“Тон странноват, и многие шутки меня не зацепили”.

“Ни шарма, ни остроумия, в отличие от других фильмов серии”.

Понравился ли фильм авторам отзывов?

Использование машин для ответа на такой вопрос сулит большие деньги. Система ИИ, способная точно распознать эмоциональную окраску предложения (или абзаца) – положительную, отрицательную или любую другую, – принесет огромные прибыли компаниям, которые хотят анализировать отзывы клиентов о своих продуктах, находить новых потенциальных покупателей, автоматизировать рекомендации (“людям, которым понравился X, также понравится Y”) и наладить таргетирование онлайн-рекламы. Данные о предпочтениях человека в кино, литературе и других сферах на удивление полезны для прогнозирования покупок этого человека (и это даже пугает). Более того, на основе этой информации можно прогнозировать и другие аспекты жизни человека, например его поведение на выборах и реакцию на определенные типы новостей и политической рекламы[234]. Также были попытки (порой успешные) с помощью “анализа эмоций”, скажем, твитов, связанных с экономикой, прогнозировать цены акций и исход выборов.

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

Некоторые ранние системы ОЕЯ искали отдельные слова или короткие последовательности слов, которые считали индикаторами тональности всего текста. Например, можно предположить, что такие слова, как “лишенный”, “мрачный”, “странный”, “тяжелый”, “тревожный”, “жуткий” и “посредственный”, и такие словосочетания, как “не зацепили” и “ни шарма, ни остроумия”, говорят о негативной тональности отзывов. В некоторых случаях это действительно так, но часто те же самые слова можно найти в позитивных рецензиях. Вот несколько примеров:

“Несмотря на тяжелую тему, в фильме достаточно юмора, который не позволяет ему стать слишком мрачным”.

“Не понимаю, что тревожного и жуткого люди находят в этом фильме”.

“Когда вышел этот великолепный фильм, я был слишком молод – и тогда он меня не зацепил”.

“Не посмотрев этот фильм, вы многого лишитесь!”

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

Вскоре после того, как глубокие сети начали блистать в сфере компьютерного зрения и распознавания речи, исследователи ОЕЯ попытались применить их к анализу тональности текста. Как обычно, идея в том, чтобы натренировать сеть на множестве размеченных людьми примеров предложений с позитивной и негативной тональностью, позволив ей самостоятельно выявить полезные признаки, позволяющие с уверенностью классифицировать новое предложение как “позитивное” или “негативное”. Но как вообще добиться, чтобы нейронная сеть обработала предложение?

Рекуррентные нейронные сети

Для обработки предложения или абзаца необходимы нейронные сети особого типа, непохожие на описанные в предыдущих главах. Так, в главе 4 мы анализировали работу сверточной нейронной сети, которая классифицировала изображения по категориям “собака” и “кошка”. Ее входным сигналом была насыщенность пикселей на изображении фиксированного размера (изображения большего и меньшего размера подвергались масштабированию). Предложения, напротив, состоят из последовательностей слов, а их длина не фиксирована. Таким образом, нам нужно найти способ, которым нейронная сеть сможет обрабатывать предложения переменной длины.

Применение нейронных сетей для решения задач, в которых фигурируют упорядоченные последовательности, такие как предложения, началось в 1980-х годах, когда были созданы рекуррентные нейронные сети (РНС), само собой, навеянные представлениями о том, как последовательности интерпретируются человеческим мозгом. Представьте, что вас попросили прочитать отзыв a little too dark to my taste (“на мой взгляд, немного мрачновато”) и определить его тональность – позитивную или негативную. Вы читаете предложение слева направо, по одному слову. Читая его, вы начинаете формировать свое впечатление о его тональности, и это впечатление получает подтверждение, когда вы дочитываете предложение до конца. К этому моменту у вас в мозге складывается репрезентация предложения в форме активаций нейронов, и она позволяет вам с уверенностью сказать, позитивный перед вами отзыв или негативный.

Структура рекуррентной нейронной сети следует такому последовательному чтению предложений и формированию их репрезентаций в форме активации нейронов. На рис. 32 сравниваются структуры традиционной и рекуррентной нейронной сети. Для простоты в каждой сети только две ячейки (белые круги) в скрытом слое и одна ячейка в выходном слое. В обеих сетях входной сигнал имеет связи со скрытыми ячейками, а каждая скрытая ячейка имеет связь с выходной ячейкой (сплошные стрелки). Ключевое отличие РНС в том, что у ее скрытых ячеек есть дополнительные “рекуррентные” связи: каждая из скрытых ячеек имеет связь с самой собой и другой скрытой ячейкой (пунктирные стрелки). Как это работает? В отличие от традиционной нейронной сети, РНС функционирует в соответствии с последовательностью моментов времени. В каждый момент времени РНС получает входной сигнал и вычисляет активацию своих скрытых и выходных ячеек, как и традиционная нейронная сеть. Но в РНС уровень активации каждой скрытой ячейки вычисляется не только на основе входного сигнала, но и на основе уровней активации скрытых ячеек в предыдущий момент времени. (В первый момент времени эти рекуррентные значения равняются 0.) Это дает сети способ интерпретировать слова, которые она “читает” сейчас, вспоминая контекст “прочитанного” ранее.

Чтобы понять, как работает РНС, лучше всего представить функционирование сети во времени, как на рис. 33, который показывает РНС с рис. 32 в каждый из восьми последовательных моментов времени. Ради простоты я показала все рекуррентные связи в скрытом слое единственной пунктирной стрелкой от одного шага времени к другому. В каждый момент времени уровни активации скрытых ячеек представляют собой составленный сетью код того фрагмента предложения, который она увидела к этому моменту. Продолжая обрабатывать слова, сеть совершенствует этот код. За последним словом в предложении следует специальный символ END, который, подобно точке, сообщает сети, что предложение закончилось. Обратите внимание, что это люди добавляют символ END в конец каждого предложения, перед тем как давать текст сети.


Рис. 32. A – схема традиционной нейронной сети; B – схема рекуррентной нейронной сети, где уровни активации скрытых ячеек в конкретный момент времени учитываются также в следующий момент


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


Рис. 33. Работа рекуррентной нейронной сети с рис. 32 на последовательности восьми моментов времени


Поскольку сеть перестает кодировать предложение, только встречая символ END, система теоретически может кодировать предложения любой длины в последовательность чисел – уровней активации скрытых ячеек – фиксированной длины. По очевидным причинам такие сети часто называют кодерами[235].

Получая набор предложений, которым люди присвоили метку “позитивная” или “негативная” в зависимости от тональности, сеть-кодер обучается на этих примерах с помощью метода обратного распространения ошибки. Но я пока не объяснила важную вещь. Входными сигналами нейронных сетей должны быть числа[236]. Как лучше всего закодировать цифрами входные слова? Поиск ответа на этот вопрос привел к одному из главных прорывов в обработке естественного языка за последнее десятилетие.

Простая схема кодирования слов цифрами

Прежде чем описывать возможные схемы кодирования слов цифрами, мне нужно ввести понятие лексикона нейронной сети. Лексикон – это набор слов, которые сеть может принимать в качестве входных сигналов. По оценкам лингвистов, для работы с большинством англоязычных текстов читателю необходимо знать от 10 до 30 тысяч слов в зависимости от принципа подсчета: так, можно группировать глагольные формы argue, argues, argued и arguing, считая их одним “словом”. В лексикон также могут входить устойчивые сочетания из двух слов – например, San Francisco и Golden Gate, – каждое из которых будет считаться одним словом.

Допустим, в лексиконе нашей сети будет 20 тысяч слов. Простейший способ закодировать слова числами – присвоить каждому слову в словаре произвольный номер от 1 до 20 000. Затем дать нейронной сети 20 тысяч входных сигналов, по одному на каждое слово лексикона. На каждом шаге времени “включаться” будет лишь один из входных сигналов – тот, который соответствует входному слову. Скажем, слову dark присвоен номер 317. Если мы хотим дать слово dark сети, входной сигнал 317 должен получить значение 1, а остальные 19 999 входных сигналов – значение 0. В сфере ОЕЯ это известно как кодирование активной единицей: в каждый момент времени лишь один входной сигнал – сигнал, соответствующий слову, получаемому сетью, – считается активным (не 0).

В прошлом кодирование активной единицей было стандартным способом ввода слов в нейронные сети. Но в нем кроется проблема: произвольное присвоение номеров словам не отражает взаимосвязей между словами. Допустим, при работе с обучающим набором сеть узнала, что фраза I hated this movie (“Мне не понравился этот фильм”) имеет негативную тональность. Представьте, что теперь сеть получает фразу I abhorred this flick (“Мне не по нутру эта киношка”), но слов abhorred и flick в обучающем наборе не было. У сети не будет возможности определить, что эти фразы имеют одинаковый смысл. Допустим, сеть узнала, что фраза I laughed out loud (“Я смеялся в голос”) встречается в позитивных отзывах, и получает новую фразу I appreciated the humor (“Мне понравился юмор”). Сеть не сможет уловить близкий (но не идентичный) смысл этих фраз. Неспособность видеть семантические связи между словами и фразами – основная причина не слишком хорошей работы нейронных сетей, использующих код активной единицы.

Семантическое пространство слов

Исследователи ОЕЯ предложили несколько методов кодирования слов с учетом семантических связей. Все эти методы основаны на одной идее, прекрасно сформулированной лингвистом Джоном Фёрсом в 1957 году: “Слово узнаешь по соседям его”[237]. Значение слова можно определить на основе других слов, с которыми оно часто встречается, слов, с которыми встречаются эти слова, и так далее. Слово abhorred часто встречается в тех же контекстах, что и слово hated. Слово laughed часто соседствует с теми же словами, что и слово humor.

В лингвистике это называется дистрибутивной семантикой. В ее основе лежит гипотеза, что “степень семантической близости между двумя лингвистическими единицами A и B есть функция близости лингвистических контекстов, в которых могут появляться A и B”[238]. В качестве иллюстрации лингвисты предлагают концепцию “семантического пространства”. На рис. 34A показано двумерное семантическое пространство слов, в котором слова со сходными значениями находятся ближе друг к другу. Однако, поскольку значения слов порой многомерны, их пространства тоже должны быть многомерными. Например, слово “шарм” близко к словам “остроумие” и “юмор”, но в других контекстах оно же близко к словам “браслет” и “украшение”. Подобным образом слово “яркий” близко к кластеру “светлый” и кластеру “насыщенный”, но также имеет альтернативное (хоть и родственное) значение “выдающийся”, “неординарный”, “заметный”. Было бы очень удобно, если бы третье измерение могло выдвинуться к вам со страницы, чтобы вы увидели слова на должном расстоянии друг от друга. В одном измерении “шарм” находится рядом с “остроумием”, а в другом – рядом с “браслетом”. Но слово “шарм” также может быть близко к слову “привлекательность”, а слово “браслет” – нет. Нам нужны бóльшие размерности! Нам, людям, сложно представить пространство, где больше трех осей, но размерность семантического пространства слов может достигать десятков и сотен измерений.


Рис. 34. A – схема с двумя кластерами слов в семантическом пространстве, где слова со сходными значениями расположены близко друг к другу; B – трехмерное семантическое пространство, где слова обозначены точками


Говоря о семантических пространствах большой размерности, мы оказываемся в мире геометрии. Специалисты по ОЕЯ часто определяют “значения” слов через геометрические понятия. Например, на рис. 34B показано трехмерное пространство с осями x, y и z, вдоль которых расположены слова. Каждое слово обозначено точкой (черный кружок), имеющей три координаты – по осям x, y и z. Семантическое расстояние между словами приравнивается к геометрическому расстоянию между точками на этом графике. Можно видеть, что слово “шарм” находится в непосредственной близости как к словам “остроумие” и “юмор”, так и к словам “браслет” и “украшение”, но по разным осям координат. В ОЕЯ координаты конкретного слова в таком семантическом пространстве обозначаются термином “контекстный вектор”. В математике вектором, по сути, называют совокупность координат точки[239]. Допустим, слово “браслет” имеет координаты (2, 0, 3). Этот набор из трех чисел и есть контекстный вектор этого слова в трехмерном пространстве. Обратите внимание, что размерность вектора – это количество координат.

Суть в том, что, поместив все слова лексикона на должное место в семантическом пространстве, мы сможем описывать “значение” каждого слова его положением в этом пространстве, то есть координатами, определяющими его контекстный вектор. Зачем нужны контекстные векторы? Оказывается, при использовании контекстных векторов в качестве численных входных сигналов, представляющих слова, нейронные сети справляются с задачами ОЕЯ гораздо лучше, чем при использовании описанных выше кодов активной единицы.

Как получить все контекстные векторы для слов лексикона? Существует ли алгоритм, который может поместить все слова лексикона сети на должное место в семантическом пространстве, чтобы наилучшим образом отразить множество оттенков смысла каждого слова? Решению этой задачи посвящена значительная часть исследований в сфере ОЕЯ.

Word2vec

Существует множество решений задачи о размещении слов в геометрическом пространстве, причем некоторые из них были предложены еще в 1980-х годах, но сегодня в основном используется метод, разработанный специалистами Google в 2013 году[240]. Он называется word2vec (word to vector, “слово в вектор”). Этот метод автоматически выясняет контекстные векторы всех слов лексикона с помощью традиционной нейронной сети. Специалисты Google обучали свою сеть на фрагменте огромного массива документов, имевшихся у компании, а по завершении обучения сохранили и разместили все итоговые контекстные векторы на веб-странице, чтобы любой мог скачать их и использовать в качестве входных сигналов для систем обработки естественного языка[241].

Метод word2vec воплощает принцип “слово познается в компании слов”. Чтобы создать обучающий набор данных для программы word2vec, специалисты Google скачали огромное количество документов с сервиса “Google Новости”. (В современной ОЕЯ ничто не сравнится с доступом к “большим данным”!) В обучающий набор данных для word2vec попали пары слов, в которых каждое из слов встречалось вместе с другим словом пары в документах “Google Новостей”. Чтобы система работала лучше, особенно часто встречающиеся слова, такие как the, of и and, не учитывались.

Допустим, слова в каждой паре стоят бок о бок в предложении. В таком случае предложение A man went into a restaurant and ordered a hamburger (Мужчина зашел в ресторан и заказал гамбургер) сначала будет преобразовано в последовательность man went into restaurant ordered hamburger. Отсюда будут выделены следующие пары: (man, went), (went, into), (into, restaurant), (restaurant, ordered), (ordered, hamburger), а также обратные версии тех же пар – например, (hamburger, ordered). Суть в том, чтобы обучить сеть word2vec прогнозировать, какие слова с большой вероятностью будут образовывать пары с заданным входным словом.

На рис. 35 показана схема нейронной сети word2vec[242]. В этой сети используется кодирование активными единицами, которое я описывала выше. В представленной на схеме сети 700 тысяч входных ячеек, что близко к объему лексикона, использованного исследователями из Google. Каждый входной сигнал соответствует одному слову лексикона. Так, первый входной сигнал на схеме соответствует слову cat (“кошка”), 8378-й входной сигнал – слову hamburger, а семисоттысячный входной сигнал – слову cerulean (“лазурный”). Номера я назвала наобум – порядок слов в лексиконе не имеет значения. В сети также есть 700 тысяч выходных ячеек, каждая из которых соответствует одному слову лексикона, и относительно небольшой скрытый слой из 300 ячеек. Крупными серыми стрелками показано, что каждый входной сигнал имеет взвешенную связь с каждой скрытой ячейкой, а каждая скрытая ячейка – с каждой выходной ячейкой.


Рис. 35. Схема работы нейронной сети word2vec с парой слов (hamburger, ordered)


Специалисты Google тренировали свою сеть на миллиардах словесных пар из статей сервиса “Google Новости”. При получении словесной пары, например (hamburger, ordered), входной сигнал, соответствующий первому слову в паре (hamburger), устанавливается на 1, а все остальные входные сигналы – на 0. В ходе тренировки уровень активации каждой выходной ячейки трактуется как степень уверенности сети в том, что соответствующее слово лексикона встречалось рядом с входным словом. Здесь правильные выходные активации присвоят высокую степень уверенности второму слову в паре (ordered).


Рис. 36. Схема извлечения контекстного вектора из обученной сети word2vec


По завершении тренировки можно извлечь выявленные контекстные векторы для каждого слова лексикона. На рис. 36 показаны взвешенные связи между одним входным сигналом (соответствующим слову hamburger) и 300 скрытыми единицами. Веса, установленные в ходе тренировки, содержат информацию о контекстах, в которых встречается соответствующее слово. Все 300 весов становятся компонентами контекстного вектора, присваиваемого заданному слову. (При этом связи скрытых ячеек с выходными не принимаются в расчет, поскольку вся необходимая информация содержится во взвешенных связях входного сигнала со скрытым слоем.) Таким образом, каждый контекстный вектор, выявляемый этой сетью, имеет 300 измерений. Набор контекстных векторов всех слов лексикона образует “семантическое пространство”.

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

Чему соответствуют эти триста измерений? Если бы мы были трехсотмерными существами, способными представить такое пространство, мы бы увидели, что каждое слово в нем находится близко к другим родственным словам с разными значениями. Так, вектор слова hamburger близок к вектору слова ordered, а также к векторам слов burger (“бургер”), hot dog (“хот-дог”), cow (“корова”), eat (“есть”) и так далее. Кроме того, слово hamburger близко к слову dinner (“ужин”), даже если они никогда не встречались в паре: достаточно и того, что слово hamburger близко к словам, которые близки к слову dinner в подобных контекстах. Если сеть видит словесные пары из фраз I ate a hamburger for lunch (“Я съел гамбургер на обед”) и I devoured a hot dog for dinner (“Я слопал хот-дог на ужин”) и если слова lunch и dinner появляются рядом в некоторых обучающих предложениях, то система может узнать, что слова hamburger и dinner также должны быть близки.

Как мы помним, цель этого процесса состоит в том, чтобы найти численное представление – вектор – каждого слова лексикона с учетом семантики этого слова. Предполагается, что использование таких контекстных векторов приведет к появлению высокопроизводительных нейронных сетей для обработки естественного языка. Но в какой степени “семантическое пространство”, создаваемое word2vec, действительно отражает семантику слов?

Ответить на этот вопрос нелегко, поскольку представить трехсотмерное семантическое пространство word2vec мы не можем. Впрочем, у нас есть несколько способов в него заглянуть. Проще всего взять конкретное слово и найти его соседей в семантическом пространстве, ориентируясь на расстояние между контекстными векторами. Например, после обучения сети по соседству со словом Франция оказались слова Испания, Бельгия, Нидерланды, Италия, Швейцария, Люксембург, Португалия, Россия, Германия и Каталония[243]. Алгоритмы word2vec не объясняли понятия “страна” и “европейская страна” – эти слова просто встречались в обучающих данных в сходных контекстах со словом Франция, как слова гамбургер и хот-дог в примере выше. Если поискать ближайших соседей слова гамбургер, среди них окажутся бургер, чизбургер, сэндвич, хот-дог, тако и картошка фри[244].


Рис. 37. Двумерное представление расстояний между контекстными векторами названий стран и их столиц


Можно также рассмотреть более сложные связи, выявляемые в ходе обучения сети. Специалисты Google, создавшие word2vec, заметили, что в полученных сетью контекстных векторах расстояние между названием страны и названием ее столицы примерно одинаково для многих стран. На рис. 37 эти расстояния показаны в двумерном представлении. И снова системе не объясняли понятие “столица” – соответствующие связи проявились в ходе обучения сети на миллиардах словесных пар.

Такие закономерности позволили предположить, что word2vec сможет “решать” задачи на аналогию такого типа: “Мужчина – женщина, король – ____”. Достаточно взять контекстный вектор слова женщина, вычесть из него контекстный вектор слова мужчина и прибавить результат к контекстному вектору слова король[245]. Затем необходимо найти в семантическом пространстве контекстный вектор, который находится ближе всего к результату. Да, это королева. Когда я экспериментирую с онлайн-версией word2vec[246], этот метод часто оказывается действенным (“ужин – вечер, завтрак – утро”), но столь же часто выдает непонятные (“жажда – пить, усталость – пьян”) или абсурдные пары (“рыба – вода, птица – гидрант”).

Эти свойства выявленных контекстных векторов весьма любопытны и показывают, что программе удается установить некоторые связи между словами. Но будут ли контекстные векторы, обладающие такими свойствами, полезны в задачах ОЕЯ? Ответ – однозначно да. Сегодня почти все системы ОЕЯ вводят слова с помощью контекстных векторов того или иного типа (word2vec – лишь один пример).

Предложу вам аналогию: человек с молотком везде видит гвозди, а исследователь ИИ с нейронной сетью везде видит векторы. Многие решили, что word2vec можно применять не только к словам, но и к целым предложениям. Почему бы не закодировать предложение в качестве вектора точно так же, как кодируются слова, используя при обучении пары предложений, а не пары слов? Разве это не позволит лучше отразить семантику, чем простой набор контекстных векторов? Такой эксперимент провели несколько исследовательских групп, и группа из Университета Торонто назвала представления предложений “мысленными векторами”[247]. Другие пробовали с переменным успехом кодировать в качестве векторов абзацы и целые документы. Идея свести семантику к геометрии кажется исследователям ИИ весьма привлекательной. “Думаю, мысль можно задать вектором”, – заявил Джеффри Хинтон из Google[248]. С ним согласился Ян Лекун из Facebook: “[В Лаборатории ИИ Facebook] мы хотим представить весь мир мысленными векторами. Мы называем это World2Vec[249].

И последнее замечание о контекстных векторах. Несколько исследовательских групп продемонстрировали, что контекстные векторы – что, пожалуй, неудивительно – отражают предвзятость, характерную для языковых данных, на основе которых они создаются[250]. Так, при решении задачи “мужчина – женщина, программист – _____” с помощью контекстных векторов Google вы получите ответ “домохозяйка”. Обратный вариант задачи – “женщина – мужчина, программист – _____” – дает ответ “инженер-машиностроитель”. Вот еще один пример: “мужчина – гений, женщина – _____”. Ответ: “муза”. Сформулируем иначе: “женщина – гений, мужчина – _____”. Ответ: “гении” (во множественном числе).

Вот вам и десятилетия феминизма. Нельзя винить в этом контекстные векторы: они просто отражают сексизм и другие тенденции языка, а язык отражает предрассудки нашего общества. И все же контекстные векторы выступают ключевым компонентом всех современных систем ОЕЯ, которые занимаются целым спектром задач – от распознавания речи до переводов с одного языка на другой. Предвзятость контекстных векторов может приводить к появлению неожиданных, непредсказуемых перекосов в широко применяемых системах ОЕЯ. Исследователи ИИ, которые занимаются анализом подобных ошибок, только начинают понимать, какой неочевидный эффект они оказывают на выходные сигналы систем ОЕЯ, и несколько групп разрабатывают алгоритмы “устранения предвзятости” в контекстных векторах[251]. Это сложная задача, но, вероятно, справиться с ней легче, чем устранить тенденциозность языка и предрассудки общества.

Глава 12