В этой статье мы проведем практическое задание на Kaggle — Google Quest Q&A. Поскольку эта задача является задачей НЛП, в ней используется смешивание преобразователя CNN-LSTM + XLNet. Это решение входит в топ-7% заявок Kaggle.

Бизнес-проблема

Компьютеры умеют отвечать на вопросы с помощью единственного поддающегося проверке ответа. Например, на вопрос «Кто является премьер-министром Индии?» на google, даст идеальный ответ. Когда дело доходит до ответов на субъективные аспекты вопроса, люди справляются с задачей намного лучше, чем компьютеры. Несколько субъективных аспектов включают в себя:

  1. Вопрос понятен?
  2. Является ли вопрос разговорным?
  3. Понятен ли ответ на вопрос?
  4. и многое другое…….

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

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

Задача здесь состоит в том, чтобы построить прогностический алгоритм, который количественно определял бы эти субъективные аспекты с учетом пары вопрос-ответ.

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

Использование моделей ML/DL

Это задача, основанная на НЛП, где вопрос_название, вопрос_тело, ответ используются в качестве входных данных для прогнозирования субъективных свойств пары вопрос-ответ в качестве выходных данных.

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

Набор данных

Набор данных предоставлен командой краудсорсинга в Google и размещен на Kaggle. Набор данных Train содержит 6079 точек данных, а набор данных Public Test — 476 точек данных. Данные частного тестирования не разглашаются. Набор данных содержит три текстовых столбца, а именно: question_title, question_body и answer.

Данные имеют 30 целевых переменных. Значения этих переменных должны быть предсказаны для данной пары вопрос-ответ. Баллы для модели будут оцениваться на основе данных общедоступного и частного тестирования.

Ниже приведены целевые переменные в наборе данных:

Взгляд на значения целей:

Каждая цель дискретна по своей природе, и значения лежат между [0, 1]

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

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

EDA используется для понимания и обобщения основных характеристик набора данных. Здесь я использовал EDA, чтобы определить, похожи ли распределения данных поезда и теста или нет.

Домен -:

Наблюдение —большое количество примеров извлекается из доменаstackoverflow

1). Распределение доменов в обучающих и тестовых данных отличается.

2). Большое количество примеров извлекается из доменаstackoverflow.

Категории -:

Общее количество категорий в наборе данных: 5

Наблюдение —большое количество примеров извлекается из доменаstackoverflow

1). Распределение категорий в обучающих и тестовых данных различается.

Предварительная обработка текста. Перед анализом текста или моделированием моделей машинного обучения на основе текста необходимо выполнить предварительную обработку текстовых данных. Это связано с тем, что необработанный текст скрывает много информации. Например, если вы просто токенизируете предложение: «Однако, было много вызовов», токенами этого текста будут [«Однако», «было», «было», «много», «вызовы»]. [‘there’, ‘were’, ‘many’] являются допустимыми английскими словами и будут в словаре, но [‘однако’, ‘вызовы’] не будут в словаре, даже если они являются допустимыми английскими словами. Следовательно, нам необходимо предварительно обработать текстовые данные, чтобы свести к минимуму такие ситуации и использовать информацию. Дальнейшая EDA выполняется на предварительно обработанном тексте.

Ниже приведен код для предварительной обработки текста:

Полярность настроений

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

Наблюдения

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

2). Распределения для обучающих и тестовых данных схожи

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

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

2). Распределения для обучающих и тестовых данных схожи

3).Обаquestion_body_countиanswer_countпохожи на степенное распределение.

Биграммы

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

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

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

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

Токен — компоненты текста, которые вы получаете, разбивая текст на пробелы.

Стоп-слова. Стоп-слова — это часто используемые слова, такие как «a», «an», «the» и т. д. Такие слова обычно удаляются из текста во время предварительной обработки.

Word — токен, который не является стоп-словом.

