Начало работы, Интерпретируемость модели

Основы: Градиент * Ввод как объяснение

Простой метод для простых функций.

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

Gradient * Input - отличный способ объяснить дифференцируемые модели машинного обучения, такие как нейронные сети, поскольку он концептуально прост и прост в реализации. Вычисление градиентов также происходит очень быстро, особенно если вы используете современные библиотеки машинного обучения, такие как pytorch, TensorFlow или JAX, которые включают автоматическое дифференцирование.

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

Что такое градиенты?

Скорее всего, вы встречали выпускников в средней школе или университете. Это не будет строгим введением, а просто напоминанием.

Во-первых, нам нужно вспомнить, что такое производные. По сути, производная дифференцируемой функции f (x): ℝ → ℝ сообщает нам для любого входа x, насколько изменится f (x), если мы немного увеличим x.

Это полезно, например, для задач выпуклой оптимизации: чтобы найти минимум, мы просто начинаем с любой точки и идем в направлении, в котором f (x) уменьшается больше всего, и повторяем вычисление градиента и выполнение шагов, пока не дойдем до минимума, т. Е. градиентный спуск.

градиент дифференцируемой функции f (x): ℝ ^ d → ℝ - это просто вектор (частных) производных от f (x) относительно. к каждому из d измерений x.

Градиент сообщает нам для любой точки (x1, x2), насколько f (x1, x2) изменится при небольшом шаге в любом направлении в d-мерном пространстве ввода. Таким образом, он также сообщает нам, в каком направлении f (x1, x1) увеличится больше всего.

Формально мы запишем градиент f (x) относительно x как ∇f (x).

Как выглядит атрибуция?

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

Например, рассмотрим DNN, обученный распознавать крокодилов по изображению. Метод атрибуции будет присваивать оценку каждому пикселю ввода, указывая, насколько этот пиксель способствовал окончательному результату (крокодил или не крокодил). Если мы объединим эти отдельные атрибуты обратно в матрицу, мы обычно называем их картой атрибуции. Мы можем визуализировать карту атрибуции в виде изображения, указывающего, какие области изображения важны.

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

Что такое Gradient * Input?

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

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

Идея состоит в том, что градиент говорит нам о важности измерения, а входные данные говорят нам, насколько сильно это измерение выражено в изображении. Суммируя все это вместе, атрибуция для измерения является высокой только в том случае, если 1) измерение кажется важным для вывода и 2) значение для измерения высокое.

Пока все кажется очень разумным. Есть только одна проблема: градиент говорит нам о важности измерения, только если мы сделаем крошечный шаг. Это очень локальная информация, и при объяснении сложных функций градиент может быстро измениться даже после нескольких крошечных шагов во входном пространстве. Это означает, что функция может возрасти, если мы сделаем шаг в направлении градиента, но она также может упасть, если мы сделаем больший шаг в том же направлении, что фактически аннулирует объяснение, предоставляемое градиентами.

Это звучит довольно неутешительно, и, безусловно, есть наборы данных и модели, для которых Gradient * Input лучше, чем для других. Если вы пытаетесь объяснить неглубокую нейронную сеть, ее все же стоит попробовать.

Однако есть средства решения этой проблемы, которые основываются на том же принципе, что и Gradient * Input, но делают его более надежным. Возможно, самыми простыми из них являются SmoothGrad и Integrated Gradients, но существует бесчисленное множество других методов, которые более сложны и могут основываться на других принципах.

Заключительные слова и альтернативы

Сила Gradient * Input в том, что он такой простой и быстрый. Это также прочная концептуальная основа для более сложных методов объяснения.

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

В одном из своих предыдущих постов я сравнивал методы объяснения, основанные на градиентах. Все они основаны на Gradient * Input и адаптированы для более удобного объяснения сложных функций.

Конечно, есть еще много способов объяснения. К наиболее популярным из них относятся Анализ окклюзии, SmoothGrad, Интегрированные градиенты, Ожидаемые градиенты, LRP, DeepLIFT и Значения Шепли. Я бы посоветовал обратиться к ним, если вы хотите объяснить глубокие нейронные сети.

Надеюсь, вы узнали что-то полезное.