2014 dxdy logo

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

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




 
 Поиск скрытых закономерностей (паттернов)
Сообщение04.03.2025, 23:11 
Я пытаюсь разработать алгоритм обучения без учителя. Общий смысл такой: ищем закономерности в обучающих данных как функцию f(), которая аппроксимируется нейросетью небольшой структуры.

Тезисами:
1. Обучающие данные - это набор точек. (Для простоты можно представлять точки на плоскости, т.е. точки - это объекты с двумя признаками $x_1$ и $x_2$.)
2. Я принял такое допущение: нейросеть аппроксимирует функцию вида $p_j = f(p_i)$, где $p_i$ и $p_j$ - это точки из обучающего датасета.
3. Обучение происходит путём попарного сопоставления точек из датасета. Итого образуется $n(n-1)$ пар точек при размере датасета $n$.
4. Если точка $p_j$ попадает в окрестность модельной точки $f(p_i)$, то функция близости выдаёт результат почти 1; если точка далеко от этой окрестности, то функция близости выдаёт результат почти 0. Функция близости $c(f(p_i), p_j) = \exp(-\alpha \cdot r)$, где $r$ - евклидово расстояние между точками $p_j$ и $f(p_i)$.
5. Если перебрать все точки из датасета в качестве $p_j$, за исключением исходной точки $p_i$, и найти наибольшее значение $c$, то результат вычисления будет по сути представлять область определения функции (domain of the function). $domain[p_i] = \max\limits_{j, j \ne i}(c(f(p_i), p_j))$ Чем выше $domain$ (максимум $1.0$), тем лучше функция подходит для точки (точка попала в область определения). При $domain \to 0.0$ точка $p_i$ находится вне области определения функции.
6. Но область определения функции - это не единственная важная характеристика. Мне кажется, что гораздо важнее область значений функции (range of the function). $range[p_j] = \max\limits_{i,i \ne j} (f(p_i), p_j)$.
7. В качестве функции потерь я взял сумму $1 - \frac{\sum\limits_{j,j \ne i} sigmoid(\gamma \cdot range[p_j])}{n-1}$. Можно ещё взять вместо максимума усредненное значение функции близости $1 - \frac{\sum\limits_{j,j \ne i} sigmoid(\gamma \frac{\sum\limits_{i,i \ne j} c(f(p_i), p_j)}{n-1})}{n-1}$, эта функция потерь позволяет в начале обучения меньше сваливаться в локальные минимумы.

Чисто теоретически алгоритм может обнаруживать закономерности типа симметрии, фрактальной схожести, но образуются очень глубокие локальные минимумы, выползать из которых позволяют коэффициенты $\alpha$ и $\gamma$, которые я с трудом подкручиваю вручную. В итоге нейросеть стремится аппроксимировать зависимости между соседними точками. Было бы неплохо, например, выучивать такую функцию, которая на вход получила первую точку и последовательными итерациями применения функции находила все остальные точки датасета или хотя бы существенную долю.

Короче теория на этот счёт у меня ещё пока сырая. Какова лучшая цель обучения? Если кто-то предложит идеи, я могу обкатать.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение05.03.2025, 18:54 
Можно каждую точку представить как вершину графа. Тогда дуги, соединяющие точки в двух направлениях, можно взвесить функцией близости.
Идеальной является функция $f()$, которая образует граф-путь без циклов между всеми точками последовательно с весом дуг $1.0$.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение12.03.2025, 07:29 
В общем, задачу поиска скрытых закономерностей я формулирую в общем виде так: нужно обучить одну или несколько простых нейросетевых структур, которые смогут генерировать объекты (точки) представленной выборки с некоторой точностью.

1. При этом можно выделить первый способ генерации - итеративный - это когда берётся одна или несколько стартовых точек, они пропускаются через нейросеть, получается набор вторых точек, вторые точки пропускаются через нейросеть, получаются третьи... И так далее. Для этого способа нужна дополнительная нейросеть, которая от 0 до 1 оценивает область определения функции (domain of the function) - это вес, который определяет, насколько точно нейросеть генерирует очередную точку. Если вес низкий, то нужно прекратить генерацию последовательности точек.

2. Второй способ - стартовые точки равномерно распределены в ограниченном $m-мерном пространстве. Нейросеть обучается переводить фиктивные стартовые точки в реальные точки из датасета.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение13.03.2025, 19:23 
Я до этого момента формулировал задачу поиска скрытых закономерностей. Но также важно понимать, как использовать найденные закономерности в дальнейшем.

