Ашват Салимат, наш летний научный сотрудник Octavian, спросил сегодня, на чем ему следует сосредоточиться, чтобы закрепить свои навыки машинного обучения:

Я хочу овладеть основными алгоритмами машинного обучения в TensorFlow и иметь возможность быстро преобразовывать исследовательские работы в хорошо написанный код. Что мне делать в следующие 3–6 месяцев?

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

Чтобы стать твердым в разработке (и, возможно, затем перейти к исследованию) алгоритмов машинного обучения, я бы рекомендовал потратить время на следующее:

Написание разнообразных моделей с нуля

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

Кроме того, отладка модели заставляет вас понять, что она делает (/ не делает), почему она это делает, каковы ее ограничения и как решать общие проблемы.

Он бы рекомендовал выбрать нетривиальную проблему с данными (например, не MNIST или Iris), чтобы вы столкнулись с более актуальными проблемами реального мира (например, дисбаланс классов, шум, непреодолимость, различные метрики точности, очистка данных и предварительная обработка данных). обработка).

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

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

  • Плотные слои / Регрессия
  • Сверточные нейронные сети
  • Повторяющиеся нейронные сети
  • Армирующие нейронные сети
  • Встраивания (например, совместная фильтрация, поиск)
  • Бонус: нейронные машины Тьюринга

Создавайте модульный, тестируемый, напористый / типизированный код

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

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

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

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

Попробуйте несколько инструментов и платформ

Сейчас существует множество отличных инструментов и платформ для ускорения вашей работы. Например:

  • Попробуйте все различные вкладки TensorBoard (вкладка проекции очень удобна при вычислении вложений! Попробуйте создать для нее свой собственный словарь меток)
  • Попробуйте обучение в облаке (например, с FloydHub, Cloud ML, SageMaker)
  • Попробуйте другую библиотеку машинного обучения (например, PyTorch против TensorFlow, посмотрите класс модели Keras)

Прочитать / реализовать идеи из исследовательских работ

Прежде всего, приобретение привычки читать исследовательские работы - отличный способ:

  • Научитесь читать математику и передовые компьютерные науки
  • Узнай о новых идеях
  • Найдите вдохновение для проектов

Twitter в настоящее время является хорошим местом для поиска новых статей. Вот несколько идей ручек, которым нужно следовать.

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

Построить распределенную систему обучения

Многие реальные проблемы / наборы данных слишком велики, чтобы их можно было запустить на вашем ноутбуке за десять минут. Распределенные системы - это целый отдельный зверь (и, возможно, их труднее отлаживать, чем модели глубокого обучения!)

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

  • Попробуйте использовать распределенную очередь для данных обучения / прогнозирования (например, Kafka, Rabbit MQ, Firebase)
  • Попробуйте использовать несколько компьютеров / экземпляров для обучения (например, кластер Kubernetes, экземпляры AWS, ноутбуки ваших друзей)

Лично я занялся созданием распределенного обучения, чтобы помочь с экспериментом с генетическими алгоритмами / нейронной машиной Тьюринга.

Запуск модели на ограниченном устройстве

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

Попробуйте одно из следующего:

  • Получите модель, которую вы обучили прогнозированию на телефоне
  • Получите модель, которую вы обучили прогнозированию в браузере
  • Дать возможность обучать модель на телефоне / старом компьютере

Напишите о том, что вы узнали

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

Вот несколько распространенных форматов, которые вы можете попробовать:

  • Лабораторный отчет о том, что вы сделали, каковы были результаты
  • Краткий технический контроль качества (например, как решить распространенную ошибку, как обойти ошибку)
  • Учебник
  • Объяснение сложной концепции
  • Презентация новой находки

Практикуйтесь в поиске интересных задач

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

  • Роман (еще не решено / сделано)
  • Интересно другим
  • Возможно с учетом имеющихся у вас времени, навыков и ресурсов

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

Наконец-то

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