Hengyuan Cloud_CAN: повышение производительности классификации с помощью распределения данных

глубокое обучение
Hengyuan Cloud_CAN: повышение производительности классификации с помощью распределения данных

Источник статьи | Облачное сообщество 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?

Вернемся к задаче классификации, предположим, что теперь есть проблема бинарной классификации, модель для вводаaaПрогнозируемый результатp(a)=[0.05,0.95]p^{(a)}=[0.05,0.95], то мы можем присвоить прогнозируемой категории значение 1; затем для входных данныхbb, результат прогноза, данный моделью, равенp(b)=[0.5,0.5]p^{(b)}=[0.5,0.5], этот результат самый неопределенный, и мы не знаем, какой класс должен быть выведен

Но если я скажу вам:

  1. Категория должна быть одной из 0 или 1
  2. Вероятность появления двух категорий составляет 0,5 каждая.

В случае знания этих двух «априорных» сведений, поскольку результат предсказания предыдущей выборки равен 1, то, основываясь на наивной идее равномерности, будем ли мы более склонны предсказывать последнюю выборку как 0, чтобы получить Удовлетворительное Вторая точка "предварительных" результатов прогноза?

За этими простыми примерами стоит та же идея, что и в CAN, которая заключается в использовании «априорного распределения» для исправления результатов прогнозирования «низкой достоверности», чтобы распределение новых результатов прогнозирования было ближе к предыдущему распределению.

Энтропия ТОП-К

Если быть точным, CAN — это метод постобработки результатов прогнозирования с низкой достоверностью, поэтому сначала нам нужно иметь индикатор для измерения неопределенности результатов прогнозирования. Обычной мерой является «энтропия», посколькуp=[p1,p2,,pm]р=[р_1,р_2,…,р_м],определяется как

ICs0sA.png

Хотя энтропия является распространенным выбором, она не всегда дает результаты, соответствующие нашему интуитивному пониманию. Например дляp(a)=[0.5,0.25,0.25]иp(b)=[0.5,0.5,0]p^{(a)}=[0.5, 0.25,0.25] и p^{(b)}=[0.5,0.5,0], непосредственно применить формулу, чтобы получитьH(p(b))H(p(b))H(p^{(b)})H(p ^{(b)} ), но если люди оценят эти два распределения вероятностей субъективно, то, очевидно, мы подумаем, чтоp(b)Сравниватьp(a)p^{(b)} лучше, чем p^{(a)}Более неопределенно, поэтому прямое использование энтропии недостаточно разумно.

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

Простая коррекция состоит в том, чтобы использовать для вычисления энтропии только верхние k значений вероятности, предполагаяp1,p2,,pkр_1,р_2,…,р_кнаиболее вероятноkkзначение, тоimage.png

в,T\mathcal{T}представляет собой операцию над верхними значениями k вектора с наибольшимRm{R}^{m}Rk{R}^{k}. Мы можем расширить уравнение (2) до уравнения (1), чтобы получитьimage.png

в,p i=pi/i=1kpip~i= p_i / \sum\limits_{i=1}^k p_i

ПЕРЕМЕННАЯ НОРМАЛИЗАЦИЯ

В этой части я сначала дам описание шагов алгоритма в статье, а в следующем разделе я смоделирую процесс расчета вручную.

Step1

Пусть вектор-столбецb0еRm\mathbf{b}_0\in \mathbb{R}^mдля входного образцаxxВ соответствии с распределением вероятностей каждой категории,mmУказывает количество категорий. мы генерируемnn×mmМатрица вероятностиA0,A0А_0, А_0ФактическиnnВыборка с очень высокой достоверностью получается путем объединения прогнозируемых векторов вероятности каждой категории.A0иb0A_0 и \mathbf{b}_0объединить, чтобы получить(n+1)×m(n+1)×mматрицаL0L_0 image.png

Step2

Второй шаг представляет собой итерационный процесс, в частности, матрицуL0L_0Выполните нормализацию столбца (чтобы сумма каждого столбца равнялась 1), затем выполните нормализацию строки (чтобы сумма каждой строки равнялась 1). Прежде чем приступить к шагам алгоритма, определим операцию диагонализации вектора:image.pngD(v) преобразует вектор-столбецvеRn\mathbf{v}\in \mathbb{R}^nпреобразовать вn×nn×nДиагональная матрица , диагональные элементы являются исходными элементами вектора

