Как инициализировать встраивание слов для слова вне словарного запаса?

Я пытаюсь использовать набор данных CoNLL-2003 NER (английский), и я пытаюсь использовать для него предварительно обученные вложения. Я использую предварительно обученные вложения SENNA. Теперь у меня около 20 тысяч слов в моем словаре, и из них у меня есть встраивание только для 9,5 тысяч слов.
Мой текущий подход состоит в том, чтобы инициализировать массив 20k X embedding_size нулями и инициализировать 9,5 тысяч слов, вложения которых мне известны и сделайте все вложения доступными для обучения.

У меня вопрос, как лучше всего это сделать? Любая ссылка на такое исследование будет очень полезной?


person lordzuko    schedule 23.01.2018    source источник


Ответы (3)


Я бы предложил три способа решения этой проблемы, каждый из которых имеет свои сильные стороны:

  • Вместо использования вложений SENNA попробуйте использовать вложения FastText. Преимущество здесь в том, что они могут вывести вложения для слов OOV, используя символьные n-граммы. Чтобы узнать точную используемую методологию, проверьте соответствующий документ. Gensim реализовал все необходимые функции. Это значительно уменьшит проблему, и вы сможете более точно настроить индуцированные вложения, как вы описываете. Неудобство в том, что вам придется переходить с сенны на FastText.
  • Попробуйте использовать морфологическое или семантическое сходство для инициализации слов OOV. С точки зрения морфологии я имею в виду использование расстояния вроде Левенштейна для выбора вложения. Для слова OOV, такого как apple, выберите ближайшее (в соответствии с расстоянием Левенштейна) слово, для которого у вас есть вложения, например, apples. По моему опыту, это может работать замечательно. С другой стороны, семантическое сходство предполагает использование, например, синонимов, полученных из таких ресурсов, как WordNet, или даже усреднение вложений слов, с которыми часто встречается OOV.
  • После уменьшения разреженности способами, описанными выше, перейдите к произвольной инициализации, которая обсуждается в других ответах.
person geompalik    schedule 23.01.2018
comment
Я просмотрел статью Fasttext, и она предлагает подход с почти бесконечным словарным запасом, что делает предложенный вами подход наиболее подходящим. Я провожу свои эксперименты. Скоро опубликую свои результаты. - person lordzuko; 24.01.2018
comment
Можем ли мы обучить FastText на GPU? У меня огромный корпус, и на обучение могут уйти месяцы. Есть ли способ ускорить обучение Fasttext? - person Uma Maheswara Rao Pinninti; 15.06.2018


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

На практике все слова вне словарного запаса часто преобразуются в <UNK>, и все получают простое встраивание нуля. В этом случае вам не нужно хранить все эти нули в матрице внедрения, вместо этого выполните интеллектуальный поиск, который выбирает вектор внедрения, если индекс находится в словаре, или нули в противном случае. Если вы используете тензорный поток, это именно то, что делает tf.nn.embedding_lookup. Таким образом, матрица внедрения будет меньше (10k x embedding_size), и обучение будет быстрее.

Я не уверен, что есть много исследований слов OOV, но для справки я могу упомянуть нейронный машинный перевод Google система:

Учитывая категориальный характер слов, модель должна сначала найти исходное и целевое вложения, чтобы получить соответствующие представления слов. Чтобы этот слой внедрения работал, сначала для каждого языка выбирается словарь. Обычно выбирается размер словаря V, и только наиболее часто встречающиеся слова V рассматриваются как уникальные. Все другие слова преобразуются в "неизвестный" токен, и все они получают одинаковое вложение. Веса внедрения, по одному на каждый язык, обычно изучаются во время обучения.

person Maxim    schedule 23.01.2018
comment
Я использовал этот подход, он, похоже, не работает для меня, поскольку я пытаюсь улучшить свою систему NER. Как известно, системы NER уже страдают от проблемы со словами OOV, и сокращение начального словарного запаса, похоже, только усугубляет ситуацию. - person lordzuko; 24.01.2018