Придумал я такой
наивный слой нейросети -
MaxWithPositionalEncodingPooling. Это такой сильно поднавороченный брат старого доброго слоя
MaxPooling. Просто прикрутил к
MaxPooling позиционное кодирование (глобальное и локальное, другими словами, абсолютное и псевдоотносительное).
Сам по себе
MaxWithPositionalEncodingPooling безжизненный, так как не обучается, поэтому я дооборудовал его входным и выходным слоем:
входной обучаемый - произведение Адамара, типа "линейный слой без суммирования" (потом я ещё придумал аналогичное свёрточное произведение),
выходной обучаемый - обычный линейный слой с функцией активации или аналогичный.
Итог разработки:
GatedMaxPEPool1D
ConvMaxPEPool1D
ConvMaxPEPool2D
Цель - [хотя бы частичная] замена рекуррентных алгоритмов RNN/LSTM/GRU. У этих алгоритмов недостаток - невозможность распараллеливания алгоритма.
Я обнаружил, что серия слоёв MaxPEPool может вполне успешно выжимать из последовательностей полезные данные, поэтапно сокращая их размерность. Сравнивал с LSTM.
Были данные - таблица (in_seqlen, in_features), получили новые данные - таблица (out_seqlen, out_features), где out_seqlen < in_seqlen.
В конце жатвы можно просто найти среднее или максимальное значение оставшихся элементов последовательности, и
вроде даже такие итоговые данные успешно поддаются дальнейшему анализу с помощью обычного линейного слоя.
Недостаток нового слоя - он может работать только с фиксированными размерами последовательности. Жнецу нужно что-то жать, иначе возникает неразрешимый вопрос. Мне кажется, над этим можно поработать.
Для работы с последовательностями переменной длины предполагаю использовать устоявшийся уже слой SoftBinning (бывший
SoftOrdering). SoftBinning, как мастер по работе с данными переменной длины, делает окончательное обобщение с фиксацией размера данных. Жнецы сокращают длину последовательности, это решает проблему сильного различия длины входных данных. Это проблема позиционного кодирования в трансформерах - данные более 10000 символов кодировать затруднительно. Я надеюсь, жнецы или их аналог - это решение этой проблемы.
Код:
MaxPEPool1 #Жатва началась
MaxPEPool2
MaxPEPool3
SoftBinning #Главный жнец
Linear #Анализ
Главного жнеца можно заменить на mean() или max(), которые выжимают последовательность до конца, оставляя лишь одного члена последовательности, не изменяя число признаков в отличие от SoftBinning. Вполне рабочий вариант для некоторых задач. Проверил.