Active learning
- Введение
- Что такое активное обучение?
- Как выбирать данные для активного обучения?
- Методы семплирования в зависимости от неопределённости модели
- Семплирование в зависимости от схожести представления данных
- Семплирование в зависимости от влияния на модель
- Query by committee
- Bayesian Active Learning
- Заключение
Введение
В работе мы рано или поздно сталкиваемся с разметкой данных для создания моделей машинного обучения. Один из самых сложных аспектов — выбор этих данных. От них зависит не только качество (метрики достигают целевых значений) и скорость модели, но и время на разметку.
Сократить затраты — выгодно и нам, и компании: мы сможем быстрее завершить работу над моделью, а компания снизит финансовые расходы и ускорит выпуск продукта.
Объединение выбора данных, разметки и обучения модели в непрерывный цикл называется активным обучением. В этом процессе мы постоянно занимаемся разметкой, обучением модели и выбором данных, что позволяет добиться лучших результатов. Он может быть построен на экспертных знаниях, однако существуют различные подходы к его оптимизации.
В этой статье мы подробно рассмотрим различные детали и аспекты организации активного обучения, а также процедуру отбора данных, применение методов и подходов.
Что такое активное обучение?
Активное обучение — область машинного обучения, где алгоритм взаимодействует с некоторым источником информации, или оракулом, способным размечать запрошенные данные.
Зачастую обращение к оракулу затратно по времени и другим ресурсам, а нам нужно решить задачу, минимизируя количество обращений к оракулу.
Оракул в реальной ситуации — это, например, команда разметки, которая поставляет новые данные для обучения.
Поэтому центральная задача активного обучения — отбор объектов, то есть выбор тех объектов, которые следует отправить оракулу для получения достоверной информации об их классификации (или других атрибутах размеченных изображений). От качества отбора зависит время на обучение алгоритма, метрики качества и затраты на внешние ресурсы.

Формально постановку задачи выбора данных можно описать следующим образом.
Дано множество неразмеченных данных:
Множество меток (лейблов, разметки):
Оракул:
Требуется восстановить функцию \(a:X→Y\), минимизируя количество обращений к оракулу.
На каждой итерации алгоритм фиксирует три множества:
- \(X_{unlabeled}\) — множество неразмеченных объектов;
- \(X_{labeled}\) — множество размеченных объектов;
- \(X_{query}\) — множество объектов, которые подаются на вход оракулу.
На практике нам необходимо решить следующую задачу.
Пусть \(f(.;\theta)\) — модель, \(D_u\) — примеры, которые нужно отнести или не отнести к \(X_{query}\) — набору для разметки, \(B^*\) — выбранный батч из подмножества \(B \in D_u\) .