Я ничего нового не придумал, полный процесс классически состоит из двух этапов:
1. Обучение нейроструктур (в нашем случае - это поиск скрытых закономерностей, который описан выше)
2. Эксплуатация нейроструктур на новом датасете

Отмечу такую разницу: в классическом подходе на этапе обучения (1) используется учитель, но в нашем случае учителя нет.

Два варианта:
а. Если на этапе эксплуатации (2) также нет учителя, то использование предобученных нейроструктур может заключаться в генерации новых точек, либо детекции аномалий.
б. Если на этапе эксплуатации (2) датасет содержит точки с метками (обучение с учителем), то эксплуатация потребует обучения дополнительной нейроструктуры (дообучаемые слои общей нейросети). Мы можем взять одну точку и найти для всех преобразующих латентное пространство нейроструктур максимальные значения функции сходства выбранной точки и выхода структуры. Либо в случае итеративных нейроструктур найти максимальные значения функции сходства между точкой и одной из точек датасета с той же меткой. Эти значения функции сходства могут быть изучены дообучаемыми слоями с обратным распространением ошибки от метки.

P.S. Строго говоря, в случае обучения с учителем процесс состоит из трёх этапов:
1. Поиск скрытых закономерностей
2. Дообучение под задачу
3. Инференс

Эксплуатация, в моём понимании, это дообучение + инференс.

-- 13.03.2025, 19:41 --

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

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

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение14.03.2025, 19:03 
Я хотел рассмотреть такой простой датасет, как у XOR-задачи. Так как обучение первоначально без меток, то датасет содержит только точки (0, 0), (0, 1), (1, 0) и (1, 1). Скрытые закономерности, в данном случае - это то, что координату 0 можно оставить без изменений или увеличить на единицу, а координату 1 можно также оставить без изменения, либо уменьшить на единицу. Вполне запросто с изучением этих закономерностей справятся одиночные линейные слои. Пользуясь этими закономерностями, можно генерировать новые точки. Но в процессе обмозговывания я понял, что эти закономерности настолько просты и равномерно распределены между точками, что не дают никакого выигрыша в дальнейшем дообучении. Это просто особенность данного рода датасета. Но чисто теоретически можно проделать этот весь путь и на основе предообученных нейроструктур дообучить нейросеть задачам AND, OR, XOR и т.д.

Придётся всё-таки брать цифры MNIST. Как действовать? Мы берём один пример из датасета и изучаем закономерности внутри этого примера. Для этого мы в качестве точки берём пиксель - структуру вида $(i, j, value)$. Скрытые закономерности могут иметь вид:
$(i_2, j_2, value_2) = f(i_1, j_1, value_1)$
или
$(i, j, value) = f(LatentPoint)$

Ещё можно для рекурсивной формулы взять две точки из разных примеров. Например, обнаружить, что цифры часто похожи друг на друга полностью или частично, т.е. $(i_2, j_2, value_2) \sim (i_1, j_1, value_1)$

Перебор всех точек имеет сложность $O(n^2)$, это необходимо учитывать. Отдельный вопрос, как с этим комбинаторным взрывом бороться. Думаю может помочь область определения функции (domain), если точка не находится в области значения ($domain = 0$), то не брать её в рассмотрение.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение14.03.2025, 19:18 
Аватара пользователя
Вы тут не автоэнкодер изобретаете?

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение14.03.2025, 21:41 
В принципе да. Автоэнкодер решает сильно похожие задачи. Мне даже требуется усилие, чтобы сообразить, в чём разница. Но разница, очевидно, имеется. Первое отличие - отсутствует энкодер и вообще предлагаемые структуры совсем не "авто", так как продуцируют новые точки, а не исходные. Естественно, вариационный автоэнкодер (VAE) напоминает нейроструктуры, преобразующие латентное пространство в моём случае. Если честно, мне непонятно, зачем нужен энкодер в автоэнкодере вообще, пустая трата вычислений. Хотя в моём случае "пустой тратой" является структура, вычисляющая область определения (domain)...

-- 14.03.2025, 22:08 --

