Уметь отвечать на вопросы - это одно, но другое дело, когда речь идет о понимании того, что у вас нет ресурсов для ответа. Если диалоговые агенты теперь могут давать ответы из наборов данных, таких как системы извлечения понимания прочитанного, такие как NewsQA или SQuAD. Они даже могут сказать, когда не понимают. Тем не менее, это совсем другое дело, чтобы заставить их понять, что они могут не знать ответов из документа. Здесь вы познакомитесь с некоторыми функциями, которые помогут научить любого диалогового агента, когда он не может угадать ответ на вопрос.

Летом 2018 года была выпущена вторая версия Стэнфордского набора данных с ответами на вопросы, разработанная Раджпуркаром, SQuAD 2.0, чтобы подтолкнуть людей к решению этой проблемы. Я протестировал идеи, предложенные г-жой Альвирой Свалин, которая предоставила систему, которая отвечала на вопросы, основанные на расстояниях и корневом сопоставлении для SQuAD. Ее код доступен здесь. Я обновил ее функции и попробовал некоторые из них, чтобы помочь вам определить, когда набор данных не поддерживает ответ, и воздержусь от ответа.

Эти функции являются неконтролируемыми и контролируемыми методами, протестированными на предмет их полезности для ответов на вопросы и определения отсутствия таковых. Я пытаюсь найти предложение из предложенных абзацев, содержащее точный ответ, или сказать, когда ответа нет вообще, а не точного ответа. Это более легкая альтернатива запросам SQuAD 2.0.

Помимо тестирования результатов функций, стоящих перед этой новой проблемой, вклад этой статьи также состоит в том, чтобы повысить точность того, что Асвалин назвал «корневым соответствием», с 29,19% до 35,78% точности.

Сначала проблема определяется математически (1), затем отображаются попытки и функции, которые вы можете повторно использовать (2), мы предоставляем наши результаты (3) и делаем вывод (4).

1. Определение проблемы

Математически проблему, поставленную SQuAD2.0, можно описать следующим образом:

Тем не менее, мы сосредоточимся на предложениях, как это было в исходной статье SQuAD.

Задача состоит в том, чтобы найти для каждого вопроса qᵢ ⱼ и всех связанных абзацев правильный абзац, содержащий ответ rᵢ ⱼ ₖ, или показать, что ответов нет. Другими словами, нужно предсказать такой абзац как yᵢ ⱼ:

2. Попытка

Теперь, когда мы знаем, в чем проблема, мы представляем функции, которые мы разработали для разработки алгоритма, который решает проблему, показанную ранее, и контролируемые алгоритмы, которые мы легко использовали благодаря linear_model из sklearn библиотека. Все функции разработаны для того, чтобы предсказать лучший ответ ŷ.

Особенности обработки данных

Мы здесь не занимаемся инновациями. Мы используем только самые современные методы обработки данных для встраивания предложений и синтаксического анализа зависимостей, которые помогают нам улучшить функции Swalin или создать свои собственные. Их важно хорошо понимать, потому что впоследствии они составляют основу нашей работы.

- Вложения предложений f ₑ ₘ (p ᵢ) = E (p ᵢ)

вложения предложений разделяют все алгоритмы и многие попытки, особенно Swalin. Он нацелен на разбиение каждого абзаца p ᵢ на предложения sₗ.
- ввод: абзацы pᵢ или вопрос q
- вывод: векторизованные предложения sₗ или вопрос q̇

Я использовал Facebook Infersent методы, но вы можете использовать другие. Он состоит в создании словаря из обучающих данных и использовании этого словаря для обучения нашей модели кодировщика встраивания предложений. Для создания этого словаря мы выбрали 300-мерные вложения слов Glove. Мы выбрали большое измерение, потому что некоторые ключевые слова, такие как вопросительные местоимения, такие как what, how, which и другие, могут иметь решающее значение для систем обеспечения качества. Поэтому я стараюсь сохранить большую часть предварительно обученных встраиваний слов и настраивать только наиболее часто встречающиеся вопросительные слова.
После этого обучения модели предоставленные предложения или вопрос, введенные в функцию кодировщика, будут возвращены как 4096- размерный вектор независимо от количества слов.

