Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Всем доброго времени суток. Я давно обещала выложить сюда подробный гайд на тему того, как можно изучать Machine Learning самостоятельно, не тратя деньги на платные курсы, и, наконец, выполняю свое обещание. Надеюсь, этот гайд станет подсказкой, которая поможет найти правильное направление новичкам, которые хотят погрузиться в нашу область.
Небольшое предисловие
Для начала напомню следующее: мир машинного обучения и анализа данных многообразен. Внутри него есть целый ряд специализаций, которые требуют разных навыков. Все советы из этой статьи являются частным мнением одного человека - с математическим бэкграундом и опытом работы только в левой колонке Рис.1 (Machine Learning Engineer и Machine Learning Researcher; сейчас я работаю Старшим Академическим Консультантом в Huawei, что, по сути, также близко ко второму варианту). Поэтому путь, указанный в данной статье, является лишь одним из возможных и больше ориентирован также в сторону той же левой колонки. Люди с другим бэкграундом и опытом работы могут иметь другое мнение на то, чему нужно учиться для успешных занятий ML (Machine Learning) или DS (Data Science) и предложить другой путь изучения данных областей, и это нормально.
Например, есть вот такой альтернативный гайд о том, как стать Data Scientist от автора, у которого больше опыта работы именно с данными - https://vas3k.club/post/9904/ (у меня взгляд со стороны ML, а у него - со стороны DS). Единственный недостаток руководства: оно было написано давно, и многие ссылки на ресурсы, к сожалению, погибли.
Также нужно оговориться, что примерно четверть видеороликов и курсов, которые будут рекомендованы в данном гайде, сделаны на английском языке, что может вызвать затруднение у части читателей. Тем не менее, при работе в нашей области привыкнуть к английскому все равно рано или поздно придется, поэтому предлагаю делать это с самого начала. Напомню, что при возникновении трудностей всегда есть вариант воспользоваться субтитрами или переводом в Яндекс.браузере. Также напомню, что в интернете много бесплатных ресурсов для изучения английского, но их обзор все же находится за пределами данной статьи.
Итак, на рис. 2 изображена приблизительная последовательность шагов, которые нужно пройти, чтобы получить крепкую базу и в конечном итоге найти адекватную работу в области машинного обучения с какими-то карьерными перспективами. На картинке путь выглядит прямым, как будто он идет сверху вниз, но в реальности обучение всегда нелинейное. Время от времени нужно возвращаться обратно, чтобы что-то повторить, пересмотреть план обучения и т.д. и т.п.
Дальнейшая структура статьи будет следовать этим шагам.
1. Предварительные знания
Итак, для того, чтобы понимать, как работают алгоритмы машинного обучения и в дальнейшем быть способными писать какой-то программный код с их использованием, нам понадобится освоить следующие области:
1.1. Математика
Самые минимальные знания по основам линейной алгебры и мат. анализа, которые нужны для того, чтобы можно было начать смотреть и немного понимать некоторые учебные материалы про работу нейросетей, можно получить, посмотрев по четыре первых видео из следующих плейлистов известного 3blue1brown:
Essence of Linear Algebra
Essence of Calculus
Однако, просмотра вводных видео, указанных выше, недостаточно для того, чтобы действительно хорошо понимать ML-алгоритмы, а также в будущем создавать свои собственные пайплайны по обработке данных или нейросети (даже если последние будут модификациями уже известных архитектур). Кроме того, в этой области очень важно не бояться математических формул и иметь привычку с ними работать. Иначе будет очень сложно понимать статьи по машинному обучению и делать какие-либо нетривиальные расчеты.
Поэтому сейчас мы разберем примеры бесплатных курсов и демонстраций, в которых можно изучить нужные области математики более основательно и с практикой.
1.1.1. Линейная алгебра
Два варианта курсов для освоения Линейной алгебры:
Более быстрый вариант, для тех, кто уже изучал математику в ВУЗе и хочет повторить:
https://stepik.org/course/2461
Главный минус - в курсе не хватает секции про собственные значения, которые используются в алгоритмах понижения размерности (PCA). Эту тему можно повторить, посмотрев конец плейлиста 3blue1brown с предыдущей страницы.Более подробный вариант, может быть доступнее для тех, кто раньше не изучал предмет:
https://www.khanacademy.org/math/linear-algebra
Также не забываем продолжать просмотр плейлиста 3blue1brown Essence of Linear Algebra.
Главное, чего нужно достичь при изучении линейной алгебры - научиться свободно работать с векторами, матрицами, хорошо понимать формулы с участием этих объектов и не бояться их. Именно в этом - основная цель решения упражнений. При этом для практиков уметь решать все задачи "со звёздочкой" не обязательно, главное научиться уверенно работать с объектами линейной алгебры хотя бы в более-менее типичных сценариях.
Чуть более сложные темы, наподобие обратных матриц, собственных значений и векторов, смены базиса в векторных пространствах, пригодятся для того, чтобы в дальнейшем понять алгоритмы уменьшения размерности (PCA), а также чтобы уметь интерпретировать работу алгоритмов машинного обучения в терминах работы с линейными пространствами (иногда это удобнее). Эти темы можно отложить, если очень хочется скорее приступить к изучению базовых алгоритмов ML, где они еще не используются, и вернуться к ним позже, когда понадобятся.
1.1.2. Математический анализ
Два варианта для освоения Математического Анализа:
Вариант похардкорнее:
https://stepik.org/course/95/syllabus
Тут наиболее полезны модули 1-3 (т.е. все, кроме 4го модуля - интегралов, которые можно отложить в бэклог).Вариант поподробнее:
https://www.khanacademy.org/math/calculus-1
Также не забываем продолжать просмотр плейлиста 3blue1brown Essence of Calculus.
Главное тут - дойти до раздела "производная сложной функции". Если соединить это знание с линейной алгеброй, этого, в принципе, достаточно для понимания смысла обучения ML моделей, в том числе для понимания алгоритма обратного распространения ошибки (backpropagation). Изучать интегралы не обязательно для понимания большей части того машинного обучения, что используется на практике. Поэтому с ними достаточно поверхностно ознакомиться по видео 3blue1brown, а более подробное изучение отложить на время, и вернуться при необходимости.
Если большинство типичных упражнений по мат.анализу из выбранного курса сделать получается, а какие-то сложные задачи с большими выкладками не идут, можно их пропустить. В реальной практике большие выкладки редко встречаются - разве что их можно увидеть в некоторых научных статьях.
1.1.3. Основы математической статистики
К этой теме можно подступиться, начав с изучения вот такого сайта с демонстрациями, чтобы постепенно войти в тему:
https://seeing-theory.brown.edu/basic-probability/index.html
А потом перейти к какому-нибудь более серьезному курсу с упражнениями, например:
https://stepik.org/course/326/syllabus
Но тут надо отметить, что этот курс сложный, и полностью его проходить не обязательно. Максимально полезен первый модуль и упражнения к нему; в модулях 2-3 желательно просмотреть хотя бы лекции, чтобы понимать, о чем речь. Дальнейшее прохождение можно отложить, просто запомнив названия тем на будущее. Если на следующих этапах поймете, что вам необходимо пройти эти темы - вернетесь к курсу обратно.
Конечно, математическая статистика нужна разным специалистам в разной степени. Тем, кто хочет глубоко проникнуть в статистический анализ данных, она нужна в большей степени (например, им может потребоваться понять хотя бы в общих чертах, что такое статистические критерии), а тем, кому не нужен такой глубокий анализ или кто в основном работает с алгоритмами - им она нужна меньше.
Тем не менее, всем специализациям из ML и DS полезно знать самые базовые основы - что такое мат.ожидание, дисперсия, что такое распределение, выборка, что такое статистическая значимость. Для последнего желательно понять в общих чертах и то, что такое доверительный интервал. Без этого будет очень трудно по науке оценить результат работы алгоритмов машинного обучения и протестировать гипотезы насчет данных.
1.1.4. ЧТО ДЕЛАТЬ, ЕСЛИ НИЧЕГО НЕ ПОНЯТНО
Если не удается ничего понять ни в мат.анализе, ни в линейной алгебре, ни в мат.статистике, то, возможно, все очень плохо с математикой школьного уровня. Ведь для понимания вышеизложенных предметов необходимо помнить довольно существенную часть школьной математики. Если так, то придется потратить дополнительное время на восполнение этих пробелов.
Пример бесплатного мини-курса, в котором можно восполнить некоторые пробелы:
https://practicum.yandex.ru/math-foundations/ , а также понять, какие именно разделы математики вызывают трудности (в рекламу платных курсов рядом с ним, заходить, естественно, не обязательно).
В случае, если этого курса тоже будет недостаточно - можно поискать другие курсы на https://www.khanacademy.org/ и https://stepik.org/ , ища по названию тех разделов математики, которые даются с особенным трудом.
1.2. Программирование
Я условно разделила секцию “Программирование” на две части - "Основы языка" и "Основы Алгоритмов и Структур Данных", но на самом деле, основы алгоритмов и структур данных часто изучаются совместно с языком.
Первым у нас будет самый популярный язык для машинного обучения - Python. Большинство курсов по машинному обучению используют в домашних заданиях и примерах именно этот язык, и без знания этого языка вы их просто не решите, поэтому он крайне рекомендуется к изучению.
1.2.1. Python
Вот на какой бесплатный курс по Python я советую обратить внимание в первую очередь:
https://stepik.org/course/512
Здесь не только рассказывается про программирование на Python, но и про такие важные темы, как работа с API, скачивание и парсинг html, json etc - это как раз то, что часто используют в работе любители машинного обучения и анализа данных.
Здесь есть важная деталь: курс рассчитан на тех, кто уже умел раньше программировать на другом языке (хотя бы немного). Если опыта программирования нет совсем, лучше начать с этого курса:
https://stepik.org/course/67 , а потом вернуться к курсу выше.
Если все равно не получается решать упражнения из этих курсов, можно попробовать обратиться к более подробным курсам, где больше упражнений, на которых можно “набить руку”.
Например, есть вот такой курс в двух частях:
https://stepik.org/course/58852 , https://stepik.org/course/68343 .
Есть у него и третья часть, но она, к сожалению, платная, а значит, не является предметом обзора данной презентации. Так что если есть желание остаться в рамках концепции “за ноль рублей”, есть вариант пройти первые две части этого курса, а потом вернуться к курсам с предыдущего слайда и прорешать там те разделы, которые в этом курсе не покрыты.
В конечном итоге, мы хотим добиться знаний:
Основных конструкций и ключевых слов (keywords) языка Python - без этого мы не сможем писать свой код и понимать чужой;
Основных механик языка (например, как происходит присваивание по ссылке и копирование) - чтобы понимать на базовом уровне, что происходит под капотом и, как следствие, уметь понимать и исправлять ошибки при написании кода;
Основ объектно-ориентированного программирования - чтобы умело пользоваться ML-библиотеками и создавать свои собственные ML-модели.
И напоследок, еще один, дополнительный учебный материал по Python. Его важные особенности - наличие разделов “установка инструментов” и “Jupyter Notebook”. Эти разделы очень важны для практической работы, но не до конца покрыты курсами, указанными выше. Поэтому этот учебный материал послужит отличным дополнением к всему вышеперечисленному.
1.2.2. C++
Кроме Python, в области машинного обучения можно встретить использование и других языков программирования, в частности, C++. Этот язык нужен довольно небольшому числу ML-специалистов - в основном разработчикам (Developer), которые работают с высокопроизводительным продакшн-кодом, хотят иметь совместимость с каким-то уже написанным кодом или нуждаются в работе с особым оборудованием (например, с какими-то промышленными устройствами). Кроме того, изучать его намного сложнее, чем Python. Поэтому тратьте время на этот язык только если вы точно уверены в том, что это ваш вариант.
В качестве первого пособия по этому языку я предлагаю книгу Б. Страуструпа "Язык программирования С++". По-хорошему книга, конечно, платная, но в реальности ее несложно можно найти и скачать в интернете бесплатно. Если что-то непонятно, можно обращаться к аналогичному пособию по языку С (без плюсиков) - обычно все непонятное приходит именно оттуда.
После изучения этой книги и основ алгоритмов и структур данных (см. следующую часть презентации) можно посмотреть курс:
https://stepik.org/course/153
Здесь можно познакомиться с продвинутыми темами языка С++ и шаблонами проектирования, которые, опять же, пригодятся только людям, сильно нацеленным на интеграцию ML-решения в продакшн и другие задачи, требующие создания сложных программ. Остальным ML и DS специалистам не обязательно изучать это.
1.2.3. SQL
SQL - это язык с очень ограниченной областью применения: его используют для работы с базами данных. Вот пример ресурса, где можно поупражняться в SQL:
https://stepik.org/course/63054
Однако, на этапе получения предварительных знаний глубоко изучать SQL рано. Для начала можно просто познакомиться с тем, что такое базы данных и узнать простейшие примеры работы с ними. Сделать это можно, например, полистав такую забавную книжку с картинками, как “Занимательное программирование. Базы данных. Манга”, которую также можно найти бесплатно в интернете.
Ну, а серьезно тренироваться в SQL имеет смысл только тогда, когда будете точно уверены, что хотите пойти податься на вакансию, где требуется работа с SQL (он нужен не везде) и займетесь подготовкой к такой вакансии. Об этом еще будет сказано немного в разделе 4.
1.2.4. Другие языки, используемые в машинном обучении
Конечно, в мире машинного обучения можно встретить и другие языки. Например, язык R - его используют для анализа данных, особенно много в нем встроенных инструментов для применения аппарата математической статистики. Язык не является мейнстримом, так что если не уверены в том, что он вам нужен, с изучением можно не спешить. Также иногда в пайплайнах для обработки данных и в продакшн-коде используют Java. Если не уверены, что он вам нужен, изучать также не обязательно.
Те языки, что я перечислила, покрывают, пожалуй, 99% вакансий, связанных с ML/DS. В стандартном сценарии нам для начала достаточно изучить только Python, а потом переходить к алгоритмам и структурам данных.
1.2.5. Алгоритмы и структуры данных
Большинству специалистов в Machine Learning и Data Science достаточно знать лишь основы этих тем. Посмотреть на эти основы я рекомендую в следующих источниках:
https://stepik.org/course/1547 -
изучить модуль “Базовые структуры данных”, чтобы узнать про наиболее часто используемые структуры данных.https://stepik.org/course/217 -
изучить модуль “Введение: теория и задачи”, чтобы посмотреть простые примеры алгоритмических задач и узнать что такое сложность алгоритма.
Дальше первых модулей изучать эти курсы на начальном этапе не нужно. Продолжить изучение рекомендуется либо если вы будете точно уверены, что хотите углубиться в разработку (Development), либо перед собеседованиями. А еще изучать эти модули можно параллельно с изучением ML-алгоритмов.
Еще один занятный способ знакомиться с базовыми алгоритмами и структурами данных - приложение “Алгоритмы. Понятные и анимированные” на Android (ссылка открывается либо с ПК с VPN, либо со смартфона).
Приложение представляет собой набор демонстраций к классическим алгоритмам и структурам данных. К сожалению, некоторые демонстрации доступны только платно, но большая часть бесплатная. Приятно смотреть эти демонстрации по дороге на работу или учебу как дополнительный материал к основным занятиям. Я рекомендую в первую очередь просмотреть разделы “структуры данных” и “поиск” (в списках и графах).
2. Классическое машинное обучение
Итак, в первой части статьи мы узнали, как получить предварительную базу по математике и программированию и теперь можем приступить к самому машинному обучению.
Для начала поясню, что понимается в данной статье под терминами “классическое” и “глубокое” машинное обучение (в разных источниках эти термины могут использоваться по-разному).
Под “глубоким обучением” (Deep Learning, DL) понимается все, что связано с глубокими нейросетями.
Под “классическим машинным обучением” (Classic Machine Learning, Classic ML) понимается большая часть остальных, “неглубоких” обучающихся алгоритмов и примыкающие к ним методы математической статистики.
Примеры классических ML-алгоритмов и методов:
Линейная и логистическая регрессия
Другие “неглубокие” модели - решающие деревья, SVM, …
Ансамбли (Random Forest, XGBoost, …)
Методы понижения размерности (PCA, t-SNE, UMAP, …)
и многое другое
Примеры глубоких нейросетей:
Глубокие сверточные сети (VGG-16, AlexNet, ResNet, …)
Диффузионные модели (Stable Diffusion, DALLE-2, …)
Трансформерные архитектуры (Transformer, ViT, T5, BERT, GPT, ChatGPT, …)
и другие.
Конечно, сейчас в фокусе внимания находятся глубокие нейросети, но для хорошего понимания их работы нужно сначала разобраться хотя бы в основах классического ML. Кроме того, не редкость, когда одному и тому же специалисту для решения рабочей задачи нужно использовать и классический ML (например, для анализа данных и решения задачи в первом приближении), и глубокие нейросети (для более точного решения).
Начать "мягкое вхождение" в тему классического машинного обучения можно с помощью интерактивных демонстраций, включающих основные классические алгоритмы -
https://mlu-explain.github.io/
И видео про основы работы глубоких нейросетей от 3blue1brown -
https://youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi
После этого (или параллельно с этим) следует приступить к более серьезным материалам.
Хорошую теоретическую базу в мире машинного обучения могут дать лекции К.В.Воронцова. Вот версия 2019 года:
https://www.youtube.com/playlist?list=PLJOzdkh8T5krxc4HsHbB8g8f0hu7973fK
В основном курс лекций концентрируется на теоретических основах машинного обучения, постановке ML-задач и на классическом ML, который используется для их решения.
Обзор курса, включая ссылки на доп.материалы, можно найти на machinelearning.ru .
Плюсы курса:
Строгое изложение материала
Дает очень крепкую теоретическую базу
Минусы курса:
Высокий порог вхождения - нужно очень хорошо знать математику, желательно на уровне первых двух курсов мехмата/физтеха.
Не хватает практических заданий.
Если не хватает математической подготовки для освоения лекций Воронцова, можно обратить внимание на менее нагруженный теорией курс, например:
https://stepik.org/course/4852/
Большим плюсом этого курса является то, что в нем рассказаны основы того, как пользоваться важными ML библиотеками - Numpy, Pandas, Scikit-learn + даются практические задания с их использованием. Курс содержит более простые (но при этом, конечно, менее строгие) объяснения самых важных моделей и концепций, о которых рассказано в лекциях Воронцова.
Еще один вариант маленького курса по основам ML и классическим ML-алгоритмам:
https://stepik.org/course/8057/
Этот курс является, пожалуй, самым простым из перечисленных. Новичка могут напугать разве что формулы из мат.статистики, но к ним в любом случае придется привыкнуть. В курсе подробно рассказано о базовых вещах, однако, сложные алгоритмы изложены только на уровне идеи и махания руками. Есть упражнения, но, к сожалению, без обзора библиотек. Если выбрали этот курс, библиотеки нужно будет изучить в другом месте.
3. Глубокое машинное обучение
3.1. Основные материалы
Есть курсы, содержащие одновременно рассказ и про основы ML, и про классическое, и про глубокое машинное обучение. Самый известный курс такого типа - специализация на Coursera от Andrew Ng:
https://www.coursera.org/specializations/machine-learning-introduction
Плюсы курса:
Охвачен очень широкий спектр тем, обо всем понемногу
Andrew Ng - хороший преподаватель, понятно излагает материал
Рассказано про библиотеки Numpy, Pandas, Scikit-learn
Даются напоминания самых важных элементов лин.алгебры, мат.анализа
Минусы курса:
Изложение не очень глубокое, очень мало теории
Для объяснения нейросетей используется библиотека TensorFlow, которая является не самой простой в изучении и постепенно теряет популярность
Бесплатными являются только лекции, а практические упражнения доступны только платно.