Хабрахабр

[Перевод] Word2vec в картинках

В нём есть симметрия, элегантность и красота — качества, которые прежде всего схватывает всякий истинный художник, запечатлевающий мир. «Во всякой вещи скрыт узор, который есть часть Вселенной. Этот узор можно уловить в смене сезонов, в том, как струится по склону песок, в перепутанных ветвях креозотового кустарника, в узоре его листа.

Однако можно разглядеть и опасность, таящуюся в поиске абсолютного совершенства, ибо очевидно, что совершенный узор — неизменен. Мы пытаемся скопировать этот узор в нашей жизни и нашем обществе и потому любим ритм, песню, танец, различные радующие и утешающие нас формы. И, приближаясь к совершенству, всё сущее идёт к смерти» — Дюна (1965)

Я считаю, что концепция вложений (embeddings) — одна из самых замечательных идей в машинном обучении. Если вы когда-нибудь использовали Siri, Google Assistant, Alexa, Google Translate или даже клавиатуру смартфона с предсказанием следующего слова, то уже работали с моделью обработки естественного языка на основе вложений. За последние десятилетия произошло значительное развитие этой концепции для нейронных моделей (последние разработки включают контекстуализированные вложения слов в передовых моделях, таких как BERT и GPT2).
Word2vec — метод эффективного создания вложений, разработанный в 2013 году. Кроме работы со словами, некоторые его концепции оказались эффективны в разработке рекомендательных механизмов и придании смысла данным даже в коммерческих, неязыковых задачах. Эту технологию применили в своих движках рекомендаций такие компании, как Airbnb, Alibaba, Spotify и Anghami.

Начнём с примера, чтобы ознакомиться с тем, как представлять объекты в векторном виде. В этой статье рассмотрим концепцию и механику генерации вложений с помощью word2vec. Вы знаете, насколько много о вашей личности может сказать список из пяти чисел (вектор)?

Дети Дюны «Я даю тебе хамелеона Пустыни; его способность сливаться с песком скажет тебе всё, что надлежит знать о корнях экологии и основаниях сохранения личности».

По шкале от 0 до 100 у вас интровертный или экстравертный тип личности (где 0 — максимально интровертный тип, а 100 — максимально экстравертный)? Вы когда-нибудь проходили личностный тест: например, MBTI, а ещё лучше «большую пятёрку»? Вам дают список вопросов, а затем оценивают по нескольким осям, в том числе интровертность/экстравертность.

Пример результатов теста «большая пятёрка». Он действительно многое говорит о личности и способен прогнозировать учебный, личный и профессиональный успех. Например, здесь можно его пройти

Это можно изобразить следующим образом: Предположим, я набрал 38 из 100 по оценке интроверсии/экстраверсии.

Или на шкале от −1 до +1:

Не особо. Насколько хорошо мы узнаем человека только по этой оценке? Поэтому добавим ещё одно измерение: ещё одну характеристику из теста. Люди — сложные существа.

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

Я не показываю, какие черты личности мы наносим на график, чтобы вы не привязывались к конкретным чертам, а сразу понимали векторное представление личности человека в целом.

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

При работе с векторами сходство обычно вычисляется по коэффициенту Отиаи (геометрический коэффициент):

Человек №1 больше похож на меня по характеру. Векторы в одном направлении (длина также важна) дают больший коэффициент Отиаи

Десятилетия развития психологической науки привели к созданию теста на пять основных характеристик личности (с множеством дополнительных). Опять же, двух измерений недостаточно для оценки людей. Итак, давайте используем все пять измерений:

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

Геометрический коэффициент работает для любого количества измерений. По пяти измерениям результат гораздо точнее

В конце этой главы хочу повторить две главные идеи:

  1. Людей (и другие объекты) можно представить в виде числовых векторов (что отлично подходит для машин!).
  2. Мы можем легко вычислить, насколько похожи векторы.

