В предыдущем посте (часть 1) мы представили проблему объединения шести производственных моделей, которые используются для обеспечения многоязычной поддержки Answer Bot в Zendesk, в единую модель.

Консолидация этих моделей упрощает процесс развертывания новых моделей, обеспечивая потенциально более масштабируемое решение для добавления поддержки новых языков в будущем. Мы рассмотрели несколько возможных направлений исследования и в конечном итоге решили изучить способы объединения предварительно обученных таблиц поиска встраивания для каждого языка. В этом посте мы поговорим о том, что происходит с информацией, содержащейся в слове «встраивание», если они наивно объединены.

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

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

Краткий обзор вложения слов

Вложения слов - это векторы (то есть списки) действительных чисел, которые представляют слово. Для качественного объяснения того, что такое встраивание слов и как они создаются, я рекомендую прочитать Учебник по тензорному потоку по встраиванию слов.

На практике мы хотим создать векторы встраивания так, чтобы их организация в n -мерном пространстве кодировала семантические или лингвистические отношения между словами, которые они представляют. Одним из наиболее интересных последствий изучения этих векторов является то, что сами векторы имеют тенденцию демонстрировать линейные отношения, соответствующие семантическим отношениям, несмотря на то, что они не были обучены этому3. Например, Word2Vec, который является одним из наиболее известных методов для создания встраиваемых слов, не выполняет конкретной задачи по созданию линейных отношений между векторами встраивания. Тем не менее, после тренировки можно обнаружить линейные отношения.

Ниже приводится типичный пример того, как могут выглядеть эти отношения.

*Word math* : (king - male) + female = queen

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

*Vector math* : (V_king - V_male) + V_female = V_queen

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

Встроенная информация

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

Вектор можно нанести на график (если в списке 3 или меньше чисел). Ниже приведен вектор с двумя числами (для координат x и y).

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

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

Примечание: поскольку поверхность не определяется бесконечным числом векторов (поскольку количество слов не бесконечно), поверхность не следует рассматривать как твердую непрерывную поверхность, а вместо этого следует рассматривать как совокупность очков.

Форма, определяемая этим набором векторов, важна, поскольку модели, которые потребляют эти векторы, обычно либо пересекают поверхность этой формы (как в случае с рекурсивными нейронными сетями, такими как LSTM), либо выполняют корреляционный анализ между компонентами, которые определяют форму. (как и в случае сверточных нейронных сетей). Другими словами, информация, используемая этими моделями, встроена в форму и структуру пространства. Если мы изменим форму пространства, мы изменим информацию, встроенную в это пространство.

Столкновения слов

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

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

Высокая частота столкновений слов проблематична, и возникает вопрос - почему эти показатели так высоки? В следующих разделах указаны три причины.

Межъязыковые омографы

Первый называется межъязыковые омографы, или слова, которые пишутся одинаково, но имеют разные значения (и встречаются на разных языках). Возьмем, к примеру, слова сын, champ и vent. В английском эти слова легко идентифицируются вместе с их значениями. сын - потомок мужского пола от родителей, чемпион - победившая личность, а вентиляция - это проход, по которому может течь воздух. Однако во французском языке эти слова имеют совершенно разные значения.

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

Например, по-английски вы можете прочитать что-то вроде:

“The champ took down all of their opponents with ease.”

Но по-французски мы можем прочитать:

“Le champ était rempli de fleurs” (The field was filled with flowers)

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

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

Заимствованные слова

Второй - заимствования. Заимствованное слово - это слово, напрямую заимствованное из другого языка. Английский обычно заимствуется многими языками, и заимствования часто появляются не на английском языке как внутри Zendesk, так и в общедоступных наборах данных, таких как вложения слов MUSE.

Загрязнение

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

Bonjour,
Nous vous remercions de votre confiance et espérons que vous reviendrez.
Merci,
Le Français
Standard Confusing Disclaimer: Le Français does not condone jiggery-pokery nor acquiesce the ukase of illegitimate or unlawful businesses. The views and opinions expressed in these musings are those of the author and do not necessarily reflect the official policy and positions of Le Français.

Как справиться с потерей информации

В последнем разделе этого поста мы обсудим проблему потери информации при объединении таблиц встраивания. В следующем посте мы обсудим, как мы подошли к сохранению информации.

Коллизии слов нельзя игнорировать, если мы намереваемся объединить встраиваемые таблицы, поскольку они потенциально кодируют большой объем важной информации. Есть несколько способов справиться с этой проблемой, но все они сводятся к решению, как преобразовать преобразование слова в векторное в отношение 1: 1. Самый наивный подход, который мы выбрали для проведения экспериментов, - это просто усреднить вместе сталкивающиеся векторы.

При таком подходе возникает два важных вопроса:

1. Что происходит с формой пространства, когда мы объединяем коллекции векторов вложения из разных языков?

2. Что происходит с информацией, когда мы вместе усредняем столкновения векторов?

Вложения слов для разных языков часто предварительно обучаются отдельно от моделей, с которыми они используются. В Zendesk шесть языков, поддерживаемых Answer Bot, поддерживаются шестью отдельными моделями, каждая из которых поставляется со своими собственными предварительно обученными встраиваемыми словами. Таким образом, для каждой отдельной модели форма и ориентация вложений уникальны для этой модели.

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

The fox jumped over the fence. (English)
El zorro saltó la cerca. (Spanish translation)

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

Слова и fox будут употребляться только вместе, как в случае с El и zorro. Обычно (как это обычно бывает в Zendesk) мы не наблюдаем таких последовательностей, как зорро-соль - забор. Таким образом, базовой модели нужно только адаптироваться к потреблению векторов из каждого независимого пространства. В этом случае нет потери информации; просто препятствие, которое модель должна преодолеть.

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

Визуализация информации, потерянной при усреднении коллизий

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

Примечание: это не настоящие вложения, и расстояние между ними было увеличено.

import numpy as np
def make_blob(mean, cov, size):
    x, y = np.random.multivariate_normal(mean, cov, size).T
    return np.hstack((x.reshape(-1, 1), y.reshape(-1, 1)))
means1 = [[-10, 10], [-15, 5], [-9, 3]]
means2 = [[10, 10], [15, 5], [9, 3]]
covs1 = [
    [[4, 0], [0, 3]],
    [[2, 0], [0, 3]],
    [[2, 0], [0, 3]]]
covs2 = [
    [[4, 0], [0, 3]],
    [[3, 0], [0, 3]],
    [[2, 0], [0, 5]]]
blob_1 = np.vstack(
    [make_blob(m, c, 500) for m, c in zip(means1, covs1)])
blob_2 = np.vstack(
    [make_blob(m, c, 500) for m, c in zip(means2, covs2)])

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

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

Если мы хотим объединить эти два пространства вложения, мы можем увидеть эффект, наблюдая за движением белых точек после слияния.

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

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

использованная литература

  1. Https://medium.com/zendesk-engineering/the-science-behind-consolidating-answer-bot-production-models-part-1-be5579a9047e
  2. Https://en.wikipedia.org/wiki/Word2vec
  3. Https://arxiv.org/pdf/1901.09813.pdf
  4. Https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/text/word_embeddings.ipynb
  5. Https://github.com/facebookresearch/MUSE
  6. Https://en.wikipedia.org/wiki/Interlingual_homograph
  7. Https://en.wikipedia.org/wiki/Loanword