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

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

Вы можете изучить код в моем репозитории GitHub.

Структура

Панорама фреймворков и пакетов, доступных для проектирования и создания моделей машинного обучения, чрезвычайно богата: Tensorflow, Pytorch, scikit-learn, Caffe, Spark ML, Ludwig и т. д.

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

Трансформатор и BERT

BERT [1] расшифровывается как Bidirectional Encoder Rпредставления от Tтрансформаторов: модель, которая в 2018 году приняла научное и профессиональное сообщество обработки естественного языка (NLP) штурмом. Ключевое техническое новшество заключается в том, что BERT применяет двунаправленное обучение Transformer [2], еще одной ключевой архитектуры, опубликованной годом ранее, к языкам моделирования. Напротив, предыдущие методологии пытались рассматривать текстовую последовательность либо слева направо, либо сочетали обучение слева направо и справа налево. BERT показывает, что двунаправленное обучение Transformers позволяет модели лучше понимать и понимать языковой контекст и поток, чем однонаправленные языковые модели. В результате тестов были получены новые современные результаты по одиннадцати задачам обработки естественного языка.

Но давайте начнем с основ: Трансформер. Это модель, которая не использует в своей структуре ни сверточные нейронные сети [3] (CNN), ни рекуррентные нейронные сети [3] (RNN), а только механизмы внимания. Основная причина отказа от этих хорошо известных моделей заключается в том, что RNN нелегко распараллелить, в то время как CNN требуют много слоев для обнаружения долгосрочных зависимостей в последовательной структуре данных, что не всегда удается. Следовательно, научному сообществу НЛП потребовалась новая авторегрессионная модель, способная производить выходные данные, которые зависят не только от входных данных, но и от предыдущих выходных данных, и здесь на помощь пришел механизм внимания.

Рассмотрим основной механизм внимания на рис. 1:

Блоки, обозначенные A, являются входными последовательностями и, как правило, могут быть связаны, если вы используете RNN; в то время как блоки, обозначенные B, аналогичны и представляют выходные последовательности. Здесь вы можете сразу заметить авторегрессионное поведение этой архитектуры: второй вход A требует предыдущего выхода B Уравнения, описывающие механизм:

где i — временной шаг i-го декодера, а uu-го кодировщика. Последние два уравнения относятся к вычислительным вероятностям слоя softmax и слою взвешенной суммы, тогда как первое немного сложнее: оно утверждает, что связь между

и

можно выразить в виде поэлементного произведения (внимание с точечным произведением) или в виде результата нейронной сети (аддитивное внимание).

В статье «Внимание — это все, что вам нужно» [2], которая представила Transformer, вы, вероятно, увидите диаграмму, показанную на рис. 2.

Ну… Это не ракетостроение, но уж точно не интуитивное. Если вы считаете:

вернемся к ситуации, показанной на рис. 1.Действительно, в статье они выразили скалярное произведение как

где Q, Kи Vобозначают Запрос, Ключ и Значение соответственно, и

размерность запросов и ключей.

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

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

Преобразователь состоит из 4 основных компонентов: Ввод-Вывод, Позиционное кодирование,Кодировщик и Декодер.

Компонент Ввод-Вывод состоит из предложений, закодированных с помощью кодирования пары байтов [4], поэтому вход Преобразователя представляет собой последовательность, разбитую на подслова. , называемые токенами, а также вывод, с той лишь разницей, что во время обучения они выступают в роли меток. С помощью этой процедуры наша токенизированная версия слов приводит к последовательности векторов, каждый из которых имеет размер, равный 512. Таким образом, все предложение теперь представляет собой матрицу действительных чисел.

Позиционное кодирование, вместо этого, было первоначально введено в [5] и представляет собой способ работы с последовательными данными, когда ни рекуррентная, ни временная информация не доступны из-за отсутствия RNN или CNN.

Структура Encoder показана на рис. 4.

Кодер представляет собой стек из N = 6 уровней, каждый из которых состоит из двух подуровней: механизм внимания с несколькими головками и полностью связанная сеть прямой связи. , а также остаточные соединения [6] на обоих этапах с последующей процедурой нормализации слоя [7]. Выход кодировщика может быть выражен как:

где каждый слой в кодере имеет размерность 512, а в декодер отправляется только вектор из последнего слоя.

Кодер механизм внимания с несколькими головками является обобщением базового механизма внимания, проанализированного ранее. Раньше вектор анализировался в подпространстве фиксированной размерности, но что, если бы мы могли совместно использовать информацию из разных подпространств представления в разных позициях? Что ж, многоголовое внимание делает именно это. Вы можете думать об этом как о точечном произведении внимания, вычисляемого блоками, причем каждое представление имеет разный размер. Как видно на Рис. 5,после вычисления нормальных точечных произведений все различные hпредставления объединяются и снова проецируются. В статье «Внимание — это все, что вам нужно» они взяли h = 8, со всеми механизмами масштабированного скалярного произведения внимания, имеющими размер проекции 64 элемента.

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

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

