Контрольный список для отслеживания прогресса в машинном обучении

Может иметь минимальный уклон в сторону глубокого обучения

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

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

Давайте рассмотрим уровни более подробно, начиная с начального уровня.

Начальный уровень

Начальный уровень разделен на 5 категорий:

  • Обработка данных нацелена на возможность работы с небольшими наборами данных.
  • Машинное обучение охватывает ключевые концепции классического машинного обучения.
  • Сети ограничиваются DNN, CNN и RNN.
  • Теория призвана помочь вам понять идеи, лежащие в основе машинного обучения.
  • В разделе Общие перечислены основные моменты, с которыми вы будете работать на этом этапе.

Обработка данных

Эта категория предназначена для обработки небольших наборов данных.

Наиболее распространенные типы данных:

  • Изображений
  • Аудио
  • Временная последовательность
  • Текст

Наборы данных на этом уровне часто уже встроены в PyTorch или TensorFlow; дополнительная загрузка не требуется. Обычно они невелики по размеру и сложности и обычно умещаются в памяти. Хорошим примером изображения является классический набор данных изображений MNIST (PyTorch, TensorFlow) для набора данных обзоров IMDB (PyTorch, TensorFlow) для текстовых данных и небольших наборов данных аудио или временных рядов.

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

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

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

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

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

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

Кластеризация содержит множество алгоритмов, которые делают одно и то же: объединяют похожие образцы данных вместе и разделяют разнородные. Для решения этой задачи появилось много разных подходов, но я предлагаю сначала проверить k-Means.

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

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

Сети

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

Плотные слои и плотные нейронные сети в целом являются хорошей отправной точкой. Я предполагаю, что эти слои используются очень часто и определенно в 90% классификационных моделей. Например, в самой базовой настройке вы умножаете входные данные на вес и добавляете смещение: w₁ × x₁ + b.

Если у вас есть два входа, умножьте каждый на свой вес, а затем добавьте смещение: w₁ × x₁ + w₂ × x₂ + b.

Если у вас есть три, четыре или сотни входов, процедура остается той же - для одного нейрона. Если у вас есть два принимающих нейрона и один вход, у вас есть один вес и смещение на нейрон: w₁₁ и w₂₁, b₁ и b₂. Если у вас есть 20 входов, у вас есть двадцать весов на принимающий нейрон и одно смещение на нейрон. Не волнуйтесь, если это вас смущает. После того, как вы это получите, это не будет проблемой.

Следующая сеть в списке - сверточная нейронная сеть, сокращенно CNN. CNN используют операцию свертки, когда ядро ​​проходит по матрице и вычисляет внутренний продукт между собой и покрытым патчем. Таким образом, вы можете извлечь небольшие наборы функций из данных и помочь сети обнаружить такие особенности независимо от фактического положения. Другими словами: хотя обувь на изображении может быть внизу, сеть сможет обнаружить ее также, когда она находится в верхней половине. Трудно представить себе какое-либо успешное исследование, в котором не использовалась бы эта простая операция.

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

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

Теория

Эта категория ориентирована на теоретические концепции. Это не только математика, но и понимание техник, которые делают возможным ML в целом и DL в частности.

Для этого неплохо начать изучать математические обозначения. Возьмем, к примеру, Σ. Поработав с ним какое-то время, вы начнете ценить его краткость. Например, вместо того, чтобы постоянно писать: «Мы вычисляем сумму по всем отдельным элементам, умноженную на вероятность», вы можете написать:

Так будет короче и со временем станет точнее. Умножаем ли мы окончательную сумму? Или мы умножаем каждый элемент? Используя математические обозначения, это ясно.

Оставаясь в области математики, нужно научиться матричным операциям. Помните плотные слои, которые я предложил в качестве хорошей отправной точки? Их можно записать как матричную операцию; используя «трюк смещения», вы также можете интегрировать смещение.

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

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

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

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

Общий

В этой категории собраны методы и передовой опыт, которые вы усвоите на раннем этапе.