Тогда нам нужно найти алгоритм — \(Score\), запустив который на выходах нейронной сети \(Y^{hat}\) мы получим значения метрики (например, значения неуверенности) для эффективного отбора объектов, семплинга.
Эффективная процедура — та, при которой максимальный рост качества модели при минимальном количестве повторных вызовов (обращений к оракулу).
Как выбирать данные для активного обучения?
Функции для отбора объектов в зависимости от проблем, с которыми мы сталкиваемся:
- функция разнообразия / обогащения — есть ли подобные данные в наборе (если нет — добавляем для увеличения разнообразия);
- функция снижения ошибки — есть ли зарегистрированные кейсы ошибок модели на данных (если да — добавляем, чтобы убрать ложные срабатывания);
- функция времени — возможно ли за определённое количество времени произвести ручную разметку имеющихся данных (если нет — уменьшаем количество данных, так как задач много, а разметчиков мало).
Это не конечный список всех возможных функций и кейсов в контексте выбора данных для разметки. Сформулируем (с опорой на примеры выше) наши требования к выбору данных. Мы бы хотели при минимальных временных затратах получить наиболее разнообразный набор данных, обучение на котором даст наилучший прирост по качеству модели.
Далее проведём обзор различных функций для решения задачи выбора данных.
Для начала выделим ряд основных критериев семплирования:
- семплирование по неопределённости модели;
краткая справка по неопределённости
В машинном обучении принято различать два основных типа неопределённости: алеаторную и эпистемическую. Алеаторная связана с шумом в данных или их неотъемлемой случайностью. Она отражает присущую данным стохастичность и не может быть устранена путём сбора большего количества данных. Эпистемическая неопределённость возникает из-за недостатка знаний или данных. Она связана с моделью и отражает неуверенность в её параметрах, поскольку модель может быть обучена на ограниченном объёме данных. Она может быть уменьшена путём добавления новых данных, что делает ее устранимой.
- семплирование по схожести представления данных (как правило, на базе эмбеддингов);
- семплирование по влиянию на модель (ошибку, сходимость и др.);
- семлирование по апостериорной оценке параметров (изменения оценки при добавлении данных);
- гибридные методы (совмещают две и более стратегии).
Методы семплирования в зависимости от неопределённости модели
Обычно базовой оценкой неопределённостью модели может выступать вероятность класса. В случае мультиклассовой классификации — энтропия распределения классов. Если же мы решаем задачу регрессии — для таких моделей потребуется задать доверительные интервалы, либо использовать методы для их получения.
В качестве критериев на базе неопределённости можно выделить :
- Max Entropy
- Вычислим энтропию
\(U(\mathbf{x}) = \mathcal{H}(P_\theta(\hat{y} \vert \mathbf{x})) = — \sum_{\hat{y} \in \hat{\mathcal{Y}}} P_\theta(\hat{y} \vert \mathbf{x}) \log P_\theta(\hat{y} \vert \mathbf{x})\),\(\hat{y}\) — вероятность \(i\) -того класса , \(P_\theta(\hat{y} \vert \mathbf{x})\) — выходное распределение модели по данным, \(\mathcal{H}\) — энтропия.
- Least Confidence
- Вычислим разницу между максимальной вероятностью и 1: \(U(\mathbf{x}) = 1 — P_\theta(\hat{y} \vert \mathbf{x})\).
- Margin Score
- Вычислим разность между top-1 вероятностью класса и top-2 вероятностью класса: \(U(\mathbf{x}) = P_\theta(\hat{y}_1 \vert \mathbf{x}) — P_\theta(\hat{y}_2 \vert \mathbf{x})\) , где \(\hat{y}_1\) — top-1 вероятность, \(\hat{y}_2\) — top-2 вероятность.
Выбрав один из критериев и вычислив его для данных семплирования, мы добавляем два дополнительных шага:
- сортируем все объекты согласно убыванию значений выбранной метрики;
- выбираем K первых объектов для разметки.
На первый взгляд всё достаточно просто. Однако в контексте использования нейронных сетей возникает три ключевые проблемы.
- Мы оцениваем примеры независимо
Независимая оценка примеров может привести к тому, что на разметку уйдут все примеры одного класса, которые модель не знает, либо попадут плохие / зашумленные данные.
«Независимая оценка» обозначает ситуацию, когда важность каждого примера для модели мы оцениваем отдельно (один пример — одно значение), а обучаем модель на \(N\) таких примеров (из неразмеченной выборки). В таком случае для корректной оценки нам необходимо пересчитать оценку каждого отдельного примера с условием, что он попадёт в модель с \(N-1\) примерами.
Может оказаться, что в \(N-1\) примерах есть аналогичный или очень близкий объект для обучения, поэтому значение оценки важности примера должно быть уменьшено. Когда мы независимо оцениваем объекты, мы сталкиваемся с дублированием, которое эти критерии не решают. - Нейронные сети плохо откалиброваны
краткая справка о калибровке моделей
Калибровка модели — величина, которая показывает соответствие между вероятностями сформированной модели и качеством на данном уровне вероятности (уверенности). Для её оценки используют метрику ECE (Expected Calibration Error).
Expected Calibration Error — метрика для определения средней точности на наборе заданных интервалов уверенности модели. Для её подсчета необходимо:
- Определить набор интервалов уверенности, например, \([0.1 … 1.0]\) с шагом \(0.1\);
- Для каждого интервала сформировать набор примеров, для которых предсказанная вероятность попадает в заданные границы;
- Вычислить среднюю точность и среднюю вероятность для полученного набор примеров;
- Найти модуль разности этих величин, нормализовать на отношение количества примеров ко всем примерам;
- Усреднить полученные значения по всем интервалам.
При идеальном сценарии точность должна расти вместе со значением уверенности. Для визуального анализа метрики используют Reability diagramm.