Декодер похож на Кодировщик: он состоит из стека из 6 слоев, но, в отличие от Кодировщика, который имеет 2 подуровня, подуровни Декодера представляют собой внимание с несколькими головками, полносвязные слои и маскированное внимание с несколькими головками (помимо общего остаточные соединения и нормализация слоев).

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

Теперь, когда мы поняли, как работает Transformer, пришло время углубиться в BERT. Целью BERT является создание языковой модели: по этой причине, по сравнению с описанной ранее архитектурой Transformer, BERT использует только механизм кодирования. Механизм обучения энкодера Transformer действительно является двунаправленным: он считывает ввод последовательно, слева направо и справа налево, позволяя модели изучать контекст слова на основе всего его окружения. Эта архитектура позволяет обучать BERT задачам Модель маскированного языка (MLM) и Предсказание следующего предложения (NSP).

Авторы представили две модели BERT: обозначение L - количество слоев (т.е. блоков трансформатора), H - скрытый размер и A - количество головок самовнимания, BERT BASE имел (L = 12, H = 768, A = 12) с общим числом параметров 110 млн, в то время как BERT БОЛЬШОЙ имел (L = 24, H = 1024, A = 16), в результате чего 340 млн параметры.

Чтобы сделать BERT подходящим для различных последующих задач, авторы решили структурировать входные данные, чтобы однозначно представлять одно предложение и пару предложений (например, вопрос и ответ). Как объяснялось ранее, Transformer требует, чтобы входное предложение было представлено в виде токенов. В частности, BERT требует, чтобы предложение было разделено на токены и имело специальный токен [CLS] в начале последовательности и специальный токен [SEP] в конце последовательности. конец. Пары предложений различаются двумя способами: во-первых, между двумя предложениями добавляется специальный токен [SEP]; во-вторых, к каждой лексеме добавлено изученное встраивание, указывающее, принадлежит ли она предложению A или предложению B.

Задача «Модель маскированного языка» требует, чтобы некоторые токены из входных данных были случайным образом замаскированы во время обучения, при этом цель состоит в том, чтобы модель предсказывала исходный идентификатор словаря замаскированного произведения только на основе его контекста. В отличие от предварительного обучения языковой модели слева направо, цель MLM позволяет представлению учитывать как левый, так и правый контексты, обеспечивая предварительное обучение глубокого двунаправленного преобразователя.

Для обучения BERT MLM авторы замаскировали 15% слов в каждой последовательности, заменив их токеном [MASK]. Прогноз получается путем добавления последнего слоя softmax (классификации) поверх кодировщика Transformer и вычисления вероятностей по словарю.

Обучение задаче «Предсказание следующего предложения» имеет основополагающее значение для последующих задач, таких как Ответы на вопросы (QA) и Вывод естественного языка (NLI). В частности, обучение выполняется в такой таким образом, что при выборе предложений A и B для каждого примера перед обучением 50% времени B на самом деле является предложением, которое следует за A(помечено как isNext) и в 50 % случаев предложение выбирается случайным образом из корпуса (помечено как notNext). Как показано на рисунке Рисунок 9, C используется для подсказки следующего предложения.

На рис. 9 также показаны процедуры предварительного обучения и тонкой настройки. В то время как предварительное обучение следует стандартным процедурам и включает в себя BookCorpus ( 800 млн слов) и английскую Википедию (2,5 млрд слов), точная настройка проста благодаря механизму самостоятельного внимания в Transformer. В отличие от методологий, предшествовавших публикации BERT, которые кодировали текстовые пары перед применением двунаправленного перекрестного внимания, BERT объединяет два этапа, кодируя объединенную текстовую пару с самостоятельным вниманием, включая двунаправленное перекрестное внимание между двумя предложениями. Следовательно, для каждой задачи все, что необходимо, — это подключить входы и выходы и точно настроить все параметры от начала до конца. Процедура тонкой настройки по сравнению с предварительной подготовкой обходится недорого.

Модель

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

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

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

Структура пакета

Структура пакета показана в фрагменте кода 1: он организован с целью максимально возможного отделения логики приложения для преобразования данных от определения и реализации модели. В частности, файл configurations .py отвечает за установку конфигураций программы (загружает их из config.yml), а модуль connectors определяет коннектор клиента в Google Firestore и места для Google Cloud Storage. datasetHandler определяет объект, отвечающий за управление потоком данных от формата, полученного базой данных, к формату, наиболее подходящему для приложения, и определяет наборы для обучения, проверки и тестирования. Модуль model создает модель машинного обучения и содержит препроцессор — объект, отвечающий за предварительную обработку входных примеров в формате, требуемом BERT. Наконец, файл training.py отвечает за организацию потока данных, выполнение обучения и тестирование производительности модели.

