Хеширование функций
В машинном обучении хеширование признаков , также известное как трюк хеширования (по аналогии с трюком ядра ), представляет собой быстрый и экономичный способ векторизации признаков , т. е. превращения произвольных признаков в индексы в векторе или матрице. [1] [2] Он работает путем применения хэш-функции к объектам и использования их хеш-значений в качестве индексов напрямую (после операции по модулю), а не поиска индексов в ассоциативном массиве . Помимо использования для кодирования нечисловых значений, хеширование признаков также можно использовать для уменьшения размерности . [2]
Этот трюк часто приписывают Вайнбергеру и др. (2009), [2] но существует гораздо более раннее описание этого метода, опубликованное Джоном Муди в 1989 году. [1]
Мотивация
[ редактировать ]Мотивирующий пример
[ редактировать ]В типичной задаче классификации документов входными данными для алгоритма машинного обучения (как во время обучения, так и во время классификации) является произвольный текст. На основе этого мешок слов создается представление « » (BOW): отдельные токены извлекаются и подсчитываются, и каждый отдельный токен в обучающем наборе определяет особенность (независимую переменную) каждого из документов как в обучающем, так и в тестовом наборах.
Однако алгоритмы машинного обучения обычно определяются в терминах числовых векторов. Таким образом, пакеты слов для набора документов рассматриваются как матрица терминов-документов, где каждая строка представляет собой отдельный документ, а каждый столбец представляет собой отдельный признак/слово; запись i , j в такой матрице фиксирует частоту (или вес) j -го термина словаря в документе i . (Альтернативное соглашение меняет местами строки и столбцы матрицы, но эта разница несущественна.)Обычно эти векторы чрезвычайно редки — согласно закону Ципфа .
Обычный подход состоит в том, чтобы во время обучения или до него создать словарное представление словаря обучающего набора и использовать его для сопоставления слов с индексами. Хэш-таблицы и попытки являются распространенными кандидатами на реализацию словаря. Например, три документа
- Джон любит смотреть фильмы.
- Мэри тоже любит кино.
- Джон также любит футбол.
можно преобразовать, используя словарь
Срок | Индекс |
---|---|
Джон | 1 |
любит | 2 |
к | 3 |
смотреть | 4 |
фильмы | 5 |
Мэри | 6 |
слишком | 7 |
также | 8 |
футбол | 9 |
к матрице термин-документ
(Пунктуация была удалена, как это обычно бывает при классификации и кластеризации документов.)
Проблема этого процесса в том, что такие словари занимают большой объем памяти и увеличиваются в размерах по мере роста обучающего набора. [3] Напротив, если словарный запас остается фиксированным и не увеличивается с ростом обучающего набора, злоумышленник может попытаться изобрести новые слова или орфографические ошибки, которых нет в сохраненном словаре, чтобы обойти фильтр машинного обучения. Чтобы решить эту проблему, Yahoo! Исследователи попытались использовать хеширование функций для своих спам-фильтров. [4]
Обратите внимание, что трюк с хешированием не ограничивается классификацией текста и аналогичными задачами на уровне документа, но может быть применен к любой задаче, включающей большое (возможно, неограниченное) количество функций.
Математическая мотивация
[ редактировать ]Математически токен — это элемент в конечном (или счетно бесконечном) множестве . Предположим, нам нужно обработать только конечный корпус, тогда мы можем поместить все токены, появляющиеся в корпусе, в , это означает, что конечно. Однако предположим, что мы хотим обработать все возможные слова, состоящие из английских букв, тогда счетно бесконечно.
Большинство нейронных сетей могут работать только с реальными векторными входными данными, поэтому нам необходимо создать «словарную» функцию. .
Когда конечен, имеет размер , то мы можем использовать горячее кодирование , чтобы отобразить его в . Сначала произвольно перечислим , затем определите . Другими словами, мы присваиваем уникальный индекс каждому токену, затем сопоставьте токен с индексом к единичному базисному вектору .
Горячее кодирование легко интерпретировать, но оно требует поддержания произвольного перечисления . Учитывая токен , чтобы вычислить , нам необходимо узнать индекс токена . Таким образом, для реализации эффективно, нам нужна быстро вычисляемая биекция , тогда мы имеем .
Фактически, мы можем немного ослабить требование: достаточно иметь быстрое внедрение. , затем используйте .
На практике не существует простого способа построить эффективную инъекцию. . Однако нам нужна не строгая инъекция, а лишь приблизительная инъекция. То есть, когда , нам, вероятно, следует иметь , так что, наверное .
На данный момент мы только что уточнили, что должна быть хеш-функция. Таким образом, мы приходим к идее хеширования признаков.
Алгоритмы
[ редактировать ]Хеширование функций (Вайнбергер и др., 2009 г.)
[ редактировать ]Базовый алгоритм хеширования функций, представленный в (Weinberger et al. 2009). [2] определяется следующим образом.
Во-первых, указываются две хэш-функции: хэш ядра и знак хеша . Далее определяется функция хеширования признаков: Наконец, расширьте эту функцию хеширования на строки токенов с помощью где — это набор всех конечных строк, состоящих из токенов в .
Эквивалентно,
Геометрические свойства
[ редактировать ]Мы хотим сказать кое-что о геометрическом свойстве , но , сам по себе является просто набором токенов, мы не можем навязать ему геометрическую структуру, кроме дискретной топологии, которая порождается дискретной метрикой . Чтобы было красивее, поднимем его на , и поднимите от к по линейному расширению: Там бесконечная сумма, с которой надо разобраться сразу. По сути, есть только два способа обработки бесконечностей. Можно ввести метрику, а затем принять ее завершение , чтобы разрешить правильные бесконечные суммы, или можно потребовать, чтобы ничто на самом деле не было бесконечным, а только потенциально . Здесь мы идем по пути потенциальной бесконечности, ограничивая содержать только векторы с конечной поддержкой : , только конечное число записей ненулевые.
Определите внутренний продукт на очевидным образом: В качестве примечания, если бесконечно, то внутреннее пространство произведения не является полным . Его завершение приведет нас к гильбертову пространству , которое допускает корректные бесконечные суммы.
Теперь у нас есть пространство внутреннего продукта с достаточной структурой для описания геометрии функции хеширования признаков. .
Во-первых, мы можем понять, почему называется « хешем ядра »: он позволяет нам определить ядро к На языке «трюка ядра» это ядро, созданное «картой функций» Обратите внимание: это не та карта объектов, которую мы использовали. . На самом деле мы использовали другое ядро , определяемый Преимущество увеличения хеша ядра с двоичным хешем является следующая теорема, которая утверждает, что является изометрией «в среднем».
Теорема (интуитивно сформулированная) — Если двоичный хэш является несмещенным (это означает, что он принимает значение с равной вероятностью), тогда представляет собой изометрию в ожидании:
По линейности ожидания, Сейчас, , поскольку мы предположили является беспристрастным. Итак, мы продолжаем
Приведенное выше утверждение и доказательство интерпретируют двоичную хеш-функцию. не как детерминированная функция типа , но как случайный двоичный вектор с несмещенными записями, что означает, что для любого .
Это хорошая интуитивная картина, хотя и не строгая. Строгое утверждение и доказательство см. [2]
Реализация псевдокода
[ редактировать ]Вместо ведения словаря векторизатор объектов, использующий прием хеширования, может построить вектор заранее определенной длины, применяя хеш-функцию h к объектам (например, словам), затем используя хеш-значения непосредственно в качестве индексов объектов и обновляя их. результирующий вектор по этим индексам. Здесь мы предполагаем, что признак на самом деле означает вектор признаков.
function hashing_vectorizer(features : array of string, N : integer): x := new vector[N] for f in features: h := hash(f) x[h mod N] += 1 return x
Таким образом, если наш вектор признаков ["кошка","собака","кошка"] и хэш-функция если это «кошка» и если это «собака». Возьмем размерность выходного вектора признаков ( N ) равно 4. Затем выведите x будет [0,2,1,0].Было предложено использовать вторую однобитовую выходную хэш-функцию ξ для определения знака значения обновления, чтобы противостоять эффекту хеш-коллизий . [2] Если используется такая хэш-функция, алгоритм становится
function hashing_vectorizer(features : array of string, N : integer): x := new vector[N] for f in features: h := hash(f) idx := h mod N if ξ(f) == 1: x[idx] += 1 else: x[idx] -= 1 return x
Приведенный выше псевдокод фактически преобразует каждую выборку в вектор. Вместо этого оптимизированная версия будет генерировать только поток пары и позвольте алгоритмам обучения и прогнозирования использовать такие потоки; линейная модель затем может быть реализована как одна хэш-таблица, представляющая вектор коэффициентов.
Расширения и вариации
[ редактировать ]Хеширование изученных функций
[ редактировать ]Хеширование функций обычно страдает от коллизий хэшей, что означает, что существуют пары разных токенов с одним и тем же хешем: . Тогда модель машинного обучения, обученная на словах с хешированными признаками, будет с трудом различать и , в основном потому, что является многозначным .
Если случается редко, то снижение производительности невелико, поскольку модель всегда может просто игнорировать редкий случай и делать вид, что все означает . Однако если оба являются общими, то деградация может быть серьезной.
Чтобы справиться с этим, можно обучить контролируемые функции хеширования, которые позволяют избежать сопоставления общих токенов с одними и теми же векторами признаков. [5]
Применение и практическое применение
[ редактировать ]Ганчев и Дредзе показали, что в приложениях классификации текста со случайными хэш-функциями и несколькими десятками тысяч столбцов в выходных векторах хеширование признаков не должно оказывать отрицательного влияния на производительность классификации, даже без знаковой хеш-функции. [3]
Вайнбергер и др. (2009) применили свою версию хеширования функций для многозадачного обучения и, в частности, для фильтрации спама , где входные функции представляют собой пары (пользователь, функция), так что один вектор параметров фиксирует спам-фильтры для каждого пользователя, а также глобальные фильтр для нескольких сотен тысяч пользователей и обнаружил, что точность фильтра возросла. [2]
Чен и др. (2015) объединили идею хеширования признаков и разреженной матрицы для создания «виртуальных матриц»: больших матриц с небольшими требованиями к хранению. Идея состоит в том, чтобы рассматривать матрицу как словарь, с ключами в и значения в . Затем, как обычно в хешированных словарях, можно использовать хеш-функцию и, таким образом, представить матрицу в виде вектора в , независимо от того, насколько большой является. Используя виртуальные матрицы, они создали HashedNets — большие нейронные сети, занимающие лишь небольшой объем памяти. [6]
Реализации
[ редактировать ]Реализации трюка хеширования присутствуют в:
- Апач-махут [7]
- Генерал [8]
- scikit-learn [9]
- София-мл [10]
- Вовпал Ваббит
- Апач Спарк [11]
- Р [12]
- Тензорфлоу [13]
- Даск-МЛ [14]
См. также
[ редактировать ]- Фильтр Блума – структура данных для приблизительного членства в наборе
- Эскиз «Счет-мин» - Вероятностная структура данных в информатике
- Закон Кучи - эвристика для определения отдельных слов в документе
- Хеширование с учетом локальности - алгоритмический метод с использованием хеширования.
- MinHash — техника интеллектуального анализа данных
Ссылки
[ редактировать ]- ^ Jump up to: а б Муди, Джон (1989). «Быстрое обучение в иерархиях с несколькими разрешениями» (PDF) . Достижения в области нейронных систем обработки информации .
- ^ Jump up to: а б с д и ж г Килиан Вайнбергер; Анирбан Дасгупта; Джон Лэнгфорд; Алекс Смола; Джош Аттенберг (2009). Хеширование функций для крупномасштабного многозадачного обучения (PDF) . Учеб. ИКМЛ.
- ^ Jump up to: а б К. Ганчев; М. Дредзе (2008). Маленькие статистические модели путем случайного смешивания признаков (PDF) . Учеб. Семинар ACL08 HLT по мобильной языковой обработке.
- ^ Джош Аттенберг; Килиан Вайнбергер; Алекс Смола; Анирбан Дасгупта; Мартин Зинкевич (2009). «Совместная фильтрация спама с помощью хэш-трюка» . Вирусный бюллетень .
- ^ Бай, Б.; Уэстон Дж.; Гранжер Д.; Коллобер Р.; Марч К.; Ци Ю.; Часовня О.; Вайнбергер К. (2009). Контролируемое семантическое индексирование (PDF) . ЦИКМ. стр. 100-1 187–196.
- ^ Чен, Вэньлинь; Уилсон, Джеймс; Тайри, Стивен; Вайнбергер, Килиан; Чен, Исинь (01 июня 2015 г.). «Сжатие нейронных сетей с помощью хэш-трюка» . Международная конференция по машинному обучению . ПМЛР: 2285–2294. arXiv : 1504.04788 .
- ^ Оуэн, Шон; Анил, Робин; Даннинг, Тед; Фридман, Эллен (2012). Махут в действии Мэннинг. стр. 100-1 261–265.
- ^ "gensim: corpora.hashdictionary – создать сопоставления слов<->id" . Радимрехурек.com . Проверено 13 февраля 2014 г.
- ^ «4.1. Извлечение функций — документация scikit-learn 0.14» . Scikit-learn.org . Проверено 13 февраля 2014 г.
- ^ «sofia-ml — набор быстрых инкрементных алгоритмов для машинного обучения. Включает методы обучения моделей классификации и ранжирования с использованием Pegasos SVM, SGD-SVM, ROMMA, пассивно-агрессивного перцептрона, персептрона с запасами и логистической регрессии» . Проверено 13 февраля 2014 г.
- ^ «Хеширование ТФ» . Проверено 4 сентября 2015 г.
Сопоставляет последовательность терминов с их частотами, используя прием хеширования.
- ^ «FeatureHashing: создает матрицу модели посредством хеширования функций с помощью интерфейса формулы» . 10 января 2024 г.
- ^ «tf.keras.preprocessing.text.hashing_trick — TensorFlow Core v2.0.1» . Проверено 29 апреля 2020 г.
Преобразует текст в последовательность индексов в хеш-пространстве фиксированного размера.
- ^ «dask_ml.feature_extraction.text.HashingVectorizer — документация dask-ml 2021.11.17» . ml.dask.org . Проверено 22 ноября 2021 г.