Давайте посмотрим на график: здесь ось у — точность модели, ось x — порог вероятности для принятия решений. Как мы упомянули ранее, этим величинам нужно расти вместе, их корреляция должна стремиться к единице. Синий цвет показывает точность на разных интервалах уверенности, а розовый в полоску — gap между идеальной калибровкой и вычисленной. Его мы сокращаем для идеальной калибровки модели, которая гарантирует отсутствие переобучения или недообучения (модель не over / under confident).
Причины возникновения проблемы:
- переобучение / недообучение;
- шум в данных;
- максимизация MLE — мы хотим от модели, чтобы плотность в точке тренировочных данных была максимальная вне зависимости от самих данных и релевантности оценки априорному распределению.
Влияние на использование критериев семплирования: для многих примеров оценка неопределённости может быть занижена или завышена, так как модель выдаёт слишком низкие / высокие оценки для вероятностей классов.
- Нейронные сети не Липшиц-непрерывные
Возможно, многие из вас сталкивались с такими наблюдениями — добавление небольшого количества шума может полностью искажать ответы нейронной сети.
Подобное поведение нейронной сети можно объяснить свойством функции при построении нейронной сети как набора разных функций (слоёв).
Влияние пертурбации входа на выходы нейронной сети можно описать следующим выражением:
\(||f(x)-f(y)||_2 \leq \ell || x-y||_2\)
Разница между результатами работы нейронной сети (обычным и зашумлённым примером) должна быть меньше или равной разнице между входами с точностью до L (константа Липшица).
На изображении выше разница между входными данными незначительна, однако происходит существенное искажение выходных данных (предсказанного класса).
Отсутствие данного свойства у нейронной сети существенно влияет на возможность применять семплирование с использованием неопределённости (и других методов):
- входные данные могут иметь различные виды зашумления — непредсказуемое влияние на результаты оценки неопределённости;
- если данные сильно отличаются от тренировочной выборки — их отображение в латентное пространство может быть некорректным.
Решить проблемы можно таким образом:
- взвешенная оценка и методы агрегации, например, ансамбли или dropout (подробно об этом можно прочитать тут);
- калибровка моделей (в контексте активного обучения используется не так часто, так как требует постоянной перекалибровки после каждого обучения модели);
- регуляризация нормы весов к определённому значению константы Липшица (применяется в методах оценки неопределённости для достижения наилучших результатов, требует подбор значения константы для нейронной сети, а в частных случаях для каждого слоя отдельно).
Подходы семплирования на основе неопределённости обладают как плюсами, так и минусами.
Плюсы:
- Простая реализация.
- Отсутствие дополнительных затрат на вычисление критериев — необходим только стандартный форвард-пас-моделей.
Минусы:
- Отсутствие учёта связи между примерами, что приводит к семплированию дублирующихся или очень похожих данных.
- Для получения корректной оценки энтропии необходимо применять техники дропаута или ансамблирования. При дропауте время на оценку каждого примера увеличивается в N раз в зависимости от количества уникальных масок. А в случае с ансамблями — нам каждый раз нужно обучать весь ансамбль, например, три или пять независимых моделей вместо одной.
Семплирование в зависимости от схожести представления данных
В качестве бейзлайна при таком виде семплирования выступает подход Coreset https://arxiv.org/abs/1708.00489

