Долго не писал, так как был в месячном бане. Но я за это время провёл кучу экспериментов.
Итак, решаемая задача в
общем виде:
1. Берётся стандартный датасет от Яна Лекуна - арабские цифры MNIST 28х28 пикселей со значениями 0-255; 60000 примеров для обучения и 10000 - для теста.
2. Алгоритм может запрашивать
пикселей изображения (
- бюджет) пошагово, то есть сначала запрашивает значение первого пикселя по координатам
, делает какое-то предположение и запрашивает следующий пиксель
и так далее не более
.
3. Результатом всех шагов должен быть ответ, какая цифра на изображении.
Но в результате я решаю задачу в
частном виде: на каждом шаге алгоритм запрашивает значения сразу 16-ти пикселей, которые всегда расположены в форме "каре" 4х4, который запрашивается всё также одной парой координат
и т.д. То есть один шаг частной задачи можно рассматривать как 16 шагов общей задачи, а бюджет запросов пикселей будет также отличаться в 16 раз. Если в общей задаче алгоритм обдумывает выбор пикселя 16 раз, то в частной - только лишь один раз, но зато чуть производительнее может быть организован запрос и самое главное - можно применить 2D-свёрточный слой к обработке запроса. В общем я применил в этом деле хитрость Яна Лекуна.
Алгоритм активного обучения классически состоит из двух частей: оракул и селектор. Оракул умеет принимать какие-то данные для анализа и давать ответ. Селектор выбирает данные, которые с его точки зрения наилучшим образом подойдут для оракула и наилучшим образом обучат его. Имеет место конфликт Exploitation & Exploration. С одной стороны, следует точно угадать текущий ответ, а с другой стороны, изучить и обобщить датасет.
Вкратце, в моей серии алгоритмов селектор запрашивает координату каре-пикселя в виде вещественных координат, при этом координаты округляются до меньших целых (с помощью floor). И эти целые координаты собственно определяют положение каре. Далее полученное каре с помощью билинейной интерполяции преобразуется в девятку значений пикселей. Билинейная интерполяция учитывает отброшенную дробную часть координат. Вся эта сложность нужна для того, чтобы алгоритм обратного распространения ошибки (backprop) мог собственно распространить ошибку насквозь через селектор.
С точки зрения backprop, селектор находится на входе, он анализирует выход оракула (либо дефолтный ответ), генерирует запрашиваемую координату пикселя, далее идут запрос каре-пикселя и билинейная интерполяция и после всего этого - оракул. Оракул имеет на входе сверточный 2D-слой, а далее слой SoftOrdering, который умеет накапливать пошаговые результаты.
Какие получены лучшие результаты?
1. Если запрашивать всего один фиксированный пиксель изображения, то можно выйти на точность 30+%. Этот результат я получил с помощью более простого алгоритма без билинейной интерполяции ещё месяц назад, писал об этом.
2. Запрашиваем 1 каре-пиксель: точность 57,0% на тестовых данных.
3. 2 каре-пикселя: 67,2%.
4. 3 каре-пикселя: 72,9%.
5. 4 каре-пикселя: 77,2%.
6. 5 каре-пикселей: 77,8%.
7. 10 каре-пикселей: 77,3%.
Мне кажется проблема в алгоритме селектора.
Цель - пробить этот потолок обучения. Кстати, результаты получены несколько разными алгоритмами. То есть общий алгоритм для 1-каре/2-каре/3-каре/4-каре не работает для 5-каре и 10-каре.
-- 03.11.2024, 13:18 --Немного философии-в-науке:
Мне кажется, в задаче селектор играет гораздо более важную роль, чем оракул. При чем это выглядит так: если мы хотим простых результатов (до 50-70% точности), то селектор вообще почти неважен. Но как только мы ставим задачу достижения точности 90%+, то тут наступает его час.
Алгоритм 1...4-каре очень быстро обучался и включал в себя достаточно простую цель: распределение запрашиваемых каре-пикселей таким образом, чтобы расстояние между ними было не менее чем 3 пикселя. (Это логично, зачем анализировать одни и те же пиксели по несколько раз.)
В общем сейчас не найден хороший подход к селекции пикселей.
-- 03.11.2024, 13:28 --Существует также проблема устойчивости: если бюджет каре-пикселей небольшой
, то алгоритм хорошо сходится. Если количество пикселей растёт, то селектор и оракул в какой-то момент выходят "на контры", результаты уходят вниз и почти всегда не возвращаются к достигнутым значениям.