Современные NLP-приложения, например, для анализа настроения, поиска ответов на вопросы, смарт-ассистенты и т. п., используют огромное количество данных. Такой объём данных можно напрямую передать в модель машинного обучения. Почти все текстовые приложения требуют большой предварительной обработки, например, создания векторного представления слов с нуля с помощью счётчика частоты слов. На это уходит много сил и времени. Чтобы этого избежать, для всех сложных задач предварительной обработки используются модели Transfer Learning. Им нужно просто передать необработанный текст, об остальном модель позаботится сама.

Небольшая ремарка. Данный материал является переводом, и мы не несем ответственности за факты, представленные автором в первоисточнике.

Ключевая тенденция рынка чат-ботов — это работа над эффективностью в определении намерений пользователя. Для себя мы поставили данную задачу во главе узла: нам критически важно сделать продукт удобным и практичным именно для разработчиков. Поэтому мы сейчас думаем о том, чтобы внедрить BERT в нашу работу. Технология для нас новая, мы читаем и переводим очень много информации по данному вопросу. Наиболее интересными материалами мы поделимся с вами в рамках данного блога.

В этой статье мы обсудим один из фреймворков трансферного обучения — BERT. Рассмотрим, как использовать модуль предварительной обработки BERT, чтобы создавать векторное представление слов без усилий. Основные моменты, которые будут рассмотрены в этой статье:

  1. Стандартная процедура предварительной обработки текста

  2. Что такое BERT?

  3. Как работает BERT?

  4. Модель предварительной обработки

Начнём.

Стандартная процедура предварительной обработки текста

Метод, известный как предварительная обработка текста, используется для очистки текстовых данных перед их передачей в Machine Learning. Текстовые данные содержат различный «шум» — например, эмодзи, знаки препинания, чередование строчных и прописных символов. Это только начало трудностей, с которыми мы столкнемся. Машины не понимают слов, им нужны числа, поэтому нужно найти быстрый и эффективный способ преобразования текста в числа.

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

• преобразование в нижний регистр

• удаление знаков препинания

• удаление стоп-слов

• токенизация корпуса

• стемминг и лемматизация

• векторное представление слов с использованием CountVectorizer и TF-IDF

Подробно с примерами эти шаги рассмотрены в статьях: Полное руководство по предварительной обработке текста в NLP и Как идентифицировать сущности в NLP?

Обычно в любых ситуациях, связанных с NLP, мы следуем этому процессу. Однако он не гарантирует результата, если необработанные данные изменятся хоть немного. Это значит, что если данные взяты с веб-страницы, потребуются дополнительные операции по удалению HTML-тегов. Теперь все этапы предварительной обработки можно выполнять с помощью модулей Transfer Learning, таких как BERT.

Что такое BERT?

BERT — это аббревиатура от Bidirectional Encoder Representations from Transformers. Для предварительной подготовки глубоких двунаправленных представлений из немаркированного текста, система задаёт условия для контекста как для левой, так и для правой части предложения. В результате предварительно обученную BERT можно настроить добавлением всего одного дополнительного выходного слоя, чтобы создать новейшие модели для разнообразных задач NLP.

BERT была предварительно обучена работе с огромным корпусом немаркированного текста, включая всю Википедию, которая насчитывает 2500 миллионов слов, а также  различным BookCorpus, которые содержат более 800 миллионов слов. Половину успеха BERT можно отнести к этой предварительной фазе обучения. Когда модель обучается на большом текстовом корпусе, она начинает улавливать тончайшие нюансы языка. Такая информация может быть применена к широкому спектру задач NLP.

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

Как работает BERT

Чтобы узнать contextual relationships между словами в тексте, BERT использует Transformer, Attentions mechanism. В оригинальной реализации Transformer имеется два механизма: кодировщик, принимающий вводимый текст, и декодер, который прогнозирует задачу. Требуется только механизм кодировщика, потому что целью BERT является построение языковой модели.

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

Рисунок 1: BERT
Рисунок 1: BERT

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

Во время обучения, как показано выше, токен [CLS] вставляется в начало первого предложения, а токен [SEP] вводится в конце каждого предложения. Причем каждый токен содержит векторное представление предложения, обозначающее предложение A или предложение B. Векторное представление предложения похоже на представление токенов, но со словарём из двух слов. Наконец, каждому токену назначается PE (position embedding), соответствующее его месту в последовательности.

