Предварительная обработка естественного языка (NLP) процветает и быстро растет уже несколько лет. Выбрать модель НЛП не так сложно, как несколько лет назад, поскольку многие модели в настоящее время разрабатываются многими сообществами НЛП, и их можно бесплатно загрузить и использовать в вашей модели. Вот почему наше концептуальное понимание того, как лучше всего представлять слова и предложения, важнее. BERT от Google (представление двунаправленного кодировщика от Transformer) — одна из известных моделей, которая использовалась во многих исследованиях и проектах.

Вложения Word

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

ДистильБерт

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

Метод предварительной подготовки меньшей модели языкового представления общего назначения под названием DistilBert может быть настроен с хорошей производительностью в гораздо более широком масштабе, чтобы преодолеть это. DistilBert — это улучшенная версия Bert. Оба более или менее имеют одинаковую общую архитектуру, в которой встраивания типа токена и пулер удалены, а количество слоев уменьшено. Если упростить, архитектура Bert будет выглядеть так:

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

Входной слой — это просто вектор токенов последовательности вместе со специальными токенами. Например, токен «##ing» — это продукт разделения токенов, таких как «playing», на «play» и «##ing». Это связано с тем, что BERT использует WordPiece [6] для охвата более широкого спектра слов вне словарного запаса (OOV). Вложения токенов — это идентификаторы словарей для каждого из токенов. Вложения предложений — это просто числовой класс для различения предложений A и B. И, наконец, позиционные вложения Transformer указывают положение каждого слова в последовательности.

DistilBert перегоняется очень большими партиями, используя накопление градиента с использованием динамического маскирования и без цели прогнозирования следующего предложения. Сама по себе дистилляция представляет собой метод сжатия, при котором компактная модель (ученик) обучается воспроизводить поведение более крупной модели (учителя) или ансамбля моделей. Таким образом, DistilBert может уменьшить размер модели BERT на 40 % и ускорить процесс на 60 %, сохранив при этом 97 % своих возможностей понимания языка.

Извлечение встраивания слов с помощью BERT

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

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

def create_input(text, tokenizer, max_length):
  stokens = tokenizer.tokenize(text)
  stokens = ["[CLS]"] + stokens + ["[SEP]"]
  input_ids = get_ids(tokenizer,stokens, max_length)
  input_masks = get_masks(stokens, max_length)
  input_ids = torch.tensor([input_ids])
  input_masks = torch.tensor([input_masks])
  
  return stokens, input_ids, input_masks
def get_ids(tokenizer, token, max_length):
  token_ids = tokenizer.convert_tokens_to_ids(token)
  input_ids = token_ids + [0]*(max_length - len(token_ids))
  return input_ids
def get_masks(tokens, max_length):
  if len(tokens)>max_length:
     raise IndexError("Token length greater than max length")
  return [1]*len(tokens) + [0]*(max_length - len(tokens))

После изменения предложений нам нужно извлечь вложения с предварительно обученным последним слоем BERT.

def get_bert_embeddings(tokens_tensor, masked_tensors, model):
   with torch.no_grad():
      outputs = model(tokens_tensor, masked_tensors)
      hidden_states = outputs[2][1:]
      token_embeddings = hidden_states[-1]
   token_embeddings = torch.squeeze(token_embeddings, dim=0)
   list_token_embeddings = [token_embed.tolist() for token_embed in  token_embeddings]
   return list_token_embeddings

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

Заключение

Поскольку область НЛП быстро развивалась, нам необходимо понять, как работает НЛП. Мы можем достичь этого, понимая встраивание слов. Среди многих моделей, разработанных сообществами НЛП, BERT является одной из наиболее распространенных и наиболее часто используемых моделей. Таким образом, мы можем узнать, как модель NLP во встраиваниях слов работает с предварительно обученной моделью BERT.

Спасибо человеку, который помог мне сделать эту статью:

  1. Абиджанна Зульфа Хамдика
  2. Надя Пермата