Привет, это Александр Нозик, и этот пост посвящен еще одной "интересной" магистерской программе (на этот раз на физтехе, совместно с JetBrains, Таврида Электрик и целым списком научных организаций). Про интересность вы решите сами, но программа в этот раз действительно уникальная (пока по крайней мере). Называется она Научное программирование (официальное название "Разработка и применение программного обеспечения в физических исследованиях") и расположена на ФПМИ и ЛФИ в МФТИ. Посвящена не отдельно физике, не отдельно программированию, не отдельно computer science, а стыку всего этого.
Если вы уже поняли, что это про вас, то можно бежать читать подробности и заполнять анкету на сайте программы.
Если нет, то читаем дальше.
Дело в том, что все аспекты нашей современной жизни так или иначе связаны с компьютерами и программированием, наука и инженерия не исключение. Ученые и инженеры существенную часть своего рабочего времени посвящают работе с компьютерами. Если мы говорим про науку, то все начинается со стадии проектирования эксперимента. Мы делаем большие объемы математического моделирования, чтобы понять, что вообще можно измерить и как это лучше сделать. В конце концов, мы не можем работать методом тыка. Современные эксперименты очень дороги, и делать их, не зная заранее, что там можно измерить, очень невыгодно. Дальше нам надо собрать данные, для этого используются разнообразные автоматизированные системы управления. Эти данные нужно хранить (а данных может быть очень много, петабайты). К данным нужно обеспечить удобный доступ, организовать резервное хранение, сервисы по индексации и визуализации. В конце концов данные нужно обработать. А тут уже нужно задействовать весь арсенал современных компьютерных методов работы с данными от параллельных и распределенных вычислений до машинного обучения.
В индустрии проблем не сильно меньше. То же самое математическое моделирование, тот же сбор данных, но также добавляется использование автоматических систем проектирования, инфраструктурные проекты и многое другое.
Во всех этих задачах нужно не только знать соответствующие алгоритмы, но и создавать и поддерживать программные инструменты. Практика показывает, что для этого нужно понимать не только прикладное программирование, но и ту область, в которой решения будут применяться (предметную область). В то же время физики и инженеры должны знать прикладное программирование, чтобы работать с современным программным обеспечением и совершенствовать его.
Как вы, наверное, уже догадались, тут как раз и включается наша магистерская программа. Она организована на стыке областей, и наша цель научить физиков (и вообще "предметников") программировать, а программистов понимать предметную область. Разумеется, невозможно знать все одинаково хорошо. Но тем не менее мы и наши партнеры верим в то, что в будущем профессия физик-программист (или химик-программист, или биолог-программист), то есть тот, кто не просто может написать скрипт на Python, а умеет создавать и поддерживать прикладное программное обеспечение в предметной области, будет весьма востребована.
Разумеется, тут есть некоторая техническая сложность. Дело в том, что за последние 30 лет пути IT и естественных наук сильно разошлись, и оказывается, что физики плохо владеют IT-инструментами, а IT-шники не знают предметной области. Нам нужны и те и другие, но обучать их нужно по-разному. Поэтому нужно сделать так, чтобы программа была максимально гибкая и могла быть подстроена и под тех, и под других. Решение это минимальный набор общих предметов:
Вычислительные методы
Анализ данных
Научная этика
Научный семинар
Остальные предметы выбираются студентом совместно с научным руководителем. Научный руководитель в нашей программе играет ключевую роль, потому что мы пытаемся охватить очень широкую область со множеством узких специализаций, и именно научный руководитель (и компания или институт, стоящие за ним) являются "направляющей", по которой студент будет двигаться. По этой причине руководителя нужно выбрать заранее и убедиться в том, что он (или она) вам подходит и вы подходите ему (или ей). В качестве бонуса от такой процедуры вы можете получить гарантированное поступление в магистратуру МФТИ. Наши промышленные партнеры (JetBrains и Таврида Электрик) готовы оплатить обучение для ограниченного количества студентов, которые прошли собеседования с руководителями, но по какой-то причине не прошли по конкурсу.
Давайте теперь кратко подробно никакого поста не хватит остановимся на темах тех научных руководителей, которые участвуют в программе.
Это направление представлено очень широко, поскольку создатели программы выходцы из этой области.
Максим Долгоносов из ИКИ РАН и ВШЭ представляет широкое направление, связанное с моделированием космических детекторов и высокоэнергетических процессов в атмосфере (с заходом в физику плазмы). Над этой проблемой сейчас также работает очень активная группа в МФТИ под руководством Егора Стадничука и Екатерины Свечниковой из ИПФ РАН.
Художественное видение реакторной модели возникновения наземных гамма-всплесков. Автор: Екатерина СвечниковаИгорь Анатольевич Пшеничнов из ИЯИ РАН является ведущим мировым специалистом по фотоядерным реакциям, физике ядер-спектаторов и моделированию на платформе Geant4 как для экспериментов в физике частиц, так и для прикладных исследований, например медицинской физики. Ученики Игоря Анатольевича работают в МФТИ.
Кроме того существует широкий спектр задач в физике частиц (в основном в международных коллаборациях), требующих навыков работы с Geant4 (С++).
В лаборатории Nuclear Physics Methods JetBrains Research мы Александр Нозик и Roland Grinis также занимаемся разработкой новых экспериментальных инструментов для моделирования процессов (в основном на Kotlin и с использованием разных новых технологий.
Айно Константиновна Скасырская является уникальным специалистом по сеточным расчетам разного рода (гидродинамика, термодинамика, расчет механических напряжений, электромагнитные поля). Для таких расчетов нужно не только хорошо разбираться в решении дифференциальных уравнений на сетках, но и владеть современными коммерческими пакетами, такими как ANSYS и COMSOL. Ученики Айно Константиновны чрезвычайно востребованы в промышленности.
На данный момент этой задачей занимаются сразу две не связанные между собой группы, сотрудничающие с нашей магистерской программой: Олег Евгеньевич Калашев из ИЯИ РАН и Дмитрий Костюнин из DESY (Германия). Обе группы занимаются анализом данных с крупных международных экспериментов, таких как Telescope Array, Tunka-rex и HESS, с использованием современных компьютерных методов, включая машинное обучение.
Иллюстрация из сборника "Физики шутят"Лев Шагалов курирует широкий спектр задач от крупной коммерческой компании Таврида Электрик одного из наших основных партнеров. Среди этих задач есть как разработка высоконагруженных распределенных систем последнего поколения для управления электросетями, так и разработка и внедрение "умных" алгоритмов в энергетической отрасли.
Константин Герценбергер является главой группы программного обеспечения в эксперименте BM@N на коллайдере NICA и занимается разработкой и поддержкой всех программных систем эксперимента. Петр Климай в рамках этой же коллаборации занимается системами хранения, индексации и визуализации больших объемов данных.
Игорь Хохряков входит в коллаборацию TANGO-controls и вместе со мной занимается разработкой распределенных гетерогенных систем сбора данных нового поколения и системами визуализации для них (кому интересно, пойдите посмотрите тут и тут.
Ильмир Усманов из JetBrains (отделение в Мюнхене) входит в команду Kotlin language research и занимается проектированием и оптимизацией элементов компилятора Kotlin, нужных в том числе для высокопроизводительных вычислений.
Roland Grinis в плотном сотрудничестве с лабораториями JetBrains Research и Kotlin scientific community занимается разработкой и интеграцией инструментов для высокопроизводительных тензорных вычислений и их использованием для реализации прикладного моделирования.
Разумеется, тут описано далеко не все, чем планируется заниматься в рамках магистратуры. В одной только нашей лаборатории еще много работы по визуализации данных, распределенным вычислениям и куче всего.
Демонстрация библиотеки VisionForge. Визуализация трэков мюонов в подземном эксперименте Muon MonitorСписок руководителей постоянно обновляется. Кроме того, если у вас есть задача по научному программированию, под которую у нас не нашлось руководителя, то пишите нам, мы поищем. Ну и разумеется, можно приходить со своим руководителем.
Для того, чтобы примерно понять, о каких задачах идет речь, можно заглянуть сюда и посмотреть тестовые/стартовые задачи, оставленные нашими руководителями с пометкой "Магистратура".
Для начала надо заполнить анкету. В ней укажите свою контактную информацию и тех руководителей, с которыми вы хотели бы работать. Подача анкеты ни к чему вас не обязывает. Вы можете зарегистрироваться, пройти собеседование с руководителем и решить, что вам хочется чего-то другого.
Более подробная и актуальная информация есть на сайте.
Задать вопросы и обсудить разные аспекты научного программирования можно в телеграм-группе нашей лаборатории
Меня зовут Александр Садовников, я выпускник корпоративной магистерской программы ИТМО и JetBrains Разработка программного обеспечения и по совместительству старший разработчик биоинформатического ПО в департаменте вычислительной биологии компании BIOCAD.
В этом посте я в доступной форме и без чрезмерного жонглирования нудными биоинформатическими терминами опишу один из ключевых этапов создания лекарственного средства этап предсказания места взаимодействия лекарства с целевой молекулой в организме человека. Данная тема выбрана мной не случайно: в рамках своей дипломной работы я занимался именно этой проблемой.
Понять, как взаимодействуют две молекулы, можно, если предсказать структуру комплекса, который они формируют в природе. Предсказание структуры молекулярного комплекса по-научному называется задачей докинга. Частого использования этого термина я, к сожалению, избежать не смогу. Главная новость заключается в том, что задачу докинга человечество уже умеет с переменным успехом решать с помощью компьютерного моделирования. Это стало возможным, в частности, за счёт использования довольно известных за пределами биоинформатики алгоритмов и математических подходов. На их примере я покажу, как очень частные знания, которые мы получаем на протяжении многих лет учёбы в школе и вузе, оказываются полезными на практике, причём зачастую не самым очевидным образом.
Хочется верить, что данный материал будет интересен и полезен любому читателю, однако, чтобы понять всю техническую сторону вопроса, потребуются некоторые знания в области математики и алгоритмов.
В современной фармацевтической промышленности всё большую популярность набирают лекарственные средства, основанные на взаимодействии антител с другими молекулами. Вообще антитела представляют собой молекулы иммунной системы, но люди научились создавать их и в лабораторных условиях, причём созданные искусственным образом антитела могут выполнять абсолютно разные терапевтические функции. Например, мы можем создать антитело, которое свяжется с раковой клеткой и привлечёт другие молекулы иммунной системы для её уничтожения. Или мы можем создать антитело, которое соединит друг с другом два белка, отсутствие взаимодействия между которыми вызывает несвёртываемость крови у больных гемофилией. В общем, антителам можно найти массу применений!
Структура антитела
Антитело состоит из нескольких частей. Наиболее значимыми частями в контексте способности антитела взаимодействовать с другими молекулами являются его петли (на рисунке петли помечены как L1, L2, L3 и H1, H2, H3). Название этих частей антитела обусловлено их формой: посмотрите на рисунок действительно же петли какие-то! От структуры петель антитела зависит сила его связывания с поверхностью целевой молекулы и геометрические свойства данного взаимодействия. Поэтому при разработке лекарственных средств на основе антител наибольшее внимание уделяется именно петлям.
Пример взаимодействия антитела с мишенью. Зелёным цветом
показана молекула антитела, жёлтым молекула мишени. Красным цветом
обозначены петли антитела.
С терапевтической точки зрения очень важно, как именно антитело взаимодействует с целевой молекулой. Известны случаи, когда от места взаимодействия антитела с молекулой зависел характер побочных явлений, вызываемых лекарственным средством. Согласитесь, что когда у вас есть два лекарства, одно из которых точно безопасно для жизни пациентов, а второе нет, вы будете использовать первое. Зачастую в результате анализа литературы мы имеем представление о том, взаимодействие с какой частью целевой молекулы приведёт к наибольшему терапевтическому эффекту и снижению вероятности возникновения побочных явлений. Поэтому при создании лекарственного средства необходимо убедиться, что оно взаимодействует с целевой молекулой ожидаемым образом.
Тут мы незаметно подходим к уже озвученной выше задаче докинга, заключающейся в предсказании структуры комплекса двух молекул. В нашем случае одной из молекул является лекарство, представляющее собой антитело, а второй молекулой мишень, с которой антитело должно взаимодействовать в организме человека. Предсказав структуру комплекса антитела и целевой молекулы, мы получим представление о том, с какой частью данной молекулы взаимодействует наше лекарство. На основе этой информации можно будет сделать предварительный вывод о его эффективности. Естественно, реальную эффективность препарата можно оценить только по результатам клинических исследований, но процесс это очень дорогой. Поэтому на такие исследования целесообразно выходить с лекарством, в эффективности которого есть некоторая уверенность.
Как уже было отмечено, задачу докинга можно решить с помощью компьютерного моделирования, и существует множество алгоритмов для её решения вычислительными методами. Мы рассмотрим класс алгоритмов докинга, работающих за счёт перебора положений, в которых одна молекула может находиться относительно другой. Данный класс представляет для нас наибольший интерес не только потому, что принцип работы его представителей прост для понимания, но и потому, что лучший на данный момент алгоритм для автоматического докинга, Piper, принадлежит как раз к рассматриваемому классу алгоритмов.
На вход алгоритм докинга принимает трёхмерные структуры молекул. Вообще говоря, в природе две молекулы могут образовывать разные по структурам комплексы. Поэтому в результате своей работы алгоритм должен предсказать множество структур комплексов, которые могут формировать данные молекулы. Структура молекулы или комплекса представляет собой набор атомов, каждому из которых приписана координата, соответствующая положению этого атома в трёхмерном пространстве.
Схема работы алгоритма докинга
Алгоритмы докинга, работающие по принципу перебора положений одной молекулы относительно другой, обычно состоят из трёх последовательных этапов: этапа докинга на сетках, этапа кластеризации и этапа минимизации. Структуры, полученные в результате работы очередного этапа, являются входными данными для следующего этапа. Далее мы рассмотрим каждый из перечисленных этапов подробнее.
Этот этап является основным для алгоритма докинга. В ходе его работы происходит поиск некоторого количества положений молекул относительно друг друга, похожих на природные. В основе данного этапа лежит алгоритм 1992 года за авторством Эфраима Качальского-Кацира (который, помимо того, что был выдающимся учёным, также был четвёртым президентом Израиля).
Положение одной из молекул фиксируется в пространстве. Для второй молекулы с фиксированным шагом перебираются все возможные вращения относительно первой молекулы. Для каждого вращения второй молекулы перебираются все её смещения относительно первой, которая остается неподвижной. В итоге отбирается некоторое количество комплексов, наиболее похожих на природные и состоящих из фиксированной первой молекулы и повёрнутой и смещённой второй.
Если высокоуровнево описать принцип работы алгоритма докинга на сетках, то получается совсем простой код:
complexes = []# перебираем все возможные вращения второй молекулы относительно первойfor rotation in rotations: # перебираем все возможные смещения второй молекулы относительно первой for shift in shifts: # поворачиваем и сдвигаем вторую молекулы # с учётом заданных вращения и смещения moved_mol2 = rotate_and_shift(mol2, rotation, shift) # создаём из молекул комплекс, в котором вторая # молекула повёрнута и сдвинута new_complex = (mol1, moved_mol2) complexes.append(new_complex)# сортируем все полученные комплексы по их правдоподобиюcomplexes.sort(lambda candidate_complex: score_complex(candidate_complex))
Однако тут важны детали. А именно, нас интересует способ оценки правдоподобия молекулярного комплекса, то есть того, насколько вероятно существование этого комплекса в природе. Точное определение правдоподобия даже одного молекулярного комплекса задача достаточно трудоёмкая. Всего у нас получается комплексов, где R число вращений второй молекулы, а S число её смещений. На практике имеет порядок . Определить правдоподобие такого большого числа комплексов за разумное с практической точки зрения время и в условиях ограниченности вычислительных ресурсов просто не представляется возможным.
В 1992 году, когда был изобретён алгоритм докинга на сетках, проблема производительности была ещё более актуальна. Поэтому его авторами был предложен следующий подход.
Основная идея алгоритма заключалась в том, чтобы поместить обе молекулы, структуру комплекса которых мы хотим предсказать, в дискретные трёхмерные сетки. В оригинальной статье предлагалось заполнять ячейки сетки по следующей формуле:
Значение 1 присваивается ячейкам сетки, которые содержат атомы, находящиеся на поверхности молекулы. Значение , которое находится в промежутке от 0 до 1, присваивается ячейкам, которые содержат только атомы молекулы, не имеющие доступа к её поверхности. Значение 0 присваивается всем остальным ячейкам сетки. Пример построения сеток для двух молекул приведён ниже.
Пример построения двумерных корреляционных сеток для двух
молекул
Теперь давайте введём понятие корреляции двух сеток. Фактически, корреляция сеток представляет собой их поэлементное перемножение и последующее суммирование результатов перемножения. Давайте посмотрим, как ведёт себя корреляция двух сеток, построенных по описанной выше формуле. Наибольший вклад в корреляцию даёт перемножение ячеек, значения которых равны 1. Это соответствует ситуации, когда и в первой, и во второй сетках в ячейках находятся атомы, принадлежащие поверхностям молекул. Получается, что чем больше корреляция двух сеток, тем более подходящими друг другу с точки зрения геометрии поверхностей являются молекулы.
Можно предположить, что наиболее правдоподобные молекулярные комплексы имеют высокую геометрическую совместимость. Тогда получается, что мы можем описать правдоподобие комплекса, образуемого двумя молекулами, через корреляцию сеток молекул, входящих в его состав.
Однако в таком виде данная идея не даёт нам прироста производительности: корреляция двух сеток вычисляется за время , где N размер одного измерения сетки, и время работы алгоритма всё ещё будет составлять . Это много. Заметим, что теперь нам не надо искать смещение второй молекулы относительно первой. Смещение молекул мы описываем исключительно в терминах сеток и их корреляции, поэтому достаточно найти смещение сетки второй молекулы относительно сетки первой молекулы. По найденному смещению можно однозначно восстановить сдвиг второй молекулы относительно первой. Теперь можно более точно оценить время работы текущего алгоритма: оно получилось . Но это очень много, учитывая, что приемлемая точность работы алгоритма достигается при N, имеющем порядок .
Тут нам наконец-то приходит на помощь университетская программа курса по алгоритмам. Оттуда мы знаем (или ещё только узнаем), что корреляция двух трёхмерных сеток может быть вычислена за время для всех циклических сдвигов одной сетки относительно другой. Делается это с помощью алгоритма быстрого преобразования Фурье, более известного как FFT. При таком подходе время работы алгоритма докинга на сетках составляет , что является намного более приемлемым результатом, чем время работы первоначального подхода.
Наконец-то мы можем записать финальную эффективную версию алгоритма докинга на сетках:
complexes = []# строим корреляционную сетку для первой молекулыgrid_for_mol1 = build_grid(mol1) # прямое преобразование Фурье для первой молекулыfft_mol1 = fft_3d(grid_for_mol1) # перебираем все возможные вращения второй молекулы относительно первойfor rotation in rotations: # поворачиваем вторую молекулу с учётом заданного вращения rotated_mol2 = rotate(mol2, rotation) # строим корреляционную сетку для повёрнутой второй молекулы grid_for_mol2 = build_grid(rotated_mol2) # прямое преобразование Фурье для второй молекулы fft_mol2 = fft_3d(rotated_mol2) # поэлементно перемножаем преобразованные сетки. После этого # применяем к результату перемножения обратное преобразование # Фурье. И, казалось бы, магическим образом получаем корреляции # для всех циклических сдвигов второй сетки относительно первой correlations = ifft_3d(fft_mol1 * fft_mol2) # создаём из молекул комплексы, в которых вторая # молекула повёрнута и сдвинута rotation_complexes = map(lambda shift_: (mol1, shift(rotated_mol2, shift_))) # для каждого комплекса мы уже посчитали его правдоподобие # с помощью быстрого преобразования Фурье complexes += list(zip(rotation_complexes, correlations)) # сортируем все полученные комплексы по их правдоподобиюcomplexes.sort(lambda (candidate_complex, score): score)
Тут интересно то, что именно в таком виде алгоритм докинга на сетках используется и по сей день. Все улучшения, которые делаются для повышения точности его работы, затрагивают исключительно способы построения корреляционных сеток, а высокоуровневая структура алгоритма остаётся неизменной.
Алгоритм докинга на сетках бесконечно крут своей простотой и красотой, однако в том виде, в котором он описан выше, алгоритм имеет низкую точность. Дело в том, что на практике одной лишь геометрической совместимости поверхностей молекул не достаточно для того, чтобы делать выводы о правдоподобии формируемого ими комплекса.
Исследователи быстро это заметили и предложили способы учёта дополнительной информации при формировании корреляционных сеток молекул. Так, современные алгоритмы докинга на сетках учитывают информацию об энергии вандерваальсовых и электростатических взаимодействий между атомами и, если речь идёт о докинге антител, информацию о том, где у молекулы расположены петли.
Однако лучший на сегодняшний день алгоритм докинга, Piper, пошёл дальше своих аналогов и предложил способ учёта в процессе докинга на сетках информации о статистическом потенциале. Статистический потенциал это набор чисел, который описывает энергии взаимодействия конкретных пар атомов, рассчитанные на основе экспериментальных данных. Энергия молекулярного комплекса в заданном потенциале вычисляется по следующей формуле:
где и множества атомов молекул данного комплекса, а энергия взаимодействия атомов типов и в статистическом потенциале .
Это выражение можно представить в виде корреляции двух сеток, что позволяет повысить точность работы алгоритма докинга на сетках. Я был бы рад поделиться теоретическими выкладками о том, как это сделать, но хочется успеть рассказать вам о более интересных вещах. Просто поверьте (или проверьте), что для понимания этих выкладок не нужно ничего, кроме пары фактов из курса линейной алгебры.
Создание статистических потенциалов с разными свойствами представляет большой простор для исследований. Например, один только Piper использует два разных потенциала: DARS (Decoys as Reference State) и aADARS (asymmetric Antibody DARS). aADARS используется для докинга антител, а DARS для докинга остальных видов молекул.
В рамках своей магистерской работы я занимался созданием нового статистического потенциала, предназначенного именно для докинга антител. Изначально предполагалось просто обновить aADARS, пересчитав его на новых экспериментальных данных. Однако в ходе работы выяснилось, что сам подход к созданию потенциала может быть существенно улучшен за счёт учёта информации про электростатические взаимодействия атомов и петли антител. Это привело к созданию нового статистического потенциала WAASP (Widely Applicable Antibody Statistical Potential). Использование WAASP существенно увеличило точность алгоритма докинга HEDGE, разрабатываемого в департаменте, в котором я работаю:
Сравнение версий алгоритма докинга HEDGE, использующих разные
статистические потенциалы
Что важно, прирост точности является существенным не только относительно версии алгоритма, не использующей статистические потенциалы, но и относительно версий, использующих DARS и aADARS.
Если вам интересно узнать побольше про применение статистических потенциалов в контексте задачи докинга, то на сайте нашей магистратуры есть запись моей защиты (вообще говоря, не только моей). Всего 7 минут, и ваш кругозор расширится необратимым образом!
Напомню, что кластеризация является следующим этапом работы алгоритма докинга после докинга на сетках. Наличие этого этапа обусловлено тем, что точность докинга на сетках, пусть даже использующего все возможные улучшения, всё ещё оставляет желать лучшего. Зачастую необходимо рассмотреть топ-10000 комплексов, полученных в результате работы докинга на сетках, чтобы найти правильный ответ. А просто отдать пользователю все 10000 комплексов как результат работы алгоритма докинга нельзя, потому что без дополнительного анализа никакой содержательной информации из этого объёма данных получить не удастся.
Основной задачей этапа кластеризации является уменьшение количества кандидатов на правильный ответ. В основе данного этапа лежит достаточно сильное, но необходимое предположение: комплексы, похожие на природные, появляются в результатах работы докинга на сетках чаще остальных. Из этого предположения следует, что результаты работы докинга на сетках разбиваются на несколько больших групп и некоторое количество групп поменьше. Каждая большая группа комплексов соответствует результатам, похожим на определённый природный комплекс, который данные молекулы могут формировать. Маленькие группы соответствуют комплексам, которые попали в результаты работы докинга на сетках по причине его низкой точности и никакие природные комплексы не представляют.
Разбиение множества элементов на группы по принципу сходства элементов называется кластеризацией. Каждая полученная группа называется кластером. В нашем случае в качестве разбиваемого на группы множества выступает множество результатов работы алгоритма докинга на сетках. В качестве метрики сходства элементов множества выбирается классическая для задач структурной биоинформатики метрика RMSD (Root-Mean-Square Deviation). RMSD между двумя молекулярными комплексами вычисляется как среднеквадратичное отклонение координат атомов одного комплекса от координат атомов другого.
Определив множество, которое мы хотим разбить на группы, и метрику похожести его элементов, мы можем воспользоваться любым существующим алгоритмом кластеризации, чтобы решить поставленную задачу. Опять же, чему нас учили в вузе: если не знаешь, какой алгоритм кластеризации взять, возьми иерархическую кластеризацию точно не прогадаешь. Действительно, данный алгоритм очень прост для понимания и гибок в плане настройки своих параметров. Правильную комбинацию параметров можно подобрать при условии наличия выборки, на которой можно произвести настройку алгоритма. На практике оказывается, что алгоритм иерархической кластеризации действительно хорошо подходит для разбиения на группы множества молекулярных комплексов.
После кластеризации отбирается порядка 250 кластеров, имеющих наибольший размер. Для каждого полученного таким образом кластера вычисляется центроид представитель кластера, наименее удалённый от остальных его элементов. Таким образом, мы смогли уменьшить количество кандидатов на правильный ответ с 10000 до 250, однако это всё ещё довольно много. Улучшить данный результат нам поможет следующий этап работы алгоритма докинга.
Минимизация структуры молекулярного комплекса
Заключительным этапом работы алгоритма докинга является этап минимизации. Давайте разбираться, почему он так называется и как он работает!
Сначала давайте поймём, что такое энергия комплекса с точки зрения структурной биоинформатики. Возьмём две молекулы, которые формируют данный комплекс, и разведём их на бесконечное расстояние друг от друга. После этого давайте отпустим эти молекулы и понаблюдаем за нашей системой. Если молекулы слиплись в комплекс сами собой, то это значит, что его образование им выгодно. Если молекулы так и остались болтаться, никак друг с другом не взаимодействуя, то можно прицепить их друг к другу, используя внешнее воздействие (например, наши руки, которыми мы уже умудрились раздвинуть молекулы на бесконечное расстояние друг от друга!). Однако это означает, что в природных условиях данные молекулы в комплекс не объединятся.
В итоге энергией комплекса называется количество работы, которую нужно совершить над системой для того, чтобы привести её из состояния, когда две молекулы находятся на бесконечном расстоянии друг от друга, к виду, когда две молекулы сцеплены и формируют данный комплекс. Ситуация, когда две молекулы слипаются в комплекс сами собой, соответствует случаю отрицательного значения энергии: нам не то что не потребовалось двигать молекулы они сами могли бы подвигать что-нибудь, например, маленькую турбину! Ситуация, когда нам всё-таки нужно прикладывать к системе внешние силы, чтобы сцепить молекулы, соответствует случаю положительной энергии.
Отсюда следует вывод, что чем меньше значение энергии комплекса, тем наиболее вероятно его существование в природе: мы так определили энергию. Из этого вывода мы можем почерпнуть две простые, но важные идеи.
Во-первых, если мы сможем уменьшить величину значения энергии какого-то комплекса, то тем самым повысим вероятность его существования в природе. Во-вторых, целесообразно отдавать в качестве результата работы алгоритма докинга комплексы, имеющие наименьшие значения энергии, так как их существование, опять же, наиболее вероятно.
Существуют подходы, позволяющие приближённо оценивать энергии молекулярных комплексов. Одним из таких подходов является использование силовых полей. Фактически, силовое поле есть функция от атомов комплекса, значение которой соответствует энергии данного комплекса, вычисленной с некоторой погрешностью.
У функции энергии есть минимальное значение, которое достигается при определённом расположении атомов комплекса относительно друг друга. Так как энергия комплекса при данном положении атомов является минимальной, то с большой вероятностью структура такого комплекса близка к природной. Таким образом, чтобы приблизить структуру комплекса-кандидата, полученного в результате докинга на сетках и кластеризации, к её природному виду, нам надо найти положение атомов комплекса, при котором энергетическая функция достигает своего минимума.
Процесс поиска минимума функции называется минимизацией. Отсюда и название данного этапа работы докинга!
Минимум функции нас с вами научили искать ещё в школе: ну что там, посчитай производную, найди точки, в которых она обращается в ноль, посмотри на значения функции в окрестностях этих точек победа! В общих чертах идея поиска минимума энергетической функции остаётся такой же. Однако сложностей тут добавляет то, что у нашей функции не одна переменная (как, например, в случае со школьной параболой), а очень много: фактически, каждая координата каждого атома является параметром функции.
Для решения задачи минимизации многопараметрической функции энергии в биоинформатике принято применять градиентные методы. Если совсем просто, то градиент функции многомерный аналог производной. Градиент представляет из себя вектор, направление которого показывает направление наискорейшего роста функции. В точке минимума функции модуль вектора градиента близок к нулю аналогично тому, когда в точке минимума однопараметрической функции её производная равняется нулю.
Однако аналитически найти такой набор параметров функции, при котором её градиент обращается в ноль, невозможно: параметров очень много. Поэтому минимум функции ищется численно. На протяжении некоторого количества итераций параметры функции смещаются в направлении, обратном направлению градиента: градиент показывает, в какую сторону растёт функция, соответственно, убывает она в обратном направлении. В конце концов мы придём к такому набору параметров, при котором функция достигает своего минимума.
Пример ситуации, когда локальный минимум функции энергии не
является глобальным
Нюанс тут заключается в том, что данный минимум является локальным. В некоторой окрестности данной точки действительно нет набора параметров, при котором значение функции было бы меньше. Но это верно лишь для данной окрестности: где-нибудь подальше очень легко может найтись значение функции, которое меньше данного (пример такой ситуации изображён на соответствующем рисунке). И это, несомненно, проблема. Обычно её решают за счёт добавления в процесс минимизации функции некоторой случайности, которая помогает выйти из локального минимума и продолжить поиск минимума глобального.
В итоге в процессе этапа минимизации мы делаем следующее. Для каждого комплекса, полученного в результате кластеризации, мы изменяем положение координат его атомов таким образом, чтобы энергия комплекса достигла своего минимума. После этого мы ранжируем полученных кандидатов по величине значения энергии и отдаём пользователю 30 комплексов, образование которых является наиболее выгодным с энергетической точки зрения.
Всё, процесс работы всего алгоритма докинга завершён!
В этой статье мы с вами разобрали, зачем нужно уметь решать задачу предсказания структуры молекулярного комплекса и как её решают сейчас.
Сама по себе задача докинга очень важна потому, что её точное и быстрое решение обеспечит серьёзное увеличение скорости создания новых лекарственных средств. Существующие подходы к решению задачи на регулярной основе помогают биоинформатикам и структурным биологам создавать инновационные лекарства. Однако текущие алгоритмы докинга всё ещё далеки от идеала, так как требуют большого объёма ручной работы при обработке результатов. Тем не менее это не повод опускать руки: область по-прежнему таит в себе уйму интересных задач и ждёт новых прорывных открытий!
Но даже текущий прогресс в области алгоритмов докинга не был бы возможен, если бы у людей, работающих над решением этой задачи, не было широкого математического (да и жизненного, чего уж там) кругозора. Использование быстрого преобразования Фурье для поиска оптимальных смещений одной сетки относительно другой, кластеризация трёхмерных структур, минимизация функции с помощью градиентных методов все эти идеи достаточно абстрактны. Нужно уверенно владеть соответствующими методиками, чтобы увидеть возможность их использования в практической задаче, а затем корректно (это очень важно!) их применить.
Идеальное высшее образование действительно должно давать студенту и широкий кругозор, и уверенность в полученных знаниях, и умение корректно применять эти знания на практике. Увы, как и любой другой, данный идеал не достижим. Однако это не мешает некоторым образовательным программам к нему стремиться. У нас как раз такая программа. Поэтому если вы хотите стать классным специалистом в области прикладной математики и в будущем заниматься решением сложных, интересных и актуальных задач, то наша программа понятный и серьёзный шаг на пути к достижению этой цели.
Преподавательский состав магистерской программы JetBrains и ИТМО Разработка программного обеспечения на четверть (!) состоит из выпускников этой же программы. Пожалуй, это хороший повод для гордости. Мы решили сделать большое интервью с ребятами. Возможно, их истории помогут кому-то решиться начать преподавательскую карьеру, а кому-то поступить к нам на программу.
В первой части наши выпускники и преподаватели Владислав Танков, Дмитрий Новожилов, Дмитрий Халанский, Алексей Зубаков, Артем Хорошев, Александр Садовников, Владислав Кораблинов и Роман Голышев рассказывают о выборе магистратуры, впечатлениях от обучения и отличиях от других программ.
Почему вы поступили на эту программу? Оправдались ли ожидания?
Влад Т.: Я поступал на программу, ориентируясь на качество обучения в Computer Science центре. Я знал некоторых преподавателей и представлял, что будет, безусловно, сложно, но интересно. Относительно ожиданий думаю, оправдались. Я узнал много нового, попробовал заняться неизвестными ранее вещами, а продукт, который мы сделали на хакатоне в магистратуре, в итоге стал моей основной работой. Тогда мы за два дня написали штуку, вокруг которой в итоге выросла команда из восьми человек, а продуктом воспользовались несколько миллионов человек.
Дима Х.: Во время учебы в бакалавриате я случайно повстречался с преподававшим у параллельных групп бывшим студентом этой магистратуры Игорем Жирковым. Он впечатлил меня казавшимся тогда недоступным уровнем всестороннего понимания программирования. Особенно меня поразило, как он оперировал математическими инструментами. А я, надо признаться, в то время был убежден, что математика это про решение уравнений и неадекватных головоломок в духе правда ли, что 10 в степени 1999, если от него отнять 1999, делится на 9 и совсем меня не касается.
Это меня так впечатлило, что я решил бросить все силы на обретение этой мощи. Самостоятельное чтение книжек давалось с трудом, и я решил, что надо получить полноценное образование, где меня бы научили математически мыслить, желательно с привязкой к программированию. Я спросил у Игоря, где можно найти что-то подобное, и был готов ехать куда угодно. Каково же было мое удивление, когда Игорь сказал, что никуда ехать не надо: в СПбАУ есть такая учебная программа. (Ранее программа реализовывалась в СПбАУ. Прим. ред.)
Я увлекаюсь довольно нишевыми вещами, и в этой магистратуре мне удалось найти для себя много познавательного. Здесь каждый найдет что-то по душе. Любите машинное обучение? Пожалуйста! Хотите просто зарабатывать программированием на Java? Для этого здесь тоже все есть, и в довольно интенсивной форме. Компьютерное зрение? Алгоритмы на графах? Интерфейсы для Android-приложений? Сколько хотите. Почти любые связанные с программированием интересы тут поощряются и, скорее всего, вы найдете себе ментора. А если ваши интересы настолько особенные, что связанных с ними специалистов тут нет есть смысл подумать, а не стать ли первым соответствующим экспертом-преподавателем в этой магистратуре. Некоторые предметы начинали преподаваться именно так.
Дима Н.: Про программу я узнал еще в школе. Я получил внушительный багаж знаний по специальности, а также, благодаря практикам и стажировкам, устроился на замечательную работу.
Леша: Я хотел закрыть пробелы в знаниях и укрепить базу, которую дали в бакалавриате. Искал какое-то хорошее место в области программирования, на тот момент это была чуть ли не единственная адекватная магистратура в Питере. Ожидания полностью оправдались. Я до сих пор иногда переслушиваю некоторые курсы и даже посещаю семинары.
Артем: В бакалавриате я учился на физическом факультете СПбГУ, но со 2-3 курса увлекся программированием. Ближе к выпуску я успел освоить основы разработки на C++ и поработать в одной компании, но у меня было чувство, что я многого не знаю в отличие от ребят, которые учились на программистских специальностях. Пришло время задуматься о магистратуре. Внимательно изучив сайт программы и поинтересовавшись у знакомых, я понял, что это именно то место, где могут дать всю необходимую базу в короткий срок. Я пришел сюда за знаниями и опытом и могу с уверенностью сказать, что получил и то и другое в полном объеме.
Влад К.: Я заканчивал 4-й курс в своем любимом УдГУ и раздумывал, чем заниматься дальше. Друг собрался поступать в физическую магистратуру СПбАУ и позвал меня туда же на информатику. Я справедливо возразил, что это невозможно, потому что туда поступают только минимум желтенькие на Codeforces. Он не менее справедливо возразил, что ну и пофиг. Я подумал месяцок и решил отправить заявку. Съездил на собеседование, и меня взяли.
Моим главным стремлением было добавить к теоретическим знаниям практические навыки. Мне это удалось, однако не совсем так, как я ожидал: чаще приходилось учиться чему-то самостоятельно, но у меня появилось понимание, как именно это делать. В итоге, как мне кажется, я все равно отстаю в прикладном плане от многих моих одногруппников. Так я понял, что мне гораздо более интересны теоретические аспекты и что суровая разработка это не мое.
Какие впечатления у вас остались от обучения на программе? Стоит ли что-то в ней изменить?
Влад Т.: С одной стороны, было довольно сложно, особенно первый и второй семестр. С другой стороны крайне увлекательно. Я нашел новых друзей настоящих единомышленников, увлеченных своим делом, познакомился с новыми областями и просто попробовал что-то новое.
Артем: Только положительные впечатления, особенно запомнился первый семестр. Дело ведь даже не в том, что у студентов данной программы огромное количество заданий и практики (хотя это немаловажная черта программы), а в том, что они получают постоянный фидбек от преподавателей, могут почти в любой момент получить ответ на любой вопрос. В свое время для меня было шоком, что можно просто взять и написать вопрос по теме (и не только) в чат курса с преподавателем и максимально быстро получить ответ.
Саша: Впечатлений много! Наверное, большинство из них связаны с первым курсом. Было очень сложно. Пятичасовой сон, отмененные поездки за границу с друзьями, отсутствие свободного времени типичные атрибуты жизни студента первого семестра нашей магистратуры! Сейчас, конечно, понимаешь, что это было не зря. Но повторять, если честно, не очень хочется. А вот что хотелось бы повторить это второй семестр. Там ты уже научился балансировать между учебой и личной жизнью. И прямо ощущаешь себя сверхразумом, который успевает получать от жизни все и знания, и эмоции.
Иногда казалось, что учеба настолько сложная, потому что есть какие-то организационные затыки: то преподаватель не выложил/не проверил домашку вовремя, то сообщил о контрольной накануне ее проведения. Такие моменты, естественно, хотелось исправить! Как мне кажется, это одна из главных причин, почему так много ребят с моего курса в итоге вызвались стать преподавателями в нашей магистратуре.
Влад К.: За два года впечатления самые разнообразные, но скажу, что такая же крутая учеба в моей жизни была до этого только в ЛМШ. Здесь невероятная атмосфера и люди, после обычного университета ты просто испытываешь эйфорию: а что, так можно было?!.. Но конечно, ничто не бывает идеальным, и изменить можно много чего как глобально, так и по каждому курсу в отдельности. Но это больше вопрос для обсуждения с кураторами, мне кажется.
Рома: Сложность прохождения программы целиком зависит от подготовленности студента. У меня были проблемы с теорией (алгоритмы, дискретка), но при этом сравнительно большой практический опыт программирования, что сильно упрощало прохождение практических курсов (Bash, Python, C++, Java). Думаю, тем, у кого не было предварительной подготовки ни в теории, ни в практике, программа дается значительно труднее. Кажется, это важно учитывать при составлении заданий, чтобы не создавать порочный круг я не могу даже понять текущее задание (потому что этот материал совершенно новый для меня) <-> я пропущу его и наверстаю потом.
В последнее время я все чаще вспоминаю курс Software Design, на котором нас учили архитектуре, проектированию, шаблонам и так далее. На мой взгляд, этот курс должен занимать чуть более важное место в учебной программе, особенно с точки зрения практики. Студенты должны не только прослушать, какие бывают архитектуры приложений, но и попробовать их использовать, а в идеале ощутить последствия их неправильного использования (например, за счет работы с легаси-кодом). На текущей работе я осознаю, что самый большой пробел в моих навыках именно в проектировании программ. Возможно, я не одинок, и студентам не помешает более интенсивный курс на эту тему.
Что, по-вашему, отличает эту программу от других магистратур? Как вы пытаетесь реализовать эти отличия в преподавании?
Дима Х.: На мой взгляд, самое ценное в этой магистратуре то, что здесь многие преподают в качестве хобби, а сами работают непосредственно с тем, чему учат. Сам я тоже работаю, да и программирую для души, так что рассказываю студентам о том, с чем сталкиваюсь постоянно, и стараюсь регулярно привязывать происходящее на занятиях к тому, что можно ожидать при попытках задействовать эти знания в реальности. В конце концов какие-то теоретические изыски забудутся после экзамена, а вот реальный опыт, если его удастся донести, осядет надолго.
Дима Н.: Я бы отметил углубленное изучение сложных тем, отсутствие воды в материале. В этой магистратуре действительно учат понимать, что за код ты пишешь, как он работает и зачем это нужно. Я и сам стараюсь следовать этим принципам и, например, при рассказе про какую-нибудь возможность языка не просто показываю, как ею пользоваться, но и объясняю, как она работает под капотом, какие ограничения и возможности имеет. Благодаря этому студенты гораздо лучше понимают суть программ и языковых конструкций, а не просто относятся к ним, как к какой-то магии.
Леша: Я думаю, основное отличие в соучастии и компетентности. У нас есть специальные люди кураторы, которые сопровождают студентов в процессе обучения: помогают решать проблемы, готовят к защите диплома, по многу раз выслушивая докладчиков, регулярно встречаются со студентами (сейчас через Zoom), чтобы собрать обратную связь, и делают еще много всего, что сильно упрощает жизнь студентам и преподавателям все могут сосредоточиться на процессе обучения и не думать о лишнем.
Саша: Нашу программу отличает системность. Ты знаешь, что каждую неделю почти по каждому предмету у тебя будет домашка. Ее надо сделать вовремя, чтобы преподаватель проверил все к следующей паре. Не сделал домашку вовремя недополучил баллы и знания. И так домашка за домашкой! Такой подход хорош тем, что знания с лекций подкрепляются достаточным количеством практического материала и, соответственно, лучше усваиваются. По себе могу сказать: если не потрогать материал с лекции руками, в голове он не отложится.
Я как преподаватель стараюсь сделать так, чтобы студенты не выбивались из ритма домашка-лекция-домашка и им ничего не мешало эти домашки делать: проверяю работы в срок, объективно их оцениваю и оперативно отвечаю на вопросы студентов по условиям задач.
Влад К.: В нашей магистратуре довольно молодые преподаватели! Учиться здесь очень сложно, поэтому я стараюсь создавать для студентов максимально комфортную обстановку, чтобы они не чувствовали себя беспомощно и не боялись активно участвовать в процессе. Я довольно много общаюсь с ребятами, пытаюсь им помогать и направлять в нужную сторону, когда им это необходимо. Ну и сам стиль общения у нас довольно неформальный, что тоже должно помогать. Правда, до обмена мемами конкретно с этими ребятами еще не дошло.
Одним из существенных отличий в нашей учебе мне видится стремление преподавателей действительно научить студентов своему предмету (абсурдно, конечно, что мало где так). Наверное, ребята меня недолюбливают за то, что я часто придираюсь к их решениям и прошу многие моменты подробно прописывать. Но эти придирки служат вполне конкретной цели. Так, в курсе дискретной математики мне важно, чтобы студенты научились грамотно использовать логические рассуждения, не принимали на веру кажущиеся очевидными факты, а выводили их из определений/аксиом.
В случае с алгоритмами ситуация даже более жизненная: на работе нам почти всегда приходится трудиться в командах, поэтому при решении задачи необходимо не просто придумать идею, а объяснить ее товарищам и уметь доказать корректность. Если вы не сможете этого сделать, то здоровый скепсис заставит ваших коллег просто отбросить эту идею, даже если она на самом деле золотая. Поэтому я требую доводить решения до состояния, когда мне точно все в нем понятно. Если я его не понимаю даже зная правильное, другой человек тем более ничего не поймет.
Рома: Мне кажется, что в этой программе принципиально другой уровень отношений между студентами и преподавателем. Когда я учился в бакалавриате, многие преподаватели были в каком-то смысле недосягаемы для меня я никогда не рассчитывал оказаться с ними на одном уровне. Между нами были строго деловые учебные отношения: преподавателю нужно закрыть ведомость, студенту нужно закрыть сессию.
В нашей магистратуре эта граница сильно размыта. Большинство преподавателей работают в продакшене, т.е. когда они не учат программировать, они сами программируют. Это значит, что студенты через несколько лет могут оказаться с ними в одной команде. Это, на мой взгляд, сильно повышает ставки с обеих сторон.
Студент понимает, что его учитель не просто теоретик, который за всю жизнь не написал ни строчки кода, а реальный программист, который пишет код каждый день и зарабатывает этим на жизнь. Поэтому такого человека имеет смысл слушать. А преподаватель понимает, что перед ним его потенциальные сокомандники. И если есть место, в котором он может повысить базовую квалификацию программистов-джуниоров, то оно здесь.
Поэтому я старался взаимодействовать со своими студентами так, будто они мои сокомандники. Мы общались на ты, я не пытался выстроить образ непогрешимого авторитета в их глазах, поскольку на работе это скорее будет минусом, чем плюсом. Я просил их не стесняться задавать вопросы, но при этом стараться как можно больше искать самостоятельно ведь именно таких коллег я хотел бы иметь в своей команде.
В общем, тот факт, что однажды твой студент может прийти к тебе на стажировку или на собеседование и потом будет с тобой работать (а может, и руководить тобой), заставляет взглянуть на ситуацию иначе. Вряд ли преподаватель математики в вузе, натягивающий тройку ленивому студенту, переживает, что этот студент через пару лет вернется в университет и начнет плохо учить других студентов. А в нашей магистратуре это вполне реалистичный сценарий. :)