Как изучить Machine Learning на практике: учебный план

Сокращенный перевод статьи «How to Learn Machine Learning – Tips and Resources to Learn ML the Practical Way».

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

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

Оглавление

Предлагаемый мной учебный план представляет собой повторяющиеся в цикле шаги:

  • Шаг 0. Погружение в сферу машинного обучения
  • Шаг 1. Изучение проекта, похожего на то, что вы сами хотите создавать
  • Шаг 2. Изучение языка программирования
  • Шаг 3. Изучение библиотек сверху вниз
  • Шаг 4. Создание интересного для вас проекта максимум за один месяц
  • Шаг 5. Определение самого большого пробела в знаниях и его заполнение
  • Шаг 6: Повтор шагов с 0 по 5.

Это циклический план обучения, потому что 6-й шаг — это GOTO к шагу 0!

Должен отметить, что мой учебный план может показаться вам странным. Но я проверил его на практике, когда преподавал машинное обучение студентам Университета Макгилла.

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

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

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

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

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

Итак, с учетом всего сказанного, давайте перейдем к самому плану обучения!

Шаг 0. Погружение в сферу машинного обучения

dive into ml

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

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

Чтобы правильно погрузиться сферу ML и отточить свой учебный план, нужно по порядку ответить на три вопроса:

  1. Что вообще можно делать при помощи ML?
  2. Что вы хотите делать при помощи ML?
  3. Как вы это будете делать?

Эти вопросы позволят вам сосредоточиться на чем-то очень конкретном и доступном для изучения, а также увидеть картину крупным планом.

Давайте рассмотрим каждый из этих вопросов более подробно.

Что можно делать при помощи ML?

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

Это позволит вам усовершенствовать вашу ментальную модель машинного обучения. Вероятно, поначалу у вас не будет полного представления о том, что здесь вообще возможно. Но это не имеет большого значения. Приблизительное понимание лучше, чем ничего.

Что вы хотите делать при помощи ML?

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

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

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

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

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

Как вы собираетесь делать то, что вас интересует?

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

Это поможет вам понять, на чем не стоит сосредотачивать свою энергию. Допустим, вы поняли, что большинство людей не используют HTML, CSS и JavaScript в своей повседневной работе, связанной с машинным обучением. Так и вы не сосредотачивайтесь на этих технологиях!

Что касается того, чем люди все-таки пользуются, здесь спектр довольно широк. Есть много языков программирования и инструментов, а их выбор зависит от сферы применения. Есть инструменты на C++, Java, Lua, Swift, JavaScript, Python, R, Julia, MATLAB, Rust… и этот список можно продолжать.

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

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

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

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

Обычный набор инструментов для желающих изучить машинное обучение, следующий:

  • Python для высокоуровневого программирования
  • Pandas для работы с наборами данных
  • Numpy для численных вычислений
  • Scikit-learn для ML-моделей (без глубокого обучения)
  • TensorFlow или Pytorch для ML-моделей с глубоким обучением
  • Высокоуровневые библиотеки глубокого обучения, такие как Keras и fast.ai
  • Основы Git для работы над проектом
  • Jupyter Notebook или Google Colab для экспериментов с кодом

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

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

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

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

Python + Pandas + Pytorch + Pytorch geometric + Git + Colab

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

machine learning logo

Кодинг-марафон по Python

Реши 10 задач и выиграй 5500 рублей

×

Шаг 1. Изучите один проект, который похож на то, что вы хотите создавать

Девушка изучает ml-проект (на экране код)

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

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

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

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

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

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

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

Хорошее место для начала поиска — этот список на GitHub. Но можно просто воспользоваться поиском на Kaggle или GitHub. Ищите по ключевым словам, связанным с вашими интересами в сфере ML.

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

Шаг 2. Изучите язык программирования

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

Код, скорее всего, будет на Python. Впрочем, это может быть Julia, C++, Java — тут все зависит от того, что вы хотите изучать и какой проект вы добавили в закладки.

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

Очень хороший курс для изучения Python, достаточный для того, чтобы начать работать с этим языком, — Scientific Computing with Python («Научные вычисления с Python») от freeCodeCamp. Также можно попробовать очень короткий курс по Python от Kaggle.

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

Для целей моего учебного плана курс freeCodeCamp вполне подойдет.

Шаг 3. Изучите библиотеки сверху вниз

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

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

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

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

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

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

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

При этом следите за тем, чтобы не слишком углубляться в изучение библиотеки (если вы дошли до LAPACK, читая о Фортране, вы зашли слишком далеко!).

Для моего проекта основная библиотека, которую мне нужно изучить, — это Pytorch или ее обертка более высокого уровня, так что практический курс fast.ai будет в тему.

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

Программист за работой

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

Для справки: если, берясь за какой-то проект, вы чувствуете себя абсолютно уверенно, значит, вы недостаточно быстро прошли шаги с 0 по 3.

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

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

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

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

  • планирование, определение масштаба работ, отслеживание прогресса вашего ML-проекта
  • чтение онлайн-документации библиотек
  • чтение веток на StackOverflow и GitHub, постов в случайно найденном блоге какого-то разработчика и сообщений на загадочном справочном форуме — и все это, чтобы разобраться с одним багом
  • создание проекта неоптимальным образом с последующим улучшением
  • исправление проблем с переобучением, недообучением и генерализацией.

Чтобы подобрать интересный проект, попробуйте выполнить эти три небольших упражнения:

  • хорошенько подумайте о том, что вас сейчас интересует
  • посмотрите список идей проектов
  • обратите внимание на открытые наборы данных.

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

Этот список на GitHub может стать отличным местом для поиска вдохновения при создании мини-проекта. Чтобы найти подходящие данные для своего проекта, можно воспользоваться Google Dataset Search.

Не стоит недооценивать важность данных!

Даже если у вас есть очень хорошие идеи, отсутствие данных серьезно помешает вашему прогрессу.

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

Шаг 5. Определите один пробел в своих знаниях устраните его

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

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

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

А теперь самое странное: удалите из своего списка все, кроме самой важной темы.

Когда я говорю «удалите», я имею в виду именно это. Удалите все, кроме пункта № 1. На следующей итерации цикла ваша теперешняя оценка того, что нужно изучить, будет в основном неверной. Вам будет не хватать других, более важных знаний, о которых вы сейчас не догадываетесь.

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

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

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

Шаг 6. Повторите шаги с 0 по 5

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

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

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

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

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

Итоги

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

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

Я надеюсь, эта статья будет вам полезна. Если хотите познакомиться с отдельными темами машинного обучения, обратите внимание на мой YouTube-канал. Удачи!

machine learning logo

Кодинг-марафон по Python

Реши 10 задач и выиграй 5500 рублей

×