cwc_min = ratio of common_word_count to min(# of T1 words, # of T2 words )
cwc_max = ratio of common_word_count to max(# of T1 words, # of T2 words)
csc_min = ratio of common_stopwords_count to min(# of T1 stopwords, # of T2 stopwords )
csc_max = ratio of common_stopwords_count to max(# of T1 stopwords, # of T2 stopwords )
ctc_min = ratio of common_token_count to min(# of tokens in T1, # of tokens in T2)
ctc_max = ratio of common_token_count to max(# of tokens in T1, # of tokens in T2)
word_t1_to_t2_ratio = (# of words in T1) / (# of words in T2)
token_t1_to_t2_ratio = (# of tokens in T1) / (# of tokens in T2)
last_word_eq = boolean(T1[-1] == T2[-1])
first_word_eq = boolean(T1[0] == T2[0])
word_t1_to_t2_ratio = (# of words in T1) / (# of words in T2)
token_t1_to_t2_ratio = (# of tokens in T1) / (# of tokens in T2)
last_word_eq = boolean( T1[-1] == T2[-1] )
first_word_eq = boolean( T1[0] == T2[0] )

Fuzzywuzzy. Эти функции принимают пару текстов в качестве входных данных и возвращают оценку из 100 в качестве выходных данных. Внутри эта библиотека использует класс SequenceMatcher для вычисления сходства %age между парами текстов. Подробности реализации приведены по ссылке выше.

  • Коэффициент нечеткости — он просто использует SequenceMatcher для вычисления сходства между парами текста. SequenceMatcher выводит сходство от 0 до 1. Этот коэффициент нечеткости преобразует десятичные дроби в проценты, то есть от 0 до 100.
  • Partial Fuzz Ratio – если пара текстов имеет разную длину, т. е. меньшая строка длины m и большая строка длины n, эта функция вычисляет соотношение на основе наилучшего m- подстрока длины. Затем SequenceMatcher используется для вычисления соотношений между подстрокой длиной m и меньшей строкой.
  • Соотношение токенов — при таком подходе каждый текст разбивается на токены, и эти токены сортируются в алфавитном порядке. Затем SequenceMatcher используется для вычисления соотношений.
  • Коэффициент набора токенов — подход следующий:
1) Create a set of intersection of tokens between T1 and T2.
2) S2 = S1 + Create a set of tokens present in T1 but not in T2
3) S3 = S1 + Create a set of tokens present in T2 but not in T1
4) return max(score(S1, S2), score(S1, S3), score(S2, S3)). Scores      are computed using SequenceMatcher

Вложения —используемые вложения принадлежат Facebook под названием fasttext 300-d.

Окончательное решение

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

Я хотел бы, чтобы вы указали на используемую стратегию CV. Здесь я использовал GroupKFold.

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

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

Если вы проверите URL-адрес, номер «2894131» повторяется во всех записях. Это означает, что для данного URL-адреса есть один вопрос, но может быть несколько ответов.

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

Это решение включает в себя смешение двух моделей глубокого обучения, а именно CNN-LSTM и XLNet. В обеих моделях используется функция потерь — бинарная перекрестная энтропия.

CNN-LSTM

В этой модели CNN-1D используется до LSTM. CNN-1D можно использовать для получения информации из данных с дополнительной временной осью. Например, пусть максимальное количество токенов равно 512. При замене каждого токена связанным с ним встраиванием слов мы получим входные данные с формой (batch_size, 512, word_embedding_dim). Здесь 512 — количество шагов по времени. Для таких входов, кроме LSTM, мы также можем использовать CNN-1D. Ниже представлена ​​схема для модели -:

XLNet

Модели Autoencoding Language пытаются устранить шум из входной последовательности с шумом. Входная последовательность зашумлена заменой 15% токенов на [MASK].

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

  1. BERT не использует взаимосвязь между замаскированными токенами. Например, если зашумленная входная последовательность (замена 15% жетонов на [MASK]) — [Рой, идет, в, [MASK] и, покупает, [MASK]], допустимой заменой для замаскированных жетонов может быть ( кинотеатр, попкорн), (торговый центр, одежда) и т. д. Если мы используем BERT, он будет предсказывать 1-ю МАСКУ как кинотеатр или торговый центр. Этот прогноз не влияет на прогноз для второй [MASK]. Это означает, что вывод, который дает BERT, может быть [Рой, идет, в, кино, в, покупает, одевается], что не имеет смысла.
  2. Между обучением и тонкой настройкой отсутствует совместимость, поскольку во время тонкой настройки токены [MASK] не используются. BERT несколько пытается решить эту проблему с помощью следующей схемы:
1). Choose 15% of tokens randomly from the sequence
2). From these 15% tokens, 80% of tokens are replaced with [MASK], 10% tokens with some random tokens, and the rest tokens are kept the same.

Модели авторегрессионного языка (AR) пытаются предсказать вероятность слова на временном шаге t, учитывая контекст слов до t -1. Модели AR могут быть как прямого, так и обратного направления.

XLNet пытается объединить преимущества языковых моделей AE и AR.

XLNet использует цель обучения, которая пытается изучить условное распределение из всех перестановок последовательности токенов.

Целевая функция, которую XLNet пытается максимизировать, выглядит следующим образом:

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

Вы можете подумать, что если мы переставим наши предложения, как XLNet узнает положение токенов, и действительно ли мы переставляем входные данные в последовательность?

  1. В 1-м случае мы добавляем к входной кодировке позиционные кодировки, отражающие истинное положение токена в последовательности.
  2. Во втором случае мы фактически не переставляем входную последовательность, а используем маску внимания, чтобы отразить перестановку. XLNet назвала эту методологию двухпотоковым самовниманием.
  3. Хотя XLNet превосходит BERT в каждой задаче НЛП, время предварительного обучения в 5 раз больше, чем у BERT.

Если после токенизации итоговое количество токенов › 512, то выбираем первые 128 токенов, последние 382 токена. Вы можете проверить код в моем репозитории GitHub и разделе ссылок для получения дополнительной информации.

Код токенизации XLNet —:

Смешение и постобработка

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

predictions = 0.5*(c_lstm_predictions + xlnet_predictions)

question_type_spelling — эта цель равна › 0, если URL имеет один из этих двух доменов, а именно «eli.stackexchange» или «english.stackexchange».

Логика, которую я использовал, выглядит следующим образом:

if (domain == 'eli' or domain == 'english') and len(answer) > 85:
    do not change prediction
else:
    set the prediction to zero.
# Here prediction means prediction for question_type_spelling
# please have a look - https://www.kaggle.com/c/google-quest-challenge/discussion/130041

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

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

Для каждой метки найдите нижний и верхний пороги, которые максимизируют оценку Спирмена.

  1. Пусть начальные нижний и верхний пороги для каждой метки равны 0 и 1.
  2. Пусть оптимальный порог для любой метки будет (0,11, 0,9). Отсечение прогнозов с пороговыми значениями означает -:
Let initial lower and higher thresholds for each target be 0 and 1.
After some process, if the optimal thresholds for any label come out to be (0.11, 0.9) then:
    IF 0.11 <= predictions[i] <= 0.9: don’t change predictions[i].
    ELSE IF predictions[i] > 0.9: replace predictions[i] with 0.9
    ELSE: replace predictions[i] with 0.11

Оптимальные пороговые значения для каждого ярлыка можно получить с помощью метода золотого сечения. Это итеративный алгоритм, который используется для поиска минимумов/максимумов заданной функции. Этот алгоритм предполагает, что целевая функция выпукла. Несмотря на то, что коэффициент корреляции Спирмена не является выпуклым, при применении метода он увеличивает показатель перекрестной проверки примерно на 0,01. Данные обучения используются для поиска оптимальных порогов.

Код для поиска по золотому сечению-:

Вот баллы CV после смешивания

Ниже мое представление Kaggle:

Будущая работа

Мы можем еще больше улучшить производительность, смешав вместе больше трансформаторов. Однако это сделало бы вывод медленнее в реальном мире.

Демонстрация

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

Заключительное примечание

Большое спасибо за чтение моего блога. Я надеюсь, что этот блог поможет вам в вашем путешествии по НЛП. Не стесняйтесь комментировать свои мысли :)

Вы можете связаться со мной на linkedin — https://www.linkedin.com/in/saproo-varun/

Вы можете найти мой репозиторий на github — https://github.com/saproovarun/Google-Quest-Q-A