Пошаговое руководство, чтобы узнать, как работает ваша модель NER

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

Во время семинара в декабре 2020 года Абубакар Абид, генеральный директор Градио, изучил, как GPT-3 генерирует текст о религиях с помощью подсказки Два ___ идут в __. Изучив первые 10 ответов для различных религий, он обнаружил, что GPT-3 упомянул насилие по одному разу для иудеев, буддистов и сикхов, дважды для христиан, но девять раз из десяти для мусульман».

Позже команда Абида показала, что добавление положительного текста о мусульманах в большую языковую модель уменьшило количество упоминаний насилия в отношении мусульман почти на 40 процентов. Даже создатель GPT-3, OpenAI, в мае 2020 года выпустил документ с тестами, которые показали, что GPT-3 в целом невысокого мнения о чернокожих и проявляет сексизм и другие формы предвзятости. Примеров этого типа социальной предвзятости, встроенной в эти большие языковые модели, множество, начиная от расистских заявлений и заканчивая токсичным содержанием.

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

Объяснение моделей NER с помощью LIME

В этом уроке мы сосредоточимся на объяснении предсказания модели распознавания именованных объектов с использованием LIME (Local Interpretable Model-Agnostic Explanations). Вы можете узнать больше из оригинальной статьи.

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

Ниже приведена иллюстрация того, как работает LIME.

Вот объяснение с веб-сайта LIME: Решающая функция оригинальной модели представлена ​​сине-розовым фоном и явно нелинейна. Ярко-красный крест — это объясняемый экземпляр (назовем его X). Мы отбираем возмущенные экземпляры вокруг X и взвешиваем их в соответствии с их близостью к X (вес здесь представлен размером). Мы получаем прогноз исходной модели для этих возмущенных случаев, а затем изучаем линейную модель (пунктирная линия), которая хорошо аппроксимирует модель в окрестности X. Обратите внимание, что объяснение в этом случае не является точным в глобальном масштабе, но оно верно локально вокруг X. .

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

В этом руководстве мы сосредоточимся на объяснении вывода модели NER с помощью LIME.

Вот шаги:

  • Сгенерируйте обучающие данные для нашей модели
  • Обучите модель NER на нашем пользовательском аннотированном наборе данных.
  • Выберите целевое слово для объяснения

Загрузите данные

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

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

Первый шаг — загрузить аннотированные данные в нашу записную книжку; данные отформатированы в формате IOB.

Вот небольшой пример:

-DOCSTART- -X- O O
2 B-EXPERIENCE
+ I-EXPERIENCE
years I-EXPERIENCE
experience O
in O
the O
online B-SKILLS
advertising I-SKILLS
or O
research B-SKILLS

Затем мы импортируем несколько пакетов и предварительно обрабатываем наши данные в список кортежей (токен, тег):

! pip install -U 'scikit-learn<0.24'
!pip install sklearn_crfsuite #Installing CRF
!pip install eli5 # Installing Lime

Давайте посмотрим, как выглядит список:

train_file_path = r"/content/train_data.tsv"
train_sents = import_documents_set_iob(train_file_path)
print(train_sents)
#Small sample of the output
('of', 'O'), ('advanced', 'B-SKILLS'), ('compute', 'I-SKILLS'), ('and', 'O')

Предварительная обработка данных

Чтобы обучить модель CRF, нам нужно преобразовать наш аннотированный текст в числовые функции. Для получения дополнительной информации см. документацию CRF:

После этого мы готовы к обучению — нам просто нужно поместить функции обучения/тестирования и целевые метки в соответствующие списки:

X_train = [sent2features(s) for s in train_sents]
y_train = [sent2labels(s) for s in train_sents]
X_test = [sent2features(s) for s in test_sents]
y_test = [sent2labels(s) for s in test_sents]

Обучение модели

Запускаем обучение со 100 итерациями:

crf = sklearn_crfsuite.CRF(
algorithm='lbfgs',
c1=0.1,
c2=0.1,
max_iterations=100,
all_possible_transitions=True
)
crf.fit(X_train, y_train)

