Почему мы должны доверять ИИ настолько, чтобы управлять автомобилями, выявлять болезни и идентифицировать подозреваемых, если это черный ящик?

Вступление

Является ли ИИ всего лишь черным ящиком, которому мы начали достаточно доверять, чтобы водить машины, обнаруживать болезни, идентифицировать подозреваемых только из-за шумихи?

Возможно, вы слышали о документальном фильме Netflix Coded Bias (вы можете посмотреть фильм здесь). Фильм критикует алгоритмы глубокого обучения за присущие им предубеждения; в частности, их неспособность обнаружить темнокожие и женские лица. В фильме говорится, что решение проблемы находится в правительстве. Настаивать на принятии первого в США закона, направленного против предвзятости алгоритмов, влияющих на всех нас. Есть ли что-то изначально предвзятое в самих алгоритмах глубокого обучения или это вопрос предвзятости в данных обучения? Хотя существует потребность в регулировании ИИ, большая часть решения принадлежит инженерам по машинному обучению. Нам нужно сделать наши алгоритмы глубокого обучения более понятными, найти слабые места и предвзятость и улучшить наши алгоритмы.

Как мы можем понять, что наша сверточная нейронная сеть (черный ящик) видит и понимает при принятии решения?

Этот блог посвящен созданию тепловых карт с визуальным объяснением, которые помогут нам понять, как алгоритмы глубокого обучения принимают решения. В Forsight, стартапе строительных технологий, специализирующемся на безопасности строительства, наша команда компьютерного зрения использует визуальное объяснение для улучшения наших наборов данных и моделей. Подробнее о нашей работе читайте здесь. А пока мы собираемся изучить алгоритм визуального объяснения: Grad-CAM.

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

Дополнительная записная книжка Google Colab поможет вам воспроизвести созданные здесь тепловые карты. Не стесняйтесь копировать и использовать код в своих проектах!

Набор данных и модель

Прежде чем применять интерпретацию Grad-CAM к сложным наборам данных и задачам, давайте оставим ее простой с помощью классической задачи классификации изображений. Мы будем классифицировать кошек и собак с помощью высококачественного набора данных от kaggle. Здесь у нас есть большой набор данных, содержащий 37 500 изображений (25 000 поездов и 12 500 тестов). Данные состоят из двух классов: кошка и собака. Данные содержат кошек и собак с разным фоном, разным уровнем яркости и участием в различных действиях, которые будут проверять наши визуальные объяснения!

В блокноте Google Colab вы загрузите предварительно обученную модель, которая уже может классифицировать кошек и собак. Для тех, кто интересуется архитектурой модели: она состоит из уровня масштабирования для стандартизации, за которым следуют слои MobileNetV2, предварительно обученные на наборе данных COCO. После базовой модели мы включили глобальный средний уровень объединения, слой исключения с 10% исключения и плотный слой прогнозирования. Вы можете увидеть все метрики оценочного набора после обучения на рисунке ниже. Напоминание о том, что ложное срабатывание указывает на то, что кошка ошибочно классифицируется как собака. Точно так же ложноотрицательный результат указывает на то, что собака ошибочно классифицируется как кошка. Имея подготовленную модель, готовую к работе, мы готовы исследовать вопрос: как она принимает свои решения?

Град-САМ

Внимание, Grad-CAM может быть сложно осмыслить.

Градиентно-взвешенное отображение активации классов (Grad-CAM), использует градиенты любой целевой концепции (скажем, «собака» в сети классификации или последовательность слов в сети субтитров), переходящих в последний сверточный слой, чтобы произвести грубое выделение карты локализации. важные области изображения для предсказания концепции.

Техника - это усовершенствование предыдущих подходов по универсальности и точности. Это сложно, но, к счастью, вывод интуитивно понятен. На высоком уровне мы берем изображение в качестве входных данных и создаем модель, которая обрезается на слое, для которого мы хотим создать тепловую карту Grad-CAM. Мы прикрепляем полносвязные слои для предсказания. Затем мы пропускаем входные данные через модель, захватываем выходные данные слоя и потери. Затем мы находим градиент выходного сигнала нашего желаемого модельного слоя по отношению к. потеря модели. Оттуда мы берем участки градиента, которые способствуют прогнозированию, уменьшаем, изменяем размер и масштабируем так, чтобы тепловая карта могла быть наложена на исходное изображение. Вы можете выполнить конкретные шаги в приведенном ниже коде и ознакомиться с академической статьей, в которой изложены все математические вопросы здесь.

