Оно же реализуется как небольшая
свертка и потом глобальный пулинг.
Отобразить всё от от
до
в единицу, остальное в ноль можно вроде бы тремя-четырьмя слоями ReLU. Применяем поэлементно, а потом global sum pooling.
Свертка - понятно, пулинг - понятен. А что значит "отобразить в ноль/единицу"?
-- 18.09.2024, 21:48 --P.S. Продолжаю крутить гиперпараметры. Я сделал толстый слой RecurrentSoftOrdering. На выходе дохленький полносвязный слой. Но главное - в основе RSO использую BinarySoftOrdering, который отличается от обычного SoftOrdering тем, что количество бинов равно 1. Такой слой выродился в банальный сигмоидальный слой nn.Sigmoid(). Сигмоида работает как операция сравнения: если вход больше нуля, то такие данные "попадают в бин" и суммируются (счетчик приращивается); если вход меньше нуля, то попадание мимо бина - данные не суммируются - это тоже информативно.
На входе RSO (внутри RSO) также имеется однослойная полносвязная сеть, которая пространство входных данных + текущий стейт преобразует в необходимой толщины поток данных для построения гистограмм. Гистограммы стали сильно упрощенные (BSO), поэтому их надо побольше параллельных. Входной полносвязный слой обеспечивает разнообразие гистограмм, иначе вся нейросеть не смогла бы освоить сложность входных данных.
В общем такая структура пошла лучше и достигла все-таки пика ROC-AUC 0,88 за ~11,5 мин, выше не набирается, переобучение наступает. В общем у LSTM и у моей архитектуры близкие способности и временные затраты.
P.P.S. Кстати, данная задачка решается разными способами, достигаются результаты ROC-AUC 0,93+ и вплоть до 0,99+, но с помощью GPU и временными затратами 5, 8 и более часов, с помощью чистки-преобразования данных методами EDA.
Я же кормлю данные практически без адаптации, только сделал случайное перемешивание. Четырехлетний ноутбук с двухядерным CPU.
В общем задачка интересная в том смысле, что можно упереться по времени и попытаться улучшить пиковый ROC-AUC.