Источник статьи | Облачное сообщество Hengyuan (сосредоточение внимания на платформе искусственного интеллекта/глубокого обучения с бесплатным ускорением на GPU, официальный веб-сайт:gpushare.com)
Оригинальный автор | Матор
Исходный адрес |GPUshare.com/forum/topic…
В этой статье будет представлен метод постобработки (трюк) для задач классификации из статьи «Если есть сомнения: повышение эффективности классификации с помощью чередующейся нормализации» в выводах EMNLP 2021. После фактического измерения CAN (классификация с чередующейся нормализацией) действительно может улучшить эффект задач множественной классификации в большинстве случаев (общих для CV и NLP) и почти не увеличивает стоимость прогнозирования, потому что это просто повторная нормализация результаты предсказания.
МОЖНО ИДЕИ
Интересно, что идея CAN на самом деле очень проста, настолько проста, что ею пользовались почти все из нас. В частности, предполагая, что на экзамене 10 вопросов с несколькими вариантами ответов, вы более уверены в первых 9 вопросах, а 10-й вопрос вовсе не будет слепым, но вы обнаружите, что пропорция A, B, C и D в первых 9 вопросах 3:3:2:2, затем, когда будет рассмотрен 10-й вопрос, вы будете более склонны к C и D? Если это более экстремальная ситуация, когда вы обнаружите, что выбрали A, B и C в первых 9 вопросах, но не выбрали D, то, когда вы получите 10-й вопрос, вы будете более склонны к D?
Вернемся к задаче классификации, предположим, что теперь есть проблема бинарной классификации, модель для вводаПрогнозируемый результат, то мы можем присвоить прогнозируемой категории значение 1; затем для входных данных, результат прогноза, данный моделью, равен, этот результат самый неопределенный, и мы не знаем, какой класс должен быть выведен
Но если я скажу вам:
- Категория должна быть одной из 0 или 1
- Вероятность появления двух категорий составляет 0,5 каждая.
В случае знания этих двух «априорных» сведений, поскольку результат предсказания предыдущей выборки равен 1, то, основываясь на наивной идее равномерности, будем ли мы более склонны предсказывать последнюю выборку как 0, чтобы получить Удовлетворительное Вторая точка "предварительных" результатов прогноза?
За этими простыми примерами стоит та же идея, что и в CAN, которая заключается в использовании «априорного распределения» для исправления результатов прогнозирования «низкой достоверности», чтобы распределение новых результатов прогнозирования было ближе к предыдущему распределению.
Энтропия ТОП-К
Если быть точным, CAN — это метод постобработки результатов прогнозирования с низкой достоверностью, поэтому сначала нам нужно иметь индикатор для измерения неопределенности результатов прогнозирования. Обычной мерой является «энтропия», поскольку,определяется как
Хотя энтропия является распространенным выбором, она не всегда дает результаты, соответствующие нашему интуитивному пониманию. Например для, непосредственно применить формулу, чтобы получить, но если люди оценят эти два распределения вероятностей субъективно, то, очевидно, мы подумаем, чтоБолее неопределенно, поэтому прямое использование энтропии недостаточно разумно.
Объективно говоря, чем больше значение энтропии, тем более неустойчива система. Если вы хотите относиться к уверенности, чем больше значение энтропии, тем ниже уверенность
Простая коррекция состоит в том, чтобы использовать для вычисления энтропии только верхние k значений вероятности, предполагаянаиболее вероятнозначение, то
в,представляет собой операцию над верхними значениями k вектора с наибольшим→. Мы можем расширить уравнение (2) до уравнения (1), чтобы получить
в,
ПЕРЕМЕННАЯ НОРМАЛИЗАЦИЯ
В этой части я сначала дам описание шагов алгоритма в статье, а в следующем разделе я смоделирую процесс расчета вручную.
Step1
Пусть вектор-столбецдля входного образцаВ соответствии с распределением вероятностей каждой категории,Указывает количество категорий. мы генерируем×Матрица вероятностиФактическиВыборка с очень высокой достоверностью получается путем объединения прогнозируемых векторов вероятности каждой категории.объединить, чтобы получитьматрица
Step2
Второй шаг представляет собой итерационный процесс, в частности, матрицуВыполните нормализацию столбца (чтобы сумма каждого столбца равнялась 1), затем выполните нормализацию строки (чтобы сумма каждой строки равнялась 1). Прежде чем приступить к шагам алгоритма, определим операцию диагонализации вектора:D(v) преобразует вектор-столбецпреобразовать вДиагональная матрица , диагональные элементы являются исходными элементами вектора
нормализация столбца
Среди них параметрконтрольСкорость сходимости к высокой достоверности (чем больше скорость, тем быстрее, значение по умолчанию равно 1);является вектор-столбцом всех единиц. После преобразования формулы (4) матрицадаформа матрицы, нормализованная по столбцам;даинверсия
нормализация строк
в,Это по-прежнему вектор-столбец из всех единиц, но в настоящее время его размерность ммм; матрицанормализуется по строке (ноЭто не нормализованная по строкам форма конкретной матрицы);— диагональная матрица, а элементы на диагонали — коэффициенты распределения каждой категории
Например
Указывает, что это задача трех классов, и соотношение каждой категории составляет 1:2:2.
Step3
Итерация цикла Step2Матрица, полученная после раз:
в,это новое распределение вероятностей, скорректированное в соответствии с «предыдущим распределением»
Обратите внимание, что этот процесс требует от нас повторения каждого прогноза с низкой достоверностью, то есть вносить исправления выборка за выборкой, а не все сразу. и хотя итерационный процессПредсказанные вероятности соответствующих выборок также обновляются, но это только временный результат, и все они в конце концов отбрасываются.Каждая коррекция использует исходную
Расчет моделирования AN (ПЕРЕМЕННАЯ НОРМАЛИЗАЦИЯ)
Сначала мы устанавливаем некоторые матрицы и параметрыЧтобы немного объяснить,Согласно описанию исходного алгоритма, распределение вероятностей предсказания nnn выборок с относительно высокой достоверностью склеено, видно, что только 3 выборки имеют относительно высокую достоверность, а их категории предсказания равны 2, 0 и 2 соответственно;является образцомПрогнозируемая вероятность , поскольку это распределение вероятностей, сумма должна быть равна 1;представляет собой выборочное соотношение трех категорий, видно, что первая категория имеет много данных
Во-первых, это нормализация столбцов.Посмотрите внимательно на матрицу, это в сумме 1 для каждого столбца, то есть нормализация столбца, если мы вернемся к источнику, на самом делеэтопросуммируйте каждый столбец, затем поставьтеРазделите каждый элемент столбца на эту сумму
с последующей нормализацией строкнам просто нужнопоследняя строка, видно что оригиналРаспределение вероятностей, категория после «предварительной» корректировки явно смещается в сторону первой категории с большим количеством данных, иСумма векторов равна 1, что соответствует определению вероятности
На самом деле этот процесс очень просто реализовать на Python.Ниже приведен код, который я написал сам.Имена переменных точно такие же, как имена переменных в формуле.
import numpy as np
n, m, d, alpha = 3, 3, 5, 1
# n: 样本数量
# m: 类别数
# d: 迭代次数
# alpha: 次方
def softmax(arr):
return np.exp(arr) / np.sum(np.exp(arr))
A_0 = np.array([[0.2, 0, 0.8], [0.9, 0.1, 0], [0, 0, 1]])
# A_0 = softmax(np.random.randn(n, m))
b_0 = np.array([0.5, 0, 0.5])
# b_0 = softmax(np.random.randn(m))
L_0 = np.vstack((A_0, b_0)) # (n+1) * m
Lambda_q = np.diag( np.array([0.8, 0.1, 0.1]) )
# Lambda_q = np.diag( softmax(np.random.randn(m)) )
print("预测概率:", b_0)
print("各类别样本数量分布:", np.diag(Lambda_q, 0))
L_d_1 = L_0
for _ in range(d):
Lambda_S = np.diag( np.dot((L_d_1 ** alpha).T, np.ones((n + 1))) )
S_d = np.dot((L_d_1 ** alpha), np.linalg.inv(Lambda_S))
Lambda_L = np.diag( np.dot(np.dot(S_d, Lambda_q), np.ones((m))) )
L_d_1 = np.dot( np.dot(np.linalg.inv(Lambda_L), S_d), Lambda_q )
print("根据先验调整后的概率:", L_d_1[-1:])
эталонная реализация
Реализация босса Су Цзяньлиня приведена ниже.В его коде энтропия Top-k нормализована, чтобы гарантировать, что, лучше определить порог (то есть в кодеthreshold
)
import numpy as np
# 预测结果,计算修正前准确率
y_pred = np.array([[0.2, 0.5, 0.2, 0.1],
[0.3, 0.1, 0.5, 0.1],
[0.4, 0.1, 0.1, 0.4],
[0.1, 0.1, 0.1, 0.8],
[0.3, 0.2, 0.2, 0.3],
[0.2, 0.2, 0.2, 0.4]])
num_classes = y_pred.shape[1]
y_true = np.array([0, 1, 2, 3, 1, 2])
acc_original = np.mean([y_pred.argmax(1) == y_true])
print('original acc: %s' % acc_original)
# 从训练集统计先验分布
# prior = np.zeros(num_classes)
# for d in train_data:
# prior[d[1]] += 1.
# prior /= prior.sum()
prior = np.array([0.2, 0.2, 0.25, 0.35])
# 评价每个预测结果的不确定性
k = 3
y_pred_topk = np.sort(y_pred, axis=1)[:, -k:]
y_pred_topk /= y_pred_topk.sum(axis=1, keepdims=True) # 归一化
y_pred_entropy = -(y_pred_topk * np.log(y_pred_topk)).sum(1) / np.log(k) # top-k熵
print(y_pred_entropy)
# 选择阈值,划分高、低置信度两部分
threshold = 0.9
y_pred_confident = y_pred[y_pred_entropy < threshold] # top-k熵低于阈值的是高置信度样本
y_pred_unconfident = y_pred[y_pred_entropy >= threshold] # top-k熵高于阈值的是低置信度样本
y_true_confident = y_true[y_pred_entropy < threshold]
y_true_unconfident = y_true[y_pred_entropy >= threshold]
# 显示两部分各自的准确率
# 一般而言,高置信度集准确率会远高于低置信度的
acc_confident = (y_pred_confident.argmax(1) == y_true_confident).mean()
acc_unconfident = (y_pred_unconfident.argmax(1) == y_true_unconfident).mean()
print('confident acc: %s' % acc_confident)
print('unconfident acc: %s' % acc_unconfident)
# 逐个修改低置信度样本,并重新评价准确率
right, alpha, iters = 0, 1, 1 # 正确的个数,alpha次方,iters迭代次数
for i, y in enumerate(y_pred_unconfident):
Y = np.concatenate([y_pred_confident, y[None]], axis=0) # Y is L_0
for _ in range(iters):
Y = Y ** alpha
Y /= Y.sum(axis=0, keepdims=True)
Y *= prior[None]
Y /= Y.sum(axis=1, keepdims=True)
y = Y[-1]
if y.argmax() == y_true_unconfident[i]:
right += 1
# 输出修正后的准确率
acc_final = (acc_confident * len(y_pred_confident) + right) / len(y_pred)
print('new unconfident acc: %s' % (right / (i + 1.)))
print('final acc: %s' % acc_final)
Результаты экспериментов
Итак, сколько улучшений может принести такая простая постобработка? Экспериментальные результаты, приведенные в оригинальной статье, впечатляют:Вообще говоря, чем больше категорий, тем более очевидным будет улучшение.Если количество категорий мало, улучшение может быть слабым или даже меньше.
ONE MORE THING
Возникает естественный вопрос: почему бы просто не склеить все результаты с низкой достоверностью вместе с результатами с высокой степенью достоверности и не исправить их один за другим? На самом деле это легко понять.Первоначальное намерение CAN состоит в том, чтобы использовать «априорное распределение» для исправления низкой степени достоверности в сочетании с результатом высокой достоверности.В этом процессе, если добавляются еще результаты с низкой достоверностью, окончательный отклонение может быть больше, поэтому теоретически индивидуальная коррекция будет более надежной, чем пакетная коррекция.
REFERENCES
When in Doubt: Improving Classification Performance with Alternating Normalization