После обучения мы получаем оценку F-1 0,61, что не является высоким, но разумным, учитывая объем аннотированного набора данных. Баллы за объект:

sorted_labels = sorted(
labels,
key=lambda name: (name[1:], name[0])
)
print(metrics.flat_classification_report(
y_test, y_pred, labels=sorted_labels, digits=3
))

Объяснимый NER с LIME

Теперь, когда у нас есть обученная модель, мы готовы объяснить ее прогнозы меток с помощью алгоритма LIME. Во-первых, мы инициализируем наш класс NERExplainerGenerator, который будет генерировать функции из входного текста и передавать их в нашу модель:

Мы собираемся протестировать, используя следующее предложение из описания работы:

text = '''6+ years of Web UI/UX design experience
Proven mobile web application design experience'''
explainer= NERExplainerGenerator(crf)
for index,word in enumerate(word_tokenize(text)):
print(index,word)
0 6+
1 years
2 of
3 Web
4 UI/UX
5 design
6 experience
7 Proven
8 mobile
9 web
10 application
11 design
12 experience

Наконец, нам нужно настроить алгоритм объяснения LIME. Вот что означает каждая функция:

  • MaskingTextSampler: если вы помните ранее во введении, мы упомянули, что LIME попытается нарушить локальные функции и записать выходные данные нашей модели. Он делает это путем случайной замены 70% токенов токеном «UNK». При необходимости процент можно настроить, но значение по умолчанию — 70.
  • Образцы, сходство.Модель LIME будет генерировать множество предложений путем рандомизации исходного предложения с токеном «UNK». Вот несколько примеров.
['6+ years of UNK UNK/UX design experience\nProven UNK web UNK UNK experience', 'UNK+ years UNK Web UI/UX design experience\nProven mobile web application UNK UNK', '6+ UNK of Web UI/UX design experience\nProven UNK web application UNK experience', 'UNK+ years of Web UI/UNK UNK UNK\nUNK mobile web application UNK experience']

Для каждого предложения у нас будет предсказанная метка из нашей модели NER. Затем LIME будет обучаться на данных, используя линейную модель белого цвета, которая объяснит вклад каждого токена: te.fit(text, func)

Давайте, например, попробуем объяснить название слова «UI/UX», которое имеет word_index = 4:

word_index = 4 #explain UI/UX label
func = explainer.get_predict_function(word_index)
sampler = MaskingTextSampler(
replacement="UNK",
max_replace=0.7,
token_pattern=None,
bow=False
)
samples, similarity = sampler.sample_near(text, n_samples=4)
print(samples)
te = TextExplainer(
sampler=sampler,
position_dependent=True,
random_state=42
)
te.fit(text, func)
#the explainer needs just the one instance text from texts list
explain = te.explain_prediction(
target_names=list(explainer.model.classes_),
top_targets=3
)
print("WORD TO EXPLAIN", word_tokenize(text)[word_index])
explain

И вот результат:

Зеленые цвета означают, что токен имеет положительный вклад в прогнозируемую метку, а красный ‹BIAS› означает, что он имеет отрицательный вклад. Модель правильно предсказала с вероятностью 0,95, что «UI/UX» является частью многоточечного навыка I-SKILLS. Слово «Web» было сильным индикатором предсказанного ярлыка. В соответствии с первым утверждением метка B-SKILLS имеет более низкую вероятность 0,018, а слово «Интернет» имеет сильный отрицательный вклад.

Lime также предоставляет вклад за токен, что довольно удобно:

Мы замечаем, что Интернет, дизайн и годы вносят наибольший вклад в предсказанный ярлык I-SKILLS.

Заключение:

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

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

Если у вас есть какие-либо вопросы или вы хотите создать собственные модели для вашего конкретного случая, оставьте примечание ниже или отправьте нам электронное письмо по адресу [email protected].

Следите за нами в Твиттере @UBIAI5