Серия обучения НЛП (Часть 4)

Передача обучающей интуиции для классификации текста

Заставляем машины читать нам

Этот пост является четвертым постом из серии классификации текста НЛП. Подведем итоги: я начал с конкурса по классификации текстов НЛП на Kaggle, который назывался Quora Question неискренностью. Поэтому я решил поделиться своими знаниями с помощью серии сообщений в блоге о классификации текста. В первом посте говорилось о различных методах предварительной обработки, которые работают с моделями глубокого обучения и о увеличении охвата встраиваниями. Во втором посте я рассказал о некоторых базовых традиционных моделях, таких как TFIDF, Count Vectorizer, Hashing и т. Д., Которые использовались при классификации текста, и попытался получить доступ к их производительности, чтобы создать базовый уровень. В третьем посте я более подробно остановился на моделях глубокого обучения и различных архитектурах, которые мы могли бы использовать для решения проблемы текстовой классификации. В этом посте я попытаюсь использовать модель ULMFit, которая представляет собой метод трансфертного обучения для НЛП.

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

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

Языковые модели и НЛП передают интуицию в обучении:

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

В последнее время люди использовали RNN / LSTM для создания таких языковых моделей. Они принимают в качестве входных данных встраивание слова и в каждый момент времени возвращают распределение вероятностей вероятности следующего слова по словарным словам. Пример этого показан ниже, в котором нижеприведенная нейронная сеть использует несколько составных слоев ячеек RNN для изучения языковой модели для предсказания следующего слова.

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

  • Зависит от языка: нижняя часть нейронной сети зависит от языка. То есть он изучает особенности языка. Эта часть может быть использована для переноса наших знаний из языкового корпуса в нашу текущую задачу.
  • Конкретные для задачи: я буду называть верхнюю часть нашей сети конкретной задачей. Веса в этих слоях обучаются так, чтобы он учился предсказывать следующее слово.

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

ULMFit:

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

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

Давайте продолжим основные выводы исследования в статье ULMFit, написанной ими вместе с кодом.

Измените способ обучения сетей трансферного обучения:

Чтобы обучить модель в соответствии с ULMFiT, нам необходимо выполнить следующие три шага:

a) Создание базовой языковой модели: Обучение языковой модели на корпусе общей предметной области, который фиксирует высокоуровневые функции естественного языка.
b) Базовая языковая модель Finetune на основе данных, специфичных для задачи : Тонкая настройка предварительно обученной языковой модели на данных целевой задачи
c) Уровни базовой языковой модели Finetune + Уровни конкретных задач на конкретных данных задачи: Тонкая настройка классификатора по данным целевой задачи

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

а) Создайте базовую языковую модель:

Эта задача может быть самой трудоемкой задачей. Эта модель аналогична resnet50 или Inception для задачи видения. В статье они используют языковую модель AWD-LSTM, обычную архитектуру LSTM, обученную с различными настроенными гиперпараметрами отсева. Эта модель была обучена на Wikitext-103, состоящем из 28 595 предварительно обработанных статей Википедии и 103 миллионов слов. Мы не будем выполнять эту задачу сами и воспользуемся великолепной библиотекой FastAI, чтобы использовать эту модель, как показано ниже. Приведенный ниже код возьмет наши данные и предварительно обработает их для использования в модели AWD_LSTM, а также загрузит модель.

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

print(train_df)

print(data_lm)
--------------------------------------------------------------------
TextLMDataBunch;

Train: LabelList (1306122 items)
x: LMTextList
xxbos xxmaj how did xxmaj quebec nationalists see their province as a nation in the 1960s ?,xxbos xxmaj do you have an adopted dog , how would you encourage people to adopt and not shop ?,xxbos xxmaj why does velocity affect time ? xxmaj does velocity affect space geometry ?,xxbos xxmaj how did xxmaj otto von xxmaj guericke used the xxmaj magdeburg hemispheres ?,xxbos xxmaj can i convert montra xxunk d to a mountain bike by just changing the tyres ?
y: LMLabelList
,,,,
Path: .;

