Искусственный интеллект для поиска новых лекарственных препаратов

Индустрии
Здравоохранение
Компетенции
Искусственный интеллект и машинное обучение
Технологии
Python

Клиент


Крупная международная фармацевтическая компания, разрабатывающая лекарства от онкологических, психиатрических, неврологических и других заболеваний.

Задача


Для фармацевтической компании жизненно важен портфель разрабатываемых препаратов — веществ, которые после должной проверки (клинических исследований) станут новыми лекарственными препаратами и основными источниками прибыли, когда патенты на уже разработанные препараты истекут. Но поиск таких веществ очень дорог: это тысячи экспериментов, которые выявляют вещества, оказывающие нужное действие на биомишени.

Клиент поставил задачу разработать конвейер данных — решение, которое использует алгоритмы машинного обучения для предсказания активности химических соединений. Это позволит уменьшить количество реальных экспериментов и таким образом ускорить и удешевить поиск новых лекарств.

Требования к решению:

  • высокая скорость работы,
  • масштабируемость,
  • работа со всевозможными типами и форматами ввода и вывода данных,
  • гибкость (подстройка под нужды пользователей),
  • поддержка распределённых сложных вычислений на нескольких процессорах, кластерах, а также возможность использовать графические процессоры для ресурсоёмких вычислений.

Стоит отметить, что работа над проектом велась совместно с командой клиента и научными командами двух университетов, расположенных в Бельгии и Австрии. Это требовало умения работать в многоязыковой среде (C++, Java, Python, R) и интегрировать все части в единый конвейер данных.

Решение


В качестве основного языка разработки был выбран Python, поскольку в научных исследованиях чаще всего используются Python-скрипты и файлы Jupyter Notebook. Мы создали библиотеку инструментов, которая позволяет пользователям строить конвейеры в соответствии с потребностями бизнеса. Библиотека имеет интуитивно понятный пользовательский интерфейс, напоминающий известные библиотеки Python, такие как scikit-learn.

В библиотеке 7 основных блоков:

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

Подготовка данных

Инструменты для предварительной обработки данных позволяют пользователям

  • конвертировать записи соединения из различных форматов в один стандарт (например, в канонический SMILES),
  • стандартизировать представление структуры молекулы,
  • удалять тяжелые атомы и др.

Инструменты для фингерпринтирования используют различные методы для трансформации молекулы в числовой тензор.

В соответствии с требованием клиента, описанные выше инструменты позволяют использовать разнообразные алгоритмы как из популярных химических библиотек (Chemaxon, RDKit), так и из новейших научных исследований. Для этого мы:

  • адаптировали и внедрили ряд алгоритмов из недавних научных публикаций,
  • разработали на Python оболочку для Chemaxon, поскольку эта библиотека написана на Java,
  • разработали оболочки для некоторых инструментов на основе RDKit, чтобы компенсировать некоторые недочёты в работе этого пакета.

Машинное обучение

Перед тем, как начать собственно обучение модели, нужно провести разбивку датасета на тренировочную, валидационную и тестовую выборки, а для этого нужно предварительно произвести кластеризацию данных — разбивку на подмножества схожих объектов. Это необходимо для того, чтобы после разделения каждая выборка была «репрезентативна», т.е. разные группы объектов были представлены в ней примерно в том же соотношении, что и в общем датасете. Разработанное решение осуществляет кластеризацию и разбивку данных при помощи ИИ — методом обучения без учителя (unsupervised learning). Затем созданные выборки используются для обучения с учителем.

Инструменты для кластеризации используют как классические, так и продвинутые алгоритмы. По запросу клиента мы модифицировали библиотеку Faiss, написанную на C++: мы создали для неё оболочку на Python, которая добавляет метрику сходства Tanimoto — наилучший метод для вычисления схожести фингерпринтов молекул.

Инструменты для разбивки данных эффективно обрабатывают многозадачные многоклассовые разбивки, используя все доступные ядра ЦП. На выходе получаются датасеты, в которых доля данных из каждого кластера такая же, как и в генеральной совокупности.

Для обучения с учителем мы использовали различные алгоритмы, в том числе:

  • классическое машинное обучение — SVM, KNN, SGD и т. д.,
  • алгоритмы, основанные на дереве поиска решений, такие как XGBoost, NGBoost,
  • алгоритмы глубокого обучения на основе Pytorch и
  • нейронные сети обмена сообщениями (message-passing neural networks, MPNN). Последние являются мощными инструментами для прогнозирования свойств молекулярных графов. Некоторые из них мы реализовали с нуля на основе научных работ.

Оценка результатов

Для оценки неопределённости мы включили индуктивные конформные предикторы Мондриана и предикторы Venn-ABERS. Кроме того, модели, построенные на основе ансамбля (метамодели) могут вычислять неопределённость данных (алеаторическую) и неопределённость знаний (эпистемическую).

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

  • обучать одну модель,
  • выполнять k-кратную проверку,
  • выполнять вложенную перекрестную проверку (кросс-валидацию).

Кроме того, это позволяет пользователям оптимизировать гиперпараметры двумя методами: поиск по сетке и древесно-структурированная оценка Парзена.

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

Кроме того, пользователи могут донастроить модели либо использовать модели и оценки неопределённости со сторонними фреймворками активного обучения, поскольку у них есть аналогичный scikit-learn интерфейс.

API

Ко всем конвейерам можно обращаться посредством API. Пользователи (химики, обучающие модель ИИ) могут создать простой YAML-файл, в котором они описывают, какие методы они хотели бы использовать для предварительной обработки соединения и создания фингерпринта, а также какую модель они хотели бы использовать для вывода. Затем они запускают сервер Flask. После этого клиенты (другие химики) могут обращаться размещённой на сервере модели и запрашивать предсказания для тех или иных химических соединений. Высокая производительность позволяет использовать этот API в приложениях реального времени, таких как инструменты рисования молекул, которые генерируют прогнозы по ходу выполнения. Иными словами, химик «рисует» химическое соединение в редакторе и через API сразу получает информацию о его характеристиках, предсказанных моделью ИИ.

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

Продукт хорошо задокументирован и содержит множество примеров файлов Jupyter Notebook для различных задач и ситуаций.

Результат


Наше решение позволило обрабатывать большие объёмы данных, представленных в различных форматах, используемых в научном сообществе. При поиске потенциальных лекарственных средств используются различные алгоритмы машинного обучения; сложные вычисления можно распределить на несколько ядер процессора, графических процессоров или кластеров.

Использование Python в качестве основного языка разработки и интуитивно понятный пользовательский интерфейс позволяют пользователям быстро освоить работу с библиотекой. Кроме того, они могут интегрировать отдельные блоки нашей библиотеки в сторонние скрипты и инструменты Python — например, инструменты для активного обучения.

Высокопроизводительный код сокращает время обучения моделей машинного обучения и позволяет пользователям осуществлять вывод в режиме реального времени.