Интуиция, лежащая в основе BioBERT с реализацией в Colab

I. Введение

Интеллектуальный анализ текста в клинической области становится все более важным с появлением в настоящее время большого количества биомедицинских документов с ценной информацией, ожидающей расшифровки и оптимизации с помощью методов НЛП. Благодаря ускоренному прогрессу в НЛП предварительно обученные языковые модели теперь несут миллионы (или даже миллиарды) параметров и могут использовать огромные объемы текстовых знаний для последующих задач, таких как ответы на вопросы, логический вывод на естественном языке и, в случае, если мы будем работать биомедицинские текстовые теги посредством распознавания именованных сущностей. Весь код можно найти на моем GitHub.

II. Фон

В качестве новейшего достижения в области НЛП исследователи Google разработали языковую модель, известную как BERT (Девлин и др., 2018), которая была разработана для изучения глубоких представлений путем совместной обработки двунаправленного контекста текста в все слои его архитектуры ». Эти представления ценны для последовательных данных, таких как текст, которые в значительной степени зависят от контекста, и появление трансферного обучения в этой области помогает переносить закодированные знания для усиления более мелких задач человека в разных областях. В трансферном обучении мы называем этот шаг тонкой настройкой, что означает, что предварительно обученная модель теперь настраивается для конкретной задачи, которую мы имеем в виду. Исходная англоязычная модель использовала в предварительном обучении два корпуса: Wikipedia и BooksCorpus. Для более глубокого понимания трансформеров, таких как BERT, я бы предложил серию блогов об их архитектуре и точно настроенных задачах.

BioBERT (Lee et al., 2019) - это вариация вышеупомянутой модели от Корейского университета и Clova AI. Исследователи добавили в корпус оригинального BERT системы PubMed и PMC. PubMed - это база данных биомедицинских цитат и абстракций, а PMC - это электронный архив полнотекстовых журнальных статей. Их вкладом была модель представления биомедицинского языка, которая могла управлять такими задачами, как извлечение отношений и открытие лекарств, и это лишь некоторые из них. Имея предварительно обученную модель, которая охватывает как общие, так и биомедицинские корпуса предметных областей, разработчики и практики могут теперь инкапсулировать биомедицинские термины, которые было бы невероятно трудно понять общей языковой модели.

Текст разбивается в BERT, а BioBERT проходит через токенизатор WordPiece, который разбивает слова на частые подслова, так что Immunoglobulin будет токенизироваться на составные части I ## mm ## uno ## g ## lo ## bul ## in². Эти части слова могут использовать гибкость символов, а также общие значения слов с помощью комбинаций символов. Точно настроенные задачи, которые позволили достичь самых современных результатов с помощью BioBERT, включают распознавание именованных сущностей, извлечение отношений и ответы на вопросы. Здесь мы рассмотрим первую задачу и то, что именно выполняется.

III. Задача

Распознавание именованных сущностей (NER) - это процесс распознавания многочисленных имен собственных (или заданных целевых фраз), которые мы определяем как типы сущностей, подлежащих маркировке. Наборы данных, используемые для оценки NER, структурированы в схеме BIO (Beginning, Inside, Outside), наиболее распространенном формате тегов для токенов предложений в рамках этой задачи. Кроме того, «S», как в «S-Protein», может использоваться для вывода одного токена. Таким образом, мы можем отметить позиционный префикс и тип объекта, который прогнозируется на основе данных обучения.

Набор данных, используемый в этом примере, представляет собой комбинацию BioNLP09 Corpus, BioNLP11 Corpus и BioNLP13 Corpus. Хотя мы сосредотачиваемся на генах и белках, существуют и другие типы сущностей, такие как болезни, химические вещества и лекарства. В эти эксперименты включены 74 тега, но для краткости можно взглянуть на теги BioNLP13 Corpus в схеме BIO:

'B-Anatomical_system',
'B-Cancer',
'B-Cell', 
'B-Cellular_component',
'B-Developing_anatomical_structure',
'B-Gene_or_gene_product', 
'B-Immaterial_anatomical_entity',
'B-Multi-tissue_structure',
'B-Organ',
'B-Organism', 
'B-Organism_subdivision',
'B-Organism_substance',
'B-Pathological_formation', 
'B-Simple_chemical',
'B-Tissue',
'I-Amino_acid',
'I-Anatomical_system',
'I-Cancer', 
'I-Cell',
'I-Cellular_component',
'I-Developing_anatomical_structure',
'I-Gene_or_gene_product', 
'I-Immaterial_anatomical_entity',
'I-Multi-tissue_structure',
'I-Organ',
'I-Organism', 
'I-Organism_subdivision',
'I-Organism_substance',
'I-Pathological_formation',
'I-Simple_chemical', 
'I-Tissue',
'O'

IV. Реализация

Во-первых, нам нужно импортировать BioBERT из исходного GitHub и перенести файлы в нашу записную книжку Colab. Здесь мы загружаем основной файл BioBERT, извлекаем веса BioBERT и конвертируем их для использования в PyTorch для работы с HuggingFace API. Мы перемещаем файл конфигурации для простоты, и теперь все готово!

Вам потребуются библиотеки трансформеров от HuggingFace. Полный список установок и импорта можно найти в моем блокноте. Мы устанавливаем максимальную длину текста и размер пакета в качестве ограничений, с которыми мы будем работать позже. Мы также создадим устройство, использующее графические процессоры для вычислений в Colab. Класс BertTokenizer получит файл vocab.txt из файла BioBERT, который мы создали ранее.