Для работы с нейронными сетями вы хотите использовать некоторые полезные инструменты. К ним относятся IDE (компьютерные программы, помогающие писать код) и GitHub (служба, которая версия вашего кода).

Если вы не знакомы с языком программирования, я предлагаю python в качестве удобного для начинающих начала. Количество ресурсов для этого конкретного языка ОГРОМНО. Это критический момент; как новичок, вы хотите избежать создания пользовательских операций и обратиться к документации, чтобы использовать встроенные функции.

Эти предоставленные функции также пригодятся, когда вы проанализируете свой набор данных. Например, каков диапазон значений? Есть какие-то выбросы? Насколько они экстремальны? Есть ли неиспользуемые образцы данных? Вот некоторые вопросы, на которые вы хотите ответить, что обычно происходит в дороге:

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

Обычно на этом этапе контролируются данные, с которыми вы работаете, что означает, что они содержат сопоставления datalabel. Для изображения это может быть собака или кошка; для текста это может быть положительное или отрицательное значение; для аудио это может быть музыкальный жанр.

Эти сопоставления являются частью метаданных, которые представляют собой данные о фактических данных. Эти дополнительные знания часто предоставляются через файлы CSV или JSON. Поэтому хорошо иметь возможность их анализировать. К счастью, основные языки программирования предоставляют код для этого; несколько строк подойдет.

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

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

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

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

Промежуточный уровень

На промежуточном уровне вы потратите много времени, и здесь есть что изучить: языковые модели, большие наборы данных, пользовательские циклы обучения, поиск по гиперпараметрам и многое, многое другое. Однако переход с предыдущего уровня на этот очень плавный. Я бы сказал, что это займет от трех до четырех месяцев, в зависимости от вашего опыта, но: вы достигнете этого быстрее, чем думаете!

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

  • Обработка данных позволяет сосредоточить внимание на больших наборах данных и настраиваемой предварительной обработке.
  • Индивидуальные проекты хочет, чтобы вы приобрели опыт именно с этим
  • Сети содержит несколько тенденций на этом уровне.
  • Обучение охватывает многое из предыдущих двух пунктов.
  • Теория направлена ​​на расширение ваших базовых знаний
  • В разделе Общие перечислены несколько элементов, с которыми вы работаете на этом уровне.

Обработка данных

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

Я заметил, что наборы данных на этом уровне имеют тенденцию становиться больше или сложнее. Или оба. Если раньше вы имели дело с небольшими наборами данных, которые легко помещались в ОЗУ, теперь вы будете иметь дело с 30–100 ГБ данных. Однако это не должно вас пугать. После того как вы ознакомитесь с документацией TensorFlow или PyTorch, вы почувствуете, что делать.

То же самое и с несбалансированными наборами данных - вторая тенденция на данном этапе. Ярлыки - если это все-таки проблема классификации - больше не распределяются равномерно, а сосредоточены на одном большом классе. Это идет рука об руку с более сложными наборами данных, где данные могут иметь неправильную форму.

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

Говоря об изображениях, часто вам также придется нормализовать данные. Например, некоторые изображения могут иметь размер 400 × 400, но большинство - 350 × 350. Это случай изменения масштаба, один из возможных методов. Однако они не ограничиваются данными изображения. Существуют и другие стратегии для аудио, текста и данных временных рядов.

После того, как вы нормализовали свои данные, вы должны передать их в сеть. Просто загрузить его в ОЗУ больше невозможно, но можно написать собственный генератор. Здесь не нужно изобретать велосипед; есть много ресурсов, которые помогут вам набрать обороты.

Такие генераторы также могут быть частью настраиваемого конвейера: предварительно обрабатывать данные в генераторе перед его загрузкой; отдельная папка с именем preprocessed_data не требуется. Ваши пайплайны также могут помочь сокурсникам; почему бы не поделиться ими?

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

Индивидуальные проекты

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

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

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

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

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

Сети

На промежуточном уровне используемые сети становятся более продвинутыми:

Первая тенденция состоит в том, что сети становятся больше. Модели из предыдущего этапа обычно имеют размер несколько МБ, и достаточно пары слоев. Теперь это превратится в сотни МБ, часто с использованием более 100, 200, 500 слоев.

Вторая тенденция состоит в том, что стандартные уровни заменяются такими операциями, как BatchNormalization, Pooling и Attention. Это более сложные, и если вам не хватает какой-либо функциональности: теперь самое время написать собственный слой.

Говоря о более продвинутых функциях, теперь в поле зрения появляются генеративные сети и языковые модели. Установив основы, вы можете поиграть с ними, если сможете управлять ими локально (глядя на вас, Трансформеры). Попробуйте переключиться на Colab и зарезервируйте графический процессор или даже TPU, если вам нужно больше мощности. Нет необходимости арендовать экземпляр облачных вычислений, чтобы просто поиграть. Сделайте это, как только вы завершите свою модель и будете готовы тренировать несколько эпох.

Как и в других сетях, код часто доступен. Например, Hugginface проделал исключительную работу со своей библиотекой трансформеров, а у TensorFlow есть несколько руководств по генеративным сетям.

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

Обучение

Категория обучение посвящена всему, что связано с обучением модели.

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

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

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

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

Вложения в основном вычисляются для отдельных слов. Таким образом, вы можете загрузить вложения для наиболее распространенных, таких как «тот», «лайк», «вы», «автомобиль». Обратной стороной является то, что они могут не отражать знания в ваших данных: набор данных, на котором они были предварительно обучены, может относиться к автомобильному соревнованию и, таким образом, имеет обширные связи между различными типами: грузовик, лимузин, спортивный автомобиль. С другой стороны, ваши собственные данные не касаются автомобилей, поэтому там слишком много ненужной и слишком мало полезной информации. Короче говоря, предварительно обученные вложения не отражают сходства между вашими точками данных. Решение состоит в том, чтобы обучить собственные вложения. На самом деле это делается с помощью нейронных сетей!

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

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

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

Последние два элемента снова взаимосвязаны: TPU доступны только в облаке, и оба требуют определенных усилий для начала работы. Но они быстрые: для проекта год назад моя группа сначала запускала модель на ЦП по восемь часов в эпоху. Использование графических процессоров позволило сократить время до 15 минут. После некоторых хлопот мне удалось запустить наш код на TPU, и мы были вознаграждены 15 секундами на эпоху. Это было быстро.

От трансферного обучения до обучения облачным TPU, эта категория фокусируется на методах, которые идут с обучением продвинутых моделей, часто для сокращения времени обучения или реализации настраиваемых функций.

Теория

В этой категории собраны концепции, лежащие в основе идей этого уровня.

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

Вы когда-нибудь слышали о ReLU? Это такая функция активации - использование ее вообще (или только линейных, например, y = x + 2) уменьшит вашу сеть до линейного классификатора. (Подробнее об этом см. В примечаниях). По этому поводу ведется целый мир исследований. Возьмем, к примеру, дырявый ReLU или LReLU:

Нормальный ReLU равен y = max (x, 0). Это установило бы производную на ноль, если бы ваш ввод был ниже 0. Это означает, что каждый градиент, который идет после в обратном проходе (то есть каждый слой, который идет до), тоже равен нулю. Это причина LReLU: y = αx, когда x ‹0, в противном случае y = x. Это простое решение указанной выше проблемы.

Есть еще функции, которые стоит проверить: GeLU, swish, SeLU и так далее. Пока вы можете получить его, все в порядке.

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

wᵘᵖᵈᵃᵗᵉᵈ = wᵒˡᵈ - скорость обучения × градиенты

Это правило обновления для простого градиентного спуска, обратного градиенту. У других оптимизаторов есть свои собственные шаги обновления, посмотрите Adam или RMSProp, чтобы узнать больше.

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

Это часто сочетается с более продвинутыми метриками, когда одна только точность уже не поможет. Для несбалансированных наборов данных точность не является значимым показателем; в этом случае переключитесь на макрос F1. Совет: чтобы вычислить недостающие метрики позже, сохраните предсказание сети и основную истину.

