2014 dxdy logo

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

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




 
 Генерация датасета как основа понимания (рассуждений)
Сообщение27.12.2025, 13:17 
Началось всё с рассмотрения конкретной проблемы. Лучшие нейросети делают в лучшем случае около 20 ошибок на тестовых данных при распознавании цифр MNIST:
post1710682.html#p1710682
Человек же делает максимум 10 ошибок (на себе потренировался, правда я взял не все 10000 примеров, а только те, которые не поддались нейросети). Если же добавить рассуждения (thinking), то количество ошибок можно уменьшить.

Здесь я развивал идею, которая объясняет причину превосходства человека над нейросетью на примере задачи классификации цифр MNIST:
1) post1710355.html#p1710355
2) post1710996.html#p1710996
3) post1711355.html#p1711355

Итак, вкратце перескажу мысль: человек понимает принцип, как эти цифры появляются на бумаге и в конечном итоге в датасете. Используя эти знания, человек распознаёт каракули лучше, благодаря вниманию к деталям.
То есть, грубо, в терминах ML, датасет изображений цифр нужно дополнить датасетом генерации этих цифр и тем самым расширить модальность нейросети. Это тупиковый подход, ибо создать такой дополнительный датасет - это гораздо более сложная задача, чем задача классификации. Я же хочу применить ленивый подход, пускай нейросеть сама решит эту задачу.
Я могу лишь помочь нейросети в следующем: я объясню, что цифра появляется в результате желания её написать и результат (изображение) зависит только от этого желания и правил написания цифры, которые одинаково справедливы для всех изображений этой цифры во всем датасете.

Модель строится следующим образом:
Правила написания цифр - это набор из 10 эмбеддингов, допустим, из 1024 признаков каждый. Мы берём конкретную цифру, по лейблу подгружаем нужный эмбеддинг, прогоняем через дополнительную нейросеть - генератор изображения цифры, получаем некоторое псевдоизображение, которое каким-то образом отличается от реального изображения, которое требуется распознать.
Думаю нужно рассматривать изображение как неупорядоченный набор пикселей $(i, j, value)$. Тогда можно сделать сравнение изображений с помощью функции потерь Range Uncovery (непокрытие диапазона). Здесь определение:
post1679466.html#p1679466
Генератор изображений обучается независимо от классификатора, обучаются не только веса генератора, но и его эмбеддинги.

Помощь генератора при классификации применяется после его обучения и получения эмбеддингов-правил.

Допустим классификатор имеет сомнения - софтмакс выдаёт высокие вероятности для двух-трёх цифр. Генерируем эти цифры и сравниваем.

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

 
 
 
 Re: Генерация датасета как основа понимания (рассуждений)
Сообщение09.01.2026, 12:46 
Я нахожусь в процессе решения. Немного скорректировал генератор, который описывал здесь выше. Слишком дискретная модель для моей задачи получилась.
Теперь мой генератор генерирует не изображение 28х28, а значение пикселя в указанных координатах, то есть производит вычисления $value = f(embedding(label), i, j)$

Подход не нов. Известны архитектуры CoordConv и CPPN, CPPN-NEAT (2007). Очень интересные визуализации здесь:
https://blog.otoro.net/2016/04/01/gener ... t-vectors/
https://blog.otoro.net/2016/06/02/gener ... -part-two/

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

1. У меня же идея другая, не генерация ради генерации, а генерация ради понимания (ради улучшения решения обратной задачи - задачи распознавания).

2. У меня уже есть практичный код с моей функцией потерь RangeUncoveryLoss, которая должна вытянуть решение задачи генерации на более высокие показатели. Функция потерь способна сравнивать искажённые изображения.

3. Мой генератор генерирует не одно изображение цифры, а несколько разных. Например, в датасете могут быть цифры "7" с чертой и без черты, с разными наклонами и возможно толщинами. Все эти разновидности изображений цифр называю прототипами, то есть нейросеть учится генерировать изображения разных типов. Можно выбирать ближайший из прототипов, учитывая, что есть функция сравнения (потерь). LLM подсказывает, что этот подход близок к MoE (mixture of experts).

