Английское НЛП и, в частности, неанглийские приложения НЛП часто могут повысить точность классификатора до 10% за счет перехода на высококачественные вложения слов.

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

Библиотека НЛП SpaCy предлагает модели на английском и многих других языках, а именно: немецком, французском, испанском, португальском, итальянском, голландском, греческом, норвежском букмоле, литовском. Однако между предложениями есть большое расхождение. Английская модель доступна в малых, средних и больших размерах, каждый из которых увеличивает размер файла и требования к памяти. Каждая модель имеет фиксированный словарь, и основным компонентом размера файла модели являются векторные измерения встраивания слов. Один из способов уменьшить размер файла - использовать трюк с хешированием.

Уловка хеширования:

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

В некоторых ситуациях в хешировании функций нет ничего плохого, но когда полученное пространство слишком ограничено, коллизии увеличиваются, а производительность снижается. Использование трюка хеширования позволяет создавать векторные модели слов меньшего размера (подумайте, что 200 000 ключевых слов сопоставляются всего с 20 000 векторов с плавающей запятой). Похоже, что модели среднего размера SpaCy построили свои векторные представления слов, используя трюк хеширования с множеством коллизий, или, возможно, они просто случайным образом повторно использовали слоты - словарь модели среднего размера фиксирован, поэтому трудно сказать, но эффект остается такой же. В настоящее время существует только одна большая модель SpaCy, в которой используются полноразмерные вложения - английская. Между тем, все неанглийские языки и модели среднего размера экономят дисковое пространство и память за счет повторного использования слотов для встраивания. Эта подсказка указана в спецификации каждой модели среднего размера, вот немецкая:

Векторы 276 тыс. Ключей, 20 тыс. Уникальных векторов (300 измерений)

Да, это повторное использование 86,2%! На практике это много хеш-коллизий.

Чем эффективнее встраивание хешированных слов по сравнению с полноразмерными встраиваемыми данными?

Даже имея всего 7 108 элементов помеченных данных, использование векторов хешированных слов привело к 73% точности вместо 84% точности при использовании полноразмерных вложений (три класса для разделения с базовым уровнем большинства классов 43%) [2 ]. Приведенный выше график кривой обучения показывает, как модель машинного обучения работает по-разному, поскольку она обучается на прогрессивных объемах данных.

К счастью, для неанглийских языков доступны и другие вложения, в частности FastText, который имеет векторы слов для 157 языков с использованием данных Wikipedia и Common Crawl. Конечно, размер и качество сильно различаются между языками:

  • Девять лучших Википедий (за исключением контента, созданного ботами) являются индоевропейскими языками [3]
  • Распределение языков в Common Crawl следует распределению Парето [4]

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

Традиционные инструменты построения векторных слов, такие как Gensim, GloVe или слой встраивания нейронной сети и т. Д., Нуждаются во многих примерах для создания точного представления для одного слова. Таким образом, большинство традиционных векторных моделей слов имеют ограниченный словарный запас и поэтому не могут предсказать ценность слова, которое они раньше не видели. Напротив, рассматривая последовательность символов - иногда называемую информацией подслова - FastText может генерировать модели, которые используют совокупную информацию многих похожих слов и подслов, чтобы генерировать вложения для слов, которых он никогда не видел. Однако есть одна загвоздка: для выполнения этой функции вы должны использовать двоичную форму модели FastText, а не текстовый формат Word Vector.

Создание собственных векторных моделей Word

Формат файла бинарной модели FastText очень велик на диске и в памяти, например 4,2 ГБ сжато для английского языка. Более распространенный формат файла Word Vector - это простой текстовый файл, в котором каждая строка начинается со слова, а затем следуют числа с плавающей запятой, которые представляют размеры этого слова в глобальном пространстве векторов слов. Вот краткая выдержка из файла GloVe, показывающая обычное форматирование текста в векторном файле Word:

город 0,43945 0,43268 -0,36654 0,27781…
составил 0,14205 0,0046063 -0,40052…
вроде 0,36808 0,20834…

На практике приложения NLP / ML используют текстовый файл WordVector в качестве словаря и для преобразования слов в числовые представления, которые затем передаются в конвейеры и модели. Используя исполняемый файл FastText, вы можете загружать файлы бинарных моделей (.bin), запрашивать векторы для каждого указанного вами слова и записывать информацию в текстовый файл в общем векторном формате слова. Процесс действительно настолько прост, вот их пример:

Получение векторов слов
Печать векторов слов для текстового файла query.txt, содержащего слова.
`$ ./fasttext print-word-vectors model.bin‹ query.txt`

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

Лучшее встраивание слов не обязательно требует большего размера

Несколько быстрых экспериментов показывают, что анализ главных компонентов (PCA) может уменьшить полноразмерные вложения слов в SpaCy с 300 до 50 измерений и потерять точность только на один или два пункта. Когда обычные / полноразмерные вложения сравниваются с хешированными, мы обнаружили разницу в точности на 10% +. Правильно: используя на 83% меньше места, 50-мерный вектор слов превзошел 300-размерный хешированный вектор слов более чем на 10%. При этом использовалось три класса для разделения и 7 108 помеченных элементов; если у вас больше данных или больше классов - ваш пробег может отличаться - но производительность, вероятно, будет хуже.

Как повысить производительность вашего приложения НЛП

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

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

SpaCy по-прежнему остается хорошей библиотекой НЛП

Хотя я критически отношусь к выбору SpaCy для использования векторов хешированных слов в своих моделях среднего размера, это по-прежнему отличная библиотека НЛП, и я рекомендую ее всем начинающим практикам НЛП (от новичков до среднего и выше).

Вам не нужно выбрасывать имеющийся у вас код SpaCy; вы должны иметь возможность использовать модели SpaCy для других функций, таких как токенизация, тегирование части речи, распознавание именованных сущностей и категоризация текста [5]. Кроме того, некоторые части архитектуры SpaCy являются модульными и расширяемыми, что позволяет использовать множество новых возможностей. Однако пользователям следует также рассмотреть альтернативы. Stanza, стэнфордская библиотека НЛП, сейчас составляет серьезную конкуренцию, и ее следует рассматривать как возможность начинать с нуля. В отличие от SpaCy, Stanza не обеспечивает встраивания слов как части отдельного словаря.

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

Ссылки
[1] https://en.wikipedia.org/wiki/Feature_hashing
[2] https://www.kaggle.com/toddcook/ последствия-встраивания-пространственного-сравнения-качества
[3] https://en.wikipedia.org/wiki/List_of_Wikipedias
[4] https://commoncrawl.github.io/ cc-crawl-statistics / plots / crawlsize
[5] https://spacy.io/usage/processing-pipelines

(Спасибо Кайлу П. Джонсону и Джошу Фрейзеру за рецензирование и комментарии к черновику этой статьи.)