Примерял я идеи позиционного кодирования выше к своему SoftOrdering, не годятся они по принципу действия. Придумал другое.
Вместо SoftOrdering берём SOHE - на выходе получаем линейный тензор размера

, содержащий "мягкую гистограмму" одного токена или, иначе говоря, Soft One-Hot Encoding (для сравнения, SoftOrdering - это гистограмма многих токенов, усреднённая).
Также оговорюсь: Я ранее называл токены точками, так как напяливал слой на решение задач типа Point cloud.Далее, для реализации позиционного кодирования берём абсолютную позицию токена, прогоняем через полносвязный слой с сигмоидой и получаем единичный тензор (число от 0 до 1). К этим данным также применяем SOHE. Так как тензор был единичный, то на выходе получаем тензор длиной n_bins (n_bins - гиперпараметр). Далее делаем расширение тензора до фильтрационной матрицы

(n_bins x N). Допустим был тензор [0.07, 0.99, 0.05, 0.00], получаем матрицу
[[0.07, 0.07, 0.07, ..., 0.07],
[0.99, 0.99, 0.99, ..., 0.99],
[0.05, 0.05, 0.05, ..., 0.05],
[0.00, 0.00, 0.00, ..., 0.00]]
Расширяем также тензор данных на выходе SOHE до матрицы

размером (n_bins x N).
Умножаем почленно две матрицы и получаем следующий эффект: нейросеть получает для каждого токена запись в определённой части матрицы

, которую она выбирает сама. Мы просто суммируем записи и усредняем. В начале обучения записи в матрице хаотичные, в конце обучения они должны получиться более строгие. В общем, это записная книжка, которую нейросеть может непрерывно улучшать в процессе обучения на всяких данных.
(Почти то же самое представляет собой модуль трансформера, только там не матрица с индексным доступом к строкам, а словарь. Можно рассматривать словарь как матрицу с ключевым доступом к элементам. Ключ у словаря - это тензор, а не число как индекс у матрицы/тензора. Это такая натянутая попытка сравнения, конечно...)
Пока только учитывается абсолютная позиция.