Valid: LabelList (375806 items)
x: LMTextList
xxbos xxmaj why do so many women become so rude and arrogant when they get just a little bit of wealth and power ?,xxbos xxmaj when should i apply for xxup rv college of engineering and xxup bms college of engineering ? xxmaj should i wait for the xxup comedk result or am i supposed to apply before the result ?,xxbos xxmaj what is it really like to be a nurse practitioner ?,xxbos xxmaj who are entrepreneurs ?,xxbos xxmaj is education really making good people nowadays ?
y: LMLabelList
,,,,
Path: .;

Test: None

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

  • xxunk означает неизвестное слово (которого нет в текущем словаре)
  • xxpad - токен, используемый для заполнения, если нам нужно перегруппировать несколько текстов разной длины в пакете.
  • xxbos представляет начало текста в наборе данных.
  • xxmaj используется, чтобы указать, что следующее слово начинается с заглавной буквы в исходном тексте.
  • xxup используется, чтобы указать, что следующее слово написано заглавными буквами в исходном тексте.

б) Базовая языковая модель Finetune на конкретных данных задачи

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

В документе представлены две общие концепции этого этапа обучения:

  • Дискриминационная тонкая настройка:

Основная идея: поскольку разные слои захватывают разные типы информации, их следует настраивать в разной степени. Вместо использования одинаковой скорости обучения для всех слоев модели, отличительный штраф -tuning позволяет нам настраивать каждый слой с разной скоростью обучения. В статье авторы предлагают сначала выполнить тонкую настройку только последнего слоя, а затем разморозить все слои со скоростью обучения, сниженной в 2,6 раза.

  • Скорость обучения с наклонным треугольником.

По словам авторов: «Чтобы адаптировать свои параметры к особенностям конкретной задачи, мы хотели бы, чтобы модель быстро сходилась к подходящей области пространства параметров в начале обучения, а затем уточняла свои параметры»

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

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

# check how the language model performs 
learn.predict("What should", n_words=10)
---------------------------------------------------------------
'What should be the likelihood of a tourist visiting Mumbai for'

c) Уровни базовой языковой модели Finetune + уровни, специфичные для задачи, для данных, специфичных для задачи

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

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

Здесь также авторы разработали несколько новых методов:

  • Concat Pooling:

Авторы используют не только конкатенацию всех скрытых состояний, но также представление всех скрытых состояний Maxpool и Meanpool в качестве входных данных для линейных слоев.

  • Постепенное размораживание:

Вместо тонкой настройки всех слоев сразу, что может привести к катастрофическому забыванию (забыв все, что мы узнали из языковых моделей), авторы предлагают постепенно разморозить модель, начиная с последнего слоя. поскольку это содержит наименее общие сведения. Авторы сначала размораживают последний слой и точно настраивают все незамороженные слои для одной эпохи. Затем они размораживают следующий нижний замороженный слой и повторяют, пока не настроят все слои до схождения на последней итерации. Функция slice(2e-3/100, 2e-3) означает, что мы обучаем каждый уровень с разной скоростью обучения в диапазоне от максимального до минимального значения.

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

test_preds = np.array(learn.get_preds(DatasetType.Test, ordered=True)[0])[:,1]

Я большой поклонник Kaggle Kernels. Трудно представить себе, что все эти вычисления будут бесплатными. Вы можете найти работающую версию вышеуказанного кода в этом ядре kaggle. Попробуйте поэкспериментировать с ним после разветвления и запуска кода. Также проголосуйте за ядро, если вы сочтете его полезным.

Полученные результаты:

Вот окончательные результаты всех различных подходов, которые я пробовал с набором данных Kaggle. Я запустил 5-кратное стратифицированное резюме.

а. Обычные методы:

б. Методы глубокого обучения:

c. Методы трансферного обучения (ULMFIT):

Достигнутые результаты были не очень хорошими по сравнению с методами глубокого обучения, но мне все же понравилась идея подхода трансферного обучения, и его было так легко реализовать с помощью fastAI. Кроме того, выполнение кода заняло много времени - 9 часов, по сравнению с другими методами, которые выполнялись за 2 часа.

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

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

Заключение:

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

Также, если вы хотите узнать больше о НЛП здесь, это отличный курс. Вы можете начать бесплатно с 7-дневной бесплатной пробной версии.

Дайте мне знать, если вы думаете, что я могу добавить что-то еще к этому сообщению; Я постараюсь это включить.

Ваше здоровье!!!

Первоначально опубликовано на mlwhiz.com 30 марта 2019 г.