Дети Дюны «Дар слов — это дар обмана и иллюзий».

С этим пониманием перейдём к векторным представлениям слов, полученным в результате обучения (их также называют вложениями) и посмотрим на их интересные свойства.

Вот вложение для слова «король» (вектор GloVe, обученный на Википедии):

50451 , 0. [ 0. 59517 , -0. 68607 , -0. 60046 , -0. 022801, 0. 08813 , 0. 13498 , -0. 61798 , -0. 47377 , -0. 076666, 1. 31012 , -0. 034189, -0. 493 , -0. 68229 , 0. 98173 , 0. 51874 , -0. 81722 , -0. 55809 , 0. 31503 , -0. 1961 , -0. 66421 , 0. 11476 , -0. 13495 , -0. 41177 , -2. 30344 , 0. 0756 , -1. 223 , -1. 34354 , 0. 0783 , -0. 9927 , -0. 33505 , 1. 64319 , 0. 04234 , -0. 49159 , 0. 71125 , 0. 34344 , -0. 16754 , 0. 8523 , 0. 25663 , -0. 40102 , 1. 1661 , 0. 0137 , -0. 1685 , -1. 15155 , 0. 21585 , -0. 91241 , -1. 78321 , -0. 64426 , -0. 6106 , -0. 51042 ]

Давайте их визуализируем, чтобы сравнить с другими векторами. Мы видим список из 50 чисел, но по ним трудно что-то сказать. Поместим числа в один ряд.:

Раскрасим ячейки по их значениям (красный для близких к 2, белый для близких к 0, синий для близких к −2):

Теперь забудем о числах, и только по цветам противопоставим «короля» с другими словами:

Это о чём-то говорит. Видите, что «мужчина» и «женщина» гораздо ближе друг к другу, чем к «королю»? Векторные представления захватывают довольно много информации/значения/ассоциаций этих слов.

Вот ещё один список примеров (сравните столбцы с похожими цветами):

Можно заметить несколько вещей:

  1. Через все слова проходит одна красная колонка. То есть эти слова похожи в этом конкретном измерении (и мы не знаем, что в нём закодировано).
  2. Вы можете увидеть, что «женщина» и «девушка» во многом похожи. То же самое с «мужчиной» и «мальчиком».
  3. «Мальчик» и «девочка» тоже похожи в некоторых измерениях, но отличаются от «женщины» и «мужчины». Может быть, это закодировано смутное представление о молодости? Вероятно.
  4. Всё, кроме последнего слова — это представления людей. Я добавил объект (воду), чтобы показать различия между категориями. Например, вы можете увидеть, как синий столбец идёт вниз и останавливается перед вектором «воды».
  5. Есть чёткие измерения, где «король» и «королева» похожи друг на друга и отличаются от всех остальных. Может, там закодирована расплывчатая концепция королевской власти?

Всё, что для этого требуется, — это соглашение о традиции, согласно которой мы строим понятия». «Слова выносят любую нагрузку, какую мы только пожелаем. — Бог-император Дюны

Знаменитые примеры, которые показывают невероятные свойства вложений, — понятие аналогий. Мы можем складывать и вычитать векторы слов, получая интересные результаты. Самый известный пример — формула «король − мужчина + женщина»:

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

Визуализируем эту аналогию, как раньше:

Полученный вектор от вычисления «король−мужчина+женщина» не совсем равен «королеве», но это наиболее близкий результат из 400 000 вложений слов в наборе данных

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

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

Линейная последовательность событий полагается наблюдателем. Их вселенная не имеет свойств механической вселенной. Речь идёт совершенно о другом. Причина и следствие? Вы видите отблеск события, которое должно случиться «по логике вещей». Пророк высказывает судьбоносные слова. Вселенная претерпевает духовный сдвиг». Но пророк мгновенно освобождает энергию бесконечной чудесной силы. — Бог-император Дюны

