Создание заголовков для ядер Kaggle с помощью LSTM

Создание заголовков для ядер Kaggle с помощью LSTM

Небольшой проект глубокого обучения с PyTorch

Вступление

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

У меня возникла идея использовать набор данных Meta Kaggle, чтобы обучить модель генерировать новые названия ядра для Kaggle. Ядра — это записные книжки на R или Python, опубликованные пользователями на Kaggle. Пользователи Kaggle могут голосовать за ядра. В зависимости от количества голосов, ядра получают медали. Модель, генерирующая названия ядер, может помочь выявить тенденции для ядер Kaggle и послужить источником вдохновения для написания новых ядер и получения медалей. В этой статье:

  • Я описываю, как загружать и предварительно обрабатывать данные ядра из набора данных Meta Kaggle.
  • Я демонстрирую, как обучить модель PyTorch LSTM для создания новых заголовков Kaggle и показать результаты.

Полный код этого небольшого проекта доступен на GitHub, или вы можете поиграть с кодом на Kaggle.

Загрузить данные

Сначала мне нужно загрузить данные. Я загружаю таблицы Kernels и KernelVersions, которые содержат информацию обо всех ядрах, общее количество голосов на ядро ​​(позже я объясню, зачем нам это нужно) и названия ядер.

См. также:  Функция активации Swish с большей эффективностью памяти

Составьте список популярных названий ядер

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

Поэтому:

  • Я бросаю ядра без голосов из анализа. Я предполагаю, что ядра, за которые проголосовали, должны быть более высокого качества и иметь более значимые заголовки.
  • Я сортирую ядра по общему количеству голосов и беру только самые проголосовавшие.

Предварительная обработка названий ядер и создание словаря

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

Чтобы создать словарь, мне нужно сделать следующие шаги:

  • Очистите каждый заголовок, чтобы удалить знаки препинания и строчные буквы.
  • Разделите каждый заголовок на слова и добавьте каждое слово в словарь.
  • Введите символ, обозначающий конец заголовка (я выбрал «.», но его можно изменить) и добавьте его в словарь.

Давайте представим простую функцию для очистки заголовков ядра:

Теперь давайте представим символ конца заголовка и функцию извлечения слова:

Следующим шагом будет составление словаря, состоящего из извлеченных слов:

Подготовьте тренировочный набор

В этом разделе я создаю обучающий набор для нашей будущей модели:

  • Представьте функции, которые кодируют каждое слово в тензор, используя созданный выше словарь. Я использую горячую кодировку слов: каждое слово представлено как тензор с нулями и единицы со всеми нулями и единица в позиции, соответствующей индексу слова в словаре. Использование встраивания слов вместо быстрого кодирования, несомненно, является улучшением моего подхода.
  • Создавайте последовательности из заголовков ядра. Длина последовательности является гиперпараметром. Я выбрал длину последовательности равной 3. Итак, мы даем модели тензор, содержащий кодировку для 3 слов, и цель предсказания, которая содержит индекс 4-го следующего слова.
См. также:  Машинное обучение в iOS: пользовательское видение Azure и CoreML

Следующие функции кодируют слова в тензоры:

А теперь давайте сгенерируем словосочетания из названий самых популярных ядер:

Постройте модель последовательности

Следующим шагом будет построение простой модели LSTM:

  • Входные и выходные размеры модели должны быть равны размеру словаря, потому что мы пытаемся предсказать следующее слово для последовательности;
  • Блок LSTM со 128 скрытыми блоками;
  • Один линейный слой для преобразования скрытого размера в выходной размер;
  • С помощью активации Softmax.

Итак, давайте определим и инициализируем модель с помощью PyTorch:

Также мне понадобится служебная функция для преобразования вывода модели в слово:

Обучите модель

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

Следующим шагом является настройка гиперпараметров и устройства (ЦП или ГП, если они есть):

Определите процедуру обучения модели:

Теперь все готово к самой тренировке:

В результате обучения мы должны увидеть, как убытки уменьшаются с течением времени, например:

Примеры названий ядер из модели

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

  1. Введите в заголовок максимальное количество слов (например, 10);
  2. Передайте в модель нулевые тензоры в качестве начального слова и скрытого состояния;
  3. Повторяйте следующие шаги до тех пор, пока не будет выбран конец символа заголовка или не будет превышено максимальное количество слов в заголовке:
  • Используйте вероятности из выходных данных модели, чтобы получить следующее слово для последовательности;
  • Передайте выбранное слово в качестве следующего ввода для модели.

Итак, давайте определим функцию выборки и выберем несколько заголовков из модели:

См. также:  Представляем Mei: первое мобильное приложение для обмена сообщениями с интегрированным искусственным интеллектом и технологией блокчейн

Заключение

В этом небольшом проекте:

  • Я загрузил и предварительно обработал реальные текстовые данные.
  • Я создал основанную на словах модель последовательности, которую можно использовать для генерации новых заголовков ядра.

Вы можете видеть, что модель не дает ничего, что имеет смысл, но все же есть некоторые забавные результаты, подобные этим:

  • сбор данных чаши богатства
  • дополнять утвержденные базы данных
  • самолет игнорировать конкуренцию населения
  • проектирование исследования по назначению суперпродуктов
  • ужин урок веб-просмотр
  • эластичная детская площадка

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

Дальнейшее улучшение

Хотя мне удалось добиться впечатляющих результатов, я могу многое сделать, чтобы улучшить:

  • Лучшая очистка данных: многие заголовки следует исключить из анализа, поскольку они не на английском языке или их просто нельзя использовать (например, «kernel123»).
  • Автокоррекция слов с ошибками: заголовки могут быть предварительно обработаны с автоматическим исправлением слов с ошибками (например, рассмотрим пакет PySpell). На выполнение этой процедуры уходит много времени. Однако это все еще вариант, поскольку предварительная обработка данных происходит только один раз перед обучением.
  • Настройка гиперпараметров: я полагаю, что скорость обучения и длину последовательности можно настроить для достижения еще лучших результатов.
  • Используйте встраивание слов вместо быстрого кодирования для слов.
Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: