"Машинное обучение"

Уловки построения модели ML или DNN

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

Таблица содержания

Подготовка данных

  • Обработка ваших собственных данных
  • Использовать тензор
  • Увеличение данных
  • Выборка одинаковых данных

Модельное обучение

  • Сохранение промежуточной контрольной точки
  • Виртуальная эпоха
  • Просто красота
  • Упрощение проблемы

Отладка

  • Упрощение проблемы
  • Использование Eval Mode для обучения
  • Перенос данных
  • Решение проблемы недостаточного оснащения
  • Решение проблемы переобучения

Производство

  • Ассоциация метаданных
  • Перейти в режим вывода
  • Стоимость масштабирования
  • Без гражданства
  • Пакетный процесс
  • Используйте C ++

Подготовка данных

Обработка ваших собственных данных

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

  • Возьмем в качестве примера задачу классификации текста, и вы используете BERT для классификации. Вы не можете попросить своего клиента провести токенизацию и обсудить особенности (преобразование текста в идентификатор токена).
  • В качестве примера можно взять проблему регрессии и дату (например, 31.10.2019). В вашей первоначальной модели вы можете использовать только день недели (например, четверг) в качестве функции. После нескольких итераций день недели больше не является хорошей функцией, и вы хотите использовать только день (например, 31). Если ваш клиент передает только дату (например, 31.10.2019) вместо дня недели (например, 31) с первого дня, вам не нужно изменять интерфейс API, чтобы развернуть новую модель.
  • Если взять в качестве примера автоматическое распознавание речи, потребитель может отправлять вам только звук, но не классические функции, такие как частота-кепстральный коэффициент Mel (MFCC).

Поэтому рекомендуется встраивать предварительную обработку данных в ваш конвейер, а не просить клиента сделать это.

Использовать тензор

Tensor - это N-мерный массив, оптимизированный для многомерных вычислений. Это быстрее, чем использование словаря или массива Python, и ожидаемым форматом данных для фреймворка глубокого обучения (например, PyTorch или TensorFlow) является тензор.

Увеличение данных

Отсутствие маркированных данных - одна из проблем, с которой обычно сталкиваются практикующие врачи. Трансферное обучение - один из способов его преодоления. Вы можете рассмотреть возможность использования ResNet (для компьютерного зрения), BERT (для обработки естественного языка). С другой стороны, вы можете генерировать синтетические данные для увеличения помеченных данных. Albumentations и imgaug помогают генерировать данные для изображения, в то время как nlpaug генерирует текстовые данные.

Если вы понимаете свои данные, вам следует адаптировать подход к их расширению. Помните, что золотое правило в науке о данных - мусор выбрасывается.

Выборка одинаковых данных

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

  • Если данные поставляются с атрибутом даты, вы можете легко разделить данные по этому столбцу.
  • В противном случае вы можете изменить семя так, чтобы иметь последовательное случайное поведение.
import torch
import numpy as np
import random
seed = 1234
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)

Модельное обучение

Сохранение промежуточной контрольной точки

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

  • Из-за сложности модели, вычислительных ресурсов и размера обучающих данных весь процесс обучения модели может занять несколько дней или недель. Если промежуточные контрольные точки не будут сохранены, это будет слишком рискованно, поскольку машина может случайно выключиться.
  • В целом, более длительная тренировочная модель дает лучший результат (например, меньшие потери). Однако может произойти переоснащение. Последняя контрольная точка не дает наилучшего результата большую часть времени e. Большую часть времени нам нужно использовать промежуточную контрольную точку для производства.
  • Экономия денег при использовании механизма ранней остановки. Заметив, что модель не улучшается в течение нескольких эпох, мы можем остановить ее раньше, чтобы сэкономить время и ресурсы. Вы можете возразить, что лучшую модель можно обучить через несколько эпох. Это то, как вы это уравновешиваете.

Так можем ли мы это сделать? В идеале вы можете сохранять все контрольные точки (например, сохранять модель после каждой эпохи), но для этого требуется много места для хранения. Действительно, рекомендуется оставить только лучшую модель (или три лучшие модели) и последнюю модель.

Виртуальная эпоха

Эпоха - очень распространенный параметр при обучении моделей. Неправильная инициализация может повлиять на производительность вашей модели.