Получение вероятностей - необходимый шаг на этом уровне. Позвольте мне рассказать на собственном опыте: это нормально. Узнав о статистике и стохастике из многих источников, картина станет более ясной. Возможно, вы уже использовали некоторые методы при вычислении среднего значения ваших данных или нормального диапазона данных. Загляните на Coursera, чтобы узнать больше, или просмотрите лекции лучших университетов, которые часто загружаются бесплатно. (Какое благословение - иметь доступ к высококачественным материалам бесплатно!).

Поскольку мы уже имеем дело с продвинутыми темами, попытайтесь понять концепции продвинутых уровней. Отсев - хорошее начало, и BatchNorm - следующий кандидат.

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

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

Таким образом, эта категория охватывает связанные темы, которые укрепят ваше понимание машинного обучения.

Общий

Эта широкая категория охватывает разные темы, с которыми вы столкнетесь на этом уровне.

Исходя из контролируемых данных - данных, в которых доступны (человеческие) аннотации - вы теперь расширяетесь до неконтролируемых данных. Это тот случай, когда вы работаете с генеративными техниками. Вы также можете объединить лучшее из обоих миров: обучить автоэнкодер создавать реалистичные изображения и использовать полученные веса в другой сети классификаторов. Тогда это своего рода (продвинутое) трансфертное обучение.

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

Чтобы впоследствии отследить все, что вы сделали, не только при разделении наборов данных, рекомендуется версия вашего кода. Вам не нужно поддерживать 100 папок. С инструментами, которые вам помогут, работать проще и удобнее: Git - на первом месте.

Это связано с отслеживанием ваших экспериментов. Отслеживание может включать в себя сохранение модели, но в основном означает сохранение любых показателей и настроек. Для некоторых прогонов, которые я выполнял несколько месяцев назад, мне недавно пришлось проверить среднее время выполнения. Я был бы в затруднительном положении, если бы не использовал такие инструменты, как Weights & Biases для сохранения данных эксперимента. При этом получить необходимую информацию было довольно легко.

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

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

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

Увидев так много и обучив многих моделей, вы, безусловно, приобрели некоторый опыт в проблемном мышлении. Я не уверен, что это так, но это просто означает знать, что делать, когда происходит xyz. Это может быть упрощение проблемы, возможность задать вопросы в StackOverflow или проконсультироваться с другими людьми. Это важная часть нашего процесса обучения: даже если две задачи могут быть совершенно разными, всегда есть что-то, чему мы научились из третьей проблемы ранее, что мы можем использовать сейчас.

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

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

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

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

Продвинутый уровень

По сравнению со средним уровнем этот выглядит короче. Это ловушка! Это поле большое. Здесь тоже играет роль все, что вы узнали до сих пор. Оптимизаторы? Придумывайте свои собственные. Индивидуальные учебные циклы? Теперь создайте совершенно новый алгоритм. Участвовал в проектах? Публикуйте свои собственные в газетах.

Все следующие категории расширяют концепции предыдущего уровня:

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

Обработка данных

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

Прилагательное огромный - это относительно расплывчатое описание размера набора данных. В пересчете на ГБ это более 100, 200 ГБ. С точки зрения эпохи, это больше часа за один проход. Это зависит от вашей доступной вычислительной мощности - вам пригодятся ваши знания в области обучения работе с несколькими GPU или TPU. Вы можете обратиться в Исследовательское облако ТПУ, чтобы ускорить обучение.

Ускорение также может быть достигнуто за счет запуска распределенных конвейеров. Для предварительной обработки наборов данных такой платформой является Apache Beam; Что касается TensorFlow, я знаю, что вы также можете распространять предварительную обработку данных (не обучение, а фактическую предварительную обработку). Вы, безусловно, захотите поработать здесь с кластером Kubernetes или аналогичным. Крупные облачные провайдеры (AWS, GCP, Azure) предлагают соответствующие решения.

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

