Улучшение автоматизированного понимания содержания ответов на сложные вопросы

Оглавление:

  1. Введение
  2. Мотивация
  3. Предпосылки
  4. Сбор данных
  5. Понимание данных
  6. Очистка данных
  7. Загрузка тренировочного набора
  8. Предварительная обработка данных — изображения
  9. Предварительная обработка данных — подписи
  10. Подготовка данных с использованием функции генератора
  11. Вложения слов
  12. Архитектура модели
  13. Вывод
  14. Оценка
  15. Заключение и будущая работа
  16. использованная литература

1. Введение

Эти данные маркировки вопросов и ответов Google QUEST участвуют в конкурсе Kaggle, проводимом Google.

Целью набора данных является улучшение автоматизированного понимания содержания ответов на сложные вопросы.

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

Люди лучше справляются с субъективными вопросами, которые требуют более глубокого, многомерного понимания контекста — компьютеры пока не умеют с этим хорошо справляться. полностью разработанная проблема. Они могут иметь несколько намерений или искать совета и мнения. Некоторые могут быть полезными, а другие интересными. Некоторые из них просто правильные или неправильные.

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

В этом конкурсе вам предстоит использовать этот новый набор данных для создания алгоритмов прогнозирования для различных субъективных аспектов ответов на вопросы. Пары вопрос-ответ были собраны почти с 70 различных веб-сайтов в духе «здравого смысла». Наши оценщики получали минимальное руководство и обучение и в основном полагались на свою субъективную интерпретацию подсказок. Таким образом, каждая подсказка была разработана максимально интуитивно, чтобы оценщики могли просто использовать свой здравый смысл для выполнения задачи. Уменьшая нашу зависимость от сложных и непрозрачных правил рейтинга, мы надеемся увеличить ценность повторного использования этого набора данных. Что вы видите, то и получаете!

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

2. Мотивация