4. Пока на уровне непроверенной идеи, но считаю, что это перспективный подход: для помощи в распознавании цифр мы анализируем, как можно изменить веса генератора, чтобы изменённая модель лучше соответствовала распознаваемому изображению. Идея заключается в расширении функции потерь для работы с испорченными изображениями (недорисованными по причине плохой шариковой ручки и случайно дрогнувшей руки, лишними штрихами из-за дрогнувшей руки). Именно такое большинство изображений можно зрительно увидеть среди тех, которые нейросеть неправильно распознаёт. Изображения цифр смотреть тут: http://dxdy.ru/post1710682.html#p1710682 Подход в каком-то смысле соответствует LLM fine tuning, но может быть не совсем fine.

 
 
 
 Re: Генерация датасета как основа понимания (рассуждений)
Сообщение24.01.2026, 03:22 
Создал я генератор-нейросеть со следующей сигнатурой:

$value = f(emb(label), i, j)$

$value$ - это значение цвета пикселя (0.0-1.0).
Нейросеть имеет двухслойную архитектуру из линейных слоёв и ReLU размера (64+2)-128-1.
64 - это размер эмбеддинга $emb$, 2 - это координаты пикселя $i$ и $j$, 128 - скрытый слой, 1 - это вектор-число - значение цвета пикселя.
На каждую цифру ($label$) выделено по 4 эмбеддинга, модель отбирает один эмбеддинг из четырёх, который наилучшим образом подходит под текущее изображение цифры. Выбор происходит за счёт функции softmin, которая при обратном распространении ошибки больше обучает лучшие эмбеддинги. Таким образом изображения из датасета самосортируются в четыре группы, которые я называю прототипами.
Используя нейросеть, можно генерировать (рендерить) изображения цифр любого разрешения.

Функция потерь - функция сходства на базе $RangeUncoveryLoss$ + попарный перебор пикселей в окне 5х5.

$loss = RangeUncoveryLoss(original\_image, rendered\_image)$

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

Вы можете обратить внимание, что цифры "0" и "8" состоят как будто из склеенных сегментов. Это происходит благодаря ограничению количества нейронов в скрытом слое (128). Если число нейронов увеличивать, то прототипы будут более плавные. Но это вредно, я должен был получить модель минимальной сложности. Мы оцениваем визуально: модель способна воспроизводить все крючки-закорючки цифр, при этом количество сегментов минимально. Если число нейронов уменьшать, то прототипы будут несколько размытыми в деталях. Сложнее всего прототипы цифр 2, 3, 5, 8. Самые простые прототипы - 1 и 7.

 
 
 
 Re: Генерация датасета как основа понимания (рассуждений)
Сообщение25.01.2026, 16:20 
На самом деле, тема "Генерация датасета как основа понимания (рассуждений)" произошла от понимания того, что эксперты по данным способны улучшать показатели. Я просто пытаюсь создать нейро-эксперта по данным.

В общем первая часть работы выполнена удовлетворительно, на мой взгляд. Получена нейросеть-генератор, подобраны структура и гиперпараметры, ноухау - функция потерь RangeUncoveryLoss вроде работает, скорость обучения - десятки минут на GPU. Не сказать, что всё идеально, но допустим, что можно приступать ко второй части эксперимента.

Хочу отметить, что в экспериментах сильно помогает искусственный интеллект в лице GPT-5.2. Я прежде всего выступаю как аналитик, он пишет код, потом я работаю как тестировщик. Код приходится просматривать, но только если что-то не так работает. Приноровился. :D

Вторая часть эксперимента - это реализация распознавания цифр, используя нейросеть-генератор цифр. Обратите внимание, на название темы "Генерация датасета как основа понимания (рассуждений)". Я имел в виду, что надо взять генератор цифр и как-то его использовать для распознавания. Самый примитивный вариант распознавания с использованием генератора - это бездумно перебрать и выбрать лучший прототип из 40 с минимальным лоссом.

$loss = RangeUncoveryLoss(original\_image, prototype\_image)$

Результат - точность 70-80%. Это очень плохой результат. Цифры иногда похожи друг на друга, хотя разные по значению.

Я попросил нейросеть написать код распознавания цифр, добавив туда немного few-shot-learning на 10-50 итераций. Сам генератор и эмбеддинги больше не обучаются, зафиксированы (прототипы цифр неизменны). Обучаются только тензоры коррекций к эмбеддингам. Имеется 40 эмбеддингов к ним прибавляются почленно 40 эмбеддингов коррекций, которые изначально нулевые.