Таким образом, эта категория распространяется на более крупные и сложные наборы данных.

Индивидуальные проекты

Эта категория содержит только один элемент:

Работа над нестандартными генеративными проектами. Поле GAN стало довольно большим: BGAN, GAN, * GAN, CycleGAN,… Выберите один и работайте с настраиваемым набором данных. Здесь собрано так много вещей из предыдущего уровня: регуляризация, дополнительные потери, вероятности, настраиваемые уровни. Таким образом, это прекрасная возможность применить на практике то, что вы узнали.

Обучение

Категория обучение теперь ориентирована на ускорение обучения.

По мере того, как наборы данных становятся больше, время обучения увеличивается. Первый метод - использовать тренировку со смешанной точностью. Вместо использования 32-битной точности модель пытается использовать 16-битную точность. Чтобы обеспечить числовую стабильность (ошибки округления и т. Д.), Части весов остаются в своем исходном типе, и там, где это возможно, используется вычисление с 16-битной точностью. Последние графические процессоры имеют специальное оборудование, которое ускоряет вычисления в формате float16; тренировку часто можно ускорить в 2–3 раза.

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

Конечно, если у вас есть доступ к нескольким TPU, время обучения тоже сократится. Затем используются стручки TPU; У Google есть обширная документация здесь. Есть что-то волшебное в переходе с 8 ядер TPU на 2048. Вы определенно хотите убедиться, что ваш код эффективен, поскольку время вычислений - это деньги.

Последний шаг в первую очередь предназначен для моделей большего размера, чем RAM: параллельное обучение модели. В этой настройке модель больше не реплицируется на определенных устройствах, а размещается поверх всех них. Таким образом, например, один набор слоев может обрабатываться графическими процессорами от 0 до 4, следующий - от 4 до 8 и так далее. Это также метод, к которому следует прибегать, когда активация слоев больше, чем доступная оперативная память.

Таким образом, в тренировках основное внимание уделяется скорости. Лучше бегать быстрее.

Теория

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

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

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

Краткий первый шаг в этом направлении - эволюционные алгоритмы, которые что-то создают. Но только небольшая сумма. И по сравнению с Nature / Evolution это ни на что не похоже. То же самое касается многих вещей, которые мы делаем ежедневно. Тысяча отжиманий? Конечно, но природа создала птиц, растения, собак, кошек, деревья - попробуйте сопоставить это. Стойка на руках? Хорошо, но природа создала рыб, коров, свиней, цветы, бактерии - соответствуйте этому. Мы многого достигли, но есть чему поучиться (и придумать). Прочтите эту статью, чтобы узнать больше об этой увлекательной теме.

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

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

Биология - отличный пример для нашего исследования: GPT-x с миллиардами подключений, Turing NLG и Megatron LM, и Switch Transformer с поразительным одним триллионом параметров. И они могут делать только одну или две вещи. В то время как мы, люди, не имея возможности подключить дополнительное оборудование или обработать ТБ данных за считанные минуты, можем сделать гораздо больше. Ходить и решать математику одновременно? Попался. Плавать и переигрывать интервью? Попался. Пишете газету и едите закуски? Попался.

Запуск вашего сердца, пока вы спите, едите, гуляете, плаваете, принимаете душ, плачете, смеетесь, прыгаете, падаете, ныряете, карабкаетесь, водите машину, удивляетесь, учитесь, пишете, сочиняете, творите, мечтаете, думаете? Даже не требует нашего внимания.

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

Таким образом, вы переходите от стандартных задач DL к грандиозным.

Общий

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

Эффективный код: очевидно, это важно на раннем этапе, но когда вы тренируете свою модель с 500 миллионами параметров на трех серверах со 128 графическими процессорами в течение 5 дней, вы действительно хотите убедиться, что ваш код работает быстро. Это больше не индивидуальный проект, а совместная работа. Взглянув на статью Трансформеры, мы узнаем, что это совместная работа многих людей.