Один из примеров NLP (обработка естественного языка) — функция предсказания следующего слова на клавиатуре смартфона. Миллиарды людей используют её сотни раз в день.

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

На скриншоте вверху модель взяла эти два зелёных слова (thou shalt) и вернула список вариантов (наибольшая вероятность для слова not):

Мы можем представить модель в виде чёрного ящика:

Она выводит оценку вероятности фактически для всех известных слов («словарь» модели варьируется от нескольких тысяч до более миллиона слов). Но на практике модель выдаёт не одно слово. Затем приложение клавиатуры находит слова с самыми высокими баллами и показывает их пользователю.

Нейронная модель языка выдаёт вероятность всех известных слов. Мы указываем вероятность в процентах, но в результирующем векторе 40% будет представлено как 0.4

После обучения первые нейронные модели (Bengio 2003) рассчитывали прогноз в три этапа:

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

Теперь давайте посмотрим на процесс обучения и узнаем, как создаётся эта матрица вложений.

Понимание должно двигаться вместе с процессом, слиться с его потоком и течь вместе с ним» — Дюна «Процесс нельзя понять посредством его прекращения.

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

«Вы должны узнать слово по его компании» — Дж. Р. Фёрс

Вложения для слов вычисляются по окружающим словам, которые чаще появляются рядом. Механика такая:

  1. Получаем много текстовых данных (скажем, все статьи Википедии)
  2. Устанавливаем окно (например, из трёх слов), которое скользит по всему тексту.
  3. Скользящее окно генерирует образцы для обучения нашей модели

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

«Да не построишь машины, наделённой подобием разума людского» — Дюна

Когда мы начинаем, окно располагается на первых трёх словах предложения:

Первые два слова принимаем за признаки, а третье слово — за метку:

Мы сгенерировали первый образец в наборе данных, который позже можно использовать для обучения языковой модели

Затем перемещаем окно в следующую позицию и создаём второй образец:

И довольно скоро у нас накапливается больший набор данных:

