Я как-то ещё до разборки с трансформерами пришёл к идее наивного позиционного кодирования, которое можно назвать линейным:
Тут я не придумал ничего лучше как сделать unbinding - оторвать данные от индексов массива. Для этого нужно пиксели хранить не в виде вектора

длиной 784 элемента, а иметь данные в виде массива
![$[(x_1, y_1, value_1), (x_2, y_2, value_2), ...]$ $[(x_1, y_1, value_1), (x_2, y_2, value_2), ...]$](https://dxdy-02.korotkov.co.uk/f/9/6/7/967673fc682975fad71838a335c8927282.png)
.
На это мне ответили:
Всё уже украдено до Вас, называется positional encoding.
Собственно интерполяцию оно даст автоматически (только не по соседним пикселям, а по всем, но с убывающими весами).
Я стал изучать Sinusoidal Positional Encoding (SPE) - это первый исторический из методов позиционного кодирования для трансформеров. В принципе, нетрудно понять и один из самых актуальных методов - Rotary Positional Embeddings (RoPE). Оба этих метода работают с абсолютным и относительным позиционированием одновременно.
Я пока пытаюсь усовершенствовать свой наивный способ, у него недостатки:
1. Только абсолютные позиции
2. Слабая выразительность позиции. (Равные и близкие позиции почти неотличимы, когда их нужно отличать. И, наоборот, равные и близкие позиции отличимы, когда между ними по сути нет разницы.)
Со вторым недостатком я разобрался. Вместо линейного кодирования применяем слегка модифицированный onehot-encoding. Вместо двух координат

позиции пикселя заводим 54 признака позиции -

.
Гениальное просто!
Но как закодировать относительную позицию?.. Особенно, если твой код не рассматривает пиксели попарно (как это делается с токенами в трансформерах).