Узнайте вероятный пол имени с помощью обработки естественного языка в Tensorflow, Plotly Dash и Heroku.
Выбор имени для ребенка - одно из самых сложных решений, которые вам придется принять как новому родителю. Особенно для такого человека, который управляет данными, как я, необходимость выбирать имя без каких-либо предварительных данных о характере и предпочтениях моего ребенка - настоящий кошмар!
С тех пор, как мое имя начинается с «Мари», я пережил бесчисленное количество случаев, когда люди обращались ко мне «мисс» по электронной почте и текстовым сообщениям только для того, чтобы разочароваться и понять, что я на самом деле парень, когда мы, наконец, встретимся или поговорим 😜. Итак, когда мы с женой искали имена для нашей девочки, мы задали себе важный вопрос:
Смогут ли люди определить, что это имя относится к девушке, а не мальчику?
Оказывается, мы можем использовать машинное обучение, чтобы проверить, будут ли потенциальные имена больше ассоциироваться с мальчиками или девочками! Чтобы проверить приложение, которое я сделал именно для этого, перейдите по адресу https://www.boyorgirl.xyz.
Остальная часть этого поста посвящена техническим деталям, в том числе
- Получение имени для набора данных по гендерному обучению
- Предварительная обработка имен для обеспечения их совместимости с моделями машинного обучения (ML)
- Разработка модели машинного обучения обработки естественного языка (NLP) для чтения имени и вывода, если это имя мальчика или девушки.
- Создание простого веб-приложения для взаимодействия с моделью.
- Публикация приложения в Интернете
Архитектура решения
Получение имени в наборе данных по гендерному обучению
Чтобы обучить любую модель машинного обучения, нам понадобится большое количество помеченных данных. В этом случае нам понадобится большое количество имен и связанный с ними пол. К счастью, Bigquery Google Cloud имеет бесплатный открытый набор данных под названием USA_NAMES
[Link], который содержит все имена из приложений карты социального обеспечения для рождений, которые произошли в Соединенных Штатах. Набор данных содержит примерно 35000 имен и соответствующий пол, что очень хорошо подходит для нашей модели.
Предварительная обработка данных
Человеческие имена - это текстовые данные, а модели машинного обучения могут работать только с числовыми данными. Чтобы преобразовать наш текст в числовое представление, мы сделаем следующие шаги.
- Имя должно быть в нижнем регистре, поскольку регистр каждого символа не передает никакой информации о поле человека.
- Разделите каждый символ: основная идея модели машинного обучения, которую мы строим, состоит в том, чтобы читать символы в имени для выявления закономерностей, которые могут указывать на мужественность или женственность. Таким образом мы разбиваем имя на каждый символ.
- Имена пэдов с пустыми пробелами до тех пор, пока максимальная длина 50 символов не будет гарантировать, что модель ML видит одинаковую длину для всех имен.
- Закодируйте каждый символ в уникальный номер, поскольку модели машинного обучения могут работать только с числами. В этом случае мы кодируем «» (пробел) в 0, «a» в 1, «b» в 2 и так далее.
- Закодируйте каждый пол в уникальный номер, поскольку модели машинного обучения могут работать только с числами. В этом случае мы кодируем «F» в 0 и «M» в 1.
Модель NLP ML
Когда мы читаем имя, мы определяем вероятный пол этого имени по последовательности, в которой символы появляются в этом имени. Например, «Стивен», скорее всего, имя мальчика, а «Стефани» - скорее всего имя девочки. Чтобы имитировать то, как люди идентифицируют пол имени, мы создаем простую двунаправленную модель LSTM, используя tensorflow.keras
API.
Модель Архитектура
- Слой внедрения: чтобы «встроить» закодированный номер каждого входного символа в плотный 256-размерный вектор. Выбор
embedding_dim
- это гиперпараметр, который можно настроить для получения желаемой точности. - Двунаправленный слой LSTM: считайте последовательность встраивания символов из предыдущего шага и выведите один вектор, представляющий эту последовательность. Значения
units
иdropouts
также являются гиперпараметрами. - Конечный плотный слой: для вывода одного значения, близкого к 0 для «F» или близкого к 1 для «M», поскольку это кодировка, которую мы использовали на этапе предварительной обработки.
Обучение модели
Мы будем использовать стандартный tensorflow.keras
учебный конвейер, как показано ниже.
- Создайте экземпляр модели, используя функцию, которую мы написали на этапе архитектуры модели.
- Разделите данные на 80% обучения и 20% проверки.
- Вызовите
model.fit
сEarlyStopping
обратным вызовом, чтобы остановить обучение, как только модель начнет переобучаться. - Сохраните обученную модель для повторного использования при обслуживании веб-приложения.
- Постройте график точности обучения и проверки, чтобы визуально проверить производительность модели.
Веб-приложение
Теперь, когда у нас есть обученная модель с хорошей точностью, мы можем создать веб-приложение Plotly Dash [Link] [https://www.boyorgirl.xyz], чтобы получать имена входных данных от пользователя, загружать модель (только один раз во время запуска приложения), используйте модель, чтобы предсказать пол в именах входных данных и визуализировать результаты обратно в веб-приложении. В приведенном ниже фрагменте кода показана только часть веб-приложения для вывода модели. Полный код веб-приложения Plotly Dash, включая загрузку модели, ввод текстового поля, вывод таблицы и вывод интерактивной гистограммы, доступен в моем репозитории GitHub.
Опубликовать в Интернете
Последний шаг - опубликовать наше новое приложение в Интернете, чтобы каждый во всем мире мог с ним взаимодействовать. После небольшого исследования я решил использовать Heroku для развертывания приложения по следующим причинам.
- Бесплатно!!!
- Простой процесс развертывания
- Максимум 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, следуя инструкциям отсюда [Ссылка].
Заявление о возможном предвзятом отношении
Если серьезно, то при использовании этого подхода мы должны помнить о некоторых ограничениях и предвзятостях.
- Модель имеет НУЛЕВОЕ понимание концепции пола в реальном мире! Это только обоснованное предположение, к какому полу может принадлежать конкретное имя, на основе исторических данных имен, принадлежащих к разным полам. Например, мое имя начинается с «Мари», которое модель определяет как женское имя (с вероятностью ~ 90%!), Хотя на самом деле я мужчина. Таким образом, такой подход увековечивает врожденную предвзятость в наших именах, и устранение этих предубеждений выходит за рамки данной работы.
- Данные обучения состояли только из двоичных полов (M и F). Таким образом, небинарные полы не представлены.
В заключение, пожалуйста, НЕ используйте это приложение, чтобы делать предположения о чьей-либо гендерной идентичности!
И это все! Наше классное приложение машинного обучения для предсказания пола по именам теперь доступно для общения любому пользователю в Интернете! По результатам моего тестирования приложение, похоже, очень хорошо работает с английскими именами и достаточно хорошо с индийскими именами из-за имен, присутствующих в наборе обучающих данных. Неанглийские имена, такие как китайские, работали плохо. Не могли бы вы взглянуть и сообщить мне, правильно ли указаны ваши имена? Спасибо за чтение!
Весь код доступен в моем репозитории на Github: [Ссылка]
Вы можете получить доступ к Мальчик или девочка? на: https://www.boyorgirl.xyz