Раскрытие внутренней работы Глубокая погружение в механизм внимания BERT

Глубокое погружение во внутреннюю работу Исследование механизма внимания BERT

Введение

BERT, сокращение от Bidirectional Encoder Representations from Transformers, это система, использующая модель трансформера и неподконтрольное предварительное обучение для обработки естественного языка (NLP). За счет предварительного обучения BERT заранее изучает две неподконтрольные задачи: моделирование маскированных языков и предсказание предложений. Это позволяет настроить BERT для определенных задач, не начиная с нуля. Фактически, BERT – это предварительно обученная система, использующая уникальную модель для понимания языка, упрощающую ее применение в различных задачах. Давайте разберем механизм внимания BERT и его работу в этой статье.

Также читайте: Что такое BERT? Жмите здесь!

Цели обучения

  • Понимание механизма внимания в BERT
  • Как выполняется токенизация в BERT?
  • Как вычисляются веса внимания в BERT?
  • Реализация модели BERT на Python

Эта статья была опубликована в рамках специального мероприятия Блогона по науке о данных.

Механизм внимания в BERT

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

Рассмотрим следующие примеры, чтобы понять, как работает механизм внимания в основе.

Пример 1

Выше вес у некоторых слов, чем у других слов

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

Пример 2

Рассмотрим следующее предложение –

Выше вес у некоторых слов, чем у других слов

Для предсказания слова “спагетти” механизм внимания позволяет придать больший вес глаголу “еда”, чем качеству “пресной” спагетти.

Пример 3

Аналогично для задачи перевода как в следующем примере:

Входное предложение: Как протекает ваш день

Целевое предложение: Comment se passe ta journée

Источник : https://blog.floydhub.com/attention-mechanism/

Для каждого слова в выходной фразе механизм внимания будет сопоставлять значимые и соответствующие слова из входного предложения и давать этим входным словам больший вес. На приведенном выше изображении обратите внимание на то, как французское слово “Comment” придает наивысший вес (представленный темно-синим) слову “Как”, а для слова “journee” входное слово “день” получает наивысший вес. Именно так механизм внимания помогает достичь более высокой точности вывода, придавая больший вес словам, которые наиболее важны для соответствующего предсказания.

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

Веса внимания для композитных представлений

BERT использует веса внимания для обработки последовательностей. Рассмотрим последовательность X, состоящую из трех векторов, каждый с четырьмя элементами. Функция внимания преобразует X в новую последовательность Y с той же длиной. Каждый вектор Y является взвешенным средним векторов X с весами, называемыми весами внимания. Эти веса, примененные к эмбеддингам слов X, производят составные эмбеддинги в Y.

Расчет каждого вектора в Y зависит от изменяющихся весов внимания, назначенных x1, x2 и x3, в зависимости от необходимого внимания для каждой входной особенности при генерации соответствующего вектора в Y. Математически говоря, это будет выглядеть примерно так –

В приведенных выше уравнениях значения 0,4, 0,3 и 0,2 представляют собой веса внимания, назначенные x1, x2 и x3 для вычисления составных эмбеддингов y1,y2 и y3. Как видно, веса внимания, назначенные x1,x2 и x3 для вычисления составных эмбеддингов, являются полностью разными для y1, y2 и y3.

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

“The restless cat was ___”

Модель должна понимать составное понятие беспокойной кошки, помимо понимания понятий “беспокойный” и “кошка” отдельно; например, беспокойная кошка часто прыгает, поэтому “прыжок” может быть подходящим следующим словом в предложении.

Векторы ключей и запросов для получения весов внимания

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

BERT измеряет внимание между парами слов с помощью функции, которая присваивает оценку каждой паре слов на основе их взаимоотношения. Он использует векторы запроса и ключевые векторы в качестве эмбеддингов слов, чтобы оценить их совместимость. Оценку совместимости вычисляется путем умножения скалярного произведения вектора запроса одного слова и вектора ключа другого слова. Например, она вычисляет оценку между ‘прыгающим’ и ‘кошкой’ с помощью скалярного произведения вектора запроса (q1) ‘прыгающего’ и вектора ключа (k2) ‘кошки’ – q1*k2.

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

