Идеи проектов (версия 2023 года)
Старые идеи проектов живут в этой записи. Я их буду постепенно переносить сюда.
Data-исследования и data-инженерия
-
Как зависит распределение реакций от того какие появились на посте первыми? Смотреть на одних и тех же телеграм-постах в каналах и репостах.
-
Какую долю площади города (по данным Open Street Map) занимают жилые дома, территории заводов, зелёных насаждений. По результатам можно сделать игру-тест: слайдером разделить свой город на доли. И выдавать результат «знаток города NN» для шаринга в соцсетях.
Проектом занимается Стас Выблов.
-
Как устроены поколенческие разрывы по данным переписок / статуса дружбы в соцсетях. Как это работает в разных сообществах. Например, в науке, откуда в какой-то момент вымыло людей среднего возраста и молодёжь осталась с дедами? Верно ли, что активное участие в одном разновозрастном сообществе сильно увеличивает шанс, что человек будет состоять и в других таких же сообществах?
Мы тут с товарищем обсуждали поколенческий разрыв.
Он рассказал, что у них в лаборатории разрыв коммуникации почему-то между людьми возраста 30 с небольшим и поколением на пять лет старше. А разрыва с поколением студентов (т.е. 20-летних) не возникает. И предположил, что это потому что вокруг нынешних 35–40-летних в момент их становления учёными были только деды, и они сформировали свои коммуникативные навыки об них.
Это, понятное дело, anecdotal evidence. Но интересно, можно ли попытаться эти разрывы найти в переписках. Скажем, если мы приходим на стену какого-нибудь СМИ в соцсети, где незнакомцы комментируют друг друга. Будут ли там общаться 20-летние с 50-летними? Или есть какие-то маркеры возраста, которые делают эту коммуникацию маловероятной? Можем ли мы просто оценить число ответов людей разных возрастных страт на комментарии своей страты и других страт?
-
Есть огромный датасет информации про воевавших во второй и первой мировых войнах, взятый с ОБД Мемориал / Память народа / Памяти героев Великой войны 1914–1918). По результатам можно придумать кучу разных исследований. Вот, например, наше исследование того, как был устроен призыв в Великую Отечественную (и чуть ранее).
С этими датасетами проблема в том, что это очень грязные данные (они дословно внесены с бумажных документов; со всеми опечатками и неточностями). Хотелось бы эти данные обработать, а потом что-нибудь полезное из них извлечь:
- геокодировать записи. Построить карты расположения, например, госпиталей,
- сделать record linkage, т.е. объединить записи про одного и того же человека воедино. Сейчас это крайне трудно, т.к. опечатки, разные написания одних и тех же, например, адресов итд.
- есть ещё миллион задач по скрещиванию этих данных с данными в других биографических БД (типа базы репрессированных Международного Мемориала).
-
Спектакли по одному и тому же произведению часто появляются волнами: пусто-пусто-пусто, а потом сразу пять театров ставят одну и ту же пьесу. Хотелось бы понять, реален ли эффект или это иллюзия? С чем он связан: с авторскими правами, памятными датами или с тем, что режиссёры друг у друга подсматривают сюжеты? Ожидается много парсинга сайтов театров и копания в данных. Дата-журналистика, в общем.
Разработка учебных тренажёров
-
Разработка интерактивного учебника по статистике. Задача учебника — научить людей основным понятиям из статистики через программирование. Соответственно нужно что-то типа юпитер-тетрадки с шаблонами кода, с визуализаторами, которые помогают продемонстрировать работу кода. Генераторы распределений, описательные статистики, статистические критерии, марковские процессы итд.
-
Математическая IDE. Хотелось бы сделать MVP и потестировать на школьниках.
Я отмечаю, что у школьников в среднем всё куда проще с изучением программирования, чем с изучением математики. Моя гипотеза в том, что в программировании есть хорошие инструменты, которые помогают писать код, даже когда ты ничего не знаешь про язык программирования. IDE просто не даст тебе сделать некорректные действия. И заодно даёт мгновенную обратную связь. А после того как ты поработаешь с IDE, у тебя уже появляется встроенное чутьё.
Моя мысль в том, что было бы здорово иметь математичeскую IDE, которая будет помогать преобразовывать математические выражения. Не сама решать, а именно подсказывать допустимые действия и не показывать недопустимые. И демонстрировать строка за строкой цепочку преобразований, как в тетрадке. Ну и разумеется в зависимости от уровня школьника/студента подсказывать более сложные действия.
Скажем 5-класснику она не показывает операцию сложения дробей, пока они не приведены к общему множителю. А студента-инженера уже не мучает подробностями такого рода.
Исследования в области ML/DL
Disclaimer: Хотя я изучал машинное обучение и обучение глубоких нейросетей, я не являюсь действующим исследователем или практиком в области, поэтому не знаю текущее положение дел науки. Я всего лишь формулировал те вопросы, которые мне самому интересны. По некоторым темам я постарался сделать небольшой обзор литературы, но легко может оказаться, что я пропустил статью, которая уже отвечает на заданные мной вопросы.
-
(задача уже выполняется одним школьником, но верю, что тут есть место для ещё одного человека) При оптимизации функции потерь методом стохастического градиентного спуска мы на каждом шаге строим оценку градиента функции потерь по одному батчу, делаем шаг и считаем градиент из новой точки по новому батчу.
Каждый батч, фактически, задаёт новую функцию — частичную функцию потерь, которая является грубым приближением исходной функции потерь. И то, что у нас есть разные приближения, позволяет нам выбираться из локальных минимумов. А кроме того, аппроксимацию просто гораздо быстрее считать.
Сейчас этот процесс параллелится по примерам внутри одного батча. Хотелось бы научиться параллелить его ещё и по разным батчам. Но в исходной постановке это невозможно, потому пока мы не вычислили первый градиент, мы не знаем, градиент в какой точке мы будем считать для второго батча.
Однако нам ничто не мешает посчитать градиенты по нескольким частичным функциям потерь в одной и той же — начальной — точке. И посмотреть, как мы можем агрегировать эти градиенты. Например, чтобы сделать более длинный шаг. Можно, например, сделать отдельную маленькую нейросеточку, которая по трём градиентам в исходной точке предсказывает, где окажется модель через 3 шага. Ну а дальше надо смотреть, сколько разных градиентов имеет смысл агрегировать, а сколько уже бесполезно.
Дальше можно придумать, как агрегировать градиенты по отдельным примерам внутри одного батча. Например, не просто суммировать их, а делать суммы по нескольким случайным подмножествам примеров, и агрегировать их нашей процедурой.
-
Мне интересно, как устроено пространство параметров нейросети. Какие в нём есть симметрии/инварианты etc.
Я знаю, что некоторые люди изучают это методами линейной алгебры и выпуклого анализа. Например, смотрят на ландшафты функции потерь при оверпараметризации итд. В том числе что-то есть в курсе теории дип-лёнинга, TDL (часть 1, часть 2). Я сам, увы, смотрел только пару лекций из него.
Наверняка, этим занимаются и люди из Topological Data Analysis — науки про то, как с топологической точки зрения устроены многобразия, получаемые из данных.
Мне представляется, что можно глянуть на это в разрезе задачи о стабильности нейросетей при внесении туда потери информации.
Между слоями нейросети иногда добавляют Dropout-слой. Его задача — регуляризация весов. Для этого он зануляет выходы случайных нейронов, чтобы при обучении нейросеть не придавала слишком большое значение отдельным нейронам, а вместо этого «размазывала» содержательную информацию по нескольким нейронам ровным слоем.
Интересна динамика этого процесса. Не на уровне итогового качества предсказания нейросети: это как раз хорошо изучено, а на уровне поведения отдельных нейронов и групп нейронов. Например, есть ли какие-то симметрии/инварианты в пространстве параметров, которые появляются в ходе такого дропаута (и которые были «спонтанно нарушены» при обучении без дропаута); как их находить, как их сохранять/устранять.
Вот, например, такая пара исследовательских проектов:
-
Как ведёт себя обученная нейросеть, если добавить ей дропаут-слой и постепенно повышать dropout rate, начиная с очень низких значений? Можем ли мы следить за перетеканием весов? За изменением значимости нейронов? Как будет выглядеть «насыщение» доли выкинутых нейронов? Вопрос о том, выгоднее ли сразу учить с дропаутом или включать его на уже обученной сети, вроде решён в “Curriculum Dropout”. См. также “Adaptive dropout for training deep neural networks”.
Известно также, что можно использовать dropout и pruning для дистилляции нейросети. Это статьи “Self-Knowledge Distillation via Dropout” и “Dropout distillation”
-
В рекуррентных сетях целью LSTM/GRU-ячеек является длительное сохранение важных аспектов состояния. RNN-ки обычно делают без дропаута, потому что если на каждой итерации терять информацию, то легко растерять всё (не уверен, но возможно это дополнительно усложняет вычисление градиентов).
Тем не менее есть подходы, как применять дропаут в RNN-ках, см. обзор.
Мне же интересно, как будет распределять информацию сетка, чтобы избежать потери информации? Возможно ли это вообще с LSTM-ячейкой? с GRU-ячейкой? Можно взять простую задачу — типа вспомнить токен, который был N шагов назад. И посмотреть, как влияет дропаут на архитектуру сети.
-
-
Эта задача у меня пока формулируется на уровне «размахивания руками». Мне нужно её додумать, чтобы выдать в качестве реального проекта.
Сейчас довольно активно скрещивают графы знаний и графовые нейросети.
Условно, у нас есть граф, где каждая вершина — это понятие, а ребро — тип связи. «Москва» → «столица» → «Россия»; «Москва» → «год основания» → 1147; «Москва» → «instance of» → «город»; «Россия» → «instance of» → «страна». Например, есть огромный свободно доступный граф знаний Wikidata.
Теперь скажем, что каждая вершина (и, вероятно, каждое ребро) представлено некоторым эмбеддингом (векторным представлением). И теперь мы можем на графе строить короткие цепочки (трактуем их как что-то вроде предложений, где вершины и рёбра — это слова). И как в алгоритме word2vec, мы теперь можем скрывать отдельные токены и пытаться восстановить, что же было скрыто. Это позволяет нам учить наши эмбеддинги. А также предсказывать новые вершины и связи. Теперь мы можем в нашем графе спрашивать, а не надо ли поставить ребро между вершинами A и B, и ребро какого типа. То есть фактически можем автоматически пополнять наш граф знаний.
А теперь к задаче, которой бы мне хотелось заняться. В текстовых методах у нас есть эмбеддинги целых предложений. Например, в seq2seq методах мы можем прочитать предложение слово за словом, закодировать его целиком в один вектор, а потом также слово за словом декодировать. Например, в текст на другом языке. Или в картинку. Или во что-то ещё.
Теперь представьте, что я написал вопрос на естественном языке и закодировал его в вектор. Могу ли я теперь декодировать этот запрос в путь по графу. «В каком городе похоронен Пушкин?» → «Начни с вершины «Пушкин», пройди в обратную сторону по ребру «известные люди»; если таких рёбер несколько, выбери направление наиболее сонаправленное с «кладбище»/«похоронен» → пройди по ребру «населённый пункт»». И ответ: «Пушинские горы».
Сходные маршруты по графам хотелось бы иметь для всевозможных алгоритмических применений. Тебя просят найти вершину графа, и дают путь с опечатками. Например, просят найти слово в суффиксном дереве, но в нём есть опечатки.
Прикладное машинное обучение итп
-
Слова-паразиты - алгоритм, который по аудиозаписи считает, сколько раз встретилось то или иное слово, не проводя промежуточной конвертации в текст.
Промежуточная задача - алгоритм, который говорит, произнесено ли в двух аудиозаписях одно и то же слово или нет.
Алгоритм может быть полезен для подсчета многомандатных выборов: там затруднительно считать бюллетени складыванием их в стопки, потому что на каждом несколько галок. Зато фамилию напротив каждой галочки озвучивают голосом, притом делает это один и тот же человек, что несколько упрощает задачу.
Эту задачу уже делали на школе Слон, а потом Лиза Панфилова.
-
(Очень масштабная задача. Очень прикольная и с большим потенциалом, в том числе коммерческим. Но лично для меня не настолько интересная, чтобы её курировать. Один школьник ей занимался, но застрял на этапе получения данных). Написать нейросеть, которая в режиме реального времени предсказывает, какой ракурс получит больше лайков - и таким образом помогает делать хорошие фото.
Ключевая подзадача: спарсить огромное количество данных с инстаграма.
-
Мобильное приложение, чтобы сфоткать ключи и подписать фотографии. А потом по новой фотке показывать, за что этот ключ отвечает. См. пост [→].
Эту задачу начали делать Аня и Вадим Огарёвы, но пока она не решена.
-
При помощи нейросети разработать шрифт, в котором цифры (буквы) всё ещё узнаваемы, но при этом максимизировать их различимость, в т.ч. при неаккуратном написании и плохом зрении /закрытости части рисунка.
Разное
-
Генерировать и дешифровывать автостереограммы. То есть по картинке с точками получить карту глубин, которую увидел бы человек, расфокусировав зрение.
Генераторы автостереограмм существуют. А вот расшифровка затруднительна.
В проекте участвовали:
- Мария Ревская. У Маши были промежуточные успехи — на основе вычисления расстояний до ближайшей точки того же цвета. Презентация [→].
- Аня Огарёва. У Ани получилось по сдвигам восстановить картинку. Но пока не карту глубин. Презентация [→]. Отчёт [→].
- Мы также нашли несколько существующих проектов декодирования. Ссылки есть в отчёте Ани Огарёвой.
-
Разработка шрифтов под разные специфические задачи. См. подробности [→] в tg-канале.
- шрифт, который делает видимыми отличия между большими и маленькими русскими буквами, латинскими буквами и цифрами (русские и английские a,c,o,e; группа ‘o’ ’O’,‘О’, ‘0’; группа ‘1’, ‘I’, ‘l’,итд). Шрифт должен быть таким, чтобы напечатанный им пароль от WI-FI легко и однозначно читался
- шрифт, который хорошо виден издалека. Как напечатать буквы ‘A‘ и ‘Л’, или ‘Б‘, ‘В’ и ‘Е’, чтобы вывеска магазина «ХЛЕБ» со 100 метров читалась человеком с плохим зрением не как «ХЛЕВ», а остановка «КЛИН» не как «КАИН».
- шрифт, у которого буквы похожи на свои отражения. Чтобы, когда он напечатан на прозрачной двери, его легче было читать с изнанки (да, пусть даже справа-налево)
Биоинформатика
-
(этот проект я сейчас реанимировал сам)
Взаимодействие мутационных подписей с регуляторными мотивами aka «хрупкость мотивов» (см. драфтли драфты статьи в репозитории).
Один из проектов, которыми я начинал заниматься, про онкологию. У меня есть написанная математическая часть и программа, её реализующая. Но там основная работа начнётся уже после написания программы — когда будет этап анализа данных. И он только-только начат. Да и в математике там есть на что посмотреть: я разбирал прямой процесс, но не обратный.
Идея в следующем. Разные типы онкологических процессов вносят мутации в разных контекстах (какие-то меняют цитозин на тимин, какие-то работают только внутри CG-богатых областей итд). Это называется мутационными подписями. Фактически это частоты замен нуклеотида в тринуклеотидном контексте типа ACG → ATG (всего таких частот 96).
В то же время в геноме встречаются мотивы — часто встречающиеся паттерны. Например, мотивы сайтов связывания транскрипционных факторов (белки регулирующие транскрипцию). Если последовательность ДНК выглядит похоже на мотив, то с ней может связаться определённый белок.
Некоторые мутационные подписи склонны поражать мотив ТФ, а другие нет — потому что в мотиве не встречается нужный контекст. Из этого мы можем сделать выводы про то, какие регуляторные механизмы могут нарушаться при определённом мутационном процессе. Было бы любопытно посмотреть, какие механизмы реально поражены, поисследовать давление отбора на такие мутации, попробовать докопаться до механизмов, которые поражаются разными типами мутационных процессов и сравнить это с данными, которые получены другими способами.
Кроме того, есть вопрос про то, как эволюционная (germline) мутационная подпись влияет на ансамбль мотивов. Например, изучить, правда ли, что in vitro мотивы преваращаются подобным мутационным процессом в in vivo мотивы.
-
Длинные мутационные подписи.
Есть ещё одна история, связанная с длинными мутационными подписями. Я её буквально пару вечеров поковырял лет этак 8 назад, а потом забросил. Но предварительные результаты были довольно интересными. Вот те мутационные подписи, про которые я говорил в прошлом пункте, они трёхнуклеотидные. А если взять контекст подлиннее? 5 букв, 7 букв. Оказывается, что буквы за пределами двух соседних тоже важны.
Было бы хорошо выявить реестр таких длинных подписей (дело в том, что каждая опухоль — это комбинация нескольких процессов, поэтому нельзя просто взять одну опухоль и посчитать частоты контекстов вокруг случившихся мутаций, надо ещё разложить это на независимые компоненты, в разных соотношениях случающиеся в разных опухолях).
Следующий (или параллельный) шаг такой: посмотреть на эти подписи и сравнить их с известными мотивами. Возможно так получится узнать ранее неизвестные механизмы возникновения мутаций.
-
PASIO — наша софтина по сегментации генома и denoising-у шумных данных. В геноме случается некоторая последовательность случайных событий. Мы считаем, что они подчинены пуассоновскому процессу с разной интенсивностью на разных участках генома. Пример таких событий — внесение мутаций. Или внесение в геном разрезов при действии ДНКазы.
Мы видим отдельные события, но на самом деле хотим оценить подверженность разных участков этим процессам. У нас (Сева Макеев, Андрей Ландо и я) есть алгоритм динамического программирования, который строит оптимальную сегментацию, максимизирующую правдоподобие событий (при том, что создание большого количества сегментов штрафуется).
Андрей написал программу на Python + NumPy. Алгоритм реально вычислительно тяжёлый на наших объёмах. Андрей написал очень приличный код. Но даже он на одной хромосоме он работал около 10 часов. Я несколько оптимизировал его и свёл вычисления к 40 минутам. Эта версия у нас отлажена и собрана в пакет.
Кроме того, я переписал кусочки кода на Сython, и 40 минут превратились в 10 минут. Но этот код не доведён до релиза.
- Итак, первая кодерская задача — сделать из Cython-версии пакет, пригодный для установки через pip.
- Вторая программистская задача — переписать это так, чтобы вычисления параллелились.
- Третья задача. Содержательная. Наша софтина имеет некоторую математическую основу, которая не слишком хорошо соответствует биологической реальности. Надо понять, насколько хорошо/плохо наша аппроксимация работает, подобрать параметры модели, при которых она лучше всего работает, определиться с задачами, для которых применение софтины оправдано.
- Четвёртая задача — инфраструктурная. Деноизинг данных сглаживает шумный профиль, за счёт чего его можно сжать в очень компактное представление. Это может быть использовано для того, чтобы обработать большие наборы тяжеленных данных и сделать из них сравнительно компактную базу данных, которую могли бы использовать простые смертные.
- Пятая задача — содержательная. У нас не один образец, а сотни. Можем ли мы придумать сегментацию, которая будет переносима между образцами. Ну и дальше изучать характеристики регионов. Смотреть, чем образцы друг от друга отличаются итд.
-
Предсказание ткане-специфичной экспрессии генов путём агрегации данных о связывании ТФ и экспрессии этих ТФ.
Существуют большие модели, которые агрегируют кучу параметров для предсказания того, как будут экспрессироваться разные гены в зависимости от разных параметров.
Мы в своё время тоже пытались такое сделать, и скидывали все параметры в одну кучу.
Хотелось бы сделать скорее что-то типа нейросети, которая получает не свалку из десяти тыщ параметров, а 1000 пачек по 10 параметров (экспрессия, связывание итп для каждого из примерно 1000 факторов) и выявить общие правила, которые будут работать на каждой такой пачке. Потому что реальная мощь нейросетей (например, CNN-ок) в том, что они вычленяют общую структуру в наборе параметров, а не просто смешивают всё со всем.
Математика
- Изучить возможность корректно определить фрактальную размерность расходящихся рядов. Подробности смотреть здесь.