Но логически фаза «генерации набора данных» отделена от фазы обучения. На практике модели обычно обучаются непосредственно в процессе движения скользящего окна. третью главу книги «Обработка речи и языка»). Помимо нейросетевых подходов, для обучения языковых моделей раньше часто использовался метод N-грамм (см. Мне нравится этот пример, потому что он показывает, как алгоритмические свойства вложений можно описать маркетинговым языком. Чтобы увидеть разницу при переходе от N-грамм к нейронным моделям в реальных продуктах, вот сообщение 2015 года в блоге Swiftkey, разработчика моей любимой клавиатуры Android, который представляет свою нейронную модель языка и сравнивает её с предыдущей моделью N-грамм.

Если парадокс доставляет тебе беспокойство, то это значит, что ты стремишься к абсолюту. «Парадокс — это признак того, что надо постараться рассмотреть, что за ним кроется. Бог-император Дюны Релятивисты рассматривают парадокс просто как интересную, возможно, забавную, иногда страшную, мысль, но мысль весьма поучительную».

С учётом всего сказанного ранее, заполните пробел:

Уверен, что большинство из вас догадались, что здесь должен быть «автобус». В качестве контекста есть пять предыдущих слов (и более раннее упоминание «автобуса»). Но если я дам вам ещё одно слово после пробела, это изменит ваш ответ?

Очевидно, что информационная ценность есть у слов и до, и после пробела. Это полностью меняет ситуацию: теперь пропущенным словом, скорее всего, является «красный». Посмотрим, как в такой ситуации настроить обучение модели. Оказывается, учёт в обе стороны (слева и справа) позволяет рассчитать более качественные вложения.

«Когда абсолютно безошибочный выбор неизвестен, интеллект получает шанс поработать с ограниченными данными на арене, где ошибки не только возможны, но и необходимы». — Капитул Дюны

Кроме двух слов перед целевым, можно учитывать ещё два слова после него.

Тогда набор данных для обучения модели будет выглядеть так:

Есть ещё другая архитектура, которая тоже демонстрируют отличные результаты, но устроена немного иначе: она пытается угадать соседние слова по текущему слову. Это называется архитектурой CBOW (Continuous Bag of Words) и описывается в одном из документов word2vec [pdf]. Скользящее окно выглядит примерно так:

В зелёном слоте — входное слово, а каждое розовое поле представляет возможный выход

У розовых прямоугольников разные оттенки, потому что это скользящее окно фактически создает четыре отдельных образца в нашем наборе данных обучения:

Можно визуализировать скользящее окно следующим образом: Этот метод называется архитектурой skip-gram.

В набор данных для обучения добавляется четыре следующих образца:

Затем перемещаем окно в следующую позицию:

Которая генерирует ещё четыре примера:

Вскоре у нас гораздо больше образцов:

Но самым первым уроком стало усвоение веры в то, что он может учиться, и это — основа всего. «Муад'Диб быстро учился потому, что прежде всего его научили тому, как надо учиться. Просто поразительно, как много людей не верят в то, что могут учиться и научиться, и насколько больше людей считают, что учиться очень трудно». — Дюна

Теперь, когда у нас есть набор skip-gram, используем его для обучения базовой нейронной модели языка, которая предсказывает соседнее слово.

Берём признак и отправляем его в необученную модель с просьбой предсказать соседнее слово. Начнём с первого образца в нашем наборе данных.

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

«Целевой вектор» — тот, в котором у целевого слова вероятность 1, а у всех остальных слов вероятность 0

Вычитаем вектор прогноза из целевого и получаем вектор ошибки: Насколько ошиблась модель?

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

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

Хотя мы многое узнали, но для полного понимания, как реально обучается word2vec, не хватает пары ключевых идей.

Это — попытка познать Свет, не познав Тьмы. «Пытаться понять Муад'Диба без того, чтобы понять его смертельных врагов — Харконненов, — это то же самое, что пытаться понять Истину, не поняв, что такое Ложь. Это — невозможно». — Дюна

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

Нужно как-то повысить производительность. Третий шаг очень дорог с вычислительной точки зрения, особенно если делать его для каждой выборки в наборе данных (десятки миллионов раз).

Один из способов — разделить цель на два этапа:

  1. Создать высококачественные вложения слов (без прогноза следующего слова).
  2. Использовать эти высококачественные вложения для обучения языковой модели (для прогнозирования).

В этой статье сосредоточимся на первом шаге. Для увеличения производительности можно отойти от прогнозирования соседнего слова…

… и переключиться на модель, которая берёт входное и выходное слова и вычисляет вероятность их соседства (от 0 до 1).

Такой простой переход заменяет нейронную сеть на модель логистической регрессии — таким образом, вычисления становятся намного проще и быстрее.

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

Но нужно закрыть одну лазейку. Такая модель вычисляется с невероятной скоростью: миллионы образцов за считанные минуты. Если все наши примеры положительные (цель: 1), то может образоваться хитрая модель, которая всегда возвращает 1, демонстрируя точность 100%, но она ничему не обучается и генерирует мусорные вложения.

Для них модель обязана вернуть 0. Чтобы решить эту проблему, нужно ввести в набор данных отрицательные образцы — слова, которые точно не являются соседями. Теперь модели придётся упорно работать, но вычисления по-прежнему идут на огромной скорости.

Для каждого образца в наборе данных добавляем отрицательные примеры с меткой 0

Выберем слова произвольно: Но что ввести в качестве выходных слов?

Мы сопоставляем фактический сигнал (положительные примеры соседних слов) с шумом (случайно выбранные слова, которые не являются соседями). Эта идея родилась под влиянием метода шумосопоставительного оценивания [pdf]. Это обеспечивает отличный компромисс между производительностью и статистической эффективностью.

Мы рассмотрели две центральные концепции word2vec: вместе они называются «skip-gram с отрицательной выборкой».

Существует большая разница между дискретным пространством и непрерывным континуумом. «Машина не может предвидеть каждую проблему, важную для живого человека. Мы живём в одном пространстве, а машины существуют в другом». — Бог-император Дюны

Разобрав основные идеи skip-gram и отрицательной выборки, можем перейти к более пристальному рассмотрению процесса обучения word2vec.

Определим размер словаря (будем называть его vocab_size), скажем, в 10 000 вложений и параметры слов в словаре. Сначала предварительно обрабатываем текст, на котором обучаем модель.

В этих матрицах хранятся вложения для каждого слова в нашем словаре (поэтому vocab_size является одним из их параметров). В начале обучения создаём две матрицы: Embedding и Context. Второй параметр — размерность вложения (обычно embedding_size устанавливают на 300, но ранее мы рассматривали пример с 50 измерениями).

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

Начинаем поиск их вложений в матрицах Embedding (для входного слова) и Context(для контекстных слов), хотя в обеих матрицах есть вложения для всех слов из нашего словаря. Теперь у нас четыре слова: входное слово not и выходные/контекстные слова thou (фактический сосед), aaron и taco (отрицательные примеры).

В каждом случае получается число, которое указывает на сходство входных данных и контекстных вложений. Затем вычисляем скалярное произведение входного вложения с каждым из контекстных вложений.

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

Как видите, у taco самый высокий балл, а у aaron по-прежнему самая низкая оценка как до, так и после sigmoid. Результат вычисления sigmoid можно считать выдачей модели по этим образцам.

Для этого просто вычитаем оценку sigmoid из целевых меток. Когда необученная модель сделала прогноз и имея реальную целевую метку для сравнения, давайте посчитаем, сколько ошибок в прогнозе модели.

error = targetsigmoid_scores

Теперь мы можем использовать эту оценку ошибок для корректировки вложений not, thou, aaron и taco, чтобы при следующем расчёте результат был бы ближе к целевым оценкам. Вот здесь наступает фаза «обучение» из термина «машинное обучение».

Мы немного улучшили вложения нескольких слов (not, thou, aaron и taco). На этом завершается один этап обучения. Теперь переходим к следующему этапу (следующий положительный образец и связанные с ним отрицательные) и повторяем процесс.

Затем можно остановить процесс, отложить матрицу Context и использовать обученную матрицу Embeddings для следующей задачи. Вложения продолжают улучшаться, пока мы несколько раз циклически прогоняем весь набор данных.

В процессе обучения word2vec два ключевых гиперпараметра — это размер окна и количество отрицательных образцов.

Замечено, что меньшие размеры окон (2−15) порождают взаимозаменяемые вложения с похожими индексами (обратите внимание, что антонимы часто взаимозаменяемы, если смотреть на окружающие слова: например, слова «хорошо» и «плохо» часто упоминаются в схожих контекстах). Различные размеры окна подходят для разных задач. На практике вам часто придётся предоставлять аннотации ради полезного смыслового сходства в вашей задаче. Большие размеры окон (15−50 или даже больше) порождают родственные вложения со схожими индексами. В Gensim размер окна по умолчанию равен 5 (по два слова слева и справа, в дополнение к самому входному слову).

Оригинальный документ рекомендует 5−20. Количество отрицательных образцов — ещё один фактор процесса обучения. В Gensim значение по умолчанию — 5 отрицательных образцов. В нём также говорится, что 2−5 образцов кажется достаточным, когда у вас достаточно большой набор данных.

«Если ваше поведение выпадает за ваши мерки, то вы живой человек, а не автомат» — Бог-император Дюны

Надеюсь, теперь вы поняли вложения слов и суть алгоритма word2vec. Также надеюсь, что теперь вам станут понятнее статьи, в которых упоминается концепция «skip-gram с отрицательной выборкой» (SGNS), как в вышеупомянутых рекомендательных системах.

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»