Смотрите: я сформулировал простое объяснение - я просто предложил энкодер убрать, а в качестве латентного пространства автоэнкодера использовать пространство альтернативных точек, то есть генерировать точку $p_2$ по альтернативной точке из датасета $p_1$. В случае VAE я предложил также убрать энкодер, там может пригодиться domain-структура, которая обучается достаточно легко. Но эти все утверждения пока хз, надо демонстрировать.

-- 14.03.2025, 22:17 --

Mihaylo в сообщении #1678613 писал(а):
В случае VAE я предложил также убрать энкодер

Просто непонятно, зачем нужен энкодер, если латентное пространство VAE должно обладать заранее известными свойствами, которые надо обеспечить обратной связью при обучении.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение15.03.2025, 08:02 
Ещё какие отличия от автоэнкодеров? У автоэнкодеров нет такой проблемы как область определения функции (domain), эту проблему решает энкодер. Нейроструктура всегда отобразит точку в саму себя. По выходу энкодера можно обнаруживать аномалии, то есть когда входная точка (входной тензор) находится вне области определения. Я вместо простой функции потерь MSE, которая обычно применяется для автоэнкодеров, предложил функцию сходства - экспоненциальную (см. формулы выше), а ещё можно применять функцию косинусного сходства. Эти функции выдают значения от 0 до 1. Это позволяет ввести хорошо интерпретируемые понятия domain и range. Вместо энкодера требуется нейроструктура, предсказывающая domain. Она, кстати, обучается отдельно и гораздо легче, чем декодер.
Какие ещё отличия? Когда работают с датасетом MNIST, то автоэнкодеру скармливают изображение целиком (784-мерный тензор). Я же хочу, чтобы структуры работали с отдельными пикселями. Такую задачу автоэнкодеру можно поставить, но он будет бесполезен в этом деле, ибо закономерностей внутри пикселей нет. Закономерности имеются между пикселями.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение15.03.2025, 10:01 
mihaild
Ваше короткое сообщение было полезным. :D Я про автоэнкодеры был в курсе, но никогда не использовал на практике. Мне всегда было непонятно, зачем нужен энкодер в автоэнкодере, точнее, зачем нужны две огромные нейросети - энкодер и декодер, кто-то лишний... Короче, скорее всего, я под влиянием своей ознакомленности с автоэнкодерами и всякой теории, лежащей вокруг всего этого, изобретаю свой иной велосипед. :roll:

Теперь, когда связь с известной теорией обнаружена, можно использовать более "привычные" названия:
$(i_2, j_2, value_2) = f(i_1, j_1, value_1)$ - эту функцию реализует мутуоэнкодер. :facepalm:
$(i, j, value) = f(LatentPoint)$ - а это вариационный декодер (если получится избавиться от энкодера).

Недостатки моего подхода:
1. Мутуоэнкодеры требуют перебора $n (n - 1)$ пар точек. Нужно как-то сократить перебор. Это должны быть эвристики, которые должна открывать какая-то дополнительная нейросеть или же предопределённые эвристики?
2. Мутуоэнкодер далеко не всегда генерирует полезные данные, нужна оценка domain. Если мутуоэнкодер имеет низкий domain для входных данных, то нужно держать в запасе несколько других мутуоэнкодеров. Скорее всего, нужно придумать какую нейроструктуру, которая оценивает domain нескольких мутуэнкодеров и соответственно дирижирует их выходами.

Достоинства:
1. Интерпретируемость. То, что является недостатком, можно превратить в достоинство. Зачем производить вычисления, если domain явно низкий?..

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение15.03.2025, 11:46 
Продолжаю галлюцинировать:
1. Про domain-evaluator уже высказывался - это специальная нейросеть-оценщик... Domain - это оценка, насколько хорошо мутуоэнкодер может сгенерировать новые данные.
2. Range-evaluator даёт оценку range, насколько хорошо имеющиеся данные объясняются тем или иным мутуоэнкодером.
3. Если мы возьмём две точки и для одной вычислим domain, а для второй - range, то произведение $domain \cdot range$ - общая оценка функции, насколько она удовлетворяет данным.

Мне хочется наступить на пятки трансформерам... Сходства:
1. Трансформеры также работают с позиционными векторами ($i$ и $j$ - позиции в задаче MNIST).
2. Перебираются пары токенов, сложность $O(n^2)$
3. Работа с последовательностями произвольной длины
4. Генерация и детекция аномалий