Обработчик набора данных

Обработчик набора данных предназначен для управления преобразованиями формата данных и создания обучающих, проверочных и тестовых наборов. Фрагмент кода 2 показывает часть функции обработчика набора данных:

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

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

Вместо этого ключевые слова представляют собой специфические для бизнеса слова, значения которых, вероятно, неизвестны модели, или слово может просто отсутствовать в словаре модели. Важно правильно обращаться с этой деталью по двум причинам. Во-первых, если мы не управляем неизвестными ключевыми словами, при предварительной обработке строки неизвестные слова заменяются специальным токеном «[UNK]». Во-вторых, предположим, что ключевое слово известно BERT, но во время его обучения модель узнала, что значение отличается от того, которое задумал бизнес. В таком случае нам нужно заставить модель понять, что ключевые слова связаны с подмножеством обучающих примеров. Следовательно, входные данные обогащаются функциями с этой целью: для каждого обучающего примера создается категориальный тензор, который отображает, содержит ли пример ключевое слово. Этот вектор будет использоваться в хвостовой нейронной сети, используемой для классификации.

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

Реализация модели

Как описано в разделе «Модель», BERT требует предварительной обработки корпуса. Благодаря Tensorflow Hub можно загрузить оболочку и легко выполнить предварительную обработку.

Реализация модели достаточно проста. Во-первых, мы должны загрузить предварительно обученную модель:

Затем пользовательская модель глубокого обучения определяется путем детализации входных данных, а затем с использованием функционального API Keras для определения структуры модели. Первый блок — это слой BERT, из которого берется только объединенный вывод, вектор размерности, равный 768, который вводится в серию из 2-х плотных слоев с пакетной нормализацией. Затем выходные данные второго плотного слоя объединяются с входными функциями, отображающими ключевые слова в обучающих примерах. Наконец, результирующая классификация получается с помощью функции активации softmax.

Функция train, отвечающая за обучение модели, показана в фрагменте кода 7.

Собираем все вместе

Теперь, когда мы определили все шаги и логику, нам нужно собрать все вместе, организовав объекты и функции. После загрузки конфигураций, определенных в файле YAML, создается объект модели, препроцессор и обработчик набора данных:

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

Наконец, модель построена, обучена и проверена ее производительность.

Развертывание

Обучение модели выполняется на Google AI Platform Training, сервисе, специально разработанном и оптимизированном для обучения моделей машинного обучения. Как показано в файле Dockerfile, показанном в фрагменте кода 11, пакет упакован в контейнер Docker.

Фрагмент кода 12 отвечает за создание контейнера Docker и его отправку в Реестр контейнеров Google, репозиторий контейнеров Docker, связанных с проектом.

Как только он будет отправлен в реестр контейнеров Google, мы готовы запустить развертывание с помощью Google Cloud Run. Сценарий показан в фрагменте кода 16:

Заключение

Мы увидели, как разработать и реализовать модель глубокого обучения. Мы также рассмотрели, как создать контейнер для обучающего приложения, как отправить его в реестр контейнеров Google и как провести обучение на платформе Google AI.

Если вам интересно описание варианта использования и другие статьи из этой серии, нажмите здесь.

Ссылки

[1] Девлин, Джейкоб и др. «Берт: предварительная подготовка глубоких двунаправленных преобразователей для понимания языка». Препринт arXiv arXiv: 1810.04805 (2018).

[2] Васвани, Ашиш и др. «Внимание — это все, что вам нужно». Препринт arXiv arXiv: 1706.03762 (2017).

[3] Гудфеллоу, Ян и др. Глубокое обучение. Том. 1. №2. Кембридж: Массачусетский технологический институт, 2016.

[4] Бритц, Денни и др. «Масштабное исследование архитектур нейронного машинного перевода». Препринт arXiv arXiv: 1703.03906 (2017).

[5] Геринг, Джонас и др. «Сверточная последовательность для обучения последовательности». Международная конференция по машинному обучению. ПМЛР, 2017.

[6] Хе, Кайминг и др. «Глубокое остаточное обучение для распознавания изображений». Материалы конференции IEEE по компьютерному зрению и распознаванию образов. 2016.

[7] Ба, Джимми Лей, Джейми Райан Кирос и Джеффри Э. Хинтон. «Нормализация слоя». Препринт arXiv arXiv: 1607.06450 (2016).

[Изображения-трансформеры] https://ricardokleinklein.github.io/2017/11/16/Attention-is-all-you-need.html