По завершении тренировки можно извлечь выявленные контекстные векторы для каждого слова лексикона. На рис. 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], этот метод часто оказывается действенным (“ужин – вечер, завтрак – утро”), но столь же часто выдает непонятные (“жажда – пить, усталость – пьян”) или абсурдные пары (“рыба – вода, птица – гидрант”).