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

Conneau et al. отметил, что контролируемое обучение в ImageNet (классификация изображений) хорошо справляется с переносом результатов на последующие задачи. Некоторые функции могут быть каким-то образом переданы нижестоящему этапу. Таким образом, Conneau et al. использовал текстовые данные следования для обучения слоя встраивания предложений, который вызывает InferSent.

Прочитав эту статью, вы поймете:

  • InferSent Дизайн
  • Архитектура
  • Реализация
  • Забрать

InferSent Дизайн

Идея состоит в том, что команда использует данные SNLI (Standford Natural Language Inference) для обучения модели для задачи Natural Language Inference (NLI). Цель NLI - найти взаимосвязь между предложением 1 (посылка) и предложением 2 (гипотеза). Есть три категории: следствие, противоречие и нейтральность. Вот самый примерный пример:

  1. Я ем фрукты.
  2. Я ем яблоко.

Интуитивно понятно, что отношения - это следствие. Авторы считают, что NLI - подходящая задача для понимания семантических отношений внутри предложений, так что она помогает построить хорошие вложения для встраиваний предложений для последующих задач NLP.

Архитектура

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

  1. Конкатенация двух векторов
  2. Поэлементное произведение двух векторов
  3. Абсолютная поэлементная разность двух векторов

После обзора можно перейти к архитектуре кодировщиков предложений. Conneau et al. оценили 7 различных архитектур:

  1. Стандартный LSTM
  2. Стандарт ГРУ
  3. Объединение последних скрытых состояний прямого и обратного ГРУ
  4. Двунаправленный LSTM со средним опросом
  5. Двунаправленный LSTM с максимальным опросом
  6. Самовнимательная сеть (внимание с помощью BiLSTM)
  7. Иерархические сверточные сети

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

По результатам эксперимента лучший подход - двунаправленный LSTM с максимальным опросом.

Реализация

Есть 2 способа использовать InferSent. Во-первых, это использование предварительно обученного слоя встраивания в ваших задачах НЛП. Другой - создаёт InferSent самостоятельно.

Загрузить предварительно обученные вложения

Исследовательская группа Facebook предоставляет 2 предварительно обученных модели: версии 1 (на основе GloVe) и версии 2 (на основе fastText).

Загружая как предварительно обученную модель InferSent, так и модель GloVe (или fastText), вы можете закодировать предложение в векторы.

# Init InferSent Model
infer_sent_model = InferSent()
infer_sent_model.load_state_dict(torch.load(dest_dir + dest_file))
# Setup Word Embedding Model
infer_sent_model.set_w2v_path(word_embs_model_path)
# Build Vocab for InferSent model
model.build_vocab(sentences, tokenize=True)
# Encode sentence to vectors
model.encode(sentences, tokenize=True)

Вложения поездов

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

Вот шаг первого подхода. Клонировать InferSent оригинальное репо на локальный. Затем запустите get_data.bash в консоли, чтобы был загружен и обработан корпус SNLI (Stanford Natural Language Inference) и MultiNLI) MultiGenre NLI). Убедитесь, что вам нужно выполнить следующий сценарий оболочки в текущей папке, но не по другому относительному пути

./get_data.bash

После этого скачиваем GloVe (и / или fastText)

mkdir dataset/GloVe
curl -Lo dataset/GloVe/glove.840B.300d.zip http://nlp.stanford.edu/data/glove.840B.300d.zip
unzip dataset/GloVe/glove.840B.300d.zip -d dataset/GloVe/
mkdir dataset/fastText
curl -Lo dataset/fastText/crawl-300d-2M.vec.zip https://s3-us-west-1.amazonaws.com/fasttext-vectors/crawl-300d-2M.vec.zip
unzip dataset/fastText/crawl-300d-2M.vec.zip -d dataset/fastText/

Скачивание предварительно обученной модели InferSent. Версия 1 обучается с использованием GloVe, а Версия 2 использует fastText.

curl -Lo encoder/infersent1.pkl https://s3.amazonaws.com/senteval/infersent/infersent1.pkl
curl -Lo encoder/infersent2.pkl https://s3.amazonaws.com/senteval/infersent/infersent2.pkl

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

python train_nli.py --word_emb_path ./glove.42B.300d.txt

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

Забрать

Чтобы получить доступ ко всему коду, вы можете посетить мой репозиторий github.

  • По сравнению с другими подходами к внедрению, InferSent использует контролируемое обучение для вычисления векторов слов.
  • InferSent использует встраивание слов (GloVe / fastText) для встраивания предложений.
  • Предварительно обученная модель поддерживает как GloVe (версия 1), так и fasttext (версия 2).

Обо мне

Я специалист по анализу данных в Bay Area. Сосредоточение внимания на последних достижениях науки о данных, искусственного интеллекта, особенно в области НЛП и связанных с платформами. Вы можете связаться со мной из Medium Blog, LinkedIn или Github.

Ссылка

Conneau, D. Kiela, H. Schwenk, L. Barrault, A. Bordes, контролируемое изучение представлений универсальных предложений на основе данных логического вывода на естественном языке

InfeSent в Pytorch