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

Аддитивные объяснения Шепли (SHAP):

Способность правильно интерпретировать выходные данные модели прогнозирования чрезвычайно важна. Он вызывает соответствующее доверие пользователей, дает представление о том, как можно улучшить модель, и поддерживает понимание моделируемого процесса. В некоторых приложениях простые модели (например, линейные модели) часто предпочтительнее из-за простоты их интерпретации, даже если они могут быть менее точными, чем сложные. Однако растущая доступность больших данных увеличила преимущества использования сложных моделей, поэтому на первый план выдвигается компромисс между точностью и интерпретируемостью результатов модели. Есть несколько методов до SHAP, таких как LIME, DeepLIFT, которые решают эту проблему. Но понимания того, как эти методы соотносятся и когда один метод предпочтительнее другого, не хватает.

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

Давайте применим SHAP для интерпретации языковых моделей для задач классификации и генерации -

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

ШАП для классификации:

В этом примере давайте рассмотрим набор данных 'emotion' классификации мультикласса (6) из HuggingFace(HF) Datasets и исследуем прогнозы 'nateraw/bert-base-uncased-emotion' Модель HF, которая уже точно настроена на наборе данных emotion. Этот набор данных содержит ввод текст и метку эмоции, и вот распределение меток —

После того, как модель и токенизатор были загружены, мы должны обернуть их с помощью «shap.Explainer», как показано ниже —

«explainer» используется для вычисления «shap_values», которые, в свою очередь, используются для построения различных графиков для оценки прогнозов. Вот пример, когда первые 50 выборок набора данных передаются explainer.

shap_values = explainer(data['text'][0:50])

Мы можем получить оценки влияния функций на уровне набора данных, используя эти shap_values ​​для каждого класса. Ниже приведен пример построения графика основных функций по величине для класса «радость» в 50 образцах, которые мы передали в explainer.

shap.plots.bar(shap_values[:,:,"joy"].mean(0))

Основные функции, положительно влияющие на класс joy:

shap.plots.bar(shap_values[:,:,"joy"].mean(0), order=shap.Explanation.argsort.flip)

Основные функции, негативно влияющие на класс joy:

shap.plots.bar(shap_values[:,:,"joy"].mean(0), order=shap.Explanation.argsort)

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

Если мы хотим визуально проверить производительность модели для всех классов, вот пример для последних двух образцов —

shap.plots.text(shap_values[-2:])

На приведенном выше графике «Входной текст» не требует пояснений, а «Выходной текст» — это имена классов, разделенные пробелами, и мы можем навести курсор на любое имя класса, которое выделяется (красный-положительное влияние; синий — негативное влияние) те части вводимого текста, которые внесли наибольший вклад.

Если у нас есть предложение и мы хотим проверить влияние фраз на конкретный прогноз, снова на помощь приходит «shap_values», как показано ниже:

Примечание. Для этого примера я взял набор данных «IMDB», так как «вводимый текст» длиннее.

shap.plots.text(shap_values[:,:,"POSITIVE"])

ШАП для генерации:

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

Вот пример для обобщения слова «дистилбарт»:

s = dataset['document'][0:1]
explainer = shap.Explainer(model,tokenizer)
shap.plots.text(shap_values)

Вот пример генерации открытого текста с помощью gpt-2:

explainer = shap.Explainer(model,tokenizer)
s = ['Two Muslims']
shap_values = explainer(s)
shap.plots.text(shap_values)

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

Инструмент языковой интерпретации (LIT):

Инструмент языковой интерпретации (LIT) предназначен для исследователей и практиков, желающих понять поведение модели НЛП с помощью визуального, интерактивного и расширяемого инструмента.

Используйте LIT, чтобы задавать и отвечать на такие вопросы, как:

  • На каких примерах моя модель плохо работает?
  • Почему моя модель сделала такой прогноз? Может ли он приписать это враждебному поведению или нежелательным априорным данным из обучающей выборки?
  • Будет ли моя модель вести себя последовательно, если я изменю такие вещи, как стиль текста, время глагола или род местоимения?

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

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

Вот общий вид ЛИТ —

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

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

В разделе «Таблица данных» показаны все точки данных и их соответствующие метки, прогнозы и т. д. С помощью «Редактора точек данных» можно быстро отредактировать выборку данных (может измениться пол, чтобы изучить предвзятость модели) и сравнить ее с исходной выборкой. Мы также можем добавить новые образцы данных в набор данных.

Вкладка «Производительность» показывает точность, точность, полноту, f1 и матрицу путаницы модели без явного их вычисления.

На вкладке «Производительность» показан разброс всех точек данных, как показано ниже —

На вкладке «Пояснения» представлены различные типы весов градиента, соответствующие конкретному прогнозу. Вот пример неправильного прогноза —

Поскольку модель предсказала эту выборку неправильно с точностью 85%, мы можем исследовать градиенты, которые объясняют, почему модель предсказала неправильно, и какие токены соответствуют этому предсказанию. Используя объяснение LIME, становится ясно, что такие слова, как никогда, проигрывает, мрачная, ситуация, имеют более высокие баллы -ve, и это приводит к тому, что общий прогноз смещается в сторону -ve, из-за чего прогноз «0».

«Контрфакты» используются для замены некоторых слов в точках данных, и мы также можем зашифровать слова в примере.

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

Но чтобы заставить LIT работать с пользовательскими моделями и наборами данных, нам нужно внести несколько изменений в код, и эта записная книжка объясняет все это, обучая модель DistilBert на наборе данных классификации новостей, интегрируется как в LIT, так и в рендеринг пользовательского интерфейса LIT в блокнот сам!!

ШАП против ЛИТ:

Поскольку мы увидели возможности как SHAP, так и LIT, сразу же возникает вопрос: «Что мне следует использовать?»

На это можно ответить, рассмотрев более широкую картину следующим образом:

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

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

Эта статья написана в соавторстве с Саичандрой Пандраджу и Шакти Ганешей.