exponenta event banner

Изучение классификационных решений с использованием методов градиентной атрибуции

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

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

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

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

Простейшая карта атрибуции градиента представляет собой градиент оценки класса для прогнозируемого класса относительно каждого пикселя во входном изображении [1]. Это показывает, какие пиксели оказывают наибольшее влияние на оценку класса, и, следовательно, какие пиксели наиболее важны для классификации. В этом примере показано, как использовать градиентную атрибуцию и два расширенных метода: управляемое обратное распространение [2] и интегрированные градиенты [3]. Использование этих методов обсуждается, поскольку неясно, насколько эти расширения могут обеспечить понимание модели [4].

Загрузить предварительно обученную сеть и образ

Загрузите предварительно подготовленную сеть GoogLeNet.

net = googlenet;

Извлеките размер входного изображения и классы вывода сети.

inputSize = net.Layers(1).InputSize(1:2);
classes = net.Layers(end).Classes;

Загрузите изображение. Изображение собаки по кличке Лайка. Измените размер изображения в соответствии с размером сетевого ввода.

img = imread("laika_grass.jpg");
img = imresize(img,inputSize);

Классифицируйте изображение и отобразите прогнозируемый класс и оценку классификации.

[YPred, scores] = classify(net, img);
[score, classIdx] = max(scores);

predClass = classes(classIdx);

imshow(img);
title(sprintf("%s (%.2f)",string(predClass),score));

Сеть относит Лайку к категории миниатюрных пуделей, что является разумной догадкой. Она пудель/кокер спаниель кросс.

Вычислить карту атрибутов градиента с помощью автоматического дифференцирования

Методы градиентной атрибуции основаны на поиске градиента оценки предсказания по отношению к входному изображению. Карта атрибуции градиента вычисляется по следующей формуле:

Wxyc=∂Sc∂Ixy

где Wxyc представляет важность пикселя в местоположении (x, y) для прогнозирования класса c, Sc представляет собой оценку softmax для этого класса, а Ixy представляет собой изображение в местоположении пикселя (x, y) [1].

Преобразование сети в dlnetwork чтобы можно было использовать автоматическое дифференцирование для вычисления градиентов.

lgraph = layerGraph(net);
lgraph = removeLayers(lgraph,lgraph.Layers(end).Name);

dlnet = dlnetwork(lgraph);

Укажите имя уровня softmax, 'prob'.

softmaxName = 'prob';

Чтобы использовать автоматическое дифференцирование, преобразуйте изображение Лайки в dlarray.

dlImg = dlarray(single(img),'SSC');

Использовать dlfeval и gradientMap функция (определенная в разделе «Вспомогательные функции» данного примера) для вычисления производной ∂Sc∂Ixy. gradientMap функция передает изображение вперед через сеть для получения оценок класса и содержит вызов dlgradient для оценки градиентов оценок относительно изображения.

dydI = dlfeval(@gradientMap,dlnet,dlImg,softmaxName,classIdx);

Карта атрибуции dydI множество 227 на 227 на 3. Каждый элемент в каждом канале соответствует градиенту оценки класса относительно входного изображения для этого канала исходного изображения RGB.

Существует ряд способов визуализации этой карты. Прямая печать карты атрибуции градиента как изображения RGB может быть неясной, так как карта обычно довольно шумная. Вместо этого суммировать абсолютные значения каждого пикселя вдоль размера канала, затем масштабировать между 0 и 1. Отображение карты атрибутов градиента с помощью пользовательской карты цветов с 255 цветами, отображающей значения 0 к белому и 1 к черному.

map = sum(abs(extractdata(dydI)),3);
map = rescale(map);