- Разбор зависимости f_ {dep} (p_i) = D (p_i)

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

Мы предполагаем, что R = r ₁,…, r ₘ - это конечный набор возможных имен зависимостей, которые мы называем отношениями зависимости. Например, связь между заглавным глаголом и его подлежащим можно обозначить с помощью r = SBJ. Граф зависимостей G = (V, E) - это граф, помеченный в стандартном смысле теории графов, и состоит из набора вершин V и набора ребер E, например, для предложения S = w_1, w_2… w_n и набора имен зависимостей R:

  • V ⊆ {w_1,…,w_n}
  • E ⊆ V × R × V
  • если w_i, r, w_j ∈ E, то w_i, r ’, w_j ∉ E для всех r’ ≠ r

Набор ребер E представляет отношения помеченных зависимостей конкретного анализа G. Точнее, ребро w_i, r, w_j ∈ E представляет отношение зависимости напора w_i к w_j, обозначенное типом отношения. Следовательно, граф зависимости G - это набор отношений зависимости между токенами в S.

Например, мы представляем график зависимостей на рисунке
выше следующим графиком:

  • G = (V, E)
  • V = {Это реплика грота в Лурде, Франция, где, по общему мнению, явилась Дева Мария, Святой Бернадетте…}
  • E = {(is, NSUBJ, It), (is, ATTR, реплика), (реплика, PREP, of), (of, POBJ, грот),…}

Набор отношений зависимости между токенами S создается стратегией машинного обучения Spacy. Чрезвычайно важно выполнить определение корней перед тем, как сравнивать корни предложений с корнями вопроса, поскольку в противном случае «появляется» не соответствовало бы «появилось».

Особенности и неконтролируемые алгоритмы

После получения векторного представления или анализа зависимостей мы применяем несколько функций к каждому вопросу. Расстояние между предложением и вопросом и соответствие корня - единственные, которые я не проектировал, а только адаптировал для рассмотрения набора данных с новыми ответами.

- Расстояние до вопроса

Мы вычисляем пару предложение-вопрос для показателей расстояния: косинусное сходство между q_ {ij} и s_ {il}. Поэтому ответ таков:

или мы также можем вычислить евклидово расстояние между предложениями и вопросом.

Этого было бы достаточно для набора данных SQuAD, но так было, когда ответ всегда существовал. Нам пришлось немного изменить эту функцию, чтобы учитывать тот случай, когда нет никаких ответов. Мы вычислили расстояние с помощью пространственной функции scipy, функции для вычисления расстояния между двумя числовыми векторами q и s.

- Наличие ответа

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

То есть на каждый вопрос q_ {ij} и каждый связанный абзац p_i мы получаем следующий ответ ŷ_ {ij} такой, что:

Это применимо как для косинусных, так и для евклидовых методов. Чтобы определить порог t, мы построили график распределения расстояний, когда ответы были, а когда их не было:

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

- Соответствие корня

Эта функция уже была протестирована Swalin. Здесь вы пытаетесь сопоставить корень вопроса со всеми корнями и подкорнями предложения. Поскольку в предложении несколько глаголов, можно получить несколько корней. Если корень предложения содержится в корне вопроса, то с большей вероятностью ответ на вопрос дан из этого предложения.

Благодаря функции f_ {dep} (p_i) = D (p_i), описанной выше, мы получили набор отношений w_a, r, w_b ∈ E между токенами абзац, который обычно представляет собой слова или группу слов. Набор отношений в конечном итоге создает дерево из любого абзаца p_i или вопроса q_ {ij}. Следовательно, мы берем корневой токен w '* _ {j}, который доминирует в отношениях данного вопроса, и пытаемся сопоставить его с любым корневым токеном w_l предложения s_l.