Рисунок 2: Предварительное обучение BERT
Рисунок 2: Предварительное обучение BERT

Перед подачей последовательностей слов в BERT некоторая часть каждой последовательности заменяется токеном [MASK]. Затем модель пытается спрогнозировать исходное значение замаскированных слов, используя контекст, определяемый немаскированными фразами. Необходимо добавить слой классификации поверх выходных данных кодировщика, чтобы предсказать выходные слова. За этим следует умножение выходных векторов кодера на embedding matrix, преобразование их в словарное измерение и вычисление вероятности каждого слова в словаре с использованием softmax.

Функция потерь BERT учитывает только предсказания замаскированных значений и игнорирует предсказания немаскированных слов. Следовательно, модель сопоставляет данные медленнее, чем направленные модели. При обучении модели BERT, Masked LM (показанная на Рисунке 1) и Pre-training (показанное на Рисунке 2) обучаются совместно, чтобы минимизировать комбинированную функцию потерь этих двух методов.

Модель предварительной обработки BERT

На Tensorflow Hub доступно множество предварительно обученных моделей BERT: оригинальная BERT, ALBERT, Electra и MuRIL. Кодировщик и API предварительной обработки доступны для всех вышеперечисленных моделей.

Для каждого кодировщика BERT существует модель предварительной обработки. Используя операторы TensorFlow из пакета TF.text, она преобразует необработанный текст в числовые входные тензоры, ожидаемые кодировщиком. В отличие от предварительной обработки на чистом Python, эти операции могут быть включены в модель TensorFlow для выполнения непосредственно из текстового ввода. Каждая модель предварительной обработки TF Hub поставляется с предварительно настроенным словарем и связанной с ним логикой нормализации текста и не требует дополнительной настройки.

Пример использования BERT

Реализуем несколько примеров предварительной обработки.

!pip3 install --quiet tensorflow-text
import tensorflow_hub as hub
import tensorflow_text as text
# load the pre-processing model
preprocess =
hub.load('https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/1')
#Use BERT pre-processing on a batch of raw text inputs.
embeddings = preprocess(['Blog writing is awesome.'])

Предварительно обработанный вывод из модуля получается, как показано выше, там, где маска ввода сообщает кодировщику, какая часть предложения важна, потому что здесь присутствует заполнение. Идентификатор типа ввода указывает модели, какая часть ввода соответствует первой и второй части предложения. Input_word_ids — это индексы, соответствующие каждому токену.

Заключение 

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

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

На основе выбранной технологии мы хотим построить рекомендательную систему, которая будет анализировать тексты имеющихся у нас данных пользователей и вакансий, анализировать их и делать метчинг. С помощью участия в проекте наших клиентов и партнеров мы хотим обучить ИИ делать это максимально корректно и точно. По завершению данного этапа мы подключим модель, основанную на технологии BERT, к нашему чат-боту и запустим новую функцию. Таким образом, у пользователей нашего сервиса появится альтернативный путь — вместо заполнения анкеты, они смогут просто подгрузить свое резюме и получать в соответствии с указанными там данными подходящие вакансии.

Дмитрий Доброхотов, основатель сервиса по подбору IT-вакансий

Комментарии (5)


  1. alexwortega
    25.09.2021 17:12
    +1

    BERT — достаточно двунаправленная модель.

    @

    Достаточно.

    Спасибо, давно не так не ржал


    1. GetMeIT Автор
      25.09.2021 19:44

      :) К сожалению, из песни слов не выкинешь. Это перевод материала. Мы не стали делать стилистическую редакцию, чтобы не исказить мнение автора оригинала.

      Но мы очень рады, что смогли поднять вам настроение ;))


      1. alexwortega
        27.09.2021 01:17

        Автор имел ввиду: полностью двунаправленная полагаю, quite в данном случае является редким синонимом. См гугл переводчик)


      1. StarTessar
        27.09.2021 13:13

        Я что-то проспал и теперь общепринятым переводом "embedding" стало "вложение"? Когда впервые в статье наткнулся на это слово, то долго не мог понять что это и зачем. Встречал пару раз такую трактовку, но там это было обусловлено спецификой обращения с векторами.

        Разве по смыслу текста не сподручнее было перевести как "векторное представление"? Или на худой конец "проекция", "отображение".


        1. GetMeIT Автор
          27.09.2021 13:14

          Спасибо, что обратили наше внимание на этот недочёт, поправили)