Здесь можно увидеть, как путём коррекции эмбеддингов производится попытка мимикрировать прототипы под конкретное изображение цифры:

Изображение

Первое изображение - оригинал цифры, далее идут 5 лучших претендентов из 40 прототипов, которые немного подкорректированы через прибавку к эмбеддингу.

Обратите внимание на попытку подгонки цифр 9 под цифру 7, цифры 3 - под цифру 2, цифры 6 - под цифру 0.

Эта подгонка - это и есть то, что я называю "немного подумать". Она улучшает показатели в среднем с 70-80 до 80-90 % точности. Но много думать вредно.)))

 
 
 
 Re: Генерация датасета как основа понимания (рассуждений)
Сообщение12.02.2026, 18:31 
Покрутил-повертел я всяко свою модель генератора цифр.
1. Применил принцип "Генерация датасета как основа понимания (рассуждений)".
2. Применил соображение, что нейросеть-распознаватель цифр не должна видеть и обобщать (запоминать) изображения цифр (как это обычно делается), а должна видеть некоторые принципы генерации цифр и обобщить (запомнить) их.
3. Принцип написания (генерации) цифр - это эмбеддинг, латентный параметр пространство.
4. Применил представление о том, что есть усреднённое написание цифр и есть искажённые цифры, что эквивалентно математическому ожиданию и дисперсии. Представление о том, что надо вычислить (запомнить) сначала среднее, затем отклонение.
5. Применил системный подход.

Получилась следующая система:
1. Генератор цифр-прототипов (средние значения)
$gen\_image = F_1(proto\_embed)$
$loss = RangeUncoveryLoss(gen\_image, orig\_image)$

2. Генератор цифр точный (средние значения + отклонения)
$gen\_image = F_1(proto\_embed + \Delta embed)$
$loss = RangeUncoveryLoss(gen\_image, orig\_image) + \lambda \cdot ||\Delta embed||$

3. Распознаватель цифр
$pred = F_2(proto\_embed + \Delta embed)$
$loss = CrossEntropyLoss(pred, label)$


Обучение в несколько этапов, это необычно, поэтому тщательно описываю:

1. Обучение генератора $F_1$ и эмбеддингов цифр-прототипов $proto\_embed$.

2. Получение эмбеддингов (принципов написания/генерации) цифр из обучающей выборки $embed = proto\_embed + \Delta embed$ путём обучения $\Delta embed$ при фиксированных $F_1$ и $proto\_embed$. Каждое изображение цифры из обучающего датасета получает индивидуальный эмбеддинг 64...256 признаков, то есть может даже компактнее изображения (784 признака).

3. Обучение распознавателя $F_2$ классическое, просто вместо изображений цифр - эмбеддинги $embed$.

При эксплуатации распознавателя цифр придётся задействовать этап 2 для получения эмбеддинга изображения, это затратный процесс, но цель - получение почти 100% качества распознавания. Эту цель я преследую в своём исследовании и считаю, что он должен/может быть таким затратным.
Из-за регуляризации $\lambda \cdot ||\Delta embed||$ эмбеддинги окажутся более кучными тензорами, чем пиксельные изображения цифр. Это вроде как должно поднять качество распознавания благодаря упрощению разделения признаков. А в другом представлении - это использование принципов генерации цифр для улучшения распознавания. Простите, что наваял текст до проведения экспериментов.)

 
 
 
 Re: Генерация датасета как основа понимания (рассуждений)
Сообщение13.02.2026, 17:46 
Немного переосмыслил систему, этап 2 получения эмбеддингов изображений цифр не имеет какого-то осмысленной движущей цели. Регулязизатор $\lambda \cdot ||\Delta embed||$ - это какое-то слабое решение.
Чтобы придать больше смысла получению эмбеддингов, следует объединить этапы 2 и 3.

1. Генератор цифр-прототипов (средние значения)
$gen\_image = F_1(proto\_embed)$
$loss = RangeUncoveryLoss(gen\_image, orig\_image)$

2. Генератор цифр точный (средние значения + отклонения) + распознаватель цифр
$gen\_image = F_1(proto\_embed + \Delta embed)$
$pred = F_2(proto\_embed + \Delta embed)$
$loss = CrossEntropyLoss(pred, label) +$
$+ \lambda_1 \cdot RangeUncoveryLoss(gen\_image, orig\_image) + \lambda_2 \cdot ||\Delta embed||$

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

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


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