Дата публикации Sep 9, 2019
Это третья часть серии по детальному анализу настроений в Python.Части 1а также2охватил анализ и объяснение шести различных методов классификации в мелкозернистом наборе данных Stanford Sentiment Treebank (SST-5). В этом посте мы рассмотрим, как улучшить прошлые результаты, создавтрансформатор-на основе модели и применения трансферного обучения, мощный метод, который былдоминирующие таблицы задач НЛПнедавно.
Отпервая статьяв этой серии были получены следующие точности классификации и оценки F1 для набора данных SST-5:
В следующих разделах мы обсудим ключевые этапы обучения, оценки и объяснения, которые показывают, почему трансформаторы по своей природе лучше, чем перечисленные выше подходы для решения этой задачи.
В основе архитектуры преобразователя лежат следующие ключевые идеи, которые делают ее очень подходящей для интерпретации сложных шаблонов на естественном языке:
По сути, все топовые трансформаторные методы в последнее время (GPT,БЕРТ,XLNet) использовать такой подход последовательного обучения передачи. Внутренне они тренируютязыковая модельна этапе предварительной подготовки используются немаркированные данные из большого корпуса, после чего дополнительный пользовательский модуль (прикрепленный к языковой модели) настраивается на пользовательские данные. Ниже приведена визуализация этого подхода для BERT для нескольких наборов эталонных данных.
Этап предварительной подготовки включает в себя обучение языковой модели неконтролируемым образом - это определяет, как модель изучает синтаксис, семантику и контекстную информацию из учебного корпуса, который ей предоставляется. Последние данные (из таких моделей, какOpenAI GPT-2) указывает, что действительно большие языковые модели, при наличии достаточных данных и вычислений, многое узнают о синтаксисе языка! Для целей модели трансформатора, описанной далее в этой статье, полезно отметить следующие цели предварительной подготовки.
В оставшейся части этого поста мы будем работать с моделью трансформатора, обученной с использованиемпричинныйцель языкового моделирования (похожа, но намного меньше, чем GPT / GPT-2)
С этим фоном позади мы можем перейти к некоторому кодированию!
Некоторая базовая предварительная обработка выполняется на наборе данных SST-5 с использованием Pandas. Обратите внимание, что метки классов уменьшаются на 1 (чтобы быть в диапазоне [0, 1, 2, 3, 4]), потому что PyTorch ожидает, что метки будут индексироваться с нуля.
Первый шаг в обработке данных - выполнить токенизацию с помощью токенайзера WordPiece— [см. раздел 4.1 в этой статьеБольше подробностей]. Мы используемBertTokenizer
как реализовано в HuggingFace'spytorch_transformers
библиотека, Затем токенизированный текст кодируется в последовательности целых чисел, которые должны обрабатываться нашей моделью преобразователя. После этогоPyTorchDataLoader
создан для загрузки образцов в партии для обучения.
В своем среднем постеО тонкой настройке трансформатора для анализа настроений Оливер Атанасов написал очень хороший класс TextProcessor, который инкапсулирует этапы токенизации, кодирования и подготовки данных (для PyTorch). Этот класс использовал несколько процессорных ядер для ускорения процесса кодирования, поэтому он адаптирован и используется здесь повторно.
Обратите внимание, что в этом примере мы фиксируем максимальную длину последовательности равной 256 - теоретическимаксимальная длина последовательности, которую может обработать BERTи кодировщики аналогичной модели - 512, но, поскольку SST-5 - сравнительно небольшой набор эталонных данных с относительно короткими выборками, мы сокращаем максимальную длину последовательности токенов до 256, чтобы уменьшить использование памяти и размер модели.
Токен специальной классификации‘[CLS]’
добавляется в конце каждой последовательности - этот токен используется в задачах классификации как совокупность представления каждой последовательности, чтобы узнать, к какому классу принадлежит последовательность. Для последовательностей, которые короче 256, токен заполнения‘[PAD]’
добавлен, чтобы гарантировать, что все партии остаются одинакового размера для загрузки в память GPU во время обучения.
Общая структура пакета трансформаторных блоков, используемых для задач классификации, показана ниже. Это модифицированная форма оригинальной версии, используемой для машинного перевода Vaswani et al.
В коде PyTorch приведенная выше структура выглядит следующим образом.
БазаTransformer
класс, который наследуется от PyTorch'snn.module
определено. Входная последовательность (в нашем случае текст для классификации настроений) подается в блоки трансформатора путем суммирования токена последовательности и встраивания позиции. Каждый последующий блок трансформатора состоит из следующих модулей:
MultiHeadAttention
модуль для инкапсуляции логики самообслуживания преобразователя, то есть способности преобразователя кодировать позиционную информацию и извлекать из нее уроки во время обучения.Две «маски» определены в модуле прямой связи нашей сети.
[‘PAD’]
) введено ранее, чтобы сделать каждую последовательность одинаковой длины для каждой партии. Это указывает на то, что модель маскирует эти токены во время логического вывода, чтобы модуль самоконтроля игнорировал их. Маска дополнения специфична для каждой партии.torch.triu
), установив значение всех элементов выше главной диагонали равным отрицательной бесконечности.Нижняя часть модели использует слой линейной классификации поверх существующего трансформатора.TransformerWithClfHead
класс наследует от базыTransformer
класс и указываетCrossEntropyLoss
в качестве функции потерь для оптимизации. Размер линейного слоя составляет[embedding_dimensions, num_classes]
- в этом случае для существующей предварительно обученной модели и набора данных SST-5, 410 × 5
Необработанные выходные данные, то есть логиты, извлекаются из уровня классификации и передаются в функцию softmax для генерации вектора вероятности класса (1 × 5) в качестве выходных данных.
Вес модели инициализируется изпредварительно обученная модель, предоставляемая HuggingFace,и учебный скрипт [training/train_transformer.py
] выполняется в наборе данных SST-5.
Следующие гиперпараметры используются для обучения модели - обратите внимание, что число измерений вложения, количество головок внимания и т. Д. Явно не установлены - они унаследованы от предварительно обученной модели. После 3-х тренировочных эпох модель проверяется и ее параметры конфигурации сохраняются.
💡Линейный график прогрева: Вместо того, чтобы устанавливать постоянную скорость обучения,кусочно-линейный планировщик изpytorch-ignite
определяется для увеличения скорости обучения для ранней части обучения с последующим линейным снижением до нуля. Как правило, это хороший способ обеспечить хорошую передачу знаний в процессе обучения (аналогично «наклонно-треугольному уровню обучения» вULMFiT, Говард и Рудер, 2018).
💡Градиент накопленияТомас Вольф так хорошо описывает в своем посте:Практические советы по обучению нейронных сетей«Хороший способ имитировать пакеты больших размеров без проблем с памятью графического процессора - это накапливать градиенты. Это делается путем суммирования тензоров градиента от нескольких шагов обратного распространения итогдавызов оптимизатора для минимизации потерь - обратите внимание, что тогда потери также нужно будет разделить на количество шагов накопления. Это может позволить нам тренироваться с размерами партий, которые больше, чем те, которые фактически могут поместиться в памяти графического процессора, улучшая обучение модели.
В этом разделе мы постараемся пройти построчно и разобраться, как с помощью обученной модели сделать выводы в нашем наборе настроений SST-5, на примере. Входной текст разбивается на токены, преобразуется в целочисленные идентификаторы и передается в модель в виде тензора соответствующей формы, как показано в приведенном ниже блокноте.
Этот процесс инкапсулируется с использованиемTransformerSentiment
класс, в файлеclassifiers.py
, чтобы прочитать в наборе данных SST-5 в Pandas DataFrame и оценить производительность трансформатора.
Запуск обученной модели трансформатора (доступно в этой ссылке Google Drive) на тесте SST-5 видно, что причинный трансформатор повышает точность классификации почти до 50%!
Оценки макро-F1 для трансформатора также улучшены по сравнению с другими методами на основе встраивания (FastText и Flair).
Матрица смешения следующей лучшей модели, Flair, помещена рядом с трансформатором для сравнения.
Преобразователь делает много ложных предсказаний, принадлежащих меткам классов 2 и 4 - однако он получает значительно больше правильных меток, принадлежащих к классам меньшинств (1 и 3), по сравнению со всеми другими методами. Тот факт, что он способен достаточно хорошо классифицировать эти классы меньшинств с таким ограниченным количеством обучающих выборок, является свидетельством способности использовать предварительно подготовленные языковые модели и передавать обучение для задач классификации настроений.
Следуя методике объяснения модели, показанной вЧасть 2из этой серии мы делаем визуализаторы LIME для конкретных текстовых примеров из тестового набора SST-5, используя нашу обученную модель трансформатора. Код, использованный для генерации представленных ниже визуализаций, доступен в файле.explainer.py
- обученный файл модели также сделандоступно в этой ссылке Google Drive,
Пример 1:«Это не ужасно, просто ужасно посредственно.»
Похоже, что трансформатор правильно идентифицирует слова «какой ужас" а также "посредственный”Как две наиболее важные особенности, которые способствуют тому, чтобы в этом примере была метка класса 1 (то есть сильно отрицательная). Слово "не”Отталкивает вероятность предсказания от 1 (предположительно до метки 2 или 3), но ее влияние не так сильно, как отрицательные слова в предложении. Наречие «ужасно”Также играет небольшую роль в классификации этого предложения как сильно отрицательного, что означает, что модель имеет представление о том, как модификаторы, такие как наречия, изменяют степень настроения в предложении.
Пример 2:«Актерский состав в целом превосходен ... но сам фильм просто очарователен.»
В этом примере ясно, что слово «но”Имеет наибольший вес в предсказании трансформатора о маркировке класса 3 (нейтральный) Это интересно, потому что в этом предложении есть несколько слов, которые показывают разную степень полярности («превосходно»,«просто», «мягко" а также "обаятельный"), слово "но»Выступает в качестве критического модификатора в этом предложении - он отмечает переход предложения от сильно положительного к слегка отрицательному во второй половине. Еще раз, у преобразователя, кажется, есть представление о том, как модификаторы (в данном случае это соединение) изменяют общую степень настроения в предложении.
Другое интересное наблюдение заключается в том, что слово «бросать»Не играет никакой роли в том, что настроения прогнозируются как нейтральные (класс 3).Всеранее использованные методы (см Часть 2), включая Флэра, ошибочно усвоили особенность важности слова «бросатьКак способствующий настроению - потому что это слово встречалось много раз в обучающих данных. Основная сила причинно-следственной языковой модели трансформатора помогает ему сделатьболее значимая связь между словами и предсказанным ярлыком настроенияНезависимо от того, сколько раз слово появилось в тренировочном наборе.
В этой серии мы исследовали различные методы НЛП в Python для детальной классификации в наборе данных Stanford Sentiment Treebank (SST-5). Несмотря на то, что этот набор данных является чрезвычайно сложным и создает многочисленные проблемы для существующих методов классификации текста, очевидно, что текущий отраслевой стандарт в НЛП - преобразователи в сочетании с трансферным обучением - демонстрирует по своей сути превосходную производительность при выполнении задач классификации по сравнению с другими методами. Это происходит главным образом из-за базового представления языковой модели трансформера, что дает ему большую контекстную осведомленность и лучшее синтаксическое понимание учебного словаря.
Приведенная ниже диаграмма суммирует последовательное улучшение (с использованием все более сложных моделей), сделанное в точности и баллах F1 по набору данных SST-5.
Чтобы выжать большую производительность из трансформатора, можно попробовать несколько дополнительных экспериментов (помимо увеличения количества параметров в модели):
pretraining_train.py
файл в хранилище HuggingFace) и может привести к значительному улучшению точности классификации.Целью создания структуры анализа настроений с нуля, как описано в этой серии, было укрепление уверенности в нашей способностиоцениватьа такжеинтерпретироватьразличные методы машинного обучения, соответствующие нашей постановке задачи и имеющимся данным. Использование больших предварительно подготовленных моделей на основе трансформаторов, таких как BERT-large, XLNet или RoBERTa, конечно, даст значительно улучшенную производительность в реальных наборах данных - однако важно сбалансировать огромные вычислительные затраты на использование этих моделей по сравнению с использованием меньшие, более простые модели с хорошей целью предварительной подготовки и чистотой,хорошо аннотированный,предметно-ориентированныйданные обучения. По мере того, как все больше и больше технологий НЛП будут расширяться на огромные успехи трансформаторов в ближайшие месяцы, впереди могут быть только интересные времена!
Не стесняйтесь воспроизводить результаты и делать свои собственные выводы, используя трансформатор!
Весь код, использованный для этого поста, был адаптирован из превосходного примера кода в ссылках ниже:
Длямногоболее подробно углубиться в трансферное обучение в НЛП, настоятельно рекомендуется пройти черезNAACL 2019 учебные слайдыСебастьян Рудер, Мэтью Питерс, Свабха Сваямдипта и Томас Вольф.
© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map