Например, если у нас есть 1 миллион записей и мы установили 5 эпох для обучения, всего будет 5 миллионов (1M * 5) обучающих данных. Через три недели мы получили еще 0,5 миллиона записей. Если мы используем ту же эпоху (т.е. 5) для обучения модели, общее количество данных обучения составит 7,5 миллионов (1,5 млн * 5). Проблемы следующие:

  • Возможно, не так просто узнать, что улучшение модели вызвано увеличением количества уникальных обучающих данных или увеличения общего числа обучающих данных.
  • Новый 0.5M увеличивает время обучения до часа или даже дней. Это увеличивает риск поломки машины.

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

Вот наша обычная установка:

#original
num_data = 1000 * 1000
batch_size = 100
num_step = 14 * 1000 * 1000
num_checkpoint = 20
steps_per_epoch = num_step//num_checkpoint
#TensorFlow/ Keras
model.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch,
  batch_size=batch_size
)

Действительно, вы можете использовать следующую настройку:

num_data = 1000 * 1000
num_total_data = 14 * 1000 * 1000
batch_size = 100
num_checkpoint = 20
steps_per_epoch = num_total_data // (batch_size*num_checkpoint)
#TensorFlow/ Keras
model.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch,
  batch_size=batch_size
)

Просто красота

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

  • Нам всегда нужен базовый режим l, чтобы оправдать предложенную модель. Трудно сказать клиенту, что наша удивительная модель глубокой нейронной сети лучше других.
  • Базовая модель не должна быть очень хорошей с точки зрения производительности, но она должна быть объяснимой. Бизнес-пользователь всегда хочет знать причины результата прогноза.
  • Простота реализации t очень важна. Клиент не может ждать год, чтобы получить достаточно хорошую модель. Нам нужно построить набор моделей, чтобы получить импульс от инвестора, чтобы построить вашу замечательную модель поверх первоначальной модели.

Вот некоторые предлагаемые базовые модели в разных областях:

  • Акустика: вместо обучения модели для получения векторного представления (т. е. слоя встраивания) вы можете использовать классические функции, такие как кепстральный коэффициент частоты мела (MFCC) или спектрограмма мела. Особенности. Передача этих функций на один уровень долгосрочной краткосрочной памяти (LSTM) или сверточной нейронной сети (CNN) и на полностью связанный уровень для классификации или прогнозирования.
  • Компьютерное зрение (CV): TODO
  • Обработка естественного языка (NLP): использование набора слов или классических встраиваний слов с LSTM - хорошая отправная точка и переход к моделям на основе трансформаторов, таким как BERT или XLNet позже.

Отладка

Упрощение проблемы

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

Вместо того, чтобы классифицировать 1000 категорий, вы можете выбрать 10 категорий по 100 записей в каждой категории и обучить свою модель. Используя тот же набор (или подмножество) обучающих данных, что и набор оценочных данных, вы сможете переоснастить свою модель и достичь хороших результатов (например, 80 или даже 90+ точность). Если нет, то в разработке вашей модели могут быть ошибки.

Использование Eval Mode для обучения

Если точность набора оценок не изменилась в первые несколько эпох, вы можете забыть сбросить режим «обучение» после оценки.

В PyTorch вам нужно поменять местами режимы train и eval во время обучения и оценки. Если включен режим обучения, это повлияет на пакетную нормализацию, отсев или другие слои. Иногда вы можете забыть включить его после оценки.

model = MyModel() # Default mode is training mode
for e in range(epoch):
  # mode.train() # forget to enable train mode
  logits = model(x_train)
  loss = loss_func(logits, y_train)
  model.zero_grad()
  loss.backward()
  optimizer.step()
mode.eval() # enable eval mode
  with torch.no_grad():
    eval_preds = model(x_val)

Перенос данных

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

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

  1. Убедитесь, что поддерживается одинаковое распределение данных между набором данных для обучения, тестирования и онлайн-прогнозирования.
  2. Если возможно, добавьте дополнительные данные для обучения.
  3. Добавьте синтетические данные a с помощью библиотек. Рассмотрите возможность использования nlpaug (для обработки естественного языка и акустической задачи) и imgaug (для задачи компьютерного зрения).

