Три способа сравнения классификации текста в Google Cloud Platform

Google Cloud Platform предлагает три способа машинного обучения:

  • Keras с серверной частью TensorFlow для создания пользовательских моделей глубокого обучения, обучаемых на Cloud ML Engine.
  • BigQuery ML для построения пользовательских моделей машинного обучения на основе структурированных данных с использованием только SQL.
  • Auto ML для обучения современных моделей глубокого обучения на ваших данных без написания кода

Выбирайте между ними в зависимости от вашего набора навыков, важности дополнительной точности и количества времени / усилий, которые вы готовы посвятить решению проблемы. Используйте BigQuery ML для быстрой постановки задач, экспериментирования и простого и недорогого машинного обучения. Как только вы определите жизнеспособную проблему машинного обучения с помощью BQML, используйте Auto ML для современных моделей без кода. Создавайте собственные нестандартные модели вручную только для тех задач, где у вас много данных и достаточно времени / усилий, которые можно потратить.

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

1. CNN + встраивание + отсев в Керасе

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

Задача состоит в том, чтобы по названию статьи я мог определить, где она была опубликована. Набор данных для обучения взят из статей, опубликованных в Hacker News (в BigQuery есть общедоступный набор данных). Например, вот некоторые из заголовков, источником которых является GitHub:

Код модели для создания модели Keras, которая использует слой встраивания слов, сверточные слои и выпадение:

model = models.Sequential()
num_features = min(len(word_index) + 1, TOP_K)
model.add(Embedding(input_dim=num_features,
                    output_dim=embedding_dim,
                    input_length=MAX_SEQUENCE_LENGTH))
model.add(Dropout(rate=dropout_rate))
model.add(Conv1D(filters=filters,
                              kernel_size=kernel_size,
                              activation='relu',
                              bias_initializer='random_uniform',
                              padding='same'))
model.add(MaxPooling1D(pool_size=pool_size))
model.add(Conv1D(filters=filters * 2,
                              kernel_size=kernel_size,
                              activation='relu',
                              bias_initializer='random_uniform',
                              padding='same'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(rate=dropout_rate))
model.add(Dense(len(CLASSES), activation='softmax'))
# Compile model with learning parameters.
optimizer = tf.keras.optimizers.Adam(lr=learning_rate)
model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['acc'])
estimator = tf.keras.estimator.model_to_estimator(keras_model=model, model_dir=model_dir, config=config)

Затем это обучается на Cloud ML Engine, как показано в этой записной книжке Jupyter:

gcloud ml-engine jobs submit training $JOBNAME \
 --region=$REGION \
 --module-name=trainer.task \
 --package-path=${PWD}/txtclsmodel/trainer \
 --job-dir=$OUTDIR \
 --scale-tier=BASIC_GPU \
 --runtime-version=$TFVERSION \
 -- \
 --output_dir=$OUTDIR \
 --train_data_path=gs://${BUCKET}/txtcls/train.tsv \
 --eval_data_path=gs://${BUCKET}/txtcls/eval.tsv \
 --num_epochs=5

У меня ушло несколько дней на разработку оригинальной модели TensorFlow, у моего коллеги vijaykr день на ее модификацию для использования Keras и, возможно, день на обучение и устранение неполадок.

Мы получили точность около 80%. Чтобы добиться большего, нам, вероятно, потребуется намного больше данных (92 тыс. Примеров недостаточно, чтобы получить преимущества от использования пользовательской модели глубокого обучения) и, возможно, включить дополнительную предварительную обработку (например, удаление стоп-слов, выделение слов, использование многократно используемого вложения, так далее.).

2. BigQuery ML для классификации текста.

При использовании BigQuery ML сверточные нейронные сети, встраивания и т. Д. Являются (пока еще не) вариантом, поэтому я решил использовать линейную модель для набора слов. Задача BigQuery ML - предоставить быстрый и удобный способ построения моделей машинного обучения на основе структурированных и полуструктурированных данных.

Пословное разделение заголовков и обучение модели логистической регрессии (то есть линейного классификатора) на первых 5 словах заголовка (использование большего количества слов не очень помогает):

