Сотрудничество между Сантошем Гуптой, Алексом Шэном и Junpeng Ye
Загрузите обученные модели и внедряющий файл здесь.
Победитель Топ -6 финалиста ⚡#PoweredBytf 2.0 Challenge! https://devpost.com/software/nlp-doctor. DOC Product будет представлен команде Tensorflow Engineering в Tensorflow Connect. Оставайтесь с нами для деталей.
Мы хотели использовать Tensorflow 2.0, чтобы изучить, насколько хорошо современные модели обработки естественного языка, такие как BERT и GPT-2, могут отвечать на медицинские вопросы, извлекая и обусловив соответствующие медицинские данные, и это результат.
Цель этого проекта - изучить возможности моделей языка глубокого обучения для научного кодирования и поиска, которые он не должен использоваться для действенных медицинских консультаций.
Будучи группой друзей с разнообразными происхождениями, от сломанных студентов и до ученых-исследователей в высших уровнях, мы черпали вдохновение для нашего дизайна из различных областей машинного обучения. Объединив силу архитектур трансформатора, латентного поиска векторов, отрицательной выборки и генеративного предварительного обучения в гибкой структуре глубокого обучения Tensorflow 2.0, мы смогли придумать новое решение сложной проблемы, которая сначала казалась задачей геркулевой.
Если вы заинтересованы во всей истории о том, как мы построили продукт DOC и детали нашей архитектуры, посмотрите на наш GitHub Readme!
Наш проект был предпринят слишком большим количеством проблем, чтобы подсчитывать, от сжатия астрономически больших наборов данных, до переосмысления всего BERT в Tensorflow 2.0, запуска GPT-2 с 117 миллионами параметров в колаборторе, чтобы выросли, чтобы подготовить последние части нашего проекта, оставив несколько часов до крайнего срока подачи. Как ни странно, самые большие проблемы были часто, когда у нас были разногласия по поводу того, в каком направлении движения проекта. Однако, хотя мы не согласны с тем, каким был лучший курс действий, в конце концов у нас была одна и та же конечная цель - построить что -то значимое и потенциально ценное для многих людей. Тем не менее, мы всегда сможем сесть и прийти к соглашению и, с поддержкой друг друга и ночными переговорами о том, что он выступает за тусование Google, сталкивается с трудностями и преодолеть их вместе.
Хотя продукт DOC не готов к широко распространенному коммерческому использованию, его удивительно хорошие результаты показывают, что достижения в общих языковых моделях, таких как BERT и GPT-2, сделали ранее неразрешимые проблемы, такие как обработка медицинской информации, доступные для глубоких подходов на основе НЛП. Таким образом, мы надеемся, что наша работа служит вдохновлять других на решение этих проблем и самостоятельно изучить недавно открытую границу NLP.
Тем не менее, мы по-прежнему планируем продолжить работу над DOC Product , в частности, расширяя его, чтобы воспользоваться версиями параметров 345, 762 м и 1,5B GPT-2, поскольку Openai выпускает их как часть своей программы поэтапного выпуска. Мы также намерены продолжить обучение модели, так как у нас все еще есть немного больше данных.
Примечание: мы работаем над исследованиями в области научного/медицинского НЛП и поиска информации. Если вы заинтересованы в сотрудничестве, выстрелите нам электронное письмо по адресу [email protected]!
Вы можете установить продукт DOC прямо из PIP и запустить его на местной машине. Вот код для установки DOC Product , а также Tensorflow 2.0 и Faiss:
!wget https://anaconda.org/pytorch/faiss-cpu/1.2.1/download/linux-64/faiss-cpu-1.2.1-py36_cuda9.0.176_1.tar.bz2
#To use GPU FAISS use
# !wget https://anaconda.org/pytorch/faiss-gpu/1.2.1/download/linux-64/faiss-gpu-1.2.1-py36_cuda9.0.176_1.tar.bz2
!tar xvjf faiss-cpu-1.2.1-py36_cuda9.0.176_1.tar.bz2
!cp -r lib/python3.6/site-packages/* /usr/local/lib/python3.6/dist-packages/
!pip install mkl
!pip install tensorflow-gpu==2.0.0-alpha0
import tensorflow as tf
!pip install https://github.com/Santosh-Gupta/DocProduct/archive/master.zip
Наш репо содержит сценарии для создания данных .tfrefords , обучающего продукта DOC на ваших собственных данных вопросов и ответов и запуска продукта DOC , чтобы получить ответы на медицинские вопросы. Пожалуйста, см. В разделе «Колабораторные демоверсии», ниже, чтобы получить образцы кода для загрузки данных/весов и запуска наших моделей.
Взгляните на наши демонстрации Colab! Мы планируем добавить больше демонстраций по мере продвижения, позволяя пользователям изучать больше функциональных возможностей продукта DOC . Все новые демонстрации будут добавлены в одну и ту же папку Google Drive.
Демонстрации включают код для установки продукта DOC через PIP, загрузку/загрузку предварительно обученных весов, а также запуск функций поиска продукта DOC и тонкую настройку на ваши собственные данные Q & A.
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkwwrvexcjiqqtxhxzlcw5cxi7xa
Скводиная демонстрация продукта DOC все еще экспериментальная , но не стесняйтесь попробовать его! https://colab.research.google.com/drive/1bv7bppxiimsmg4ywb_lwjdrguhvi7pxx
Наш Берт был обучен кодировать медицинские вопросы и медицинскую информацию. Пользователь может ввести медицинский вопрос, и наша модель будет получить наиболее соответствующую медицинскую информацию для этого вопроса.
Мы создали наборы данных из нескольких медицинских и ответных форумов. Форумы - WebMD, HealthTap, EhealthForums, IClinic, Вопросные врачи и Reddit.com/r/askdocs
Архитектура состоит из тонкой настройки биобарта (то же самое для как вопросов, так и ответов) для преобразования ввода текста в представление встраивания. Затем внедрение вводится в FCNN (другой для вопросов и ответов) для разработки встраивания, которое используется для поиска сходства. Верхние аналогичные вопросы и ответы затем используются GPT-2 для создания ответа. Полная архитектура показана ниже.
Давайте посмотрим на первую половину диаграммы выше выше, более подробно, обучение BERT и FCNNS. Подробная фигура этой части показана ниже
Во время обучения мы принимаем множество медицинских вопросов и их соответствующих медицинских ответов и преобразуем их в биобарты. Те же веса берта используются как для вопросов, так и для ответов.
Эти встраивания затем вводятся в слой FCNN. Существуют отдельные слои FCNN как для вопроса, так и для ответов. Чтобы резюме, мы используем одинаковые веса в слое BERT, но у каждого и ответов есть свой отдельный слой FCNN.
Теперь вот где все становится немного сложным. Обычно внедрение сходства обучение включает отрицательные выборки, например, как Word2VEC использует потерю NCE. Тем не менее, мы не можем использовать потерю NCE в нашем случае, так как встраивания генерируются во время каждого шага, а веса изменяются на каждом этапе тренировок.
Таким образом, вместо потери NCE то, что мы сделали, было вычислять точечный продукт для каждой комбинации вопроса и ответов в нашу партию. Это показано на рисунке ниже
Затем через ряды берут Softmax; Для каждого вопроса все его комбинации ответов софтации.
Наконец, используемая потеря - это потери поперечной энтропии. Матрица с мягкой максимальной промышленностью сравнивается с наземной матрицей правды; Правильные комбинации вопросов и ответов помечены «1», а все остальные комбинации помечены «0».
Сбор данных был хитрым, потому что форматирование всех различных медицинских сайтов значительно отличалось. Для каждого сайта необходимо выполнить пользовательскую работу, чтобы вытащить вопросы и ответы из правильной части тегов HTML. Некоторые из сайтов также имели возможность, чтобы несколько врачей отвечали на один вопрос, поэтому нам нужен метод сбора нескольких ответов на отдельные вопросы. Чтобы справиться с этим, мы создали несколько строк для каждой пары вопросов-ответов. Отсюда нам нужно было запустить модель через BERT и сохранить выходы из одного из конечных слоев, чтобы сделать биобартные встраиваемые встроенные вкладки, мы могли бы пройти через плотные слои нашей нейронной сети с подачей (FFNN). 768 векторов измерений были сохранены как для вопроса, так и для ответов и объединены с соответствующим текстом в файле CSV. Мы пробовали различные форматы для более компактной и быстрой загрузки и обмена, но CSV в итоге стал самым простым и самым гибким методом. После того, как были созданы встроенные биобарты и сохранены, был проведен процесс обучения сходства, а затем были созданы FFNN Enterdings, которые будут отражать сходство вопросов с ответами. Они также хранились вместе с встраиванием биобарта и исходным текстом для последующей визуализации и запросов.
Модели встраивания встроены в TF 2.0, который использует гибкость нетерпеливо выполняемого TF 2.0. Тем не менее, модель GPT2, которую мы используем, встроены в TF 1.x. К счастью, мы можем тренировать две модели отдельно. Во время вывода мы должны поддерживать отключение энергичного выполнения с помощью tf.compat.v1.disable_eager_execution и поддерживать две отдельные сеансы. Нам также необходимо позаботиться о памяти графических процессоров о двух сеансах, чтобы избежать OOM.
Одним из очевидных подходов к получению ответов на основе вопросов пользователя является то, что мы используем мощный энкодер (BERT) для кодирования входных вопросов и вопросов в нашей базе данных и выполнять поиск сходства. Нет никаких тренировок, и эффективность этого подхода полностью полагается на энкодер. Вместо этого мы используем отдельные сети подачи для вопросов и ответов и рассчитываем сходство косинуса между ними. Вдохновленный отрицательной выборкой бумаги Word2VEC, мы рассматриваем другие ответы в той же партии, что и отрицательные образцы и рассчитываем потерю поперечной энтропии. Этот подход делает вопросы встраивания и ответов в одну пару как можно ближе с точки зрения евклидового расстояния. Оказывается, что этот подход дает более надежные результаты, чем поиск сходства непосредственно с использованием вектора встраивания BERT.
Предварительная обработка BERT сложна, и у нас есть около 333 тыс. Калифорнийских пар и более 30 миллионов токенов. Учитывая, что шаффл очень важен в нашем обучении, нам нужен буфер для перетасовки, достаточно большой, чтобы правильно обучить нашу модель. Прежде чем начать обучение модели в каждую эпоху, потребовалось более 10 минут. Таким образом, мы использовали TF.Data и TFRECORDS для создания высокопроизводительного входного трубопровода. После оптимизации потребовалось всего около 20 секунд, чтобы начать тренировку, а не время простаивания графических процессоров.
Другая проблема с предварительной обработкой BERT заключается в том, что он накладывает все данные к фиксированной длине. Следовательно, для коротких последовательностей много вычислений и памяти графического процессора потрачены впустую. Это очень важно, особенно с большими моделями, такими как Берт. Таким образом, мы переписываем код предварительной обработки BERT и используем tf.data.experimental.bucket_by_seckence_length для последовательностей ведра с различными длинными и динамическими последовательностями. Делая это, мы достигли более длительной максимальной длины последовательности и более быстрого обучения.
После некоторой модификации Keras-Bert может работать в среде TF 2.0. Однако, когда мы пытаемся использовать Керас-Берт в качестве подмодели в наших моделях встраивания, мы обнаружили следующие две проблемы.
В результате мы решили повторно внедрить императивную версию Берта. Мы использовали некоторые компоненты керас-берта (внимание с несколькими головками, загрузка веса контрольной точки и т. Д.) И записываем метод вызова BERT. Наша реализация легче отлаживать и совместима как с гибким режимом, так и с высокоэффективным статическим графическим режимом.
Пользователи могут испытывать несколько симптомов в различных условиях, что делает идеальный ответ, может быть комбинацией нескольких ответов. Чтобы справиться с этим, мы используем мощную модель GPT2 и подаем модель вопросов от пользователей, а также высших k вспомогательных ответов, которые мы извлекали из наших данных. Модель GPT2 будет основана на вопросе и верхних k -ответах и генерирует лучший ответ. Чтобы правильно обучить модель GPT2, мы создаем учебные данные следующим образом: Мы принимаем каждый вопрос в нашем наборе данных, выполняем поиск сходства, чтобы получить верхний ответ K+1, используйте исходный ответ в качестве целевого и других ответов в качестве вспомогательных входов. Делая это, мы получаем такое же количество учебных данных GPT2, что и данные обучения модели встраивания.
Берт фантастика для кодирования медицинских вопросов и ответов, а также для развития надежных векторных представлений этих вопросов/ответов.
Мы обучили тонкую версию нашей модели, которая была инициализирована с помощью Biobert Naver. Мы также обучили версию, в которой были заморожены веса биоберта, и только обучили два FCNN для вопросов и ответов. В то время как мы ожидали, что тонкая версия будет хорошо работать, мы были удивлены тем, насколько надежным был позже. Это говорит о том, что Biobert обладает врожденными возможностями в способности кодировать средства медицинских вопросов и ответов.
Исследуйте, есть ли какое -либо практическое использование этого проекта вне исследований/исследовательских целей. Подобная модель не должна использоваться в общественности для получения медицинской информации. Но, возможно, это может быть использовано обученными/лицензированными медицинскими работниками для сбора информации для проверки.
Изучите применение того же метода к другим доменам (т.е. поиск информации истории, поиск инженерной информации и т. Д.).
Исследуйте, как недавно выпущенный Scibert (от Allen AI) сравнивается с Biobert Naver.
Мы благодарим команду Tensorflow за предоставление задачи #PoweredBytf2.0 в качестве платформы, с помощью которой мы могли бы поделиться нашей работой с другими, и особое благодарность доктору Ллиону Джонсу, чьи понимание и руководство оказали важное влияние на направление нашего проекта.