2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Positional Encoding (PE) в трансформерах и не только
Сообщение25.07.2025, 07:22 
Я как-то ещё до разборки с трансформерами пришёл к идее наивного позиционного кодирования, которое можно назвать линейным:
Mihaylo в сообщении #1655790 писал(а):
Тут я не придумал ничего лучше как сделать unbinding - оторвать данные от индексов массива. Для этого нужно пиксели хранить не в виде вектора $x$ длиной 784 элемента, а иметь данные в виде массива $[(x_1, y_1, value_1), (x_2, y_2, value_2), ...]$.

На это мне ответили:
mihaild в сообщении #1655895 писал(а):
Всё уже украдено до Вас, называется positional encoding.
Собственно интерполяцию оно даст автоматически (только не по соседним пикселям, а по всем, но с убывающими весами).

Я стал изучать Sinusoidal Positional Encoding (SPE) - это первый исторический из методов позиционного кодирования для трансформеров. В принципе, нетрудно понять и один из самых актуальных методов - Rotary Positional Embeddings (RoPE). Оба этих метода работают с абсолютным и относительным позиционированием одновременно.

Я пока пытаюсь усовершенствовать свой наивный способ, у него недостатки:
1. Только абсолютные позиции
2. Слабая выразительность позиции. (Равные и близкие позиции почти неотличимы, когда их нужно отличать. И, наоборот, равные и близкие позиции отличимы, когда между ними по сути нет разницы.)

Со вторым недостатком я разобрался. Вместо линейного кодирования применяем слегка модифицированный onehot-encoding. Вместо двух координат $(x, y)$ позиции пикселя заводим 54 признака позиции - $(x\geqslant 1, x\geqslant 2, x\geqslant 3, ..., x\geqslant 26, y\geqslant 1, y\geqslant 2, y\geqslant 3, ..., y\geqslant 26)$.
Гениальное просто!

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

 
 
 
 Re: Positional Encoding (PE) в трансформерах и не только
Сообщение25.07.2025, 09:11 
Пока у меня такая мысль: берём эмбеддинг - результат обработки пикселя и складываем с абсолютной позицией.
$emb = \frac{emb + \frac{x}{27} + \frac{y}{27}}{3}$

И потом надеемся, что последующая нейроструктура с линейным слоем разложит эту суперпозицию в нужную линейную комбинацию позиций, включая относительную $x_1 - x_2$ и т.д.

Требуется тестирование...

-- 25.07.2025, 09:22 --

Ещё один способ:
$emb = \frac{emb \cdot (1 + \frac{x}{27} + \frac{y}{27})}{3}$
Дело в том, что очень многие члены эмбеддинга равны 0 и некоторые близки к 1. Но не все. Немного такой подход идёт в разрез с линейной алгеброй - нелинейное кодирование позиции. Не знаю. Просто идея.

 
 
 
 Re: Positional Encoding (PE) в трансформерах и не только
Сообщение30.07.2025, 15:50 
Примерял я идеи позиционного кодирования выше к своему SoftOrdering, не годятся они по принципу действия. Придумал другое.

Вместо SoftOrdering берём SOHE - на выходе получаем линейный тензор размера $N$, содержащий "мягкую гистограмму" одного токена или, иначе говоря, Soft One-Hot Encoding (для сравнения, SoftOrdering - это гистограмма многих токенов, усреднённая).
Также оговорюсь: Я ранее называл токены точками, так как напяливал слой на решение задач типа Point cloud.
Далее, для реализации позиционного кодирования берём абсолютную позицию токена, прогоняем через полносвязный слой с сигмоидой и получаем единичный тензор (число от 0 до 1). К этим данным также применяем SOHE. Так как тензор был единичный, то на выходе получаем тензор длиной n_bins (n_bins - гиперпараметр). Далее делаем расширение тензора до фильтрационной матрицы $F$ (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 до матрицы $D$ размером (n_bins x N).
Умножаем почленно две матрицы и получаем следующий эффект: нейросеть получает для каждого токена запись в определённой части матрицы $F \cdot D$, которую она выбирает сама. Мы просто суммируем записи и усредняем. В начале обучения записи в матрице хаотичные, в конце обучения они должны получиться более строгие. В общем, это записная книжка, которую нейросеть может непрерывно улучшать в процессе обучения на всяких данных.

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

Пока только учитывается абсолютная позиция.

 
 
 
 Re: Positional Encoding (PE) в трансформерах и не только
Сообщение26.08.2025, 18:27 
Короче, создал я этот слой PositionalSoftOrdering по образу и подобию. Он работает и довольно шустро, но предел сходимости недостаточно высок. В чём-то модель на базе такого слоя выходит слаба.

Цель - создать нерекуррентный слой для работы с последовательностями и без сложности $O(n^2)$ (как у трансформеров). Трансформеры, по сути, делают полный перебор пар токенов в последовательности, поэтому $O(n^2)$ - от этого никуда не деваться (кажется).

Я ж хочу, чтобы нейросеть пробежалась по последовательности и выбрала токены-якоря. Это те токены, которые задают конструкцию предложения. Например, сказуемое и подлежащее. Отличный пример якорей! В реальности можно сделать так: нейросеть определяет степень "якорности" каждого токена в последовательности в диапазоне от 0.0 до 1.0. "Якорность" - это способность токена (в зависимости от своей позиции?) задавать позицию другим токенам. Может быть есть ещё понятие степени "якоримости" - это когда токен можно опознать по токену-якорю. Что думаете?

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group