Институт Аллена в рамках своих открытых исследовательских усилий выпустил свалку научных статей в качестве инициативы, призванной помочь усилиям по борьбе с COVID-19. Этот набор данных содержит 51 000 статей на момент написания этой статьи и продолжает увеличиваться в размерах.
При поиске данных поиск по ключевым словам, вероятно, будет эффективным, однако его дополнение семантическими встраиваемыми предложениями обеспечит ценную информацию о данных либо с помощью кластеризации, либо с помощью семантической поисковой машины. Тем не менее, у семантического поиска есть свои проблемы, которые хорошо описаны в этом выпуске здесь.
Уже появились попытки, такие как this и covidex, что дает нам отличную отправную точку для интеграции языковых моделей для поиска CORD-19. Однако нынешним подходам не хватает определенного удобства использования; они, как правило, обучаются по абзацам или ищут только по аннотации и заголовку статей. Продолжая это, мы работали над обучением различных языковых моделей встраивания предложений на медицинских данных, оценивая эти модели с помощью соответствующих тестов и, наконец, предоставляя эффективный способ индексирования данных.
Я начну с заявления об отказе от ответственности, в котором говорится, что я не медицинский эксперт и постараюсь не переступить эту границу. Мне посчастливилось получить отзывы на высоком уровне от членов медицинского коллектива компании, в которой я работаю, и я ищу больше отзывов от других. Доступен весь код и модели, пожалуйста, делайте вопросы / предложения в репозитории CORD-19-ANN здесь!
Подход
Вкратце подход высокого уровня можно описать так:
- Обозначьте CORD-19 в предложения с помощью SciSpacy
- Точная настройка BioBERT и BlueBERT с использованием набора данных medNLI / SNLI / MultiNLI с помощью преобразователей предложений
- Создавайте вложения предложений для CORD-19 с помощью S-BioBERT / S-BlueBERT
- Создайте поисковый индекс с помощью FAISS с разумным сжатием
- Создайте визуальную кластеризацию с помощью UMAP
Токенизация
Для большинства поисковых систем входной запрос - это короткий промежуток времени. Набор данных CORD-19 разделен на отдельные статьи, где абзацы разбиты на разделы. Абзацы, вероятно, плохо моделируют входной запрос, но предложения будут ближе. В результате, чтобы отформатировать необработанные абзацы CORD-19 в предложения, я использовал токенизатор SciSpacy. Благодаря многопроцессорности токенизация завершается в разумные сроки.
Обучающие модели вложения предложений
При оценке набора языковых моделей я выбрал стандартный BERT, а также BioBERT и BlueBERT; Модели BERT обучены на биомедицинских данных. Они показывают результаты SOTA для различных медицинских задач и, надеюсь, обеспечивают более качественное встраивание предложений в набор данных CORD-19. Важно отметить, что последние предварительно обученные модели BlueBERT не имеют корпуса, тогда как BioBERT - это модель в корпусе. Было бы интересно определить, играет ли регистр важную роль в качестве встраивания для CORD-19, но это сохранено для будущей работы.
Для точной настройки моделей встраивания предложений и генерации встраивания я использую репозиторий преобразователей предложений UKPLab. Текущее состояние репозитория затрудняло опробование различных языковых моделей, появившихся в репозитории HuggingFace transformers, а также различных языковых моделей, таких как BlueBERT / BioBERT. Необходимо было внести изменения, чтобы сделать модель языка пакета независимой, а также выставить необходимые флаги для различных конфигураций LM. Изменения, которые необходимо было внести, можно увидеть на развилке здесь.
Чтобы настроить языковые модели, я объединил набор клинических данных MedNLI и наборы данных SNLI / MultiNLI. Все они предоставляют пары на английском языке, однако MedNLI предоставляет пары клинических предложений, которые являются ценными обучающими данными при точной настройке моделей. Я настроил различные языковые модели, используя наборы данных SNLI / MultiNLI и набор данных MedNLI. Результаты представлены ниже:
Выше мы видим, что BioBERT / BlueBERT превосходит предварительно обученный BERT на парах медицинских предложений MedNLI, хотя и с падением точности на эталонном тесте STS, наборе данных общего текстового сходства. Затем эти модели использовались для создания встраиваний в предложения CORD-19, что позволило нам выполнять приблизительный поиск ближайших соседей, а также кластеризацию.
Используя вложения, созданные BlueBERT и BioBert, я проверил ближайших соседей, прыгнув на несколько шагов вперед и создав поисковый индекс. Я заметил, что результаты были хуже при использовании BlueBERT, особенно для сокращений, которые имели смысл из-за того, что BlueBERT обучался с текстом без регистра. В результате я выбрал встраивание BioBERT в нисходящем направлении.
Создание поискового индекса
При создании индекса поиска по сходству я остановился на FAISS. Первоначальная работа была выполнена с использованием nmslib, однако, учитывая гибкость FAISS и обширную документацию в различных масштабах, я в конечном итоге перешел на FAISS. Вложения занимали около 20 ГБ дискового пространства, что означало бы, что для использования плоского индекса требовалось 20 ГБ ОЗУ. Это было нецелесообразно для обслуживания, поэтому я исследовал различные конфигурации индекса FAISS, в которых время запроса и отзыв могут быть потрачены на память, варьируя конфигурации. Ниже приводится анализ подмножества набора данных CORD-19 с вычислением оценки 1 @ R, описанной в этой статье FAISS. Это включает в себя вычисление отзыва о нахождении основного истинного ближайшего соседа в первых R ближайших соседях. В данном случае истинной точкой зрения была конфигурация с плоским индексом.
Большинство индексов содержат ближайшего соседа золотой истины в первой десятке лучших соседей, однако есть некоторая изменчивость в верхнем результате (Напомним @ 1). Чтобы выбрать подходящее сжатие, я также сравнил Recall @ 1 с размером индекса.
Основываясь на ограничениях отзыва и памяти, я выбрал конфигурацию «PCAR128, SQ8» в качестве компромисса между двумя значениями. Я пропустил HNSW из приведенного выше графика, поскольку индексы были значительно больше, но у меня было лучшее время поиска со значительным отрывом. Это было бы полезно в ситуациях, когда время поиска можно оптимизировать с меньшими ограничениями памяти.
Наконец, для визуализации был создан интерфейсный сайт поверх API поиска по http, как показано в верхней части этой статьи. API может использоваться независимо от веб-сайта и может быть удобен для определенных задач.
Кластеризация с использованием UMAP
Кластеризация может быть полезна для качественной проверки того, что вложения работают, а также для понимания данных. Используя UMAP, я смог сгруппировать образец данных в графике боке:
Ноутбук можно запустить на Google Colab здесь.
Будущая работа
Планирую и дальше дорабатывать и получать отзывы, весь код / модели можно увидеть в репозитории CORD-19-ANN. Набор инструментов является довольно общим для применения к любому набору данных, который содержит текст и может предоставить значение за пределами набора данных CORD-19. Если вы заинтересованы в этом, оставьте вопрос, и я буду более чем счастлив помочь.
Несколько будущих начинаний, которые я хотел бы осуществить:
- Автоматизация приема данных по мере увеличения набора данных и добавления новых статей для поддержания индекса в актуальном состоянии.
- Оцените добавление обучающих данных COVIDQA при обучении моделей встраивания предложений.
- Улучшение взаимодействия с пользовательским интерфейсом на основе отзывов пользователей
Благодарности
Спасибо @maheratashfaraz за помощь в создании интерфейса, а также авторам репозиториев, выделенных выше!