Решение проблемы недостаточного оснащения

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

  1. Выполните анализ ошибок. Интерпретация вашей модели с помощью LIME, SHAP или Anchor, чтобы вы могли понять проблему.
  2. Первоначальная модель может быть слишком простой. Повышение сложности модели, например добавление слоев долгосрочной краткосрочной памяти (LSTM), слоев сверточной нейронной сети (CNN) или полносвязных слоев (FC).
  3. Немного переобучите модель, уменьшив уровни регуляризации. Падение и снижение веса предназначены для предотвращения переобучения. Вы можете попробовать удалить эти макеты регуляризации, чтобы увидеть, можно ли решить проблему.
  4. Используйте современную модельную архитектуру. Рассмотрение использования преобразователей (например, BERT или XLNet) в обработке естественного языка (NLP)).
  5. Представьте синтетические данные. Создание большего количества данных помогает повысить производительность модели без каких-либо человеческих усилий. Теоретически сгенерированные данные должны иметь одну и ту же метку. Это позволяет модели видеть более разнообразные данные и, в конечном итоге, повышать надежность. Вы можете использовать nlpaug (для обработки естественного языка и акустической задачи) и imgaug (для задачи компьютерного зрения) для выполнения увеличения данных n.
  6. Назначьте лучше гиперпараметры и оптимизатор. Вместо использования стандартной / общей скорости обучения, эпохи и размера пакета вы можете рассмотреть возможность настройки гиперпараметров. Рассмотрите возможность использования лучевого поиска, поиска по сетке или случайного поиска, чтобы определить лучшие гиперпараметры и оптимизатор. Этот подход относительно прост, просто изменяя гиперпараметры, но это может занять больше времени.
  7. Пересмотрите свои данные и представьте дополнительные функции.

Решение проблемы переобучения

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

  1. Выполните анализ ошибок. Интерпретация вашей модели с помощью LIME, SHAP или Anchor, чтобы вы могли понять проблему.
  2. Если возможно, добавьте больше данных для обучения.
  3. Представьте уровни регуляризации и нормализации. Исключение (уровень регуляризации) и пакетная нормализация (уровень нормализации) помогают уменьшить переобучение за счет удаления некоторых входных данных и сглаживания входных данных.
  4. Представьте синтетические данные. Создание большего количества данных помогает повысить производительность модели без каких-либо человеческих усилий. Теоретически сгенерированные данные должны иметь одну и ту же метку. Это позволяет модели видеть более разнообразные данные и, в конечном итоге, повышать надежность. Вы можете использовать nlpaug (для обработки естественного языка и акустической задачи) и imaug (для задачи компьютерного зрения) для выполнения увеличения данных n.
  5. Назначьте лучше гиперпараметры и оптимизатор. Вместо использования стандартной / общей скорости обучения, эпохи и размера пакета вы можете рассмотреть возможность настройки гиперпараметров. Рассмотрите возможность использования лучевого поиска, поиска по сетке или случайного поиска, чтобы определить лучшие гиперпараметры и оптимизатор. Этот подход относительно прост, просто изменяя гиперпараметры, но это может занять больше времени.
  6. Используйте механизм ранней остановки, чтобы найти оптимальную модель.
  7. Удалить функции.
  8. Модель может быть слишком сложной. Уменьшить сложность модели.

Производство

Ассоциация метаданных

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

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

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

Перейти в режим вывода

При использовании PyTorch есть несколько настроек, о которых следует позаботиться при развертывании модели в производственной среде. Вышеупомянутое о eval в PyTorch заставляет эти слои (например, Dropout, BatchNorm) работать в режиме вывода, например, во время вывода не применяется никакое действие исключения. Это не только ускоряет ваш процесс, но и передает всю информацию в нейронную сеть. detach и torch.no_grad помогут вам получить результат из графика, используя меньше памяти.

mode.eval() # enable eval mode
with torch.no_grad():
  eval_preds = model(x_val)

Стоимость масштабирования

Когда вы пытаетесь масштабировать API для обработки большей пропускной способности, вы можете иногда подумать об использовании графического процессора. Это правда, что виртуальная машина с графическим процессором намного дороже ЦП. Однако графический процессор дает вам некоторые преимущества, такие как меньшее время вычислений и требуется меньше виртуальных машин для поддержания того же уровня обслуживания. Попробуйте оценить и посмотреть, экономит ли GPU немного денег.

Без гражданства

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

Пакетный процесс

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

Используйте C ++

Хотя Python является первоклассным гражданином в области машинного обучения, он может быть слишком медленным по сравнению с другими языками программирования, такими как C ++. Вы можете рассмотреть возможность использования TorchScript, если вам нужно время вывода с малой задержкой. Общая идея состоит в том, что вы все равно можете обучить свою модель на Python и сгенерировать модель, совместимую с C ++, используя ее.

Ссылка