`

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

  1. Данные Amazon Fine Food Review: Amazon Fine Food Review — одна из самых больших проблем при прогнозировании отзывов клиентов. Мы можем увеличить продажи на сайте электронной коммерции.
  2. Выбор донора: набор данных выбора донора получает тысячу проектов каждый год для классного проекта. Столь большое количество волонтеров должны были вручную проверять каждую заявку, прежде чем она будет одобрена. Цель состоит в том, чтобы предсказать, будет ли одобрено проектное предложение DonorChoose.org, представленное учителем, или нет.
  3. Сходство пары вопросов Quora: - Сходство пар вопросов Quora - это проблема в кворе, заключающаяся в том, что большинство вопросов сформулированы по-разному, но имеют одинаковое значение. В настоящее время Quora использует модель случайного леса для выявления повторяющихся вопросов. Наша основная задача — применить передовые методы для классификации пар вопросов, являются ли они дубликатами или нет.

3. Предпосылки

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

Техника глубокого обучения, такая как многоуровневые персептроны, сверточные нейронные сети, LSTM, недообучение, переоснащение, вероятность, обработка текста, синтаксис и структуры данных Python, библиотека Keras и т. д.

Предварительная обработка естественного языка, такая как Bert, Albert, Roberta, XLNET и т. д., присутствует в Hugging Face.

4. Сбор данных

Kaggle — основной источник сбора данных в этой задаче.

Данные для этого конкурса включают вопросы и ответы от различных ресурсов Stack Exchange. Ваша задача — спрогнозировать целевые значения 30 меток для каждой пары вопрос-ответ.

Описания файлов

  • train.csv — данные обучения (целевые метки — последние 30 столбцов)
  • test.csv — тестовый набор (вы должны предсказать 30 меток для каждой строки тестового набора)
  • sample_submission.csv — образец файла отправки в правильном формате; имена столбцов — это 30 целевых меток

5. Понимание данных

Список из 30 целевых меток совпадает с именами столбцов в файле sample_submission. Целевые метки с префиксом question_ относятся к функциям question_title и/или question_body в данных. Целевые метки с префиксом answer_ относятся к функции ответа.

Каждая строка содержит один вопрос и один ответ на этот вопрос, а также дополнительные функции. Данные обучения содержат строки с некоторыми повторяющимися вопросами (но с разными ответами). Данные теста не содержат повторяющихся вопросов.

Это не задача бинарного предсказания. Целевые метки объединяются из нескольких оценщиков и могут иметь непрерывные значения в диапазоне [0,1]. Следовательно, прогнозы также должны быть в этом диапазоне.

Поскольку это синхронное повторное соревнование, у вас есть доступ только к общедоступному набору тестов. В целях планирования повторный набор тестов должен содержать не более 10 000 строк и менее 8 МБ в несжатом виде.

Я загрузил файл поезда, теста и отправки с Kaggle. Используя Panda Dataframe, мы можем прочитать файл File.

Мы можем прочитать этот файл следующим образом:

6. Очистка данных и предварительная обработка

В этом наборе данных у нас нет значения Null, так как в описании проблемы kaggle написано, что значение Null отсутствует в наборе данных.

Когда мы имеем дело с текстом, мы обычно выполняем некоторую базовую очистку, такую ​​как перевод всех слов в нижний регистр, удаление специальных токенов (таких как «%», «$», «#» и т. д.), удаление тегов HTML, тегов \r, \ n (ввод) с пробелом Удалены все специальные символы.

Ниже приведен фрагмент кода для удаления тега HTML, специального символа.

7. Исследовательский анализ данных

После очистки и слияния данных все данные, установленные в final_dataset. Приступим к исследовательскому анализу данных.

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

Хост является категориальной функцией, которую мы имеем в наборе обучающих данных. Ниже приведен фрагмент кода Распределение хоста (с какого веб-сайта собраны вопросы и ответы)

Ниже приведен вывод кода

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

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

Ниже приведен фрагмент кода Распределение категорий.

Ниже приведены выходные данные приведенного выше кода.

Поскольку у нас есть 30 целевых переменных, которые нам нужно предсказать на основе 11 функций, присутствующих в наборе тестовых данных.

давайте посмотрим Распределение целевых переменных.

Ниже приведен фрагмент кода для построения графика распределения целевых переменных.

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

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

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

Наиболее распространенная функция, присутствующая как в обучении, так и в тестировании, — это answer_user_name 405.

В качестве наиболее важной или информативной функции у нас есть текстовая функция, так как у нас есть question_title , question_body и question_answer.

Ниже приведен код для распределения заголовка вопроса.

Ниже приведен код Box plot

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

У нас может быть график Word, чтобы узнать важные слова, присутствующие в текстовых данных.

Ниже приведен код словесного сюжета.

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

Ниже приведен код для определения связанных с ответом answer_related_target_cols.

8. Разработка функций

В Feature Engineering у нас есть текстовые функции, такие как question_title, question_body и Question_answer.

Это функция, которую мы можем создать с помощью текстовой функции.

  • Количество символов в question_title
  • Количество символов в question_body
  • Количество символов в ответе
  • Количество слов в question_title
  • Количество слов в question_body
  • Количество слов в ответе
  • Количество уникальных слов в question_title
  • Количество уникальных слов в question_body
  • Количество уникальных слов в ответе

Ниже приведены код и график частоты слов в обучающих данных.

Ниже приведен код для создания количества символов в текстовых данных.

Точно так же мы можем построить то же самое для вышеупомянутой функции в разделе «Разработка функций».

9. Разделение набора данных

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

10 . Предварительная обработка данных

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

Одно горячее кодирование

Для категориальной функции мы должны выполнить одно горячее кодирование с использованием CountVectorizer. CountVectorizer доступен в Sklearn.

Ниже приведен фрагмент кода для выполнения одного горячего кодирования в категориальных данных.

Ниже приведены выходные данные

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

Стандартизация столбца числового признака

В нашем фрейме данных у нас есть такие функции, как question_title_num_chars, question_body_num_chars, question_title_num_chars и т. д., которые являются числовыми функциями.

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

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

11. Векторизация текста

Удалите слова с низким значением IDF и высоким значением IDF из наших данных.

Поскольку в нашем корпусе много текстовых данных, мы можем удалить слова с низким значением IDF и высоким значением IDF. Сначала мы должны вычислить значение IDF, а затем удалить слова с высоким значением IDF и низким значением IDF.

Текстовый вектор FastText

Вектор слова Fastext содержит вектор 157 языков. Ниже приведен код для загрузки вектора слов.

ft = fasttext.load_model('cc.en.300.bin')
glove_words =  set(ft.words)

Мы можем построить 30-мерный вектор слов, используя вектор перчаток.

12. Глубокое обучение с Керасом

Вложения слов

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

Ниже приведен фрагмент кода для создания нашего пользовательского вектора слов.

13 . Модель глубокого обучения LSTM

Модель глубокого обучения LSTM в основном используется для последовательности слов, в отличие от пакета слов, векторизатор TF-IDF не фокусируется на последовательности слов, но LSTM дает значительно хороший результат при сохранении информации о последовательности слов.

Ниже приведен код для выполнения модели LSTM.

Таким же образом мы можем работать с категориальными данными и числовыми данными.

После этого у нас есть список слоев Concat, куда мы добавляем каждое категориальное, числовое и текстовое встраивание.

В нашем проекте у нас есть проблема регрессии. В нашем проекте мы являемся единицей активации relu, потому что она работает значительно лучше по сравнению с tanh и sigmoid, поскольку у нее есть проблема с исчезающим градиентом.

Для инициализации ядра мы выбираем нормальную, так как у нас есть много инициализаций ядра, доступных в keras, таких как Random Uniform, glorot Normal, glorotuniform. Обычно он хорошо работает в нашей модели LSTM.

Мы экспериментировали с коэффициентом отсева и обнаружили, что показатель отсева работает нормально, когда показатель меньше 0,5 (у нас есть 0,2 как лучший показатель отсева).

Ниже приведен фрагмент кода модели LSTM.

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

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

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

Для проверки графика Epoch vs loss у нас есть тензорная доска в Tensorflow.

Ниже приведен фрагмент кода для компиляции и запуска.

График тензорной доски

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

14. Нейронная сеть свертки модели глубокого обучения (CNN)

Нейронная сеть свертки в основном используется для метода обнаружения изображений. Нейронная сеть свертки вдохновлена ​​​​биологической нейронной сетью. В CNN у нас есть объединение и заполнение, мы четко обнаруживаем края. Здесь, в нашем проекте, мы собираемся использовать нейронную сеть свертки 1 измерение, так как 2-мерная нейронная сеть используется для изображений. и мы пробуем различное количество слоев и коэффициент отсева, чтобы найти наилучшие потери и точность.

Здесь, в нашем проекте, мы используем инициализатор ядра, как обычно, и единицей активации является relu (не tanh и sigmoid, поскольку у него есть проблема исчезающего градиента)

Ниже приведен фрагмент кода для применения CNN *

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

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

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

Для проверки графика Epoch vs loss у нас есть тензорная доска в Tensor Flow.

Ниже приведен фрагмент кода для компиляции и запуска.

Tensor Board Plot выглядит так

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

15 LSTM и CNN

Мы пытаемся объединить слой LSTM и CNN, проверить потери, которые мы получаем, и точность, которую мы получаем после объединения структуры LSTM и CNN. мы можем использовать инициализацию как «нормальную», а единицу активации мы взяли как Relu. мы пробуем различное количество слоев и коэффициент отсева, чтобы найти наилучшие потери и точность.

Ниже приведен код для объединения CNN 1-d и LSTM.

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

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

Для проверки графика Epoch vs loss у нас есть тензорная доска в Tensor Flow.

Ниже приведен фрагмент кода для компиляции и запуска.

График тензорной доски

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

16. Обработка естественного языка Берт, XLNET, Роберта

Hugging Face изначально поддерживал только PyTorch, но теперь TF 2.0 также хорошо поддерживается. Вы можете найти большое количество качественных руководств по использованию библиотеки трансформаторов с PyTorch, но это не так с TF 2.0 (основной мотив для этого блога).

Использовать BERT или даже AlBERT довольно просто, и стандартный процесс в TF 2.0 любезно предоставлен tensorflow_hub, но это не относится к GPT2, RoBERTa, DistilBERT и т. д. На помощь приходит библиотека преобразователя Hugging Face. Они предоставляют интуитивно понятные API для создания пользовательской модели с нуля или тонкой настройки предварительно обученной модели для широкого списка моделей на основе преобразователя.

Он поддерживает широкий спектр приложений NLP, таких как классификация текста, система вопросов и ответов, суммирование текста, классификация токенов и т. д. Для получения более подробной информации перейдите в их Документы.

17 .Обработка естественного языка Берт

Определение токенизатора

Каждая модель на основе трансформатора имеет уникальную технику токенизации, уникальное использование специальных токенов. Библиотека трансформаторов позаботится об этом за нас. Он поддерживает токенизацию для каждой связанной с ним модели.

Токенизация документов

Следующий шаг — выполнить токенизацию документов. Это может быть выполнено либо методом encode(), либо методом encode_plus().

→ Любая модель трансформатора обычно требует трех входов:

  • входные идентификаторы: идентификатор слова, связанный с их словарем
  • маска внимания: на какой идентификатор следует обратить внимание; 1 = обратите внимание. Проще говоря, он сообщает модели, какие слова являются исходными, а какие — дополненными словами или специальными токенами.
  • Идентификатор типа токена: он связан с моделью, использующей несколько предложений, например модель вопрос-ответ. Он сообщает модели о последовательности предложений.

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

Обучение и тонкая настройка

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

  1. Используйте предварительно обученную модель непосредственно в качестве классификатора
  2. Модель преобразователя для извлечения встраивания и использования его в качестве входных данных для другого классификатора.
  3. Тонкая настройка предварительно обученной модели трансформатора в пользовательской конфигурации и наборе данных.

Использовать предварительно обученную модель непосредственно как регрессию

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

Определение токенизатора → Токенизация документов → Определение модели

Ниже приведен код для создания модели

Здесь, в этой модели Берта, мы используем скорость обучения 2e-5 оптимизатора Адама и потери как двоичную_кроссэнтропию.

Таким образом, мы можем подогнать модель без ввода. мы можем получить желаемый прогноз.

18. Обработка естественного языка Роберта

Определение токенизатора

Каждая модель на основе трансформатора имеет уникальную технику токенизации, уникальное использование специальных токенов. Библиотека трансформаторов позаботится об этом за нас. Он поддерживает токенизацию для каждой связанной с ним модели.

Токенизация документов

Следующий шаг — выполнить токенизацию документов. Это может быть выполнено либо методом encode(), либо методом encode_plus().

→ Любая модель трансформатора обычно требует трех входов:

  • входные идентификаторы: идентификатор слова, связанный с их словарем
  • маска внимания: на какой идентификатор следует обратить внимание; 1 = обратите внимание. Проще говоря, он сообщает модели, какие слова являются исходными, а какие — дополненными словами или специальными токенами.
  • Идентификатор типа токена: он связан с моделью, использующей несколько предложений, например модель вопрос-ответ. Он сообщает модели о последовательности предложений.

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

Обучение и тонкая настройка

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

  1. Используйте предварительно обученную модель непосредственно в качестве классификатора
  2. Модель преобразователя для извлечения встраивания и использования его в качестве входных данных для другого классификатора.
  3. Тонкая настройка предварительно обученной модели трансформатора в пользовательской конфигурации и наборе данных.

Использовать предварительно обученную модель непосредственно в качестве классификатора

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

Определение токенизатора → Токенизация документов → Определение модели

Ниже приведен код для создания модели

Здесь, в этой модели Берта, мы используем скорость обучения 2e-5 оптимизатора Адама и потери как двоичную_кроссэнтропию.

Таким образом, мы можем подогнать модель под наши данные. мы можем получить желаемый прогноз.

19 .Обработка естественного языка XLNET

Определение токенизатора

Каждая модель на основе трансформатора имеет уникальную технику токенизации, уникальное использование специальных токенов. Библиотека трансформаторов позаботится об этом за нас. Он поддерживает токенизацию для каждой связанной с ним модели.

Токенизация документов

Следующий шаг — выполнить токенизацию документов. Это может быть выполнено либо методом encode(), либо методом encode_plus().

→ Любая модель трансформатора обычно требует трех входов:

  • входные идентификаторы: идентификатор слова, связанный с их словарем
  • маска внимания: на какой идентификатор следует обратить внимание; 1 = обратите внимание. Проще говоря, он сообщает модели, какие слова являются исходными, а какие — дополненными словами или специальными токенами.
  • Идентификатор типа токена: он связан с моделью, использующей несколько предложений, например модель вопрос-ответ. Он сообщает модели о последовательности предложений.

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

Обучение и тонкая настройка

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

  1. Используйте предварительно обученную модель непосредственно в качестве классификатора
  2. Модель преобразователя для извлечения встраивания и использования его в качестве входных данных для другого классификатора.
  3. Тонкая настройка предварительно обученной модели трансформатора в пользовательской конфигурации и наборе данных.

Использовать предварительно обученную модель непосредственно в качестве классификатора

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

Определение токенизатора → Токенизация документов → Определение модели

Ниже приведен код для создания модели

Здесь, в этой модели Берта, мы используем скорость обучения 2e-5 оптимизатора Адама и потери как двоичную_кроссэнтропию.

Таким образом, мы можем подогнать модель под наши данные. мы можем получить желаемый прогноз.

20. Сравнение модели машинного обучения и модели глубокого обучения.

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

Ниже приведен код для печати красивой таблицы.

21. Заключение и будущая работа

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

Конечно, это только первое решение, и для его улучшения можно внести множество модификаций, например:

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

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

Профиль Linkedin



Ссылка на GitHub

https://github.com/deelipku23/Google-QUEST-Q-A-Labeling

использованная литература





https://www.kaggle.com/c/google-quest-challenge/overview