Учитывая это, это помогает нам создать еще одну характеристику для каждого предложения, значение которого равно 1 или 0. Здесь 1 означает, что корень вопроса содержится в корнях предложения, а в противном случае - 0.

То есть на каждый вопрос q_ {ij} и все связанные предложения s_ {il} абзаца мы получаем следующий ответ ŷ_ {ij} такой, что:

Где V_ {s_ {il}} - это набор корней предложений абзаца p_i.

- соответствие контекста

Затем вы можете проверить идею не сосредотачиваться на корне вопроса, а скорее на контексте, проверив, что хотя бы один корень вопроса w′j соответствует одному корню w_l этого предложения. Назовем это… сопоставлением контекста. То есть на каждый вопрос q_i j и каждый связанный абзац мы получаем следующий ответ ŷ_ {ij} такой, что:

Где V_ {s_ {il}} - это набор корней предложений абзаца p_i.

Как насчет решения проверить идею оценки предложений, в которых хотя бы один корень вопроса w_j ’соответствует другому корню w_i этого предложения, и вернуть то, которое имеет наивысший балл. Оценка предложения - это количество корней, совпадающих с корнями вопроса.

То есть дан абзац p_i, для каждого вопроса q_ {ij} с набором корней V_ {q_ {ij}} и каждого набора корней V_ {s_ {il}} предложения s_ {il} этого абзаца , получаем следующий ответ ŷ_ {ij} такой, что

Где S_i - это набор предложений абзаца p_i.

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

Когда Бейонсе стала популярной?

Здесь «начать становиться популярным» в ответе аналогично «прославиться».

прославился в конце 1990-х.

Мы не создавали никаких функций для этого, а использовали wordnet от nltk.corpus.

Алгоритмы обучения с учителем

Я попробовал три алгоритма контролируемого обучения, но уверен, что подойдет и другой. Я был мотивирован и движим тем фактом, что большая часть моих неконтролируемых подходов не была на самом деле успешной.

- Полиномиальная логистическая регрессия

Полиномиальная логистическая регрессия - это метод классификации, который обобщает логистическую регрессию.

Для мультиклассовых задач, то есть с более чем двумя возможными дискретными исходами, была естественная идея для задачи, в которой нам приходилось выбирать между различными частями предложения в качестве возможных ответов. Мы используем функцию linear_model из библиотеки sklearn.

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

где {X} _ {i} - вектор независимых переменных, описывающих наблюдение i, β_k - вектор весов, соответствующих результату k, это вычисляет оценку, связанную с присвоением наблюдения i категории k.
В нашем случае:

Здесь наш вклад состоял в обновлении цели для вопросов без ответов.

- Случайный лес

Алгоритм случайного леса также был естественным выбором для этой задачи классификации, поскольку он основан на алгоритме дерева решений. Это дерево решений, в котором каждый узел принимает двоичное решение, основанное на том, соответствует ли x_i ‹t заданному пороговому значению t. x_i∈ X - объект или вектор, который помогает классифицировать.

Например, в нашем случае

состоит из векторов расстояния и соответствия корня в предложениях абзаца. Верхний узел содержит все примеры, а набор примеров делится среди дочерних узлов каждого узла в соответствии с классификацией на этом узле. Разделение примеров продолжается до тех пор, пока у каждого узла внизу не будут примеры, относящиеся только к одному классу. В каждом узле выбирается характеристика x_i и порог, чтобы минимизировать разнообразие дочерних узлов.

- XgBoost

XgBoost - это идея случайного леса, разработанная Фройндом, которая основана на идее, что набор слабых классификаторов все еще работает немного лучше, чем реальность.

3. Результаты

