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

Модули TensorFlow Hub можно применять к множеству задач обучения передачи и наборов данных, будь то изображения или текст. «Универсальный кодировщик предложений» - один из многих недавно опубликованных многоразовых модулей TensorFlow Hub, автономный фрагмент графика TensorFlow с включенными предварительно обученными значениями весов.

Доступна работающая записная книжка Colab, вы можете экспериментировать с кодом во время чтения.

Что такое универсальный кодировщик предложений и как его обучили

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

Универсальный кодировщик предложений VS встраивание слов

Если вы помните, как слово GloVe встраивает векторы в наш предыдущий учебник, который превращает слово в 50-мерный вектор, универсальный кодировщик предложений намного мощнее и может вставлять не только слова, но и фразы и предложения. То есть он принимает на вход английский текст переменной длины и выводит 512-мерный вектор. Обработка ввода текста переменной длины - это здорово, но в чем заключается загвоздка: чем длиннее предложение, тем меньше могут быть результаты встраивания. А поскольку модель была обучена на уровне слов, она, скорее всего, обнаружит, что опечатки и сложные слова будет сложно обработать. Подробнее о разнице между языковой моделью уровня мира и уровня персонажа вы можете прочитать в моем предыдущем уроке.

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

Параллельно Сравнение архитектур моделей для кодировщиков предложений Transformer и DAN.

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

Кодер состоит из стека из N = 6 идентичных слоев. Каждый слой имеет два подслоя. Первый - это механизм самовнимания с несколькими головками, а второй - простая позиционная, полностью подключенная сеть с прямой связью. Они также использовали остаточное соединение вокруг каждого из двух подуровней с последующей нормализацией уровня. Поскольку модель не содержит повторений и сверток, для того, чтобы модель могла использовать порядок последовательности, она должна ввести некоторую информацию об относительном или абсолютном положении токенов в последовательности, это то, что делает «позиционное кодирование». . Энкодер на основе трансформатора обеспечивает наилучшую общую производительность задачи передачи. Однако это происходит за счет времени вычислений и масштабирования использования памяти с увеличением длины предложения.

Сеть глубокого усреднения (DAN) намного проще, когда входные вложения для слов и биграмм сначала усредняются вместе, а затем передаются через глубокую нейронную сеть с прямой связью (DNN) для создания встраиваемых предложений. Основное преимущество кодировщика DAN заключается в том, что время вычислений линейно зависит от длины входной последовательности.

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

Обе модели были обучены с помощью корпуса Stanford Natural Language Inference (SNLI). Корпус SNLI представляет собой набор из 570 тыс. Написанных человеком пар английских предложений, вручную помеченных для сбалансированной классификации с помощью меток следствие, противоречие и нейтральный, что поддерживает задачу логического вывода на естественном языке (NLI), также известного как распознавание текстового следования (RTE). ). По сути, модели были обучены изучать семантическое сходство между парами предложений.

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

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

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

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

Значение message_embeddings - это два массива, соответствующие вложениям двух предложений, каждый из которых представляет собой массив из 512 чисел с плавающей запятой.

Задача классификации вопросов и предварительная обработка данных

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

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

  1. ABBR - «abbreviation»: сокращенное выражение и т. д.
  2. DESC - «описание и абстрактные понятия»: способ действия, описание чего-то. и т.п.
  3. ENTY - «сущности»: животные, цвета, события, еда и т. д.
  4. HUM - «люди»: группа или организация людей, отдельное лицо и т. д.
  5. LOC - «местоположения»: города, страны и т. д.
  6. NUM - «числовые значения»: почтовые индексы, даты, скорость, температура и т. д.

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

Первый шаг - превратить необработанный текстовый файл в DataFrame pandas и установить столбец «label» как категориальный столбец, чтобы мы могли в дальнейшем получить доступ к метке как числовому значению.

На следующем шаге мы подготовим данные ввода / вывода для модели, ввод в виде списка строк вопросов и вывод в виде списка ярлыков с горячим кодированием. Если вы еще не знакомы с кодированием one-hot, я рассказал вам в части моего предыдущего поста.

Если вы взглянете на значение train_label, вы увидите его в горячей закодированной форме.

Теперь мы готовы построить модель.

Керас встречает универсальный кодировщик предложений

Ранее мы загрузили универсальный кодировщик предложений как переменную «embed», чтобы он хорошо работал с Keras, необходимо обернуть его слоем Keras Lambda и явно передать его ввод как строку.

Затем мы строим модель Keras в ее стандартном Функциональном API,

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

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

Окончательный результат проверки показывает, что максимальная точность составляет около 97% после обучения в течение 10 эпох.

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

Здесь мы предлагаем 3 новых вопроса для классификации модели.

Результаты классификации выглядят достойно.

['NUM', 'LOC', 'HUM']

Заключение и дальнейшее чтение

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

Некоторые связанные ресурсы могут оказаться полезными.

TensorFlow Hub

Примеры записных книжек TensorFlow Hub

Чтобы начать использовать блокнот Google Colab, вы можете прочитать первый раздел моего поста - Как бесплатно запустить обнаружение и сегментацию объектов на видео быстро.

Исходный код в моем GitHub и работающий Colab notebook.

Первоначально опубликовано на www.dlology.com.