2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Слой SoftOrdering
Сообщение10.09.2024, 19:14 
 i  Ende
Выделено из темы «Структура RNN2D»


Короче, я изобрел новую структуру SoftOrdering, которая встает где-то наряду с CNN и LSTM.
1. CNN ограничена размером ядра, SoftOrdering не ограничена совсем (это, конечно, не для всех данных хорошо).
2. LSTM является рекуррентной, а SoftOrdering - нет, но при этом может обрабатывать тензоры переменной длины.

На данный момент я написал на PyTorch слои SoftOrdering (стандартный слой), RaggingSoftOrdering (для работы с тензорами переменной длины), RecurrentSoftOrdering(рекуррентная одномерная версия) обкатал на нескольких задачах, но пока CNN и LSTM победить не удалось по причине иной специализации. А специализация заключается в способности обрабатывать облака точек (points cloud), до этой задачи еще не добрался, там придётся тряхнуть архитектуры PointNet и PointNet++ (GPU не помешал бы).

Плюсом это еще, как я полагаю, одна из самых эффективных структур типа pooling.

-- 10.09.2024, 19:39 --

А я что сюда вывалил это всё?
Хочу-таки разобраться, как лучше всего подойти к задаче распознавания цифр MNIST. Сама задача-то некорректно обычно решается: типа "вот тебе 784 пикселя в один ряд - распознавай". Правильнее всего нейросети видеть то, как эти цифры пишутся в процессе. Но, к сожалению, стандартный датасет не содержит такой информации.

А что если пиксели превратить в аппроксимирующие ломаные, а потом точки этой ломаной обработать? Уж облака точек-то я могу... Как эти ломаные строить эффективно?

 
 
 
 Re: Структура RNN2D
Сообщение11.09.2024, 13:11 
Аватара пользователя
Mihaylo в сообщении #1654153 писал(а):
CNN ограничена размером ядра
Global Pooling это решает.
Mihaylo в сообщении #1654153 писал(а):
Сама задача-то некорректно обычно решается: типа "вот тебе 784 пикселя в один ряд - распознавай".
Это только один из подходов. Собственно CNN так не делают.

Вы говорите про вообще задачу распознавания текста, или конкретно про датасет MNIST? На нём самом уже идет борьба за единичные примеры, он все еще хорош в качестве sanity check, но бороться за SotA на нем странно.
Mihaylo в сообщении #1654153 писал(а):
Правильнее всего нейросети видеть то, как эти цифры пишутся в процессе. Но, к сожалению, стандартный датасет не содержит такой информации
Это уже другая задача.

 
 
 
 Re: Структура RNN2D
Сообщение11.09.2024, 15:47 
mihaild в сообщении #1654250 писал(а):
Global Pooling это решает.

Я смотрел архитектуру Fully-CNN, но не понял пока, почему простое усреднение работает. Как даунсэмплинг - да, мощно. Видимо классификации, как правило, много не надо.

mihaild в сообщении #1654250 писал(а):
конкретно про датасет MNIST?

Да

mihaild в сообщении #1654250 писал(а):
хорош в качестве sanity check, но бороться за SotA на нем странно

check выживания, поэтому. Селекция.

 
 
 
 Re: Структура RNN2D
Сообщение17.09.2024, 18:09 
Выложу-ка я здесь теорию, может кого-нибудь заинтересует.

Если вообще "в двух словах" описать, то так:

Слой SoftOrdering - это "мягкая" реализация гистограммы; если бы входными данными были категориальные, то операция почти соответствовала бы группировке данных (group by).

Как работает группировка данных? Есть неупорядоченная последовательность чисел, берём первое число записываем в список, напротив числа записываем "1", это означает, что число встречалось в последовательности один раз. Если это число встретится второй раз, то вместо "1" будет записано "2". Таким образом пробегаемся по всей последовательности, в итоге имеем два столбца: числа и их количество повторений. Это группировка данных.
Вход: [2, 5, 6, 3, 2, 9, 5, 5, 9]
Выход: [(2, 2), (5, 3), (6, 1), (3, 1), (9, 2)]

Упорядочивание данных в общем виде - это когда сгруппированные данные дополнительно сортируются по возрастанию.
Вход: [2, 5, 6, 3, 2, 9, 5, 5, 9]
Выход: [(2, 2), (3, 1), (5, 3), (6, 1), (9, 2)]

Гистограмма - это когда числа записываются в заранее подготовленные "пулы" - диапазоны значений.
Вход: [2.0, 5.2, 6.9, 3.0, 2.0, 9.5, 5.5, 5.7, 9.1]
Выход: [(2.0-2.9, 2), (3.0-3.9, 1), (4.0-4.9, 0), (5.0-5.9, 3), (6.0-6.9, 1), (7.0-7.9, 0), (8.0-8.9, 0), (9.0-9.9, 2)]
(Здесь в примере учитывается только один знак после запятой - это для простоты. В реальности в нейронных сетях тип данных будет что ни есть с плавающей запятой.)

Тут надо отметить, что:
1. В приведенных примерах группировки и упорядочивания данных информация не теряется, то есть по выходу можно восстановить вход. (Порядок входных чисел не имеет значения.)
2. Гистограмма теряет часть информации о входной последовательности. Чем меньше размер пула (=чем больше количество пулов), тем меньше потеря информации. Потеря информации может быть равна нулю при размере пулов, стремящемся к нулю.

В контексте нейронных сетей свойства гистограммы очень полезны:
1. Мы можем сжимать информацию и степень сжатия определяется гиперпараметром - количество пулов (или как принято для гистограмм - количество бинов).
2. На вход гистограммы может подаваться любое количество неупорядоченных чисел, но на выходе будет фиксированное упорядоченное множество.

Итак, упорядочивание данных методом гистограммы даёт возможность работы с данными, с которыми не умеет работать никакая существующая базовая структура (полносвязная, свёрточная и др.). К тому же упорядочивание данных - это новый вид пулинга, в котором есть гиперпараметр, плавно регулирующий даунсэмплинг (сжатие данных) от 0 до 100%.

Я написал слой SoftOrdering для PyTorch, который реализует "мягкую" гистограмму: вместо нелинейной операции сравнения используется сигмоида. Это даёт слою свойство дифференцируемости.

Я бы назвал SoftOrdering идеальной записной книжкой нейросети. Выход этого слоя хорош в качестве эмбеддингов и стэйтов. Пока я научился только записывать, но не научился удалять "записи". Хотя мысль гуляет...

 
 
 
 Re: Структура RNN2D
Сообщение17.09.2024, 21:03 
Аватара пользователя
Mihaylo в сообщении #1655146 писал(а):
На вход гистограммы может подаваться любое количество неупорядоченных чисел, но на выходе будет фиксированное упорядоченное множество
Для этого надо еще минимальное и максимальное значения зафиксировать.
Mihaylo в сообщении #1655146 писал(а):
Итак, упорядочивание данных методом гистограммы даёт возможность работы с данными, с которыми не умеет работать никакая существующая базовая структура (полносвязная, свёрточная и др.).
Оно же реализуется как небольшая $1 \times n$ свертка и потом глобальный пулинг.
Отобразить всё от от $n$ до $n+1$ в единицу, остальное в ноль можно вроде бы тремя-четырьмя слоями ReLU. Применяем поэлементно, а потом global sum pooling.

Естественно никто не сказал, что такая архитектура будет как-то разумно учиться, но в принципе желаемое поведение очень легко реализуется стандартными методами.

 
 
 
 Re: Структура RNN2D
Сообщение18.09.2024, 07:02 
mihaild в сообщении #1655180 писал(а):
Для этого надо еще минимальное и максимальное значения зафиксировать.

Я беру стандартно диапазон (-1, +1), данные нормализованы. Но иногда обучение "срывается", особенно если лёрнинг рейт большой. Метрики и функция потерь сваливаются на дно. Думаю, это из-за массового выхода из диапазона.

 
 
 
 Re: Структура RNN2D
Сообщение18.09.2024, 19:51 
mihaild в сообщении #1655180 писал(а):
Оно же реализуется как небольшая $1 \times n$ свертка и потом глобальный пулинг.

В одном месте читал, что глобальный пулинг имел популярность лет 10 назад, когда его предложили.
Я вообще LSTM/GRU рассматривал как лучшую альтернативу. LSTM у меня решает одну задачу с временными рядами за ~5 мин, достигая максимального значения ROC-AUC 0,88+. Рекуррентный SoftOrdering помедленнее работает, так как написан на Python/C, но в принципе сопоставимо и достигаю максимума 0,85+. Если сильно растянуться по времени, то лучший результат 0,875.

LSTM имеет компонент forget gate - шлюз забывания. При достижении определенного внутреннего состояния и получении некоторых входных данных в эмбеддинге обнуляются некоторые части.

У меня этого забывания в RecurrentSoftOrdering нет, хотя понятно, что гистограмму в самом общем случае надо считать не с самого первого элемента последовательности, а с некоторого оптимального, который должна определять сама нейросеть.

Пока не придумал как сделать "мягкую" и эффективную реализацию сдвига временного окна...

 
 
 
 Re: Структура RNN2D
Сообщение18.09.2024, 20:19 
Аватара пользователя
Mihaylo в сообщении #1655304 писал(а):
В одном месте читал, что глобальный пулинг имел популярность лет 10 назад, когда его предложили
Вполне используется. Но я больше про то, что Ваш подход явно стоит сравнить вот с такой стандартной архитектурой.

А так в общем-то популярность всех рекуррентных моделей сильно уменьшилась с приходом attention.

 
 
 
 Re: Структура RNN2D
Сообщение18.09.2024, 21:18 
mihaild в сообщении #1655180 писал(а):
Оно же реализуется как небольшая $1 \times n$ свертка и потом глобальный пулинг.
Отобразить всё от от $n$ до $n+1$ в единицу, остальное в ноль можно вроде бы тремя-четырьмя слоями 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.

 
 
 
 Re: Структура RNN2D
Сообщение18.09.2024, 21:55 
Аватара пользователя
Mihaylo в сообщении #1655316 писал(а):
А что значит "отобразить в ноль/единицу"?
Имелось в виду, что функцию $f(x) = \begin{cases} 1, n \leq x < n + 1 \\ 0, |x| < 10^6 \wedge x \not \in [n, n + 1) \end{cases}$ можно точно выразить нейронкой небольшой глубины.

 
 
 
 Re: Структура RNN2D
Сообщение19.09.2024, 19:53 
Ну понятно, что нейронку можно научить всему. Но наверное все-таки лучше научить нейронку работать с готовыми инструментами аналитики, такая была у меня мысль. И вот пришла конкретная мысль - агрегация данных. Нейронке такой подход не совсем очевиден. Она только умеет аппроксимировать. А что если научить интерполировать, делать EDA?.. :|

 
 
 
 Re: Структура RNN2D
Сообщение20.09.2024, 14:59 
Аватара пользователя
Научить можно всему, но всё же разные архитектуры неявно содержат разные приоры, и одна архитектура для приближения некоторой функции может требовать сильно меньше параметров, чем другая. Просто Ваше утверждение
Mihaylo в сообщении #1655146 писал(а):
упорядочивание данных методом гистограммы даёт возможность работы с данными, с которыми не умеет работать никакая существующая базовая структура
неверно - имеющаяся структура позволяет с небольшим количеством весов реализовать Ваш подход точно.
Как оно будет работать на практике - надо проверять экспериментально. Но сравнение с описанной мной выше архитектурой (или чем-то похожим) - это один из первых вопросов, который возникает при знакомстве с Вашей идеей.

 
 
 
 Re: Структура RNN2D
Сообщение20.09.2024, 15:45 
Я бы не сказал, что нелинейная $f(x)$, которую вы привели ранее, является частью существующей структуры. У меня ведь тоже кроме суммирования, умножения на константу и сигмоид ничего принципиально нового нет.

P.S. Обнаружил, что в градиентом бустинге применяют Histogram-based-алгоритмы. Как я понял, что это по сути то же самое, только строится дерево.

 
 
 
 Re: Структура RNN2D
Сообщение20.09.2024, 16:07 
Аватара пользователя
Mihaylo в сообщении #1655405 писал(а):
Я бы не сказал, что нелинейная $f(x)$, которую вы привели ранее, является частью существующей структуры
Так я не предлагаю её напрямую пихать. Я предлагаю 1x1 convolution с последующим global pooling. С мотивацией, что эта структура при небольшом числе параметров может точно выучить предлагаемую Вами функцию.

 
 
 
 Re: Структура RNN2D
Сообщение20.09.2024, 17:45 
То есть нагенерировать синтетических данных и обучить нейронку этому же?
Ну да, это получится. Но это не будет означать, что эти же слои в составе, предназначенном для более комплексной задачи, додумаются принять вид гистограммы.
Одно дело - зашить в нейронку алгоритм на структурном уровне, совершенно другое - обучить ее этому специально.

 
 
 [ Сообщений: 20 ]  На страницу 1, 2  След.


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