Класс SentenceFetch принимает наши данные, считывает файлы TSV, в которые входит текст схемы BIO, и организует предложения и теги в рабочие структуры данных. Затем у нас есть методы для получения предложений и тегов.

Мы ищем во всех подкаталогах нашего корневого каталога. В Colab я бы посоветовал загружать ваши данные либо с Google Диска, либо с вашего локального диска. Мы используем класс SentenceFetch и создаем список предложений и тегов для использования в наших экспериментах.

Мы создаем вспомогательную функцию для токенизации текста без потери меток для каждого токена. Нам нужны эти ярлыки в неизменном виде для нашей модели.

Теперь мы можем нормализовать наши входные данные с помощью pad_sequences в Keras. Это используется для обеспечения согласованности фиксированной длины с последовательностями, которые короче нашей максимальной длины.

Теперь мы можем завершить подготовку данных для нашего моделирования. Маски внимания используются при группировании последовательностей, чтобы указать, какие токены следует наблюдать. Мы разделяем наши входные данные и маски между данными обучения и проверки. Затем мы конвертируем наши данные в тензоры для правильной работы с PyTorch. После этого мы передаем эти тензоры через утилиты данных в PyTorch и, наконец, имеем данные, готовые для нашей модели.

На этапе моделирования мы используем класс BertConfig, чтобы использовать файл конфигурации для модели. Мы также используем предварительно обученные веса, чтобы помочь установить наш «state_dict». State_dict - это словарь, который сопоставляет каждый слой с его тензором параметров, что значительно увеличивает модульность наших моделей и оптимизаторов в PyTorch.

Мы создаем простой класс BioBERT для модели NER. Наши атрибуты - это слои в нашей сети вместе с методом прямого прохода.

Создав нашу первичную модель, мы настраиваем планировщик скорости обучения и оптимизации. Здесь мы также устанавливаем другие гиперпараметры.

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

Вторая функция была создана для оценки нашей модели. Как можно было догадаться, мы знаем, что нужно сообщить слоям, что мы находимся в режиме eval. Мы также деактивируем механизм автограда, чтобы уменьшить использование памяти и ускорить вычисления. В будущем было бы более кратко объединить эти две функции как методы в классе модели BioBERT.

Здесь мы пройдемся по нашим эпохам, воспользуемся нашими двумя функциями и распечатаем результаты как для обучения, так и для проверки потери / точности.

Наши результаты показывают высокую точность 96% для точности обучения и 95% для точности проверки. Учитывая время, которое требуется (хотя здесь модель работает невероятно быстро с доступным графическим процессором!), Нет причин увеличивать эпохи.

======== Epoch 1/3 ========
Train Loss: 0.20869970354739556 Train Accuracy: 0.9479462699822381
Val Loss: 0.1037805580667087 Val Accuracy: 0.9576587301587302
======== Epoch 2/3 ========
Train Loss: 0.09325889256480109 Train Accuracy: 0.9650584665482536 Val Loss: 0.09049581730413059 Val Accuracy: 0.9589087301587302
 ======== Epoch 3/3 ======== 
Train Loss: 0.0828356556263529 Train Accuracy: 0.9658170515097693 Val Loss: 0.08888424655038213 Val Accuracy: 0.9585449735449736
CPU times: user 8min 41s, sys: 6min 12s, total: 14min 54s 
Wall time: 14min 58s

Когда мы рассматриваем потери, кривая обучения выражает разумные потери за три эпохи:

Теперь мы можем пометить случайное предложение из биомедицинской статьи аннотацией:

( - O 
i - O 
) - O 
Genetic - O 
experiments - O 
demonstrate - O 
that - O 
complementation - O 
of - O 
an - O 
in - O 
- - O 
frame - O 
deletion - O 
of - O 
HisG - S-Protein 
from - O 
Escherichia - O 
coli - O 
( - O 
which - O 
does - O 
not - O 
possess - O 
HisZ - S-Protein 
) - O 
requires - O
both - O 
HisG S-Protein 
and - O 
HisZ - S-Protein 
from - O 
L - O

Мы видим, что он правильно пометил отдельные / индивидуальные упоминания белка. Однако, учитывая обилие «0», обозначающих слова, не относящиеся к рассматриваемой задаче, были результаты, которые не соответствовали тегу «0» из-за огромного количества примеров в обучающих данных. Этот дисбаланс тегов будет неотъемлемой частью, которую необходимо улучшить в будущем.

В. Заключение

Мы получили общее представление о том, как работает BioBERT и как он расширяет работу BERT. Используя BioBERT, мы стремились правильно пометить биомедицинский текст с помощью задачи NER. Я познакомил нас с моей реализацией BioBERT, которая импортировала необходимые файлы, предварительно обработала данные и, наконец, построила, обучила и протестировала модель. Для более глубокого изучения BERT в Colab я настоятельно рекомендую учебники ChrisMcCormickAI. В главе 10 Практической обработки естественного языка есть также некоторая ценная информация, относящаяся непосредственно к инструментам и приложениям НЛП (включая BioBERT!) В отрасли здравоохранения. Я надеюсь, что это помогло вам познакомиться с современной моделью в биомедицинской сфере.

[1]: Devlin et. al. (Октябрь 2018 г.). BERT: предварительная подготовка глубоких двунаправленных преобразователей для понимания языка https://arxiv.org/abs/1901.08746

[2]: Lee et. al. (Сентябрь 2019 г.). BioBERT: предварительно обученная модель представления биомедицинского языка для биомедицинского анализа текста https://arxiv.org/abs/1901.08746