Практическое определение порога аномалии в (вариационных) автоэнкодерах

Хотя это не совсем вопрос программирования, я не нашел ничего по этой теме на этом сайте. В настоящее время я имею дело с (вариационными) автокодерами ((V) AE) и планирую использовать их для обнаружения аномалий. В целях тестирования я реализовал VAE в тензорном потоке для обнаружения рукописных цифр.

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

На данный момент у меня есть два основных вопроса:

1.) Для тренировки я использовал проигрыш, состоящий из двух составляющих. Первая - это ошибка реконструкции, которая является функцией кроссэнтропии:

# x: actual input
# x_hat: reconstructed input
epsilon = 1e-10  # <-- small number for numeric stability within log
recons_loss = - f.reduce_sum( x * tf.log( epsilon + x_hat) + (1 - x) * tf.log( epsilon + 1 - x_hat),
                             axis=1)

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

# z_mean: vector representing the means of the latent distribution
# z_log_var: vector representing the variances of the latent distribution
KL_div = -0.5 * tf.reduce_sum( 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var),
                              axis=1)

Должен ли я использовать обе части потери при обучении для определения ошибки реконструкции нового изображения? Интуитивно я бы сказал «нет» и просто выбрал recon_loss.

2.) Как определить пороговое значение? Есть ли уже реализованная функция tf, которую я могу использовать?

Если у вас есть хороший источник для чего-либо, поделитесь ссылкой!

Спасибо!


person DocDriven    schedule 29.05.2018    source источник


Ответы (1)


Недавно у меня была похожая проблема. VAE очень хорошо проецируют данные большой размерности в скрытое пространство меньшей размерности. Изменение скрытого вектора и передача его в часть декодера создает новые выборки.

Надеюсь, я правильно понял ваш вопрос, вы пытаетесь обнаружить аномалию с помощью кодирующей части в скрытом пространстве меньшей размерности?

Я предполагаю, что вы тренировали свой VAE по MNIST. Что вы можете сделать, так это получить все скрытые векторы цифр MNIST и сравнить с ними скрытый вектор вашей новой цифры через евклидово расстояние. Порог будет установленным вами максимальным расстоянием.

Код будет примерно таким:

x_mnist_encoded = encoder.predict(x_mnist, batch_size=batch_size) #array of MNIST latent vectors
test_digit_encoded = encoder.predict(x_testdigit, batch_size=1) #your testdigit latent vector

#calc the distance
from scipy.spatial import distance
threshold = 0.3 #min eucledian distance

for vector in x_mnist_encoded:
 dst = distance.euclidean(vector,test_digit_encoded[0])

 if dst <= threshold:
  return True

Код VAE взят из https://blog.keras.io/building-autoencoders-in-keras.html

person Daniel Tremer    schedule 29.05.2018
comment
Чтобы прояснить ситуацию: я обучил свой VAE работе с MNIST, теперь я хочу проверить, может ли он определять, подается ли ему нецифровое изображение, например. грамм. "X". Это нужно как-то обозначить. Я думал, что использую обе части, кодировщик и декодер, и как-то сравниваю необработанное изображение с моим восстановленным изображением. Не знаю, подходит ли для этого евклидово расстояние. - person DocDriven; 29.05.2018
comment
Вы описываете простую задачу двоичной классификации. Если вы действительно хотите использовать для этого модель VAE как некую неконтролируемую модель. Вы должны использовать только латентное векторное представление из части кодировщика. - person Daniel Tremer; 29.05.2018
comment
Декодер просто крут для генерации новых цифр. Другой способ сделать вашу классификацию - подогнать oneclassSVM к MNIST-латентным векторам. - person Daniel Tremer; 29.05.2018
comment
Хорошо, в этом есть смысл. Но разве сравнение нового изображения со всеми цифрами MNIST в скрытом пространстве не требует больших вычислительных затрат? Кроме того, предположим, что мое скрытое пространство двумерно, как бы выглядела формула? Мне кажется странным суммировать квадраты разностей средних и отклонений, как если бы добавляли яблоки к бананам. - person DocDriven; 30.05.2018
comment
Статья кажется интересной, мне нужно ее прочитать повнимательнее. Что касается вашей проблемы, даже в двумерном скрытом пространстве вы можете вычислить расстояние между точками и вашей новой цифрой. И да, это требует больших вычислительных ресурсов, чтобы сравнить вашу точку со всеми mnist точками, но это будет O (n). Использование скрытого представления было моим первым предположением, поскольку теоретически то, что оно делает, является уменьшением размеров, которое можно использовать для дальнейшей классификации. - person Daniel Tremer; 30.05.2018