Узнайте вероятный пол имени с помощью обработки естественного языка в Tensorflow, Plotly Dash и Heroku.

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

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

Смогут ли люди определить, что это имя относится к девушке, а не мальчику?

Оказывается, мы можем использовать машинное обучение, чтобы проверить, будут ли потенциальные имена больше ассоциироваться с мальчиками или девочками! Чтобы проверить приложение, которое я сделал именно для этого, перейдите по адресу https://www.boyorgirl.xyz.

Остальная часть этого поста посвящена техническим деталям, в том числе

  1. Получение имени для набора данных по гендерному обучению
  2. Предварительная обработка имен для обеспечения их совместимости с моделями машинного обучения (ML)
  3. Разработка модели машинного обучения обработки естественного языка (NLP) для чтения имени и вывода, если это имя мальчика или девушки.
  4. Создание простого веб-приложения для взаимодействия с моделью.
  5. Публикация приложения в Интернете

Архитектура решения

Получение имени в наборе данных по гендерному обучению

Чтобы обучить любую модель машинного обучения, нам понадобится большое количество помеченных данных. В этом случае нам понадобится большое количество имен и связанный с ними пол. К счастью, Bigquery Google Cloud имеет бесплатный открытый набор данных под названием USA_NAMES [Link], который содержит все имена из приложений карты социального обеспечения для рождений, которые произошли в Соединенных Штатах. Набор данных содержит примерно 35000 имен и соответствующий пол, что очень хорошо подходит для нашей модели.

Предварительная обработка данных

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

  1. Имя должно быть в нижнем регистре, поскольку регистр каждого символа не передает никакой информации о поле человека.
  2. Разделите каждый символ: основная идея модели машинного обучения, которую мы строим, состоит в том, чтобы читать символы в имени для выявления закономерностей, которые могут указывать на мужественность или женственность. Таким образом мы разбиваем имя на каждый символ.
  3. Имена пэдов с пустыми пробелами до тех пор, пока максимальная длина 50 символов не будет гарантировать, что модель ML видит одинаковую длину для всех имен.
  4. Закодируйте каждый символ в уникальный номер, поскольку модели машинного обучения могут работать только с числами. В этом случае мы кодируем «» (пробел) в 0, «a» в 1, «b» в 2 и так далее.
  5. Закодируйте каждый пол в уникальный номер, поскольку модели машинного обучения могут работать только с числами. В этом случае мы кодируем «F» в 0 и «M» в 1.

Модель NLP ML

Когда мы читаем имя, мы определяем вероятный пол этого имени по последовательности, в которой символы появляются в этом имени. Например, «Стивен», скорее всего, имя мальчика, а «Стефани» - скорее всего имя девочки. Чтобы имитировать то, как люди идентифицируют пол имени, мы создаем простую двунаправленную модель LSTM, используя tensorflow.keras API.

Модель Архитектура

  1. Слой внедрения: чтобы «встроить» закодированный номер каждого входного символа в плотный 256-размерный вектор. Выбор embedding_dim - это гиперпараметр, который можно настроить для получения желаемой точности.
  2. Двунаправленный слой LSTM: считайте последовательность встраивания символов из предыдущего шага и выведите один вектор, представляющий эту последовательность. Значения units и dropouts также являются гиперпараметрами.
  3. Конечный плотный слой: для вывода одного значения, близкого к 0 для «F» или близкого к 1 для «M», поскольку это кодировка, которую мы использовали на этапе предварительной обработки.

Обучение модели

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

  1. Создайте экземпляр модели, используя функцию, которую мы написали на этапе архитектуры модели.
  2. Разделите данные на 80% обучения и 20% проверки.
  3. Вызовите model.fit с EarlyStopping обратным вызовом, чтобы остановить обучение, как только модель начнет переобучаться.
  4. Сохраните обученную модель для повторного использования при обслуживании веб-приложения.
  5. Постройте график точности обучения и проверки, чтобы визуально проверить производительность модели.

Веб-приложение

Теперь, когда у нас есть обученная модель с хорошей точностью, мы можем создать веб-приложение Plotly Dash [Link] [https://www.boyorgirl.xyz], чтобы получать имена входных данных от пользователя, загружать модель (только один раз во время запуска приложения), используйте модель, чтобы предсказать пол в именах входных данных и визуализировать результаты обратно в веб-приложении. В приведенном ниже фрагменте кода показана только часть веб-приложения для вывода модели. Полный код веб-приложения Plotly Dash, включая загрузку модели, ввод текстового поля, вывод таблицы и вывод интерактивной гистограммы, доступен в моем репозитории GitHub.

Опубликовать в Интернете

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

  1. Бесплатно!!!
  2. Простой процесс развертывания
  3. Максимум 500 МБ памяти достаточно для моей небольшой нестандартной модели.

Развернуть монорепо

Шаги по развертыванию приложения в Heroku хорошо документированы на веб-сайте Heroku [Ссылка]. Я внес индивидуальные изменения для поддержки моего формата монорепозитория, который я задокументировал в моем репозитории Github [Ссылка]. Основные изменения для поддержки монорепозиториев:

  • Добавьте следующий пакет сборки
heroku buildpacks:add -a <app> https://github.com/lstoll/heroku-buildpack-monorepo -i 1
  • Добавьте следующие конфиги
heroku config:set -a <app> PROCFILE=relative/path/to/app/Procfile

heroku config:set -a <app> APP_BASE=relative/path/to/app

Уточняйте количество рабочих

Важно! Одна серьезная ошибка, на которую мне потребовалось некоторое время, - это то, что Heroku по умолчанию запускает двух рабочих процессов. Таким образом, если размер вашего приложения превышает 250 МБ, оба воркера вместе взятые превысят предел в 500 МБ, установленный Heroku для бесплатных приложений. Поскольку я не ожидаю, что трафик моего приложения будет достаточно большим, чтобы потребовалось два воркера, я легко решил эту проблему, указав только одного воркера с помощью флага -w 1 в файле Procfile.

web: gunicorn -w 1 serve:server

Настройка службы ping

Приложения Heroku бесплатного уровня переходят в спящий режим после 30 минут бездействия. Поэтому я использовал бесплатную службу проверки связи Kaffeine [Link], чтобы проверять связь с моим приложением каждые 10 минут. Это обеспечит нулевое время простоя приложения.

Впоследствии я перешел с уровня Free на уровень Hobby (в основном для бесплатного SSL в моем личном домене), гарантируя, что приложение никогда не спит, поэтому служба ping больше не актуальна для моего приложения.

Добавление личного домена

Наконец, я купил дешевый домен в Namecheap [Ссылка] и указал домен на свое приложение Heroku, следуя инструкциям отсюда [Ссылка].

Заявление о возможном предвзятом отношении

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

  1. Модель имеет НУЛЕВОЕ понимание концепции пола в реальном мире! Это только обоснованное предположение, к какому полу может принадлежать конкретное имя, на основе исторических данных имен, принадлежащих к разным полам. Например, мое имя начинается с «Мари», которое модель определяет как женское имя (с вероятностью ~ 90%!), Хотя на самом деле я мужчина. Таким образом, такой подход увековечивает врожденную предвзятость в наших именах, и устранение этих предубеждений выходит за рамки данной работы.
  2. Данные обучения состояли только из двоичных полов (M и F). Таким образом, небинарные полы не представлены.

В заключение, пожалуйста, НЕ используйте это приложение, чтобы делать предположения о чьей-либо гендерной идентичности!

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

Весь код доступен в моем репозитории на Github: [Ссылка]

Вы можете получить доступ к Мальчик или девочка? на: https://www.boyorgirl.xyz