Получая набор предложений, которым люди присвоили метку “позитивная” или “негативная” в зависимости от тональности, сеть-кодер обучается на этих примерах с помощью метода обратного распространения ошибки. Но я пока не объяснила важную вещь. Входными сигналами нейронных сетей должны быть числа
[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). Этот набор из трех чисел и есть контекстный вектор этого слова в трехмерном пространстве. Обратите внимание, что размерность вектора – это количество координат.