В отличие от методов, основанных на неопределённости, подход с использованием векторных представлений, Сoreset, имеет два преимущества:
- Позволяет решать проблему семплирования не отдельных примеров, а целых выборок, что значительно упрощает и ускоряет процесс активного обучения.
- Помогает получить значительное количество данных за один проход.
Основная идея подхода — неразмеченный набор данных представляет собой множество точек в некотором латентном пространстве, часть из которых схожа. Из любого набора данных можно выделить примеры, которые будут отличаться друг от друга и описывать отдельные группы, являться опорными точками набора данных. Если мы обучим модель на таком подмножестве примеров — скорее всего, она будет хорошо работать и с остальными данными, так как увидит ключевые реперные объекты в процессе обучения. Однако возникает вопрос: как семплировать такие примеры из неразмеченных данных?
Для выбора реперных объектов, которые затем будут использоваться в разметке и обучении, авторы подхода Corset предлагают двухступенчатое семплирование.
- Сначала они определяют N наименьших расстояний в векторном пространстве между точками выборки, на которой обучена модель, и неразмеченной выборкой.
Получив набор минимальных расстояний, они выбирают из них максимальное. Первая выбранная точка будет стартовой для обхода неразмеченной выборки и создания реперного набора данных. Зачем это нужно? В первую очередь, чтобы защитить результаты от влияния случайных факторов. Если мы просто возьмём примеры, которые находятся далеко от размеченной выборки — возможно, они окажутся выбросами. Чтобы определить начальную точку для выборки, мы выбираем самый отдалённый пример из всех ближайших.
- Далее мы начинаем с выбранной на первом этапе точки и последовательно измеряем расстояния до всех остальных точек. Их мы сохраняем в буфере (размера, равного выборке) и определяем следующую точку через наибольшее расстояние на текущий момент. Эту точку мы добавляем в список сохранённых примеров — тех, что мы позднее отдадим на разметку, и удаляем из анализируемой выборки.
Каждый раз, когда мы вычисляем расстояние до следующей точки, мы обновляем в буфере только те расстояния, которые оказались меньше предыдущих. А в качестве новой точки берём максимальное расстояние среди текущих минимальных (тех, что лежат в буфере).
Такую процедуру повторяем до момента, пока количество выбранных примеров не будет равно искомому объему (равный определённому «бюджету» на разметку в рамках одной итерации).
Это позволяет нам обойти все точки выборки и выделить только те из них, которые находятся на достаточном расстоянии друг от друга. Алгоритм схож с алгортимом Furthest Point Sampling

Какие проблемы и задачи нам предстоит решить, если мы хотим использовать методы семплирования, основанные на векторных расстояниях до эмбеддингов?
- Во-первых, не всегда обычные классификаторы подходят для сравнения эмбеддингов. Они изначально обучены так, чтобы эмбеддинг корректно обрабатывался линейным классификатором на последнем слое. Корректная работа классификатора не означает, что точки в латентном пространстве будут расположены достаточно информативно для использования подобных эмбеддингов и сравнения с помощью метрик дистанции. Решить эту проблему можно за счёт обучения отдельного метрического классификатора или внесения изменений в существующую нейронную сеть. Например, использовать метрический классификатор вместо линейного или предварительно предобучить модель с применением self supervised learning.
- Выбор метрики дистанции выступает дополнительной задачей. Для сравнения можно применять различные метрики: классическое L2 расстояния, косинусную дистанцию или сравнение промежуточных признаков модели с LPIPS.
- В качестве альтернативы обучения собственного метрического классификатора можно использовать одну из фундаментальных моделей, например, CLIP или DINO. Однако в этом случае модели также необходимо переобучать, чтобы со временем расстояние между добавленными и уже размеченными примерами становилось меньше.
- Как и у методов оценки неопределённости, существует проблема с отсутствием Липшиц-непрерывности. Из-за этого для части данных, которые могут быть искажены или зашумлены, мы можем получать точки в этом пространстве, кажущиеся очень похожими на точки из тренировочной выборки (хоть это и не так).
Семплирование в зависимости от влияния на модель
Здесь чаще всего применяются подходы, которые с помощью различных аппроксимаций позволяют найти влияние конкретного примера на ошибку модели или же на изменение её параметров.
Также часто применяются различные функции, позволяющие аппроксимировать реальный подсчёт градиента или гессиана. Например, подобная реализация изложена в методе Learning Loss for Active Learning https://arxiv.org/abs/1905.03677