Результаты неконтролируемого обучения с функциями Aswalin не стабильны в SQuAD2.0. Действительно, среди неконтролируемых методов косинусного расстояния, SQuAD довольно хорошо работает, достигая точности более 0,6. К сожалению, в новом наборе данных этого не произошло.

Значительно снизилась точность результатов по всем функциям. Но косинусное расстояние потеряло более 20% точности, что почти вдвое больше, чем у других погрешностей. Это потребовало проверки, возможно ли установить порог, чтобы узнать, на чей вопрос может быть нет ответа.

Расстояние не помогает ответить на вопросы, на которые нет ответа

Расстояния были бы полезны для выяснения вопросов, на которые нет ответа, если бы они не могли дать ответов, если бы расстояние было слишком большим. Это было бы статистически прослежено с увеличением точности при повышении порога и, возможно, уменьшением, когда оно было слишком высоким.

Тем не менее, как видно на рисунке, повышение точности практически не заметно при увеличении порога. Мы можем сделать вывод, что порог расстояния между векторами - не самая лучшая функция для поиска того, на что нет ответа.

Root Matching и расширения помогают обнаруживать вопросы, на которые нет ответа

Затем вы можете попытаться увидеть, что произойдет, если вы спросите, чтобы хотя бы один корень вопроса соответствовал одному корню первого предложения, то есть g_ {context} Вы можете попытаться сделать это еще более надежен с функцией подсчета баллов между предложениями на основе количества корней, общих с вопросом

И вы достигнете 35,78% точности. С этой отправной точки мы решили начать следующие алгоритмы.

Заметив, что некоторые вопросы касались людей, мест или учреждений, например: «Какую роль Бейонсе играла в Destiny’s Child?» Я подумал о том, чтобы попытаться добавить их в корень вопросов и абзацев, иначе они были бы установлены как не являющиеся корнем и забыты. Я также попытался добавить синонимы корней, используя синонимы nltk.

Мы просто получили уровень точности 35,7182%. Эти плохие результаты могут быть вызваны не очень похожими синонимами. Действительно, в вопросе «Какую роль Бейонсе играла в Destiny’s Child?» корни бывают «иметь» и «внутри». Синонимы второго - «собственный» или «удерживать», но также некоторые из них применимы только в определенном контексте, например «получить», «получить», «принять», «побудить», который может отличаться от одного из контекст. Некоторые другие «give_birth», «rich_person» нуждаются в обработке для удаления подчеркивания и, возможно, не смогут сопротивляться приручению. Синонимы первого - «дюйм», «индийский», «инд», что показывает, что некоторые из них на самом деле не являются синонимами. После попытки добавить имена собственные к корням вопросов и абзацев, наш показатель точности упал до 32,4033%. Вероятно, это было вызвано тем, что в первом абзаце обычно указывается имя человека или учреждения, к которому направлен вопрос.

Контролируемый алгоритм

При тестировании в SQuAD все четыре контролируемых метода неплохо справились с предоставленными функциями сопоставления расстояния и корня.

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

4. Вывод

Во-первых, вы можете видеть, что попытка Свалина решить эту новую проблему, SQuAD 2.0, не так актуальна, как в первом наборе данных для понимания прочитанного. Ее попытка была основана на встраивании предложений и расстоянии между вопросом и предложениями. Алгоритмы без учителя потеряли от 10,58% до 20,87% точности перед этой новой задачей, в то время как алгоритмы с учителем потеряли от 23,29% до 35% точности. Порогового значения расстояния между предложениями, преобразованными в векторы, недостаточно, чтобы определить, когда для данного слова не существовало ответа.

Во-вторых, Swalin недостаточно использовал сопоставление корней, поскольку вы можете проверить это с помощью функции, оценивающей предложения по количеству общих корней с вопросом. Это увеличило точность соответствия корня на 7% на SQuAD2.0.

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

Надеюсь, вам понравилась статья. Не стесняйтесь связаться со мной, если

  • ты хочешь нанять меня;)
  • Я могу улучшить эту статью.