2019–08–17: Демонстрация кода в статье опубликована в Google Colab.

BERT (Представления двунаправленного кодировщика от трансформаторов) - это модель глубокого обучения, разработанная Google. Он стал одним из главных достижений в области машинного обучения за год, поскольку позволил достичь самых современных результатов в 11 различных задачах обработки естественного языка (NLP). Более того, Google открыл исходный код кода и сделал предварительно обученные модели доступными для загрузки, аналогичные моделям компьютерного зрения, предварительно обученным в ImageNet. По этим причинам BERT по-прежнему вызывает большой интерес (даже несмотря на то, что другие модели немного уступают ему).

Хотя BERT побил рекорды по множеству различных задач, от вопросов и ответов (SQuAD v1.1) до вывода естественного языка, классификация текста остается одной из наиболее практичных и широко применимых задач НЛП. В этой статье мы покажем, как применить BERT к проблеме классификации текста всего за 3 строки кода. Для этого мы будем использовать ktrain, интерфейс в стиле fastai для Keras. ktrain имеет открытый исходный код и доступен здесь.

Чтобы установить ktrain, просто введите следующее:

pip3 install ktrain

Чтобы продемонстрировать классификацию текста BERT в ktrain и Keras, мы будем выполнять анализ настроений в обзорах фильмов с использованием набора данных обзора фильмов IMDb, используемого во многих научных статьях. Цель состоит в том, чтобы правильно классифицировать каждый обзор фильма в проверочном наборе как положительный или отрицательный. Вы можете скачать набор данных здесь, а затем распаковать его. Для начала импортируем модули ktrain и ktrain.text:

import ktrain
from ktrain import text

Импортировав ktrain, приступим.

ШАГ 1: Загрузите данные

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

Первым аргументом должен быть путь к папке aclImdb, в которую вы извлекли набор данных IMDb. Аргумент maxlen указывает максимальное количество слов в каждом обзоре фильма, который следует учитывать (где более длинные обзоры обрезаются до этой длины). BERT может обрабатывать максимальную длину 512, но вы захотите использовать меньше, если сможете, чтобы уменьшить объем памяти и повысить скорость. Для использования с BERT текст должен быть предварительно обработан определенным образом. Это достигается путем установки preprocess_mode на «причал». При необходимости модель BERT и словарь будут загружены автоматически. Наконец, функция texts_from_folder ожидает следующую структуру каталогов, которой уже соответствует папка aclImdb:

├── folder
    │   ├── train
    │   │   ├── class0       # folder for class 0 documents
    │   │   ├── class1       # folder for class 1 documents
    │   │   ├── class2       # folder for class 2 documents
    │   │   └── classN       # folder for class N documents
    │   └── test 
    │       ├── class0       # folder for class 0 documents
    │       ├── class1       # folder for class 1 documents
    │       ├── class2       # folder for class 2 documents
    │       └── classN       # folder for class N documents

ШАГ 2. Загрузите BERT и оберните его в объект Learner

Первый аргумент get_learner использует функцию ktrain text_classifier для загрузки предварительно обученной модели BERT со случайно инициализированным финальным слоем Dense. Второй и третий аргументы - это данные для обучения и проверки соответственно. Последний аргумент get_learner - размер пакета. Мы используем небольшой пакет размером 6 на основе следующих рекомендаций Google для графических процессоров 12 ГБ:

ШАГ 3: Обучите модель

Для обучения модели мы используем fit_onecycle метод ktrain, который применяет политику скорости обучения в один цикл, которая линейно увеличивает скорость обучения в первой половине обучения, а затем снижает скорость обучения во второй половине. :

См. Эту статью о ktrain для получения дополнительных сведений о настройке скорости обучения. Максимальная скорость обучения 2e-5 используется на основе рекомендаций из статьи (и подтверждена посредством выполнения ktrain Learning Rate Finder).

Как видно из выходных данных Keras, здесь достигается точность 93,71% за одну эпоху:

Поскольку не похоже, что мы переобучаем, модель может быть обучена для большего количества эпох, чтобы при желании получить еще более высокую точность. Например, обучение для трех эпох может дать точность более 94% для этого набора данных.

Несколько заключительных мыслей о BERT на практике

Скорость. Хотя производительность BERT впечатляет, он сравнительно медленный как с точки зрения обучения, так и с точки зрения вывода (т. е. прогнозов на основе новых данных). Попытки ускорить BERT с помощью сжатия не увенчались успехом. По этим причинам, если вы тренируетесь в течение более чем одной эпохи, вы можете опустить аргумент val_data из get_learner и проверять его только по окончании обучения. Это можно сделать в ktrain с помощью метода learner.validate, как показано в этой записной книжке Google Colab. Учитывая медлительность BERT, вам также следует рассмотреть более простые и быстрые модели в качестве альтернативы, чтобы решить, стоит ли того повышенная точность от BERT. В некоторых случаях вы удивитесь, обнаружив, что это не так.

ОБНОВЛЕНИЕ 2020-01–14: Дистилляция может использоваться для ускорения моделей трансформаторов. См. Наш новый пост на Medium, чтобы узнать об использовании модели DistilBERT в ktrain.

Память. BERT может потреблять довольно много памяти. Если вы столкнулись с ошибками, которые могут указывать на превышение пределов памяти вашего графического процессора (например, Blas GEMM launch failed, CUDA_ERROR_OUT_OF_MEMORY), вы можете попробовать уменьшить параметр batch_size, используемый в STEP 2 или параметр maxlen, используемый в ШАГ 1.

Сохранение моделей BERT. После обучения BERT для вашего набора данных может потребоваться сохранить его на диск, чтобы в дальнейшем делать прогнозы на основе новых данных. Как вы, возможно, знаете, вы можете сохранять и загружать модели в Keras, используя метод model.save и встроенную функцию Keras load_model соответственно. Однако функция Keras load_model здесь не будет работать должным образом, поскольку BERT использует настраиваемые слои. Вместо использования встроенной функции load_model Keras вы можете загрузить модель с помощью метода learner.load_model в ktrain после повторного выполнения шагов 1 и 2, описанных выше. Это будет работать правильно, поскольку ktrain передает пользовательские слои BERT в функцию load_model Keras. Кроме того, вы можете сохранить и загрузить только веса, используя стандартные вызовы model.save_weights и model.load_weights. (В обоих случаях модель Keras всегда напрямую доступна как learner.model.)

Исходный код статьи: Исходный код этой статьи доступен в виде следующего блокнота Jupyter: IMDb-BERT.ipynb. В записной книжке есть примеры оценки хорошей скорости обучения и прогнозов на основе новых данных. Не стесняйтесь опробовать это на своих собственных наборах данных.

Дополнительная информация: Дополнительные сведения о ktrain см. в обучающих тетрадях по ktrain и в нашей предыдущей публикации TDS Medium:

Ktrain: легкая оболочка для Keras, помогающая обучать нейронные сети

Используете ktrain в Google Colab? См. Также эту демонстрацию BERT в действии в настройке с несколькими классификациями.

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

  • ktrain поддерживает классификацию текста BERT с помощью пакета keras_bert от Zhao HG.