Upgrade to Pro — share decks privately, control downloads, hide ads and more …

(12.05.2021) Семинар – "Применение байесовских сетей в задаче определения мед. диагноза на примере сервиса helzy.ru"

(12.05.2021) Семинар – "Применение байесовских сетей в задаче определения мед. диагноза на примере сервиса helzy.ru"

ТиМПИ

May 12, 2021
Tweet

More Decks by ТиМПИ

Other Decks in Science

Transcript

  1. Disclaimers • Рассматриваемый сервис: helzy.ru • Я не аффилирован с

    сервисом, компанией или группой разработки • Представленная информация может быть неточной или устаревшей • План доклада: • Пример работы сервиса • Общая схема работы • Описание модуля распознавания симптомов • Описание модуля предсказания диагноза • Результаты и сравнение с аналогичными сервисами
  2. Этапы взаимодействия с пользователем 1. Первоначальный сбор анамнеза • Распознавание

    симптомов из произвольного текста • Natural Language Processing: нейронные сети 2. Генерация уточняющих вопросов, получение ответов и вывод предварительных диагнозов • Итеративный процесс • Байесовская сеть
  3. Постановка задачи • Цель: извлечь симптомы из текста-жалобы пациента •

    Все симптомы – из онтологии SNOMED CT • Одинаковые симптомы могут иметь разные названия • Формализовано кодами • На основе SNOMED был составлен справочник симптомов (наиболее частые + дополнения от своих врачей) Диффузный токсический зоб Болезнь Грейвса Graves' disease SCTID 353295004
  4. Особенности распознавания симптомов • Семантически сложная структура симптомов • Один

    и тот же симптом можно выразить очень по разному • Концентрированные короткие тексты • Мало деталей и конкретики • Сложность выявления паттернов • Дорогая и трудоемкая экспертная разметка • Необходимо медицинское образование • Текущее решение: классификация текста
  5. Предобработка текста • Приведение входного предложения к нижнему регистру •

    Удаление символов пунктуации • Удаление стоп-слов: частиц, союзов, предлогов, междометий и т.п. • Исправление орфографических ошибок ввода • Лемматизация (приведение к нормальной форме) “Появились боли в серединк груди и одышка” -> “появиться боль середина грудь одышка”
  6. Разбиение на подстроки, определение области медицины и симптомов “появиться боль

    середина грудь одышка” • Предложение разбивается на скип-граммы • Каждая скип-грамма отправляется на вход классификатору (нейронная сеть), который определяет вероятную область медицины • Далее отправляется в классификатор конкретной области медицины • Или в generic модель, если определить область не удалось
  7. Подготовка данных • Разметка данных – медэксперты и врачи •

    Цели: • Определение области медицины • Определение симптома из конкретной области (для врача из этой области) • Нюансы: • Добавление и учет альтернативных формулировок • Источника данных для разметки – форумы медицинских консультаций • Вместо ручной разметки текста – предварительная автоматическая разметка на основе cosine similarity (word2vec), а затем передача результатов врачам для исправления ошибок (и ошибок, и ошибок, и ошибок...)
  8. Векторизация и классификация • Векторизация текста: tf-idf • Симптомы отличаются

    ключевыми словами • Ключевые слова имеют большую метрику tf-idf в контексте нужной области медицины и маленькую в остальных • Классификатор: • Простая Sequential модель из Dense и Dropout блоков
  9. Задачи • Дальнейший сбор анамнеза • Распознавание дополнительных симптомов •

    Уточнение симптомов • Постановка вероятных диагнозов • На основе учтенных факторов риска и симптомов • Инструмент: дискретные байесовские сети • 15 разных сетей для разных областей медицины • Огромный плюс – объяснимость результатов, что важно для медицины
  10. Структура сети • Факторы риска: • Пол • Возраст •

    Перенесенные операции и болезни • Болезни родственников • География • Диагноз – скрытые переменные (по 1 на каждый диагноз) • 200+ диагнозов • Симптомы – наблюдаемые переменные из анамнеза • 1600+ симптомов
  11. Этап 2. Предобработка • Дискретизация величин (возраст) • Простановка дополнительных

    фактов • Свертка наблюдений в одно (рост + вес == индекс массы тела) • Обогащение данных дополнительной информацией (текущий сезон) • Автоматическое вычисление некоторых фактов по симптомам • «нет боли в животе» -> «боль внизу живота отсутствует» + «боль вверху живота отсутствует» + ... • Исключение фактов • Некоторые наборы фактов взаимоисключающи – их можно вычислить и автоматически проставить как отсутствующие • Пример: «воспаление миндалин» -> NOT «миндалины отсутствуют» • На практике немного сложнее и с матлогикой
  12. Этап 3. Вычисление доп. вопросов на основе правил • Некоторые

    вопросы почти всегда необходимо задать • «болит живот» -> необходимо локализовать место боли • «кашель» -> «сухой или мокрый?» • Быстрее, чем делать инференс по сети Этап 4. Инференс по сети • Маркировка симптомов и факторов риска, полученных на предыдущих этапах • Инференс сети
  13. Этап 5. Вычисление доп. вопросов по информационной мере • Определение

    пока неизвестных симптомов, знание которых даст наибольшее количество информации • Определяется по информационной мере Этап 2-5 (Б). Параллельно: вычисление доп. вопросов по факторам риска • Эти вопросы обычно задаются в конце – ими удобно подтверждать диагноз, но не вычислять • «Болели ли ваши родственники XXX?»
  14. Этап 6. Фильтрация • Технические • Логические (отсечение наименее вероятных

    диагнозов) Этап 7. Построение пути решения • Рассказывает, какие факторы наиболее повлияли на выбранные диагнозы на текущий моменты • Необходимо для визуализации и объяснения пользователю или мед. эксперту при составлении диагноза • Реализовано, но не отображается на настоящий момент
  15. Этап 8. Постобработка • Превращение вероятного факта (по которому необходимо

    задать вопрос) в набор вопросов • «Потенциально болит живот» -> «болит ли живот?», «где болит?», и т.д. Этап 9. Демонстрация вопросов пользователю • Задает вопрос(ы) пользователю и собирает ответы • Далее переходит на этап 4 (инференс по сети), или 2-5 (Б) доп. вопросы по факторам риска, или в конец работы.
  16. Построение структуры сети 1. Построение первоначального варианта мед. экспертами •

    Люди с медицинским образованием и соответствующим опытом работы в нужной сфере медицины 2. Анализ клинических данных и консультация с практикующими врачами или исследователями • Уточнение структуры сети, коррекция модели
  17. Обучение сети (заполнение вероятностями) • Частично: обеспечивается существующими данными •

    Проблемы: данных в хорошем виде (пригодном для обучения) очень мало • Большая часть: агрегация информации по врачам • Усреднение мнений врачей о диагнозе по симптомам • Telegram бот для сбора данных: • Используя структуру сети, генерирует вопросы вида «как часто головная боль встречается при XXX?» • Использовали Noisy-Max (см. Noisy-Or, Pearl 1988) и Noisy-Adder (Zagorecki, 2010) • Сильно сократило размеры таблиц и очень сильно уменьшило число врачам (с условных 10 000 до 1000)
  18. Тестирование готовой модели • Научили мед. экспертов программировать и написали

    тестовый фреймворк и тесты ☺ • См. пример теста справа • Использованные метрики: • Топ-1 и топ-3 попаданий правильной болезни в ответы • Процент найденных скрытых данных • Некоторые симптомы «присутствовали» в тесте, но не были выданы сети, а ждали правильного вопроса • Нагрузочные тесты TakeAPerson() .WhoHas(…) .And .WhoHas(…) .And […] .And .MakeInferForHim() .InferenceResultMust .IncludeAdditionalQuestionAbout(…) .OnThatPersonAnswer(…) .Then .MakeNewInferForPerson();
  19. Текущие результаты • Топ-1: около 70% • Топ-3: около 80%

    • 74% выведанных дополнительных фактов в процессе сбора анамнеза • В среднем: 20 вопросов за сеанс
  20. Интересные вызовы • Реализация Noisy-Max и Noisy-Adder • Выбор движка

    вычислений • figaro • pymc3 • pyro • stan • Edward • Smile Engine • Infer.Net • Как задать пользователю поменьше вопросов • Как задать наиболее важные вопросы
  21. Infer.Net • Фреймворк на C# для вероятностного программирования • Опубликован

    под лицензией MIT • .NET Standard 2.0 • Т.е. можно под .NET Framework 4.6.1+ (Windows) и .NET Core 3.1+ (Linux, Windows, etc.) • Генерирует код, описывающий структуру модели и ее связи • Позволяет использовать разные алгоритмы инференса • Используемый на текущий момент – Expectation Propagation • Модель компилируется в dll, подгружается и используется отдельным сервисом • Внутренний параллелизм (PLINQ) и борьба с ним ☺
  22. Сравнение с другими сервисами • Преимущества: • Широкий охват указанных

    симптомов • Меньшее число вопросов • Генерация дополнительных вопросов после инференса модели • Аналогичные сервисы: • Ada • Babylon • SymptomAid • И др.
  23. Использованные материалы • Сервис: https://helzy.ru • Материалы конференции Conversations AI

    2020. • https://youtu.be/1UDD8m2rcaU • https://dotnet.github.io/infer/ • Контакты: • https://medlinx.online • [email protected]