Основная идея:
Поскольку мы не знаем реальных меток, мы можем обучить функцию (регрессор), которая будет приблизительно оценивать значение функции потерь, основываясь на картах признаков (промежуточных выходов нейронной сети) для конкретного примера. Если карты признаков будут похожи на сложные примеры из обучения на размеченных данных — это позволит выявлять наиболее полезные образцы из неразмеченной выборки.
Важно отметить: невозможно использовать метод напрямую (обучать модель предсказывать лосс), так как значение ошибки на каждой итерации обучения меняется, и происходят постоянные флуктуации.
Чтобы решить проблему, авторы предложили подход для обучения предикторов ошибки:
- Оригинальный батч данных разделяется на две части.
- По каждой части получаем предсказание ошибки.
- Сравниваем разницу в предсказаниях, полученных по двум частям батча с помощью модифицированного hinge loss:
\(max(0,\mathbf{-1}(l_{b1},l_{b2})*(l_{b1}-l_{b2})+\xi)\) , где \(l_{b1},l_{b2}\) — предсказания для первой и второй части батча.
\(\mathbf{-1}= \begin{cases} +1 & \text{if \(l_{b1} > l_{b2}\)} \\ -1 & \text{otherwise}\end{cases}\)
Идея в том, чтобы разница между предсказаниями ошибки на разных данных была как минимум больше, чем \(\xi\) . Таким образом, мониторинг такого лосса позволяет оценить коллапс классификатора и понять, что он продолжает обучатся.
У подобного подхода есть похожие проблемы с оценкой неопределённости. Так как модель предсказания ошибки обучается только на тренировочных данных — достаточно сложно судить о её генерализации к каким-то данным из внешнего мира. Также из-за решения задачи регрессии невозможно оценить, насколько модель уверена в своих предсказаниях (без использования дополнительных подходов).
Рассмотрев три направления в построении критериев семплирования для активного обучения, мы перейдём к подходам, проектирование которых строится с учётом описанных выше проблем.
Query by committee
Если представить, что мы заменили нашу единственную модель на множество моделей (например, обучив ансамбль) или же добавили в пайплайн предсказания использование множественного запуска дропаута — мы можем вернуться к критериям неопределенности, но за счёт множественной оценки получим более надёжное семплирование.
Группа таких критериев называется Query by committee (QBC).
Основная идея: мы учитываем мнение не одной модели (полученную оценку неопределённости), а множества (комитета). Критерии семплирования могут быть следующими:
- Vote Entropy: \(-\frac{V(c)}{C}Log(\frac{V(c)}{C})\)
Здесь мы считаем энтропию между выбором (индексом самого вероятного класса), предсказанным каждой индивидуальной моделью. В этом критерии учитывается согласованность комитета, поэтому робастность семплирования повышается.
- Сonsensus Entropy: \(\frac{1}{m}\sum^m_{i=1}P_с(y|x)Log(\frac{1}{m}\sum^m_{i=1}P_с(y|x))\) , где \(P_с(y|x)\) — распределение вероятностей классов на выходе из модели, \(m\) — количество моделей в комитете.
Здесь во внимание берётся как различие в наиболее вероятных классах, так и низкая максимальная уверенность.
Эти критерии лучше подходят к реальным задачам, однако проблему с дубликатами они не учитывают. Поэтому давайте рассмотрим несколько дополнительных критериев, которые с ней справляются 🙂
Bayesian Active Learning
Критерий Bayesian Active Learning by Disagreement (BALD) https://arxiv.org/abs/1112.5745 основан на теории Баесовского вывода и информационной теории. Запись критерия выглядит следующим образом:
\(I(y; \omega | x, D_{train}) = H(y | x, D_{train}) — E_{p(\omega|D_{train})} [H(y|x, \omega, D_{train})]\)
Давайте рассмотрим, что обозначает каждая часть формулы.
Для этого посмотрим на постановку задачи с точки зрения теории информации. Предположим, мы хотим понять, как одна случайная величина \(X\) связана с другой случайной величиной \(Y\) . В теории информации есть подходящая оценка — взаимная информация. Она показывает количество информации, содержащееся в \(i\)-го значении одной случайной величины (обозначим за \(X\)) относительно \(j\)-го значения другой случайной величины (обозначим за \(Y\)). Записывается как \(I[X, Y ] = H[p(X)] − E_{p(Y )}H[p(X|Y )]\).
Посмотрим на эту формулы со стороны задачи активного обучения. Пусть \(p(X)\) — распределение информации об объектах, которое уже содержится в нейронной сети. Нам нужно понять, какой следующий пример выбрать: зададим его как \(Y\). Если мы узнаем, какой будет информация при обучении на примере \(p(X|Y )\) — определим, насколько повлиял (был информативен) пример на распределение информации в нейронной сети. Если мы распишем данную формулу применительно к задаче активного обучения:
\(\mathcal{U(x)} = H[p(θ|D)] − E_{p(y|x,D)}H[p(θ|D, x, y)]\) , где \(H\) — энтропия , \(\theta\) — параметры модели, \(x,y\) — новые данные.
Осталось понять, как переложить расчёт подобной формулы в алгоритм. Есть несколько проблем:
- \(p(θ|D)\) — подобное распределение посчитать невозможно, так как нам потребуется рассмотреть все комбинации веса модели;
- \(y\) отсутствует.
Но выход есть! 🙂 Так как взаимная информация является симметричной — приведённую выше функцию можно переписать следующим образом:
\(\mathcal{U(x)} = H[p(y|x, D)] − E_{p(θ|D)}H[p(y|x, θ)]\)
В данном случае мы решили проблему с отсутствием \(y\) — метки данных. Теперь мы будем смотреть не на \(y\) как лейбл, а на \(y\) как выходное распределение, предсказанное моделью. Осталось решить задачу нахождения \(p(θ|D)\). С учётом, что у нас уже есть множества моделей, заменяем честный подсчет \(p(θ|D)\) на аппроксимацию с помощью конечного множества семплов из этого распределения \(\{\theta_0 …. \theta_m\}\), где \(m\) — количество моделей в ансамбле или комбинаций dropout.
Таким образом, мы перешли к формуле критерия BALD:
\(I(y; \omega | x, D_{train}) \approx-\sum_c(\frac{1}{M}\sum_mp_c^m)Log(\frac{1}{M}\sum_mp_c^m) + \frac 1 M \sum_{m, c} p_c^m Log p_c^m\) , где \(p_c^m\) — вероятность \(с\) — того класса предсказанная моделью \(m\) , \(M\) — общее количество моделей (семплов из распределения \(p(θ|D)\)
Мы сравниваем энтропию в среднем (правая часть) с энтропией, усреднённой по индивидуальным запускам.
Итак, мы разобрались с BALD — переходим к Batch BALD https://arxiv.org/abs/1906.08158, критерию с решённой проблемой семплирования дубликатов. Идея состоит в том, чтобы перенести описанный выше функционал на случай, когда перед нами не просто случайная величина — один пример, а n случайных величин — засемплированный батч.
Наивной реализацией будет являтся запуск BALD по каждому примеру и выбор top-k примеров с наивысшим значением критерия. Однако такая реализация не решает нашу задачу. Чтобы учитывать взаимосвязь между примерами в батче, нам необходимо учитывать набор предсказаний комитета по батчу как совместное распределение предсказаний. Тогда формула критерия будет выглядеть следующим образом:
\(I(y_1,…,y_B; \omega | x_1,..,x_B, D_{train}) = H(y_1,…,y_B | x_1,…,x_B, D_{train}) — E_{p(\omega|D_{train})} [H(y_1,…,y_B|x_1,…,x_B, \omega, D_{train})]\)
По аналогии с BALD разберём, как подобную формулу можно привести к перелагаемому в код варианту.
Начнём с правой части: \(E_{p(\omega|D_{train})} [H(y_1,…,y_B|x_1,…,x_B, \omega, D_{train})]\)
Так как \(x_1,…,x_B\) — независимые случайные величины, мы можем вычислить данную часть как \(\frac{1} {M} \sum_B \sum_{m, c} p_c^m Log p_c^m\), аналогично BALD, добавить сумму по батчу — \(\sum_B\) .
Для левой части всё несколько сложнее. Нам необходимо вычислить cовместную энтропию. Совместная энтропия двух случайных величин имеет вид \(H(X,Y) = — \sum_{S_X}\sum_{S_Y}p(x,y)\log p(x,y)\), где \(\sum_{S_X}\sum_{S_Y}\) — сумма по всем возможным совместным комбинациям \(x\) и \(y\). В зависимости от размера батча для честного подсчёта нам нужно будет перебрать все комбинации, каким может быть выходное распределение для каждого индекса примера из батча данных.
Конечное количество комбинаций будет равно \(c^B\), где \(c\) — количество классов / вероятностей на выходе модели, \(B\) — размер батча. Для расчёта подобной формулы на реальных данных был предложен следующий алгоритм:
- Подсчитываем \(\frac{1} {M} \sum_{m, c} p_c^m Log p_c^m\) без \(\sum_B\) → \(H_2\ [B,1]\). Таким образом мы получаем энтропию по каждому примеру из батча(правая часть формулы Batch BALD)
- Семплируем K случайных комбинаций (где \(K\) = \(1e4\)) по \(B\) элементов (получится матрица размером \([K,B,1]\)). Параметр \(K\) выбирается эмпирически (авторы статьи не делали выкладок о том, насколько распределение по \(K\) семплам приближено к честному перебору \(c^B\)). Так мы получаем аппроксимацию реального распределения ответов. Обозначим её как \(class\ combinations\).
- Итерируемся по индексам батча:
- Для первой итерации (i=0)
- Берём семпл возможных значений класса для данного индекса → \([K,1,1]\)
- Cемплируем логиты из наших данных \([B,C,M]\) согласно идексам классов в \(K → [B,K,M]\) . Таким образом мы получаем матрицу которая для каждого примера из батча хранит M x K комбинаций логитов. Можно представить это как случайное распределение вероятностей которая может быть предсказано каждой из моделей.
- Вычисляем \(\sum_k(\frac{1}{M}\sum_mp^m_k)Log(\frac{1}{M}\sum_mp^m_k)\) → получаем \(H_1\ [B,1]\). Тут мы рассчитываем энтропию для ответов ансамбля моделей усредняя по K комбинациям.
- Вычисляем BALD \(H_1 — H_2\) — массив скоров для семплирования элементов
- Выбираем индекс примера с наибольшим значением BALD среди тех, для которых мы уже провели процедуру семлирования (выбирали семлп из матрицы \([K,B]\)) . Выбирать мы будем из массива полученного на шаге ii. Данный семпл понадобиться нам для последующей итерации. Индекс примера сохраняется для финального шага выбора примеров для обучения.
- Для всех последующих итераций
- Перед вычислением \(H_1\) перемножаем массив логитов с шага v размера \([M,K]\). и семпл с вероятностями на текущем шаге → \([B,K,M]\). Так мы учитываем ситуации, когда у нас есть семплы с похожим распределением вероятностей (и с похожей энтропией)
- Для первой итерации (i=0)
- Используем top-k наибольших по значению критериев семплов для обучения.
У критериев BALD и Batch BALD много плюсов, однако для реального применения нам нужно провести подготовку:
- Реализовать класс для консистентного дропаута. Это тот же дропаут, только индексы нейронов для зануления (маски дропаута) определяются до запуска модели. Далее весь батч данных, для которых мы хотим посчитать критерий, обрабатывается только с помощью ранее созданных масок дропаута. Это необходимо, чтобы оценки между примерами в батче были консистенты между собой.
- Реализовать сами критерии. В случаее ранее описанных критериев всё можно с достаточной точностью реализовать посредством имплементации формул. Но для Batch BALD даже с учётом детального рассмотрения лучше воспользоваться готовой библиотекой, например, https://github.com/BlackHC/batchbald_redux или https://github.com/baal-org/baal
- Запастить компьютом. Так как помимо прогона множества моделей из комитета нам необходим расчёт совместной энтропии, временные затраты на обработку одного батча данных возрастут многократно.
Заключение
Сегодня мы познакомились с активным обучением и рассмотрели набор подходов, который чаще всего встречается в различных системах или фреймворках для реализации активного обучения.
Снижение сложности процесса выбора данных и удешевление разметки на первых этапах может потребовать больших усилий на адаптацию и настройку подобных пайплайнов. Однако на длинной дистанции грамотное применение подобных подходов должно существенно снизить первоначальные затраты на разметку при старте новых проектов, так как система уже будет отлажена и настроена.
Методы, рассмотренные в этом материале, сегодня имеют множество модификаций и доработок. Поэтому после знакомства с «базой» можно смело углубиться в рассмотрение последних статей в этой области 🙂