gradModel = Model(
inputs=[model.inputs],
outputs=[model.get_layer(layer_name).output,
model.output])
with tf.GradientTape() as tape:
   # cast the image tensor to a float-32 data type, pass the
   # forward propagate the image through the gradient model, and grab the loss
   # associated with the specific class index
   inputs = tf.cast(img_array, tf.float32)
   (convOutputs, predictions) = gradModel(inputs)
   loss = predictions[:, 0]
# use automatic differentiation to compute the gradients
grads = tape.gradient(loss, convOutputs)
# compute the guided gradients
castConvOutputs = tf.cast(convOutputs > 0, "float32")
castGrads = tf.cast(grads > 0, "float32")
guidedGrads = castConvOutputs * castGrads * grads
# the convolution and guided gradients have a batch dimension
# (which we don't need) so let's grab the volume itself and
# discard the batch
convOutputs = convOutputs[0]
guidedGrads = guidedGrads[0]
# compute the average of the gradient values, and using them
# as weights, compute the ponderation of the filters with
# respect to the weights
weights = tf.reduce_mean(guidedGrads, axis=(0, 1))
cam = tf.reduce_sum(tf.multiply(weights, convOutputs), axis=-1)
# grab the spatial dimensions of the input image and resize
# the output class activation map to match the input image
# dimensions
(w, h) = (img_array.shape[2], img_array.shape[1])
heatmap = cv2.resize(cam.numpy(), (w, h))
# normalize the heatmap such that all values lie in the range
# [0, 1], scale the resulting values to the range [0, 255],
# and then convert to an unsigned 8-bit integer
numer = heatmap - np.min(heatmap)
denom = (heatmap.max() - heatmap.min()) + eps
heatmap = numer / denom

Вооружившись кодом создания Grad-CAM, мы взяли нашу предварительно обученную модель и набор для проверки, чтобы увидеть, что наша модель узнала о кошках и собаках.

Мы начали создавать тепловые карты Grad-CAM для последнего сверточного слоя в нашей модели, Conv_1. Теоретически тепловая карта для этого слоя должна отображать наиболее точное визуальное объяснение объекта, классифицируемого моделью.

В математике градиента мы фиксируем важность всех последовательных карт функций, ведущих к последнему сверточному слою. Мы заметили, что хотя тепловая карта действительно выделяет классифицированный объект, в данном случае кошку, она не очень точна. Подчеркнутый участок (красный) охватывает области кошки, но не подходит для кошки с большой точностью. Область включает участки человеческой рубашки, руки человека и фона. Мы знаем, что модель видит кошку, но не совсем уверены, что именно в кошке убеждает модель в том, что это на самом деле кошка. Как сделать тепловую карту Grad-CAM более точной?

Вы заметите, что приведенный выше код был заключен в функцию записной книжки Google Colab, позволяющую воспроизводить Grad-CAM для разных слоев модели. Давайте исследуем более ранние слои модели с помощью этой функции.

Здесь есть что переварить. По мере изучения тепловых карт стала вырисовываться логика обучения модели. Первые ~ 10 слоев (блоки с 1 по 3) определяют контуры и границы изображения. Слои по глубине снимают акцент с объектов, а слои при проецировании и расширении снимают подчеркивание с контуров. Следующие ~ 20 слоев (блоки с 4 по 11) обнаруживают концепции в изображении. Блок 4 расширяет relu - отличный пример.

На этом этапе архитектуры модели формы, определяющие характеристики кошки, начинают выделяться из общих контуров изображения. Вы можете увидеть, как усы, уши и глаза кошки подчеркнуты оттенками красного и желтого, а остальная часть изображения окрашена в синий и зеленый цвета. Вы можете увидеть, как модель рассуждает о том, как определяющие характеристики кошки различают это изображение, когда мы углубимся в слои модели. Последние ~ 16 слоев (блоки с 12 по 16) пытаются идентифицировать объект на изображении, используя пространственную информацию из самых ранних слоев и концепций, разработанных позже. Последний слой модели, Conv_1, правильно определяет общую область объекта, но не улавливает нюансы объекта, которые присутствуют на тепловых картах Grad-CAM более раннего слоя. Мы использовали человеческую интуицию вместо математики Grad-CAM, и она улучшила результаты Grad-CAM.

Чтобы включить более ранние слои, мы усреднили тепловые карты Grad-CAM из всех слоев модели. Вы можете увидеть результат ниже.

Тепловая карта Grad-CAM теперь подчеркивает морду, глаза и лапы кошки и уменьшает акцент на руке человека. В целом, у нас есть гораздо более точная область акцента, которая определяет местонахождение кошки. Мы знаем, что модель классифицирует это изображение как кошку из-за его внутренних особенностей, а не из-за общей области изображения.