Отличия трансформеров:
1. Также как и у автоэнкодеров - всё отдано на откуп нейросети, непонятно, что творится в весах. Отсутствие интерпретируемости.
2. Как и у автоэнкодеров - вычисления производятся в полной мере единой структурой даже если закономерность элементарнейшая. Нельзя для низких domain-range отменять вычисления.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение16.03.2025, 10:38 
Mihaylo в сообщении #1678660 писал(а):
3. Если мы возьмём две точки и для одной вычислим domain, а для второй - range, то произведение $domain \cdot range$ - общая оценка функции, насколько она удовлетворяет данным.

Это действительно фантазия, стереть из памяти.

===========

В общем, я разобрался с вариационным автоэнкодером, там по-хитрому используется расстояние Кульбака - Лейблера и я понял, что это не то, что мне требуется. VAE - это по-настоящему генерация, в том числе генерация объектов, которых не было в обучающей выборке. Мне же нужно простое моделирование, а не генеративное моделирование. Поэтому название "вариационный декодер" для моей нейроструктуры нежизнеспособно. Пока ничего кроме LST-структуры в голову не приходит (latent space transformation), так и буду величать пока.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение17.03.2025, 18:49 
У автоэнкодеров нет проблемы вычислительной сложности $O(n^2)$, где $n$ - количество пикселей. Поэтому, чтобы мутуоэнкодеры показали свою жизнеспособность по сравнению с автоэнкодерами, они должны достичь сложности хотя бы $O(n)$. Единственный способ - это быстрый отбор пар точек (фильтрация), в результате которого рассматриваются только $O(n)$ пар точек, а остальные $O(n^2)$ пар должны быть отброшены. Это очень сильный фильтр.

Либо мы соглашаемся с имеющейся сложностью, просто принимаем, что мутуоэнкодеры имеют чуть более широкие сферы применения, а именно: способность анализировать отдельные пиксели, а не только всё изображение. В конце концов, трансформеры же популярны нынче, а у них тоже есть проблема сложности $O(n^2)$.

Я вижу такое решение: domain-эвалюатор и range-эвалюатор. Это такие две нейросети, которые скажут, каков потенциал той или иной структуры для правильного моделирования данных.
Два варианта:
1. Имеется единое пространство данных (например, набор точек на плоскости).
2. Имеется множество пространств частично зависимых данных (например, датасет MNIST с рукописными цифрами). Например, мы взяли некоторое изображение цифры 28х28, посмотрели несколько пар точек - эвалюаторы учитывают не только эти пары, но и пары точек в других изображениях цифр - сопоставляют.

Эвалюаторы дают оценку от 0 до 1, какой предсказательный потенциал имеет та или иная нейроструктура в текущих данных (в текущем изображении). Лишь только понятие "текущести" отличается. Но они не просто дают оценку, а делают это для конкретных точек.

Пока что, в моём понимании, эвалюаторы должны принять на вход набор проверенных (текущих) пар точек, то есть имеющих оценки близости $c(p_2, f(p_1))$ по всем нейроструктурам и запрашиваемые координаты точки $i$ и $j$ и выдать оценку потенциала точки от 0 до 1.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение21.03.2025, 19:38 
В первом своём сообщении я обозначил функцию потерь:
Mihaylo в сообщении #1677481 писал(а):
$1 - \frac{\sum\limits_{j,j \ne i} sigmoid(\gamma \cdot range[p_j])}{n-1}$

Mihaylo в сообщении #1677481 писал(а):
$range[p_j] = \max\limits_{i,i \ne j} (f(p_i), p_j)$

Ошибочка только в записи, вот так правильно: $range[p_j] = \max\limits_{i,i \ne j} (similarity(f(p_i), p_j))$, где $similarity(f(p_i), p_j) = \exp(-\alpha \cdot r)$ - функция сходства (близости), я её упоминал там же. Можно также взять известную функцию косинусного сходства, но у неё нет коэффициента, который возможно нужен для регуляризации.
Эту функцию потерь можно назвать Range Uncovery (непокрытие диапазона) - какова доля точек (данных) не имеет достаточного объяснения. Эту величину нужно уменьшать.
Эта функция потерь проверена на практике, работает. То есть можно взять несколько мутуоэнкодеров несложной структуры и с помощью их "объяснить" максимальное количество точек в датасете, обучив их, минимизируя Range Uncovery.
Для этого нужно в идеале перебрать $O(n^2)$ пар точек.