По общему признанию, от эффективного кода до квантового глубокого обучения - это довольно сложно. Но на этом уровне вы уже слишком многому научились, чтобы не смотреть в эту область. Оно указано в разделе Общие, а не Теория, поскольку это сильно разобщенное поле. Биология может способствовать развитию алгоритмов, но квантовая физика - это совершенно отдельная область. Опять же, главная мотивация - делать что-то быстро. Пробовать комбинацию паролей в последовательности утомительно. Испытать тысячу из них одновременно - быстро. Нам даже не нужно далеко смотреть; от перелетных птиц, мы в настоящее время предполагаем, что они используют квантовые эффекты, чтобы почувствовать магнитное поле Земли. Природа снова за это.

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

Говоря о статьях, теперь пора перейти от чтения статей к пониманию (большей части) их. Вы, естественно, сосредоточитесь на нескольких областях и попытаетесь понять что-то в них. Это часть того, чтобы оставаться в курсе событий. В области исследований ИИ происходит слишком много всего:

Год назад я читал лекцию о НЛП с машинным обучением. У нас было несколько таблиц размеров моделей, и Megatron LM числился одной из самых больших моделей. Затем, вскоре после лекции, появился ГПТ-3, взорвавший весы. И это только один домен. Есть GAN, модели аудио, классификаторы изображений и многое другое. Таким образом, все сводится к общему обзору, который предоставляется в информационных бюллетенях, таких как The Batch Эндрю Нг, с последующим сосредоточением внимания на вашем собственном домене.

Тогда это исследование. Как и в предыдущих двух пунктах, этого никогда не происходит.

Таким образом, вам нужен эффективный код и вы хотите оставаться в курсе последних событий.

Куда идти дальше?

Вы можете найти контрольный список на GitHub здесь и Notion здесь. Скопируйте и настройте его, а затем постепенно отметьте его.

Если вы ищете конкретные ресурсы:

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

Дальнейшие примечания

  1. Этот контрольный список основан на моем собственном опыте.
  2. RNN могут использоваться для любых данных. Однако исчезающие градиенты и длительные периоды затрудняют их обучение.
  3. Между PyTorch и TensorFlow нет такой большой разницы. Как новичок, нет необходимости выбирать одно вместо другого. Однако, как только вы добьетесь большего прогресса, вы можете столкнуться с проблемой и заметить, что в другом фреймворке это может быть проще. Это довольно часто, но позвольте мне сказать следующее:
    Тот факт, что вы сталкиваетесь с такими проблемами, означает, что вы глубоко внутри материала; переключение фреймворка, таким образом, повлечет за собой огромные накладные расходы, связанные с запуском заново. Поэтому часто лучше перекусить пулю и прогрызть ее. (У меня был подобный опыт, когда я писал собственный слой в TensorFlow. Какое усилие это было тогда!).
  4. Вложения не ограничиваются отдельными точками данных. Например, вы можете вычислить вложения для полных предложений. Кроме того, в качестве заделки также часто используется предварительный плотный слой.
  5. Вложения - это просто массивы чисел с плавающей запятой: [0.1213, 0.542, 1.993,…], и вы можете часто их проверять.
  6. Я заметил, что использование каких-либо функций активации может сделать вашу сеть воспроизводимой до одного линейного классификатора. Это верно для нейронных сетей с плотной структурой. Проблема в том, что вы можете изучать только линейные зависимости, что обычно не то, что вам нужно.
  7. Генеративные методы могут быть расширены для работы с контролируемыми данными, что, например, делает CycleGAN: вы переводите между двумя известными доменами, таким образом, требуя помеченных данных для каждого домена. Однако первоначальные генеративные методы, оригинальные GAN, AE и VAE, не полагаются на такие ярлыки.
  8. Я наверняка кое-что упустил. Пожалуйста, оставляйте комментарии и дайте мне знать.
  9. Чтобы все это изучить, необязательно ходить на университетские курсы. Интернет демократизировал передачу знаний, так что взгляните на YouTube, блог Google, блог OpenAI, блог DeepMind и т. Д.