Модель особенно впечатляет тем, что это сложный образ! На человеке бело-черная рубашка того же цвета, что и кошка. Тем не менее, модель может отличить морду черной кошки от черной человеческой рубашки. Благодаря многоуровневому Grad-CAM мы узнали о сильных сторонах моделей. Как мы можем использовать Grad-CAM, чтобы узнать о слабых сторонах нашей модели?

Давайте подробнее рассмотрим 7 изображений кошек, ошибочно отнесенных к собакам, как вы можете видеть ниже.

Мы можем использовать тепловые карты Grad-CAM, чтобы понять, почему у модели возникли проблемы с правильной классификацией. Похоже, что у модели возникли проблемы с различением кошки, когда она сидит за клеткой (4, 7). Мы видим из Grad-CAM, что модель подчеркивает решетки клетки и не может найти черты кошки. На рисунках 5 и 6 отличительными чертами изображения являются кошачьи хвосты. Но по Grad-CAM мы видим, что модель не может распознать эту функцию, поскольку она окрашена в оттенки зеленого и синего. Самый ясный пример того, что могут предоставить тепловые карты Grad-CAM, находится в №1. Модель сбивает с толку игрушка, с которой играет кошка. Из тепловой карты видно, что модель считает игрушку частью кошки. Путаница привела к ошибочной классификации модели. Используя эти знания, мы можем найти больше примеров кошек, играющих с игрушками, и включить их в наш набор данных, что поможет нашей модели учиться и совершенствоваться.

Улучшение модели

Заметив, что у нашей модели возникли проблемы с клетками, мы представили ей несколько более конкретных примеров из изображений Google; в частности, ящики-транспортеры.

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

Мы создали дополнительный набор данных о кошках и собаках в транспортных ящиках из изображений Google. Используя альбументации , мы дополнили набор данных дополнительными аугментациями изображений. Вооружившись необходимыми данными, мы начали экспериментировать. Мы создали серию моделей с нашим исходным набором данных и добавили 25%, 50%, 75% и 100% дополнительных данных ящика транспортера. На каждой итерации нашего эксперимента мы возвращались к Grad-CAM, чтобы посмотреть, скорректировала ли модель область акцента на исходном изображении.

Чтобы увидеть, где модель действительно влияет, мы создали маску, которая использует пороговую обработку для захвата наиболее интенсивных (красных) областей Grad-CAM. Мы использовали маску, чтобы затем сегментировать наиболее важные пиксели исходного изображения.

Как видно из отфильтрованного изображения выше, фокус модели смещается с ящика на морду и особенности кошки по мере того, как мы добавляем больше изображений из дополнительного набора данных в наш обучающий набор данных. И это не займет много времени, прежде чем модель начнет правильно классифицировать! Когда модель обучается на исходном наборе данных плюс только 25% дополнительного набора данных ящика транспортера, модель присваивает 90% вероятность того, что на изображении выше изображена кошка.

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

Заключение

В этом блоге мы, надеюсь, предоставили некоторые полезные сведения и инструменты для визуального объяснения сверточной нейронной сети с использованием Grad-CAM. С помощью кошек и собак мы выяснили, как модель различает классы. Мы улучшили результаты Grad-CAM для последнего сверточного слоя, учитывая тепловые карты всех слоев модели. Мы использовали Grad-CAM, чтобы выявить области предвзятости и слабости модели. Что наиболее важно, мы использовали Grad-CAM для улучшения наших алгоритмов. Машинное обучение - это итеративный процесс, в котором наши модели никогда не бывают достаточно хорошими. Мы надеемся, что представленные здесь методы помогут обеспечить большую прозрачность и укрепить доверие к моделям на протяжении всего процесса улучшения. В Forsight мы используем тепловые карты Grad-CAM, чтобы определять ошибочные акценты в наших моделях.

Чтобы помочь энтузиастам машинного обучения / искусственного интеллекта и всем, кто заинтересован в решении этой проблемы в целом, мы создали и поделились записной книжкой Google Colab, которая дает вам возможность экспериментировать и производить теплоотвод Grad-CAM. карты, которые мы представили в этом блоге.

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

использованная литература

  1. Рампрасаат Р. Сельвараджу и др., 2019, Grad-CAM: визуальные объяснения из глубоких сетей с помощью градиентной локализации, https://arxiv.org/pdf/1610.02391.pdf
  2. Собаки против кошек, https://www.kaggle.com/c/dogs-vs-cats/data
  3. Марк Сандлер и др., 2019, MobileNetV2: инвертированные остатки и линейные узкие места, https://arxiv.org/abs/1801.04381
  4. Закодированное смещение, 2020, https://www.codedbias.com/