Что это?
Хеширование с учетом местоположения — это процесс распределения элементов (на практике точек данных) по разным корзинам. Элементы или точки данных, похожие друг на друга, помещаются в одно и то же ведро.
В контексте НЛП это делается с помощью встраивания слов или документов. Слова или документы, похожие друг на друга, будут иметь векторное представление, хэшированное до одного и того же значения.
Почему это полезно?
Хеширование с учетом местоположения полезно для повышения эффективности поиска слов или документов, похожих друг на друга.
Если мы хотим найти 5 слов, наиболее похожих на слово «кошка», хеширование с учетом местоположения может значительно ускорить этот поиск. Вместо того, чтобы сравнивать вложение каждого слова с вложением слова «кошка», хеширование с учетом местоположения можно использовать только для проверки подмножества вложений слов, которые имеют то же хеш-значение, что и вложение слова «кошка».
Как это делается?
Как определить сходство векторов?
Чтобы сгруппировать похожие векторы в одно и то же ведро, необходимо определить метрику подобия, чтобы получить оценку того, насколько два вектора похожи друг на друга. Общепринятой метрикой подобия является евклидово расстояние. Евклидово расстояние d — это кратчайший путь из одной точки векторного пространства в другую:
Вы можете вспомнить теорему Пифагора, которую можно использовать для вычисления евклидова расстояния между двумя точками: a2 + b2 = c2
Как эта метрика сходства/расстояния используется для хеширования с учетом местоположения?
Евклидово расстояние можно обобщить до векторной нормы L2, которая для любого вектора обеспечивает расстояние от начала координат. Норма L2 может быть рассчитана следующим образом для вектора любой длины/размерности.
Дан вектор длины n:
Норма L2 — это квадратный корень из суммы квадратов каждого элемента:
Чтобы хэшировать похожие векторы в одно и то же ведро, мы хотим объединить только те векторы, между которыми имеется относительно небольшое евклидово расстояние.
Для этого векторное пространство делится на произвольное количество областей путем создания ряда гиперплоскостей.
Затем векторы, лежащие в одной области, хэшируются в одно и то же ведро.
Как определить, что вектор находится в одной области по сравнению с другой?
Чтобы определить, в какой области находится вектор, для каждой сгенерированной гиперплоскости определяется, на какой стороне гиперплоскости лежит вектор. Для вектора это приводит к списку значений +1 или -1, которые указывают сторону каждой гиперплоскости, на которой лежит вектор. Любые векторы с одинаковой комбинацией значений +1 и -1 находятся в одной области.
Учитывая вектор и гиперплоскость, как определить, находится ли он на положительной (+1) или отрицательной (-1) стороне?
Каждая гиперплоскость может быть представлена одним вектором. Вычисляется скалярное произведение вектора и вектора, представляющего гиперплоскость. Если скалярное произведение положительное, мы присваиваем вектор стороне +1, если скалярное произведение отрицательное, мы присваиваем вектор стороне -1.
Как создаются гиперплоскости?
Поскольку гиперплоскости могут быть представлены в виде одного вектора, серия векторов генерируется и используется случайным образом. Обычно это делается много раз, и используются серии случайных векторов с лучшими результатами.