Внимание в BERT

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

BERT разделяет свои параметры Запрос, Ключ и Значение N раз. Каждая из этих N пар проходит независимо через отдельную Голову, выполняя вычисления внимания. Результаты от этих пар затем совмещаются для получения окончательного счета Внимания. Вот почему это называется ‘Многоголовое внимание’, обеспечивая BERT улучшенную способность захватывать множество отношений и нюансов для каждого слова.

Многоголовое внимание

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

В зависимости от конкретной модели BERT, здесь может быть либо 12, либо 24 слоя внимания, и каждый слой имеет либо 12, либо 16 голов внимания. Это значит, что одна модель BERT может иметь до 384 различных механизмов внимания, потому что веса не разделяются между слоями.

Реализация BERT-модели на Python

Шаг 1. Импорт необходимых библиотек

Нам понадобится импортировать библиотеку “torch” для использования PyTorch. Также нам понадобится импортировать BertTokenizer и BertForSequenceClassification из библиотеки transformers. Библиотека токенизатора помогает разделить текст на токены, а BertForSequenceClassification используется для классификации текста.

import torchfrom transformers import BertTokenizer, BertForSequenceClassification

Шаг 2. Загрузка предобученной модели BERT и токенизатора

На этом шаге мы загружаем предобученную модель “bert-base-uncased” и передаем ее в метод from_pretrained для класса BertForSequenceClassification. Поскольку мы хотим классифицировать настроение текста, мы устанавливаем num_labels равным 2, что представляет “позитивный” и “негативный класс”.

model_name = 'bert-base-uncased'tokenizer = BertTokenizer.from_pretrained(model_name)model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)

Шаг 3. Установка устройства на GPU, если доступно

Этот шаг нужен только для переключения на устройство GPU, если оно доступно, или оставания на CPU.

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model.to(device)#import csv

Шаг 4. Определение входного текста и его токенизация

На этом шаге мы определяем входной текст, для которого мы хотим провести классификацию. Мы также определяем объект токенизатора, который отвечает за преобразование текста в последовательность токенов, которые являются основными единицами информации, понятными моделям машинного обучения. Параметр ‘max_length’ задает максимальную длину токенизированной последовательности. Если токенизированная последовательность превышает это значение, она будет усечена. Параметр ‘padding’ указывает, что токенизированная последовательность будет заполнена нулями до максимальной длины, если она короче этой длины. Параметр “truncation” указывает, следует ли усекать токенизированную последовательность, если она превышает максимальную длину.

text = "Мне действительно не понравился этот фильм. Он был фантастическим!"#Токенизация входного текстаtokens = tokenizer.encode_plus(    text,    max_length=128,    padding='max_length',    truncation=True,    return_tensors='pt')# Перемещение тензоров входа на устройствоinput_ids = tokens['input_ids'].to(device)attention_mask = tokens['attention_mask'].to(device)#import csv

Шаг 5. Предсказание настроения

На следующем шаге модель генерирует предсказание для заданных input_ids и attention_mask.

with torch.no_grad():    outputs = model(input_ids, attention_mask)predicted_label = torch.argmax(outputs.logits, dim=1).item()sentiment = 'позитивный' if predicted_label == 1 else 'негативный'print(f"Настроение входного текста - {sentiment}.")

Результат

Настроение входного текста - положительное.

Заключение

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

Основные выводы

  • BERT основан на двух важных достижениях в области NLP: архитектуре трансформера и неуправляемом предварительном обучении.
  • Он использует «внимание», чтобы определить приоритетные характеристики входных данных в предложениях, помогая понять отношения и контекст слов.
  • Веса внимания вычисляют взвешенное среднее входных данных для составных представлений. Использование нескольких блоков внимания и слоев позволяет BERT создавать детальные представления слов, фокусируясь на выводах предыдущего слоя.

Часто задаваемые вопросы

Иллюстрации, показанные в этой статье, не принадлежат Analytics Vidhya и используются по усмотрению автора.