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:
Скрипты, которые будут использоваться
В основном мы будем модифицировать и использовать два скрипта для нашей задачи классификации текста. Один из них - 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; те же изменения можно сделать и с другими задачами. Класс, который будет использоваться, будет -
Ниже приведены изменения, которые необходимо внести -
- Измените список возврата функции get_labels () с [‘0’, ‘1’] на список ярлыков, присутствующих в ваших данных.
- В функции _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/
Объясню все параметры по порядку -
- - имя_модели_или_путь - этот параметр указывает тип модели BERT, которую вы хотите использовать.
- - task_name - определяет задачу склеивания, которую мы хотим использовать. Можно использовать один из CoLA, SST-2, MRPC, STS-B, QQP, MNLI, QNLI, RTE, WNLI.
- - do_train - Указывает, хотите ли вы настроить модель или нет. Если вы хотите использовать предварительно обученную модель, просто удалите этот параметр.
- - do_eval - Если вы хотите выполнить проверку
- - do_predict - Если вы хотите создать прогноз на основе тестовых данных.
- - data_dir - путь к каталогу, в котором должны быть сохранены данные обучения, проверки и тестирования.
- - output_dir - путь к каталогу, в котором вы хотите сохранить прогнозы и другие сгенерированные файлы.
Думаю, все остальные параметры очевидны по названию. Другой параметр, который можно использовать, -
- - save_total_limit = Определяет, сколько каталогов контрольных точек вы хотите сохранить.
Всего этого достаточно, чтобы настроить BERT для задачи классификации текста.
На этот раз все с моей стороны. Надеюсь, этот пост в блоге поможет вам в выполнении указанной задачи.