В этой статье показано, как использовать 10 строк операторов Python для достижения первоклассного эффекта классификации настроений данных обзора Yelp.
сомневаться
существует"Как сделать обучение глубокой передаче изображений с помощью Python и fast.ai?В статье я подробно рассказал вам о преимуществах трансферного обучения для классификации изображений, в том числе:
- меньше времени
- бюджетный
- Требуется небольшой объем данных
- менее склонен к переоснащению
Некоторые студенты сразу связали это преимущество трансферного обучения с исследованиями, которые они проводили, и спросили меня:
Учитель, можно ли использовать трансферное обучение в классификации текстов? Беспокоиться о количестве данных слишком мало!
хороший вопрос!
ответМожет.
обзор"Как справляться с задачами бинарной классификации с помощью машинного обучения?«В статье мы представили некоторые распространенные методы классификации текстов.
Во-первых, мы должны понять семантическую информацию. Способ сделать это — использовать встраивание слов для предварительной подготовки модели. Вектор, представляющий слово, больше не является просто уникальным порядковым номером, но может в определенной степени описывать значение слова (подробности см.Как обрабатывать естественный язык с помощью Python? (Spacy и встраивание слов)"и"Как вызвать предварительно обученную модель встраивания китайского слова с помощью Python и gensim?").
Во-вторых, вышеуказанные методы могут представлять значение только одного слова, поэтому информация о порядке слов должна быть охарактеризована нейронными сетями.
Например, можно использовать одномерную сверточную нейронную сеть (One Dimensional Convolutional Neural Network, 1DCNN):
Или используйте рекуррентную нейронную сеть (RNN):
Другие исследователи считают несколько расточительным использовать сложные структуры, такие как CNN или LSTM, для представления порядка слов в предложении.
Так что Google просто предложилUniversal Sentence Encoder, который напрямую принимает все введенное вами предложение, а затем единообразно преобразует его в векторную форму. Это может значительно снизить нагрузку на моделирование и обучение пользователей.
трудность
Полезны ли эти методы? Есть конечно. Однако Джереми Ховард указал, что такая модель, основанная на предварительном обучении встраивания слов (предложений), будет иметь существенный недостаток, то есть проблему контекста предметной области.
Здесь для простоты мы обсуждаем вопросы только на английском языке.
Предположим, кто-то еще обучил встраивания слов в английской Википедии, и вы хотите использовать их для классификации текста на IMDB или Yelp. Это проблема. Потому что многие слова имеют разное значение в разных контекстах. Когда вы используете его напрямую, вы на самом делеигнорировать различие.
Что делать тогда? Интуитивная идея, естественно, состоит в том, чтобы отступить, и я больше не использую результаты предварительной тренировки других людей. Обучайте встраивания слов с нуля, используя текст из текущей предметной области.
Но таким образом ваша тренировочная нагрузка резко возрастает. текущий мейнстримWord2vec , GloveиfasttextВсе эти модели предобучения с встраиванием слов принадлежат известным семьям. Среди них word2vec — от Google, Glove — от Stanford, а fasttext — от facebook. Потому что обучение этому массивному тексту требует не только владения техникой, но и большого количества вычислительных ресурсов.
В то же время вы также, вероятно, пострадаете от недостаточности данных. Это может привести к тому, что ваша самообучаемая модель встраивания слов будет работать хуже, чем у кого-то другого. Википедия часто используется для обучения из-за обилия текста. Однако некоторые данные комментариев зачастую не обладают таким богатым словарным запасом.
Как это сделать?
мигрировать
Джереми Ховард предложил метод под названием «Точная настройка универсальной языковой модели для классификации текста (ULMFiT)». диссертация вздесь: Ховард, Дж., и Рудер, С. (2018).Точная настройка универсальной языковой модели для классификации текстов.В материалах 56-го ежегодного собрания Ассоциации компьютерной лингвистики (Том 1: Длинные статьи) (Том 1, стр. 328-339).
В этой статье он предлагает идею.
- Кто-то (например, ранний исследователь или крупная организация)массивныйОбучайте языковые модели на наборах данных, таких как Википедия. послевыпускЭта модель, а не просто результат выражения вектора встраивания слова;
- После того, как обычные пользователи получат эту модель, поместите ее в свой обучающий текст (например, обзоры Yelp или IMDB).тонкая настройка, таким образом, существует проблемная область, которая соответствует своей собственной задачеконтекстязыковая модель;
- После этого добавьте классификатор в заголовок языковой модели и изучите обучающие данные, чтобы для текущей задачи была полная модель классификации;
- Если эффект недостаточен, можно настроить всю модель классификации.
Следующий рисунок используется в тексте для обозначения вышеописанных шагов.
Обратите внимание, что в этой языковой модели фактически используетсяAWD-LSTMкак куски (иначе не может обрабатывать информацию о порядке слов). Но вам вообще не нужно разбираться в конструкции AWD-LSTM, потому что она полностью модульная и прозрачная для пользователя.
Давайте возьмем некоторые из наших примеров, чтобы дать вам толчок:
Вам не нужно разбираться в устройстве кинескопа и беспроводной передачи сигнала, вы можете смотреть телевизор и использовать пульт дистанционного управления для переключения каналов;
Вам не нужно разбираться в механике и принципах работы двигателей внутреннего сгорания, чтобы водить машину.
с питоном иfast.aiДля обучения по обмену все, что вам нужно, это понятьруководствоВот и все.
Затем давайте на самом деле выполним задачу классификации текста и испытаем возможности «тонкой настройки общей языковой модели» и глубокого трансферного обучения.
данные
Текстовые данные, которые мы используем,Yelp reviews Polarity, который представляет собой стандартизированный набор данных. Многие документы по классификации текстов будут использовать его для сравнения эффектов.
Версия, которую мы используем, отfast.aiОткрытый набор данных, хранящийся на AWS. это иYelp reviews PolarityПервоначальная версия содержания данныхнет разницы, является ничем иным, как предоставленным csv , который структурно соответствуетfast.aiТребования к нормализации чтения (т.е. каждую строку ставить разметку перед текстом).
нажмите этоСсылка на сайт, ты можешь видетьfast.aiВесь контент с открытыми данными.
Есть много других категорий данных, которые могут быть полезны для вашего исследования.
Заходим в раздел «Обработка естественного языка» (NLP) и находимYelp reviews - Polarity
.
Этот набор данных составляет несколько сотен мегабайт. Не маленький, но и не большой. Вы можете скачать его на свой компьютер, разархивировать и просмотреть.
Обратите внимание, что в сжатом пакете есть 2csv
файлы, называемыеtrain.csv
(тренировочный набор) иtest.csv
(тестовый набор).
мы открытыreadme.txt
Взгляните, где авторы набора данных упоминают:
The Yelp reviews polarity dataset is constructed by considering stars 1 and 2 negative, and 3 and 4 positive. For each polarity 280,000 training samples and 19,000 testing samples are take randomly. In total there are 560,000 trainig samples and 38,000 testing samples. Negative polarity is class 1, and positive class 2.
Причина, по которой они называются данными полярности, заключается в том, что автор делит их на две категории: положительные и отрицательные настроения в соответствии с оценками, соответствующими комментариям. Поэтому наша задача классификации является бинарной. В обучающем наборе содержится 280 000 элементов данных о положительных и отрицательных настроениях, а в тестовом наборе — 19 000 элементов данных о положительных и отрицательных настроениях.
На сайте есть датасет автораБумажная ссылка. Газета была опубликована в 2015 году.здесьСуществует резюме документа, включая сравнение производительности различных методов на одном и том же наборе данных.
Как показано, производительность показана с точки зрения частоты ошибок.Yelp reviews - Polarity
В этом столбце синим цветом отмечена самая низкая частота ошибок, равная 4,36, поэтому показатель точности (точности) составляет 95,64%.
Обратите внимание, что при написании научных работ обязательно обращайте внимание на требования к цитированию. Если вы используете этот набор данных в своих исследованиях, вам необходимо добавить цитату в список литературы:
Xiang Zhang, Junbo Zhao, Yann LeCun. Character-level Convolutional Networks for Text Classification. Advances in Neural Information Processing Systems 28 (NIPS 2015).
окрестности
Для запуска кода глубокого обучения вам нужен графический процессор. Но покупать его не нужно, достаточно взять напрокат. Самый удобный способ аренды — облачная платформа.
существует"Как сделать обучение глубокой передаче изображений с помощью Python и fast.ai?«В статье мы упомянули, что рекомендуется использовать Google Compute Platform. Это всего 0,38 доллара США в час, и если вы новый пользователь, Google отправит его вам первым.300 долларов, действует 1 год.
Я написал для вас пошаговое руководство по настройке, пожалуйста, используйтеэта ссылкадоступ.
Когда такая подсказка появляется в вашем терминале, это доказывает, что все приготовления на месте.
Я поместил код учебника на github, пожалуйста, используйте следующую инструкцию, чтобы загрузить его.
git clone https://github.com/wshuyi/demo-nlp-classification-fastai.git
После этого вы можете вызвать jupyter для игры.
jupyter lab
Обратите внимание: поскольку вы выполняете jupyter в облаке Google Compute Platform, браузер не будет открываться автоматически.
Вам нужно открыть Firefox или Chrome и ввестиэта ссылка(http://localhost:8080/lab?).
Откройте левую боковую панельdemo.ipynb
.
Весь код для этого урока находится здесь. Конечно, если вы спешите, вы можете выполнитьRun->Run All Cells
для просмотра всех текущих результатов.
Однако, как и прежде, я все же рекомендую вам следовать инструкциям туториала и следовать им шаг за шагом. Для более глубокого понимания смысла каждого предложения.
нагрузка
В Jupyter Lab мы можем использовать!+命令名称
способ выполнить команду терминала (команда bash). Мы будем использовать нижеwget
чтобы загрузить набор данных отзывов Yelp с AWS.
!wget https://s3.amazonaws.com/fast-ai-nlp/yelp_review_polarity_csv.tgz
В левой колонке вы увидитеyelp_review_polarity_csv.tgz
Этот файл был загружен.
заtgz
Сжатый пакет формата, который мы используемtar
команда на распаковку.
!tar -xvzf yelp_review_polarity_csv.tgz
В левой боковой панели вы увидитеyelp_review_polarity_csv
Каталог распакован.
Давайте дважды кликнем по нему и посмотрим содержимое.
Файл успешно загружен и распакован. Ниже мы начинаемfast.aiВызовите некоторые модули, чтобы получить некоторые общие функции.
from fastai import *
from fastai.text import *
from fastai.core import *
мы установилиpath
Укажите папку данных.
path = Path('yelp_review_polarity_csv')
Затем мы изучаем обучающие данные.
train_csv = path/'train.csv'
train = pd.read_csv(train_csv, header=None)
train.head()
Каждая строка включает метку и соответствующий комментарий. Здесь комментарии свернуты из-за ограничения ширины экрана. Давайте посмотрим на полный текст комментариев в первой строке:
train.iloc[0][1]
Для набора проверки мы также смотрим на него так же, как и выше. Обратите внимание, что этот набор данных предоставляет только обучающий набор и «тестовый набор», поэтому мы используем этот «тестовый набор» в качестве проверочного набора.
valid_csv = path/'test.csv'
valid = pd.read_csv(valid_csv, header=None)
valid.head()
Далее читаем данные.
data_lm = TextLMDataBunch.from_csv(path, valid='test')
data_clas = TextClasDataBunch.from_csv(path, valid='test', vocab=data_lm.train_ds.vocab)
Обратите внимание, что всего две строки команд на самом деле выполняют несколько функций.
Первая строка — построение языковой модели (Language Model, LM) данных.
Вторая строка предназначена для построения модели классификации (классификатора) данных.
Они делают следующие вещи:
- В языковой модели токенизация и нумерация выполняются над текстом обучающего набора. Для этого процесса, пожалуйста, обратитесь к моемуКак обучить модель классификации тональности китайского текста с помощью Python и машинного обучения?«Введение в статье;
- В языковой модели токенизация и нумерация также выполняются для текста набора проверки;
- В модели классификации напрямую используются словари после токенизации и нумерации в языковой модели. И читайте в этикетках (ярлыках).
Поскольку у нас есть сотни тысяч данных, выполнение займет несколько минут.
После окончания посмотрим, нормально ли идет загрузка данных.
data_lm.train_ds.vocab_size
В обучающих данных всего 60 002 слова.
Давайте посмотрим, как выглядит индекс словаря:
data_lm.train_ds.vocab.itos
В классификаторе правильно ли загружены метки обучающего набора?
data_lm.train_ds.labels
А как насчет проверочного набора?
data_lm.valid_ds.labels
После того, как данные загружены, мы собираемся начатьзаимствованныйЯзыковая модель предварительно обучена и настроена.
языковая модель
В этой статье используетсяfast.aiВстроенная предварительно обученная языковая модельwt103_v1
, он находится вWikitext-103Результат обучения на наборе данных.
Давайте загрузим его:
model_path = path/'models'
model_path.mkdir(exist_ok=True)
url = 'http://files.fast.ai/models/wt103_v1/'
download_url(f'{url}lstm_wt103.pth', model_path/'lstm_wt103.pth')
download_url(f'{url}itos_wt103.pkl', model_path/'itos_wt103.pkl')
На левой боковой панели в каталоге данных мы увидим новую папку с именемmodels
.
Сюда входят два файла:
Что ж, теперь, когда параметры предварительного обучения модели данных и языка доступны, мы должны создать RNNLearner для создания нашей собственной языковой модели.
learn = RNNLearner.language_model(data_lm, pretrained_fnames=['lstm_wt103', 'itos_wt103'], drop_mult=0.5)
Здесь мы указываем, что текстовые данные, которые должны быть прочитаны языковой моделью,data_lm
, предварительно обученные параметры — два только что скачанных файла, третий параметрdrop_mult
Это коэффициент отсева, установленный во избежание переобучения.
Далее мы по-прежнему позволяем модели использоватьone cycle policyтренировать. Если вас интересуют подробности, вы можете нажатьэта ссылкаВыучить больше.
learn.fit_one_cycle(1, 1e-2)
Поскольку наш набор данных содержит сотни тысяч элементов, время обучения займет около 1 часа. Пожалуйста, будьте терпеливы.
Спустя более 50 минут я все еще бежал, но уже мог видеть дневной свет.
Когда команда успешно выполнена, мы можем увидеть, насколько хорошо текущая языковая модель соответствует нашим обучающим данным.
Вы можете подумать, что этот показатель точности слишком низок!
Да, но обратите внимание, что это точность языковой модели, а не точность модели классификации. Поэтому он несопоставим с результатами, которые мы видели в этой таблице раньше.
Нас не устраивает такой результат, что делать?
Метод простой, мы его дорабатываем.
Оглядываясь назад на рисунок ниже, мы фактически заморозили базовые параметры модели перед обучением только сейчас и использовали только уровень головы, чтобы соответствовать нашим собственным обучающим данным.
Метод точной настройки заключается в том, чтобы больше не замораживать предварительно обученные параметры модели. После «разморозки» мы по-прежнему используем «скорость дискриминативного обучения» для тонкой настройки.
Если вы забыли, что такое «дискриминационная скорость обучения», см. раздел «Дискриминативная скорость обучения».Как сделать обучение глубокой передаче изображений с помощью Python и fast.ai?» статьи «Тонкая настройка».
Обратите внимание, что этот метод не только гарантирует, что структура модели предварительного обучения, близкая к входному слою, не будет разрушена, но также пытается сделать параметры модели предварительного обучения, близкой к выходному слою, подходящими для наших собственных обучающих данных как насколько это возможно.
learn.unfreeze()
learn.fit_one_cycle(1, 1e-3)
Ну, еще час или около того. Выходите на тренировку, будьте активны.
Когда вы вернетесь вовремя, вы обнаружите, что производительность модели значительно улучшилась.
До и после вы потратили часы на обучение, чтобы построить эту языковую модель, соответствующую потребностям задачи.
Теперь, когда модель обучена, мы не должны забывать проделанную нами работу по сохранению параметров.
learn.save_encoder('ft_enc')
Таким образом, в следующий раз, когда вам понадобится использовать языковую модель для этой задачи, вам не придетсяwt103_v1
Тонкая настройка с нуля. Вместо этого вам нужно только прочитать текущие сохраненные параметры.
Классификация
Языковая модель настроена, давайте построим классификатор.
learn = RNNLearner.classifier(data_clas, drop_mult=0.5)
learn.load_encoder('ft_enc')
learn.fit_one_cycle(1, 1e-2)
Хотя имя до сих пор называетсяlearn
, но обратите внимание, что наша модель на данный момент уже является моделью классификации, а не языковой моделью. Данные, которые мы считываем, также изменились в ответ наdata_clas
, вместоdata_lm
.
здесь,load_encoder
Это применение параметров нашей языковой модели к модели классификации.
Мы по-прежнему реализуем «политику одного цикла».
На этот раз, после более чем 20-минутного обучения, наша языковая модель получила свою первую оценку в задаче классификации.
Точность близка к 95%, что очень хорошо!
Однако, как яЧто должен написать студент гуманитарных наук по машинному обучению?》 Как указано в статье, для задач классификации, которые уже выполнялись другими, вашей целью должно быть сравнение с результатами других.
Просмотрите результаты других людей:
Да, самый высокий показатель точности — 95,64%, и у нашей модели все еще есть отставание.
что делать?
Все просто, мы просто доработали языковую модель. На этот раз мы собираемся доработать модель классификации.
Сначала сделайте что-нибудь легкое. То есть для большей части слоев мы остаемся замороженными. Разморозьте только два последних слоя модели классификации для точной настройки.
learn.freeze_to(-2)
learn.fit_one_cycle(1, slice(5e-3/2., 5e-3))
Через полчаса получили вот такой результат:
На этот раз наша точность близка к 97%, что выше, чем у других 95,64%.
Также обратите внимание, что в этот момент потери при обучении выше, чем потери при проверке. Нет признаков переобучения, а это значит, что модель можно улучшить.
Если вы все еще не удовлетворены, то мы просто разморозим всю модель и снова настроим ее.
learn.unfreeze()
learn.fit_one_cycle(1, slice(2e-3/100, 2e-3))
Поскольку существует больше уровней тонкой настройки, естественно, и параметров гораздо больше. Так обучение займет больше времени. Примерно через час вы увидите результат:
Точность подскочила до 97,28%.
Опять же, потери при обучении в этот момент все еще выше, чем потери при проверке. Модель имеет потенциал для улучшения...
В сравнении
Хотя наша модель глубокого обучения очень проста в реализации. Но сравнивать результаты, полученные нами в 2018 году, со статьей 2015 года, кажется немного несправедливым.
Итак, в Google Scholar я искалyelp polarity
и ограничил год результатов поиска после 2017 года.
Для всех документов, которые появились на первом экране, я открывал их один за другим и искал список сравнений точности. Все совпадающие результаты перечислены ниже для сравнения.
Следующая таблица взята из: Sun, J., Ma, X., & Chung, TS (2018).Исследование повторяющихся единиц в иерархической нейронной сети внимания для классификации предложений.
Обратите внимание, что самое высокое значение здесь — 93,75.
Следующая таблица взята из: Murdoch, W. J., & Szlam, A. (2017) Автоматическое извлечение правил из сетей с долговременной кратковременной памятью, препринт arXiv arXiv:1702.02540.
Самое высокое значение здесь — 95,4.
Следующая таблица взята из: Chen, M., & Gimpel, K. (2018).Меньшие текстовые классификаторы с дискриминационными вложениями кластеров.В материалах конференции 2018 года Североамериканского отделения Ассоциации вычислительной лингвистики: технологии человеческого языка, Том 2 (Короткие статьи) (Том 2, стр. 739-745).
Самое высокое значение здесь — 95,8.
Следующая таблица взята из: Shen, D., Wang, G., Wang, W., Min, MR, Su, Q., Zhang, Y., ... & Carin, L. (2018). любовь: О простых моделях, основанных на встраивании слов, и связанных с ними механизмах объединения, препринт arXiv arXiv:1805.09843.
Самое высокое значение здесь — 95,81.
Это учебник, а не академическая статья. Так что ябез концаНайдите лучшие результаты категории полярности обзоров Yelp, появившиеся на данный момент.
Кроме того, я оставляю вас с мысленным вопросом - является ли наше сравнение научным? Вы можете оставить мне свой отзыв в области комментариев.
Однако, сравнивая с оптимальными результатами классификации в этих недавних публикациях, я полагаю, что вы можете получить более объективную ссылку на точность, которой мы достигли до сих пор.
резюме
В этой статье мы пытаемся перенести обучение из области классификации изображений в область классификации текста (обработка естественного языка).
существуетfast.aiFramework, код нашей модели классификации глубокого обучения прост. За исключением части предварительной обработки и отображения данных, фактическое обучающее предложение составляет всего 10 строк.
Напомним, основные шаги включают в себя:
- Получите помеченные данные и разделите набор для обучения и набор для проверки;
- Загружать данные языковой модели и данные модели классификации для токенизации и цифровой предварительной обработки;
- Чтение параметров предварительной подготовки, обучение и тонкая настройка языковой модели;
- Используйте параметры, скорректированные языковой моделью, для обучения модели классификации;
- Точная настройка модели классификации
Стоит подумать о том, что в рамках этого процесса вам вообще не нужно получать большое количество размеченных данных для достижения очень высокой степени точности.
В статье Джереми Ховарда есть такая сравнительная таблица, которая очень впечатляет.
Кроме того, для достижения уровня ошибок набора проверки около 20% вам потребуется более 1000 данных для обучения с нуля, в то время как если вы используете тонкую настройку общей языковой модели с полууправлением (ULMFiT, полууправляемая), вам нужно всего 100 данных. . Если вы используете точную настройку модели универсального языка с учителем (ULMFiT, с учителем), 100 наборов данных уже могут напрямую привести к 10-процентной частоте ошибок набора проверки.
Это предоставляет значительные возможности для задач с небольшими выборками, особенно задач обработки естественного языка на малых языках.
Используя этот метод, Чапла и др. легко заняли первое место в конкурсе PolEval'18, опередив второе место примерно на 35%.
Если интересно, их документы находятся по адресуздесь.
300 долларов, которые дал вам Google, должны остаться, верно?
Найдите интересующую вас задачу классификации текста и запустите ее.
Удачного (глубокого) обучения!
Если вам это нравится, пожалуйста, поставьте лайк и наградите. Вы также можете подписаться на мой публичный аккаунт в WeChat и закрепить его."Юшу Чжилань" (нкваншуйи).
Если вы интересуетесь Python и наукой о данных, вы можете прочитать мою серию постов с учебными указателями "Как эффективно начать работу с наукой о данных?", есть более интересные задачи и решения.