#standardsql
CREATE OR REPLACE MODEL advdata.txtclass
OPTIONS(model_type='logistic_reg', input_label_cols=['source'])
AS
WITH extracted AS (
SELECT source, REGEXP_REPLACE(LOWER(REGEXP_REPLACE(title, '[^a-zA-Z0-9 $.-]', ' ')), "  ", " ") AS title FROM
  (SELECT
    ARRAY_REVERSE(SPLIT(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.'))[OFFSET(1)] AS source,
    title
  FROM
    `bigquery-public-data.hacker_news.stories`
  WHERE
    REGEXP_CONTAINS(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.com$')
    AND LENGTH(title) > 10
  )
)
, ds AS (
SELECT ARRAY_CONCAT(SPLIT(title, " "), ['NULL', 'NULL', 'NULL', 'NULL', 'NULL']) AS words, source FROM extracted
WHERE (source = 'github' OR source = 'nytimes' OR source = 'techcrunch')
)
SELECT 
source, 
words[OFFSET(0)] AS word1, 
words[OFFSET(1)] AS word2, 
words[OFFSET(2)] AS word3,
words[OFFSET(3)] AS word4,
words[OFFSET(4)] AS word5
FROM ds

Это было быстро. Приведенный выше SQL-запрос - это полная энчилада. Больше ничего нет. Само обучение модели заняло всего несколько минут. Я получил 78% точности, что значительно превосходит 80%, которые я получил с пользовательской моделью Keras CNN.

После обучения делать пакетные прогнозы с помощью BigQuery легко:

SELECT * FROM ML.PREDICT(MODEL advdata.txtclass,(
SELECT 'government' AS word1, 'shutdown' AS word2, 'leaves' AS word3, 'workers' AS word4, 'reeling' AS word5)
)

Онлайн-прогнозы с использованием BigQuery могут быть выполнены путем экспорта весов в веб-приложение.

3. AutoML

Третий вариант, который я попробовал, - это вариант без кода, который, тем не менее, использует самые современные модели и методы. Поскольку это проблема классификации текста, подход Auto ML для использования - это Auto ML Natural Language.

3а. Запустить AutoML Natural Language

Первый шаг - запустить Auto ML Natural Language из веб-консоли GCP:

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

3b. Создайте файл CSV и разместите его в Google Cloud Storage.

Если BigQuery ML требует от вас знания SQL, AutoML просто требует, чтобы вы создали набор данных в одном из форматов, понятных инструменту. Инструмент понимает файлы CSV, расположенные следующим образом:

текст, метка

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

Итак, наш первый шаг - это экспорт CSV-файла из BigQuery в нужном формате. Это был мой запрос²:

WITH extracted AS (
SELECT STRING_AGG(source,',') as source, title FROM 
  (SELECT DISTINCT source, TRIM(LOWER(REGEXP_REPLACE(title, '[^a-zA-Z0-9 $.-]', ' '))) AS title FROM
    (SELECT
      ARRAY_REVERSE(SPLIT(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.'))[OFFSET(1)] AS source,
      title
    FROM
      `bigquery-public-data.hacker_news.stories`
    WHERE
      REGEXP_CONTAINS(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.com$')
      AND LENGTH(title) > 10
    )
  )
GROUP BY title
)
SELECT title, source FROM extracted
WHERE (source = 'github' OR source = 'nytimes' OR source = 'techcrunch')

Что дает следующий набор данных:

Обратите внимание, что я убрал знаки препинания и специальные символы. Пробелы были обрезаны, а SELECT independent используется для удаления дубликатов и статей, которые появляются в нескольких классах (AutoML предупредит вас о дубликатах и ​​может иметь дело с метками с несколькими классами, но их удаление будет более чистым).

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

а затем экспортировал таблицу в файл CSV:

3c. Создать набор данных Auto ML

Следующим шагом будет использование пользовательского интерфейса Auto ML для создания набора данных из файла CSV в облачном хранилище:

Для приема набора данных требуется около 20 минут. В итоге мы получаем экран, полный текстовых элементов:

Текущий предел Auto ML составляет 100 тыс. Строк, поэтому наш набор данных в 92 тыс. Определенно раздвигает некоторые границы. Набор данных меньшего размера будет загружен быстрее.

Почему у нас есть ярлык «источник» только с примером? В CSV-файле была строка заголовка (источник, заголовок), и она тоже была загружена! К счастью, AutoML позволяет нам редактировать текстовые элементы в самом графическом интерфейсе. Итак, я удалил лишнюю метку и соответствующий ей текст.

3d. Тренироваться

Обучение так же просто, как нажатие на кнопку.

Затем Auto ML пробует различные вложения и различные архитектуры и выполняет настройку гиперпараметров, чтобы найти хорошее решение проблемы.

Проходит 5 часов.

3e. Оценка

После обучения модели мы получаем набор статистических данных: точность, отзыв, кривая AUC и т. Д. Но мы также получаем фактическую матрицу путаницы, из которой мы можем вычислить все, что захотим:

Общая точность составляет около 86% - даже выше, чем у нашей кастомной модели Keras CNN. Почему? Поскольку Auto ML может использовать преимущества переноса обучения из моделей, построенных на наборах данных Google, об использовании языка, то есть включает данные, которые у нас не были доступны для нашей модели Keras. Кроме того, из-за доступности всех этих данных для передачи обучения, архитектура модели может быть более сложной (читайте: более глубоко).

3f. Прогноз

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

Обратите внимание, что модель намного более уверена, чем модель BQML (хотя обе дали один и тот же правильный ответ), уверенность, обусловленная тем фактом, что эта модель Auto ML была обучена на большем количестве данных и создана специально для задач классификации текста.

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

Резюме

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

  • Используйте BigQuery ML для простого и недорогого машинного обучения и быстрых экспериментов, чтобы убедиться, что машинное обучение применимо к вашим данным. Иногда точности, которую вы получаете с помощью BQML, бывает достаточно, и вы просто остановитесь на этом.
  • Как только вы определите жизнеспособную проблему машинного обучения с помощью BQML, используйте Auto ML для современных моделей без кода. Например, классификация текста - это очень специализированная область с многомерными входными данными. Таким образом, вы можете добиться большего успеха с помощью индивидуализированного решения (например, Auto ML Natural Language), чем с подходом к структурированным данным, который просто использует набор слов.
  • Создавайте собственные нестандартные модели вручную только для тех задач, где у вас много данных и достаточно времени / усилий, которые можно потратить. Используйте AutoML в качестве эталона. Если вы не можете победить Auto ML после некоторых разумных усилий, не тратьте время зря. Просто выберите Auto ML.

¹ Есть еще несколько способов машинного обучения в GCP. Вы можете выполнять xgboost или scikit-learn в ML Engine. Виртуальная машина глубокого обучения поддерживает PyTorch. Spark ML хорошо работает в Cloud Dataproc. И, конечно же, вы можете использовать Google Compute Engine или Google Kubernetes Engine и установить любую платформу машинного обучения, какую захотите. Но в этой статье я остановлюсь на этих трех.

² Спасибо Грегу Микелсу за улучшение моего исходного запроса AutoML для удаления дубликатов и перекрестных статей.