BERT (двунаправленные представления кодировщика от трансформаторов) - это архитектура на основе трансформаторов, представленная Google в статье Внимание - все, что вам нужно » в 2016 году. Модель BERT была опубликована в 2019 году в статье « BERT: предварительная подготовка глубоких двунаправленных преобразователей для понимания языка ». Когда он был выпущен, он показал самые современные результаты по тесту GLUE.

Вступление

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

Архитектура BERT представляет собой кодировщик многослойного двунаправленного преобразователя, описанный в статье BERT: предварительное обучение глубоких двунаправленных преобразователей для понимания языка.

В статье предлагаются две разные архитектуры. BERT_base и BERT_large. Архитектура BERT base имеет L = 12, H = 768, A = 12 и всего около 110 миллионов параметров. Здесь L обозначает количество блоков-трансформеров, H обозначает скрытый размер, A обозначает количество самовнимающей головы. Для BERT большой: L = 24, H = 1024, A = 16.

Формат ввода BERT приведен на изображении выше. Я не буду вдаваться в подробности. Вы можете обратиться к приведенной выше ссылке для более подробного объяснения.

Исходный код

Код, которому я буду следовать, можно клонировать из следующего репозитория HuggingFace на GitHub:

Https://github.com/huggingface/transformers/

Скрипты, которые будут использоваться

В основном мы будем модифицировать и использовать два скрипта для нашей задачи классификации текста. Один из них - glue.py,, а другой - run_glue.py. Путь к файлу glue.py - «transformers / data / processors /», а файл run_glue.py можно найти в папке «examples / text- классификация / ».

Формат данных

Формат данных примерно такой. Первый столбец должен быть столбцом id. Второй столбец должен быть столбцом, содержащим метки. И третий столбец должен содержать текст, который требуется классифицировать.

data = pd.DataFrame()
data['id'] = [i for i in range(num_text)]
data['label'] = labels
data['text'] = text

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

#if data is your training file 
data.to_csv('train.tsv', sep='\t', index=False, header=None)

#if data is your validation file
data.to_csv('dev.tsv', sep='\t', index=False, header=None)

#if data is your test file
data.to_csv('test.tsv', sep='\t', index=False, header=None)

В вашем тестовом файле вы можете игнорировать столбец меток, если хотите. Я использовал, потому что его можно использовать для проверки производительности моделей после прогнозирования. Кроме того, имена файлов могут быть сохранены по своему усмотрению. Но соответственно необходимо внести изменения в файл glue.py, изменив имена файлов.

Изменения, которые необходимо внести в сценарий

glue.py

путь - трансформаторы / данные / процессоры / glue.py

Для целей классификации можно выбрать одну из этих задач - CoLA, SST-2, MRPC, STS-B, QQP, MNLI, QNLI, RTE, WNLI.

Я продолжу выполнение задания SST-2; те же изменения можно сделать и с другими задачами. Класс, который будет использоваться, будет -

Ниже приведены изменения, которые необходимо внести -

  1. Измените список возврата функции get_labels () с [‘0’, ‘1’] на список ярлыков, присутствующих в ваших данных.
  2. В функции _create_examples () измените -
text_a = line[text_index]
⬇ ⬇ ⬇(to)
text_a = line[-1]

3. В словаре, определенном как glue_task_num_labels, измените значение ключа 'sst-2' на num_labels. присутствует в ваших данных.

run_glue.py

путь - примеры / классификация текста / run_glue.py

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

Прогнозы можно сохранить, сохранив массив предсказаний, который показан в приведенном выше коде в текстовом файле.

Как запускать скрипты

Чтобы запустить скрипт, можно запустить следующую команду -

python ./examples/text-classification/run_glue.py \
    --model_name_or_path bert-base-uncased \
    --task_name $TASK_NAME \
    --do_train \
    --do_eval \
    --data_dir $GLUE_DIR/$TASK_NAME \
    --max_seq_length 128 \
    --per_device_eval_batch_size=8   \
    --per_device_train_batch_size=8   \
    --learning_rate 2e-5 \
    --num_train_epochs 3.0 \
    --output_dir /tmp/$TASK_NAME/

Объясню все параметры по порядку -

  1. - имя_модели_или_путь - этот параметр указывает тип модели BERT, которую вы хотите использовать.
  2. - task_name - определяет задачу склеивания, которую мы хотим использовать. Можно использовать один из CoLA, SST-2, MRPC, STS-B, QQP, MNLI, QNLI, RTE, WNLI.
  3. - do_train - Указывает, хотите ли вы настроить модель или нет. Если вы хотите использовать предварительно обученную модель, просто удалите этот параметр.
  4. - do_eval - Если вы хотите выполнить проверку
  5. - do_predict - Если вы хотите создать прогноз на основе тестовых данных.
  6. - data_dir - путь к каталогу, в котором должны быть сохранены данные обучения, проверки и тестирования.
  7. - output_dir - путь к каталогу, в котором вы хотите сохранить прогнозы и другие сгенерированные файлы.

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

  • - save_total_limit = Определяет, сколько каталогов контрольных точек вы хотите сохранить.

Всего этого достаточно, чтобы настроить BERT для задачи классификации текста.

На этот раз все с моей стороны. Надеюсь, этот пост в блоге поможет вам в выполнении указанной задачи.