Как я пришел к SoftOrdering? Я вообще изначально думал как реализовать механизм активного внимания. Типа зрачок глаза пробегается по изображению и, игнорируя подавляющее и бесполезное количество пикселей, определяет, что изображено. Работа глазодвигательной мышцы зрачка - это по сути выбор координаты
пикселя для анализа.
Но как существующие базовые структуры работают с графическими данными? Если тебя интересует пиксель с координатами
, то запроси значение вектора
. А для пикселя
запроси значение вектора
. Никакой логики и понимания.
Тут я не придумал ничего лучше как сделать
unbinding - оторвать данные от индексов массива. Для этого нужно пиксели хранить не в виде вектора
длиной 784 элемента, а иметь данные в виде массива
. При чем данные должны быть неупорядоченные, ведь наш глаз будет двигаться по пикселям в произвольном порядке.
Операция unbinding абсолютно не теряет информацию об исходном векторе
, это, я считаю, важно.
Такие данные называются облаком точек (point cloud) и особо хороших алгоритмов для работы с ними нет, известны лучшие алгоритмы в этом классе PointNet и PointNet++. Я изобрел SoftOrdering, но в результате анализа работы по PointNet я понял, что у меня абсолютно такая же структура, только вместо MaxPool у меня Histogram. Histogram заведомо выигрышнее, так как имеет гиперпараметр, который регулирует сжатие данных от 0 до 100%.
Что я думаю? Нагенерировать случайным образом наборы координат точек фиксированной длины. Координаты генерируются вещественные, но наш массив понимает только целые значения координат от 0 до 27. Чтобы решить эту проблему, мне пришла в голову применить билинейное преобразование. То есть пиксель с вещественными координатами находится между четырьмя окружающими целочисленными пикселями, он получает усреднённое значение
по правилу билинейного преобразования. Билинейное преобразование легко дифференцируемо, и это кажется гениально.
Соответственно входные данные
я хочу обучать, PyTorch такое позволяет.
В итоге можно получить обученные последовательности координат пикселей, оптимальные для анализа. Ещё тут может быть рекуррентный вариант алгоритма, который посмотрит первую точку, проанализирует её и на основании первых данных запросит вторую точку и т.д. Работы уйма.