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

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

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

Шутка: Большие данные — это данные, которые приводят к сбою вашего MS Excel.

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

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

Путь больших данных

Конечно, каждый должен начать изучать, что такое большие данные и почему обработка больших данных является такой сложной задачей. Для этого шага вы можете проверить Большие данные: революция, которая изменит то, как мы живем, работаем и думаем Виктора Майера-Шенбергера и Кеннета Цукьера. Однако вы можете легко его пропустить, поскольку такая информация всегда повторяется в каждой книге, связанной с большими данными, в качестве мотивационного введения.

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

Одной из наиболее важных в практических приложениях больших данных является модель программирования MapReduce, которая позволяет распределять обработку больших наборов данных по кластерам компьютеров. Это необходимо знать, и я рекомендую прочитать Шаблоны проектирования MapReduce: создание эффективных алгоритмов и аналитики для Hadoop и других систем Дональда Майнера и Адама Шука, это руководство для инженера по большим данным. Существуют реализации MapReduce во многих распределенных фреймворках, самая известная из которых — Apache Hadoop. Я считаю экосистему Hadoop очень важной, но не обязательной для изучения, потому что она фокусируется на очень специфических проблемах, на которых вы, возможно, не хотите сосредотачиваться прямо сейчас. Если вы решили это сделать, взгляните на книгу Тома Уайта Hadoop: The Definitive Guide: Storage and Analysis at Internet Scale.

Обработка потоков — это еще один аспект обработки данных, и в настоящее время я считаю его обязательным для всех, особенно с появлением устройств IoT. MapReduce также важен здесь и есть очень хорошо продуманные и проработанные фреймворки, такие как Apache Storm, Apache Spark, Apache Flink и другие. Однако архитектура потоковых приложений отличается от обычных, поэтому я настоятельно рекомендую прочитать книгу Большие данные: принципы и лучшие практики масштабируемых систем обработки данных в реальном времени Джеймса Уоррена и Натана Марца, автора Twitter. Storm, ставший Apache Storm.

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

путь машинного обучения

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

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

Инженерам, интересующимся машинным обучением, я рекомендую одну из лучших книг в этой области — Понимание машинного обучения: от теории к алгоритмам Шай Шалев-Шварц и Шай Бен-Давид».

Глубокое обучение — очень интересная тема в этой области, которая охватывает нейронные сети различных типов, такие как многослойные персептроны, рекуррентные нейронные сети, сверточные нейронные сети, автоэнкодеры. В качестве отправной точки я бы рекомендовал прочитать Глубокое обучение Яна Гудфеллоу, Йошуа Бенжио и Аарона Курвилля. В этой книге также есть вся необходимая математика, но я все же советую перед этим освежить свои знания.

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

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

Надеюсь это поможет.