cmap = [linspace(1,0,255)' linspace(1,0,255)' linspace(1,0,255)'];

imshow(map, "Colormap", cmap);
title("Gradient Attribution Map (" + string(predClass) + ")");

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

Резкость карты атрибуции градиента с помощью управляемого обратного распространения

Можно получить более четкую карту атрибуции градиента, изменив обратный проход сети через слои ReLU так, чтобы элементы градиента, которые меньше нуля, и элементы ввода на уровень ReLU, которые меньше нуля, были установлены в ноль. Это известно как управляемое обратное распространение [2].

Обратная функция управляемого обратного распространения:

dLdZ = (X > 0) * (dLdZ > 0) * dLdZ

где L - потеря, X - вход в уровень ReLU, а Z - выход.

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

Использовать вспомогательную функцию replaceLayersofType (определено в разделе «Вспомогательные функции» данного примера) для замены всех экземпляров reluLayer в сети с экземплярами CustomBackpropReluLayer. Установите BackpropMode свойство каждого CustomBackpropReluLayer кому "guided-backprop".

customRelu = CustomBackpropReluLayer();
customRelu.BackpropMode = "guided-backprop";

lgraphGB = replaceLayersOfType(lgraph, ...
    "nnet.cnn.layer.ReLULayer",customRelu);

Преобразовать график слоев, содержащий CustomBackpropReluLayers в dlnetwork.

dlnetGB = dlnetwork(lgraphGB);

Вычислите и постройте карту градиентной атрибуции для сети с помощью управляемого обратного распространения.

dydIGB = dlfeval(@gradientMap,dlnetGB,dlImg,softmaxName,classIdx);

mapGB = sum(abs(extractdata(dydIGB)),3);
mapGB = rescale(mapGB);

imshow(mapGB, "Colormap", cmap);
title("Guided Backpropagation (" + string(predClass) + ")");

Вы можете видеть, что метод направляемого обратного распространения более четко выделяет различные части собаки, такие как глаза и нос.

Также можно использовать технику Цейлера-Фергуса для обратного распространения через уровни ReLU [5]. Для техники Цейлера - Фергуса обратная функция задаётся как:

dLdZ = (dLdZ > 0) * dLdZ

Установите BackpropMode имущества CustomBackpropReluLayer экземпляры для "zeiler-fergus".

customReluZF = CustomBackpropReluLayer();
customReluZF.BackpropMode = "zeiler-fergus";

lgraphZF = replaceLayersOfType(lgraph, ...
    "nnet.cnn.layer.ReLULayer",customReluZF);

dlnetZF = dlnetwork(lgraphZF);

dydIZF = dlfeval(@gradientMap,dlnetZF,dlImg,softmaxName,classIdx);


mapZF = sum(abs(extractdata(dydIZF)),3);
mapZF = rescale(mapZF);

imshow(mapZF,"Colormap", cmap);
title("Zeiler-Fergus (" + string(predClass) + ")");

Карты градиентной атрибуции, вычисленные с использованием метода обратного распространения Цейлера-Фергуса, гораздо менее ясны, чем карты, вычисленные с использованием управляемого обратного распространения.

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

Подход интегрированных градиентов вычисляет интегрированные градиенты оценки класса по отношению к пикселям изображения по набору изображений, которые линейно интерполируются между базовым изображением и исходным изображением, представляющим интерес [3]. Метод интегрированных градиентов разработан так, чтобы быть чувствительным к изменениям значения пикселя по сравнению с интегрированием, так что если изменение значения пикселя влияет на оценку класса, этот пиксель имеет ненулевое значение на карте. Нелинейности в сети, такие как уровни ReLU, могут предотвратить эту чувствительность в более простых методах градиентной атрибуции.

Карта атрибутов интегрированных градиентов рассчитывается как

Wxyc = (Ixy-Ixy0) ∫α=01dα∂Sc (Ixy (α)) ∂Ixy (α),

где Wxyc - значение карты для класса c в местоположении пикселя (x, y), Ixy0 - базовое изображение, а Ixy (α) - изображение на расстоянии α вдоль пути между базовым изображением и входным изображением:

Ixy (α) = Ixy0 + α (Ixy-Ixy0).

В этом примере формула интегрированных градиентов упрощается суммированием по дискретному индексу n, вместо интегрирования по α:

Wxyc = (Ixy-Ixy0) ∑n=0N∂Sc (Ixyn) ∂Ixyn,

с

Ixyn = Ixy0 + nN (Ixy-Ixy0).

Для данных изображения выберите изображение базовой линии в виде черного изображения с нулями. Найдите изображение, которое отличается от исходного изображения на базовое. В этом случае differenceImg совпадает с исходным изображением, так как базовое изображение равно нулю.

baselineImg = zeros([inputSize, 3]);
differenceImg = single(img) - baselineImg;

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

numPathImages = 25;

pathImgs = zeros([inputSize 3 numPathImages-1]);
for n=0:numPathImages-1
    pathImgs(:,:,:,n+1) = baselineImg + (n)/(numPathImages-1) * differenceImg;
end

figure;
imshow(imtile(rescale(pathImgs)));
title("Images Along Integration Path");

Преобразование мини-пакета изображений путей в dlarray. Форматирование данных с использованием формата 'SSCB' для двух пространственных, одного канала и одного пакетного измерения. Каждое изображение пути представляет собой одно наблюдение в мини-пакете. Вычислите карту градиента для результирующего пакета изображений вдоль траектории.

dlPathImgs = dlarray(pathImgs, 'SSCB');
dydIIG = dlfeval(@gradientMap, dlnet, dlPathImgs, softmaxName, classIdx);

Для каждого канала суммируйте градиенты всех наблюдений в мини-пакете.

dydIIGSum = sum(dydIIG,4);

Умножьте каждый элемент суммированных карт атрибуции градиента на соответствующий элемент differenceImg. Для вычисления интегрированной карты атрибутов градиента суммируйте данные по каждому каналу и выполните масштабирование.

dydIIGSum = differenceImg .* dydIIGSum;

mapIG = sum(extractdata(abs(dydIIGSum)),3);
mapIG = rescale(mapIG);

imshow(mapIG, "Colormap", cmap);
title("Integrated Gradients (" + string(predClass) + ")");

Вычисленная карта показывает, что сеть более сильно ориентирована на лицо собаки как средство принятия решения о ее классе.

Показанные здесь методы градиентной атрибуции можно использовать для проверки того, фокусируется ли ваша сеть на ожидаемых частях изображения при создании классификации. Чтобы получить четкое представление о том, как работает ваша модель, и объяснить решения по классификации, вы можете выполнить эти методы для ряда изображений и найти конкретные функции, которые сильно способствуют определенному классу. Метод неизмененных градиентных атрибутов, вероятно, будет более надежным методом объяснения сетевых решений. Хотя управляемое обратное распространение и интегрированные градиентные методы могут дать наиболее четкие градиентные карты, неясно, насколько эти методы могут дать представление о том, как работает модель [4].

Вспомогательные функции

Функция карты градиента

Функция gradientMap вычисляет градиенты оценки относительно изображения для указанного класса. Функция принимает одно изображение или мини-пакет изображений. В этом примере функция gradientMap представлен в разделе «Вычислительная карта атрибутов градиента с использованием автоматического дифференцирования».

function dydI = gradientMap(dlnet, dlImgs, softmaxName, classIdx)
% Compute the gradient of a class score with respect to one or more input
% images.

dydI = dlarray(zeros(size(dlImgs)));

for i=1:size(dlImgs,4)
    I = dlImgs(:,:,:,i);
    scores = predict(dlnet,I,'Outputs',{softmaxName});
    classScore = scores(classIdx);
    dydI(:,:,:,i) = dlgradient(classScore,I);
end
end

Заменить функцию слоев

replaceLayersOfType функция заменяет все слои указанного класса экземплярами нового слоя. Новым слоям присваиваются те же имена, что и исходным слоям. В этом примере функция replaceLayersOfType представлен в разделе «Резкость карты атрибуции градиента с помощью управляемого обратного распространения».

function lgraph = replaceLayersOfType(lgraph, layerType, newLayer)
% Replace layers in the layerGraph lgraph of the type specified by
% layerType with copies of the layer newLayer.

for i=1:length(lgraph.Layers)
    if isa(lgraph.Layers(i), layerType)
        % Match names between old and new layer.
        layerName = lgraph.Layers(i).Name;
        newLayer.Name = layerName;
        
        lgraph = replaceLayer(lgraph, layerName, newLayer);
    end
end
end

Ссылки

[1] Симоньян, Карен, Андреа Ведальди и Эндрю Зиссерман. «Глубоко внутри сверточные сети: визуализация моделей классификации изображений и карт солености». ArXiv:1312.6034 [Cs], 19 апреля 2014 г. http://arxiv.org/abs/1312.6034.

[2] Спрингенберг, Йост Тобиас, Алексей Досовицкий, Томас Брокс и Мартин Ридмиллер. «Стремление к простоте: вся сверточная сеть». ArXiv:1412.6806 [Cs], 13 апреля 2015 г. http://arxiv.org/abs/1412.6806.

[3] Сундарараджан, Мукунд, Анкур Тали и Цици Янь. «Аксиоматическая атрибуция для глубоких сетей». Материалы 34-й Международной конференции по машинному обучению (ПМЛР) 70 (2017): 3319-3328

[4] Адебайо, Джулиус, Джастин Гилмер, Майкл Мюлли, Иэн Гудфелло, Мориц Хардт и Бе Ким. «Проверки работоспособности для карт удовлетворенности». ArXiv:1810.03292 [Cs, Stat], 27 октября 2018 года. http://arxiv.org/abs/1810.03292.

[5] Цейлер, Мэтью Д. и Роб Фергус. «Визуализация и понимание сверточных сетей». В компьютерном видении - ECCV 2014. Лекционные записки по информатике 8689, под редакцией Д. Флита, Т. Пайдлы, Б. Шиле, Т. Туйтелаарса. Спрингер, Чам, 2014.

См. также

| | | | | | |

Связанные темы