нормализация столбца image.pngСреди них параметрαеN+\alpha \in \mathbb{N}^+контрольb0\mathbf{b}_0Скорость сходимости к высокой достоверности (чем больше скорость, тем быстрее, значение по умолчанию равно 1);eеRn+1\mathbf{e}\in \mathbb{R}^{n+1}является вектор-столбцом всех единиц. После преобразования формулы (4) матрицаSdеR(n+1)×mS_d\in \mathbb{R}^{(n+1)\times m}даLd1L_{d-1}форма матрицы, нормализованная по столбцам;ΛS1\Lambda_S^{-1}даΛS\Lambda_Sинверсия

нормализация строк image.pngв,eеRm\mathbf{e}\in \mathbb{R}^{m}Это по-прежнему вектор-столбец из всех единиц, но в настоящее время его размерность ммм; матрицаLdеR(n+1)×mL_d\in \mathbb{R}^{(n+1)\times m}нормализуется по строке (ноLdL_dЭто не нормализованная по строкам форма конкретной матрицы);ΛqеRm×m\Lambda_q \in \mathbb{R}^{m\times m}— диагональная матрица, а элементы на диагонали — коэффициенты распределения каждой категории

НапримерICysX9.pngУказывает, что это задача трех классов, и соотношение каждой категории составляет 1:2:2.

Step3

Итерация цикла Step2ddМатрица, полученная после разLdL_d:image.png

в,bd\mathbf{b}_dэто новое распределение вероятностей, скорректированное в соответствии с «предыдущим распределением»

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

Расчет моделирования AN (ПЕРЕМЕННАЯ НОРМАЛИЗАЦИЯ)

Сначала мы устанавливаем некоторые матрицы и параметрыimage.pngЧтобы немного объяснить,A0A_0Согласно описанию исходного алгоритма, распределение вероятностей предсказания nnn выборок с относительно высокой достоверностью склеено, видно, что только 3 выборки имеют относительно высокую достоверность, а их категории предсказания равны 2, 0 и 2 соответственно;b0b_0является образцомxxПрогнозируемая вероятность , поскольку это распределение вероятностей, сумма должна быть равна 1;Λq\Lambda_qпредставляет собой выборочное соотношение трех категорий, видно, что первая категория имеет много данных

Во-первых, это нормализация столбцов.image.pngПосмотрите внимательно на матрицуSdS_d, это в сумме 1 для каждого столбца, то есть нормализация столбца, если мы вернемся к источнику, на самом делеSdS_dэтоL0L_0просуммируйте каждый столбец, затем поставьтеL0L_0Разделите каждый элемент столбца на эту сумму

с последующей нормализацией строкimage.pngнам просто нужноL1L_1последняя строкаb1=[23/25,0,2/25]T\mathbf{b}_1=\begin{bmatrix}23/25,0,2/25\end{bmatrix}^T, видно что оригиналb0\mathbf{b}_0Распределение вероятностей[0.5,0,0.5]T\begin{bmatrix}0.5 ,0,0.5\end{bmatrix}^T, категория после «предварительной» корректировки явно смещается в сторону первой категории с большим количеством данных, иb1\mathbf{b}_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 нормализована, чтобы гарантировать, чтоHtop-k(p)е[0,1]H_{\text{top-k}} (p) \in [0,1], лучше определить порог (то есть в коде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)

Результаты экспериментов

Итак, сколько улучшений может принести такая простая постобработка? Экспериментальные результаты, приведенные в оригинальной статье, впечатляют:image.pngВообще говоря, чем больше категорий, тем более очевидным будет улучшение.Если количество категорий мало, улучшение может быть слабым или даже меньше.

ONE MORE THING

Возникает естественный вопрос: почему бы просто не склеить все результаты с низкой достоверностью вместе с результатами с высокой степенью достоверности и не исправить их один за другим? На самом деле это легко понять.Первоначальное намерение CAN состоит в том, чтобы использовать «априорное распределение» для исправления низкой степени достоверности в сочетании с результатом высокой достоверности.В этом процессе, если добавляются еще результаты с низкой достоверностью, окончательный отклонение может быть больше, поэтому теоретически индивидуальная коррекция будет более надежной, чем пакетная коррекция.

REFERENCES

When in Doubt: Improving Classification Performance with Alternating Normalization

МОЖЕТ:Простые приемы постобработки для повышения производительности классификации с помощью предыдущих распределений