Теперь о том, что мутуоэнкодеры можно приспособить УСЛОВНО для исследования внешних закономерностей объектов в датасете и для исследования внутренних закономерностей. В датасете рукописных цифр MNIST объектами условно являются цифры. Можно сравнивать цифры между собой - это классическое исследование внешних закономерностей, широко известно и широко распространено. Но этого недостаточно, можно за объекты принять отдельные пиксели изображений. Я ранее постоянно употреблял слово "точки", но в более широком смысле - это объекты по терминологии машинного обучения. Если мы принимаем в качестве объектов пиксели изображений, то датасет обретает иерархическую структуру "датасет - изображение - пиксель". Изображение - это набор объектов (пикселей). Эта структура нужна для того, чтобы исключить применение мутуоэнкодеров между пикселями разных изображений.

Теперь о том, как уйти от квадратичной сложности. Для этого предназначается domain-эвалюатор. Мы берём изображение цифры и каким-то образом находим некоторое критическое количество пар пикселей, которые очень хорошо согласованы хотя бы одним из мутуоэнкодеров, т.е. функция сходства высокая ($similarity(f(p_1), p_2) > threshold$). Мы собираем статистику об этих парах пикселей с помощью полносвязного слоя и SoftOrdering-слоя.
О SoftOrdering начало тут: topic158638.html
Тут продолжение: topic158750.html
Особенность SoftOrdering в том, что он для любого количества точек (данных) строит уникальный тензор фиксированной длины, который очень удобно обрабатывать далее. В реальной жизни SoftOrdering соответствует построению гистограммы. Гистограмма - это как некоторая интерпретируемая "статистика" или "характеристика" набора произвольного количества точек. В случае же нейросетей вместо гистограммы применяется мягкий вариант - SoftOrdering, выход этого слоя - эмбеддинг (данные, которые понятны только нейросети, несмотря на наличие аналогии с гистограммой).
Итак, по нескольким точкам построена характеристика всего надобъекта - изображения. Распознаванию надобъекта обучается последующая структура, ей на вход подаётся эмбеддинг SoftOrdering и добавляются координаты нового пикселя $p_x$, для которого хотелось бы узнать, насколько он объясняет какие-то другие пиксели в изображении. Нужно найти хотя бы один мутуоэнкодер и точку $p_y$, когда $similarity(f(p_x), p_y) > threshold$. Эта структура оценивает насколько данный пиксель характерен для данного изображения и насколько подходит под каждый мутуоэнкодеров (domain от 0 до 1).
Для обучения этой штуки можно просто взять все мутуоэнкодеры и обработать ими пиксель $p_x$, найти наиболее сходные пиксели $p_y$. Это тяжкая часть обучения, но в какой-то момент, предполагается, обучение можно остановить и приступить к эксплуатации domain-эвалюатора, так как он способен более менее находить неплохие пары точек без полного перебора.

 
 
 
 Re: Поиск скрытых закономерностей (паттернов)
Сообщение06.04.2025, 20:07 
Немного забросил исследование... Надо исправить ситуацию.
Из всех пар точек нужно исключить точки с одинаковыми координатами, ибо мутуоэнкодер - это не автоэнкодер по определению. При этом давно возникло понимание, что и точки лежащие в окрестности исходной точки тоже нужно исключить из рассмотрения.
Таким образом, важно при отборе пар точек контролировать характеристику $similarity(p_x, p_y)$, если сходство точек слишком высокое, тогда имеется риск "обнаружить" слишком тривиальную закономерность вида "идентичность" ($p_x = p_y$ или $p_x \approx p_y$), так как таких точек может быть достаточно.
То есть, с одной стороны, должно быть
$similarity(p_x, p_y) < threshold_1$
с другой -
$similarity(f(p_x), p_y) > threshold_2$.

И ещё один интересный момент хочу отметить. Я хочу объединить нейросетевые алгоритмы с традиционными. Отбор пар точек должен производиться традиционным алгоритмом. Почему бы и нет? Нужно из фиксированного набора пар точек в количестве $n^2$ отобрать некоторое неопределённое количество пар, которое зависит от объёма закономерностей в данных. Я считаю для нейросетевых алгоритмов эта подзадача трудна, традиционные алгоритмы будут более эффективными.

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


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