На самом деле эту тему я создавал не как очередную флудилку. "Куда шагать в ML" - это про то, как изобретать новые алгоритмы для ML. Итак, время бионического подхода, ИМХО, прошло - нейрон изобрели, нейросеть тоже, бэкпроп к ним разработали.
Я сделал те самые картинки MNIST, чтобы понять, действительно, куда шагать дальше. Применяю умозрительный подход - "а как решал бы я сам?". И тут у меня на сегодняшний день выработался целый пласт направлений:
1. Генерация датасета как основа понимания
2. Типы данных в ML и их поддержка
3. Методы аналитики и их "мягкие" (soft) реализации
4. Анализ внутренней структуры данныхЭти направления не связаны друг с другом почти, просто набор идей.
1. Генерация датасета как основа пониманияОб этом я уже написал
выше. Конечно, в идеале нужно научиться генерировать сэмплы датасета по-настоящему, но годны и синтетические датасеты. Тут можно выделить контрастивное обучение (обучение на основе контрастных примеров).
2. Типы данных в ML и их поддержкаЧто такое вектор/тензор в ML? Это набор чисел double (если не оговаривать, что в библиотеках типа Tensorflow и видеокартах Nvidia числа могут принимать несколько другие интерпретации, специализированные для ML). Это универсальный тип данных, который может переваривать в том числе целые числа, булевый тип. Известны также методы перевода категориальных типов в числовые... Но я не об этом.
Известно при этом, что ML-разработчик же должен вложить в каждый признак объекта
природу данных. Звучит как магия, но я просто предлагаю понимать это как необходимость ввода типов данных в ML. Природа данных = тип данных.
Основное правило типов данных: никогда не подсовывай число одного типа вместо другого. Некоторые начинающие ML-щики думают: "да какая там разница, нейросеть всё пережуёт и выдаст правильный ответ". Нет, это так не работает. Точнее, как-то работает, но плохо.
Стандартные алгоритмы нейросетей являются типозависимыми. Возьмём, например, линейный слой и свёрточный - это два родственника. Свёрточный слой тоже является линейным, только линия немного ломаная.
Так вот, вес каждого синапса линейного/свёрточного слоя лучше обучается на какой-то одной определённой природе данных. В самом общем случае типичный тензор, который подаётся на вход линейного слоя, имеет тип списка (list). Тип списка - это тензор, у которого каждый признак имеет свой индивидуальный тип. Так как линейный слой есть практически в каждой нейросети, то вы вынуждены соблюдать минимальное требование ML-типизации - соблюдать типы данных списка. Иначе нейросеть плохо обучается.
Есть ещё популярный частный случай - тип данных массив (array). Это когда набор признаков имеет одинаковый тип, а каждый признак имеет индекс. Очень распространённое направление - временные (или пространственные) ряды. В этом случае признаки можно подменять. Отсюда родились рекуррентные нейросети и их современные аналоги типа LSTM, GRU, в которых всё также применяются линейные/свёрточные слои, но есть хитрости с перемещением признаков. Перемещение признаков делается путём какого-либо изменения индексов. Кстати говоря, в свёрточном слое тоже производится работа с индексом массива, он не вправе работать со списком.
По ML-типизации выделяю несколько направлений:
2.1. Тип индекса массива, слои для работы с индексами (positional encoding и др.)
2.2. Поддержка массивов переменной длины
2.3. Поддержка смешанных типов (распознавание типа?)
-- 29.11.2025, 08:50 --3. Методы аналитики и их "мягкие" (soft) реализацииПункт 3 немного связан с пунктом 2. Но сейчас речь не про нейросети, а про анализ данных человеком. В процессе своего обучения я заметил, что независимо от природы данных, всегда требуется проделывать вполне определённые действия по анализу. Самое главное - берём признаки, определяем их тип (булевый, целый, вещественный, строковый, дата, время, категориальный и т.д.). По каждому признаку смотрим распределение, выделяем отбросы, определяем минимум, максимум, среднее, медиану, моду. Не говорю про коэффициент Пирсона. Подход ко всем данным одинаков, но в некоторых примерах некоторые действия могут вырождаться и процесс анализа выглядит очень разнообразным.
А чем нейросети хуже? Они тоже должны анализировать методами человека. Но главное отличие - функции этих методов должны быть дифференцируемыми для реализации в бэкпропе.
Я проработал слой SoftOrdering - он как раз из этой темы - он строит мягкое распределение признаков массива (хочу переименовать в SoftBinning). Это только первая моя разработка. Мне кажется, тут непаханное поле. Очень важные аналитические max/min имеют мягкие реализации, argmax/argmin не имеют, интересно туда заглянуть. Выходом argmax/argmin, кстати, является индекс массива.