Эта книга написана коллективом добрых людей, состоящим из преподавателей и выпускников Школы анализа данных. Своим появлением она обязана двум замечательным курсам. Во-первых, это курс Константина Вячеславовича Воронцова, на котором выросло подавляющее большинство авторов книги, да и вообще ML-специалистов в России. Во-вторых, это курс NLP Course | For You Лены Войта, благодаря которому мы поняли, как должен выглядеть современный учебник, и на который мы будем регулярно ссылаться в частях, связанных с анализом текстов.
Идея была такая: записать сложившийся в ШАДе курс машинного обучения в виде книги, при этом избежав каких-либо компромиссов: нигде ничего не упрощать чрезмерно, дать необходимую теорию, описать и исторически важные алгоритмы, и применяющиеся сегодня, вместе с теорией рассказывать и практические вопросы о реализации алгоритмов и работе с данными.
Математика — это один из языков, на котором написан учебник. Мы будем стараться давать необходимые пояснения, но всё же уверенное владение линейной алгеброй, математическим анализом и теорией вероятностей будет большим плюсом. Знания статистики и методов выпуклой оптимизации не обязательны, хотя сделают чтение комфортнее.
Читая книгу, вы, возможно, заметите в ней ошибки, неточности и плохо объяснённые детали. В таком случае, пожалуйста, дайте нам знать об этом, написав (сюда) — так вы поможете и другим читателям.
Итак, приступим.
Машинное обучение — это наука, изучающая алгоритмы, автоматически улучшающиеся благодаря опыту.
С момента возникновения компьютеров человечество пытается автоматизировать всё больше и больше задач. Многие проблемы получается алгоритмически решить (и запрограммировать), но по разным причинам выходит это не всегда. Например, бывают задачи, которые люди не могут решить сами; более того, их доказуемо нельзя эффективно решить, и компьютер здесь чуда тоже не совершит (речь об NP-трудных задачах). Но бывают и задачи, которые для людей особенного труда не составляют, но которые почему-то трудно или вообще невозможно запрограммировать, например:
перевести текст с одного языка на другой;
диагностировать болезнь по симптомам;
сравнить, какой из двух документов в интернете лучше подходит под данный поисковый запрос;
сказать, что изображено на картинке;
оценить, по какой цене удастся продать квартиру.
Эти задачи объединяет как минимум несколько вещей. Во-первых, их решение можно записать как функцию, которая отображает объекты, или примеры (samples) в предсказания (targets). Например, больных в диагнозы, документы в оценку релевантности. Во-вторых, нам подойдёт не идеальное, а достаточно хорошее решение: ведь и доктора иногда делают ошибки в диагнозах, и вы не всегда можете сказать, что же именно изображено на картинке. В-третьих, у нас есть много примеров правильных ответов (скажем, переводов предложения на другой язык или подписей к заданной картинке), а примеры неправильных ответов (если они нужны), как правило, не составляет труда сконструировать. Функция, отображающая объекты в предсказания, именуется моделью, а имеющийся у нас набор примеров иногда ещё называют обучающей выборкой или датасетом (от слова dataset). Обучающая выборка состоит из
объектов (это могут быть скачанные из интернета картинки, истории известных нам больных, активность пользователей на сервисе)
и ответов для них (это могут быть подписи к картинкам, диагнозы, факты ухода пользователей с сервиса), которые мы также будем иногда называть таргетами
По обучающей выборке мы хотим построить модель, предсказания которой достаточно хороши. Но что значит «достаточно хороши»? Обычно качество предсказаний измеряют с помощью метрик качества, то есть функций, которые показывают, насколько сильно полученные предсказания, выдаваемые моделью, похожи на правильные ответы. Метрики могут быть очень разными:
для задачи с диагнозами хорошими метриками могут быть, например, доля правильно поставленных диагнозов или доля больных, которым удалось поставить правильный диагноз (а вы поняли разницу?);
в задаче с ценой квартиры — доля квартир, для которых разница между предсказанным и истинным значением цены не превысила какого-то порога, или средний модуль разницы между предсказанным и истинным значением;
в задаче с поисковыми документами — доля пар документов, которые мы упорядочили неправильно.
Цель обычно в том, чтобы получить как можно лучшее (наибольшее или наименьшее возможное, в зависимости от ситуации) значение метрики.
Вопрос на подумать. Важно помнить, что разные нужды заказчика могут диктовать самые разные метрики. Вернёмся к задаче постановки диагноза пациентам больницы. Какие метрики вы предложили бы использовать в каждом из следующих случаев:
обычный год в обычном терапевтическом отделении обычной больницы;
определение очень унизительной болезни, которая жутким клеймом падёт на каждого, кому поставили такой диагноз;
определение опасной и очень заразной болезни.
Конечно, даже в каждом из этих довольно частных случаев могут быть разные ситуации и разные метрики, но вот как, например, можно было бы ответить:
Обычный год в обычном терапевтическом отделении обычной больницы — тогда главного врача вполне устроит, если доля правильно поставленных диагнозов будет высокой (эта метрика называется accuracy).
Определение очень неприятной болезни, которая жутким клеймом падёт на каждого, кому поставили такой диагноз, — тогда нам важно максимизировать долю действительно больных среди тех, кому мы имели несчастье поставить этот диагноз (эта метрика называется точностью, или precision).
Определение опасной и очень заразной болезни — тогда нам важно не пропустить ни одного заражённого, и метрика будет иметь вид доли правильно определённых носителей (эта метрика называется полнотой, или recall).
Разумеется, это самые простые метрики, и в реальной жизни аналитику приходится сталкиваться с более сложной иерархией метрик; немного подробнее мы поговорим об этом в главе про измерение качества моделей.
Вопрос на подумать. Рассмотрим задачу детектирования людей на изображении (под детектированием чаще всего понимают указание местоположения человека, например прямоугольника, в котором он находится). Подумайте, какие метрики можно было бы использовать в различных ситуациях для измерения качества решения этой задачи. Не забудьте, что метрики — это способ численно измерить то, насколько модель помогает нам в жизни, так что важно думать о том, зачем вообще нам детектировать людей.
Вот несколько вариантов, которые можно было бы придумать:
Мы разрабатываем программу для проведения видеоконференций и хотим добавить эффект, который облачает участника в рыцарские доспехи, — в этом случае нам важно корректно определять местоположение и в качестве метрики мы могли бы брать среднеквадратичное отклонение координат каких-нибудь опорных точек тела от истинных.
Мы строим систему безопасности вокруг какого-то важного объекта, и нам важно обнаруживать вторжение — в этом случае нам не очень принципиально, насколько точно отмечено местоположение человека в кадре, но все люди должны быть обнаружены. Таким образом, в качестве метрики можно рассмотреть полноту: на какой доле кадров, где действительно были люди, наша модель отметила их наличие.
Мы строим систему, определяющую, не превышает ли количество людей в помещении некоторый порог (например, в рамках борьбы с пандемией), — в этом случае метрикой может быть, скажем, среднеквадратичное отклонение числа детектированных моделью людей от истинного их количества.
Как найти функцию, которая минимизирует метрику на данной выборке? В общем случае решить эту задачу не представляется возможным. Но, быть может, если ограничиться каким-то классом функций, то на нём получится найти оптимум?
Для примера давайте возьмём задачу предсказания цены квартиры, в качестве класса моделей — константные функции \(f(x) = c\) (то есть будем для всех квартир предсказывать одно и то же значение цены), а в качестве метрики — среднее абсолютное отклонение (mean absolute error, она же MAE).
\[MAE(f, X, y) = L(f, X, y) = \frac1N\sum\limits_{i=1}^N \vert f(x_i) - y_i\vert \rightarrow \min\limits_f,\]где \(f\) — это модель (та самая, \(f(x) = c\)), $X = \{x_1,\ldots,x_N\}$ — обучающие примеры (данные о квартирах, которые мы смогли достать), $y = \{y_1,\ldots,y_N\}$ — правильные ответы (то есть цены на известные нам квартиры). Так как предсказание модели константное, по нему легко можно взять производную, которую мы приравняем к нулю, чтобы найти оптимальное значение \(c\):
\[\nabla_cL(f, X, y) = \frac1N\sum\limits_{i=1}^N sign(c - y_i) = 0\]Немного погрешив против математической строгости, можно сказать, что $0$ (и, соответственно, оптимум нашей метрики) достигается в точке \(f(x) = \mathrm{median}(y)\).
Вопрос на подумать. Давайте теперь в задаче предсказания цены квартиры рассмотрим метрику среднеквадратичное отклонение (MSE):
\[MSE(f, X, y) = \frac1N\sum_{i=1}^N(f(x_i) - y_i)^2\]Каким будет оптимальное значение параметра $c$ для константной модели $f(x) = c$?
Это будет среднее значение:
\[\overline{y} = \frac1N\sum_{i=1}^Ny_i\]
Прекрасно, значит, в классе константных функций мы можем найти оптимальную модель. Может быть, это можно сделать и в каком-нибудь более интересном классе? Этому вопросу и будет посвящена большая часть нашей книги. Классический курс ML состоит из описания классов моделей и способов работы с ними. Несмотря на то что для решения большинства практических задач на сегодня достаточно знать только два типа моделей — градиентный бустинг на решающих деревьях и нейросетевые модели — мы постараемся рассказать и про другие, чтобы развить у вас глубинное понимание предмета и дать возможность не только использовать лучшие сложившиеся практики, но и, при вашем желании, участвовать в проработке новых идей и поиске новых методов — уже в роли исследователя, а не просто инженера.
Не любое сочетание задач, моделей и метрик имеет смысл. Скажем, если вы предсказываете класс опасности вещества (бывает от 1-го до 4-го) по его химической формуле, MAE по умолчанию представляется не очень обоснованной метрикой, уж точно менее удачной, чем доля правильных предсказаний: ведь несмотря на то, что классы вроде как представлены целыми числами, их порядок не имеет чёткой семантики. И наоборот, если мы предсказываем возраст человека в годах по его фотографии, точность предсказаний кажется уже не столь удачной метрикой (хотя возраст принимает лишь конечное и не очень большое число различных значений), а вот MAE — вполне. В ходе курса вы научитесь выбирать правильные метрики для различных задач и классов моделей — и поймёте, что этот выбор не всегда так однозначен, как хотелось бы.
При этом стоит отметить, что при постановке бизнес-задачи метрика обычно выбирается из соображений целесообразности, а не из-за её совместимости с какими-то моделями (больше того, модель обычно возникает уже в процессе оптимизации метрики как средство). Например, человек, ставящий аналитику задачу о предсказании цены квартиры, может попросить в качестве метрики использовать доход риелторского агентства или аудиторию сайта этого агентства. Ясно, что в такой ситуации особо ничего не продифференцируешь, потому что доход можно лишь неявно связать с качеством предсказания цен на квартиры. Или же метрика окажется принципиально недифференцируемой (как, например, точность предсказания). Что же делать? Обычно поступают так: выбирают прокси-метрику, оптимизируя которую будут улучшать и исходную метрику или хотя бы уповать на это. Например, в качестве прокси для дохода риелторского агентства можно использовать метрику абсолютной близости и понадеяться, что точные предсказания приведут к успеху и популярности компании. А вместо точности предсказания класса опасного вещества мы можем попробовать взять среднеквадратичное отклонение (вот это плохая идея, а как надо делать — вы узнаете дальше). В таком случае метрику, которую используют при поиске оптимальной модели, называют функцией потерь, ошибкой, лоссом (от loss) или лосс-функцией. Выбор удачной функции потерь и класса моделей для конкретной задачи — тонкое и хорошо оплачиваемое искусство, которому мы надеемся научить вас в нашем курсе.
Описанные выше задачи являются примерами задач обучения с учителем (supervised learning), так как правильные ответы для каждого объекта обучающей выборки заранее известны. Задачи обучения с учителем делятся на следующие виды в зависимости от того, каким может быть множество $\mathbb{Y}$ всех возможных ответов (таргетов):
Ответ может быть и более сложным. Так, в задаче сегментации изображения требуется для каждого пикселя предсказать, к какому объекту или типу объектов он относится, а в задаче машинного перевода мы должны сгенерировать предложение (или целый текст), являющееся переводом исходного. Интерес представляют и задачи порождения новых объектов, то есть генерации правдоподобных объектов, из ничего или на основе уже существующих. На первый взгляд может показаться, что таким моделям сложно найти применение: понятно, почему мы хотим научиться отличать изображение кошки от изображения собаки, но не очень понятно, зачем нам уметь генерировать изображения собак. Однако с помощью такой модели также можно научиться увеличивать разрешение изображения и применять любимые всеми маски в Snapchat и Instagram.
Чем сложнее задача, тем больше данных нужно, чтобы её решить. Например, существенные успехи в задачах распознавания изображений были достигнуты лишь с появлением очень больших датасетов (и, стоит добавить, вычислительных мощностей). Вычислительные ресурсы продолжают совершенствовать, но во многих ситуациях размеченных данных (то есть объектов, которым кто-то сопоставил ответ) было бы по-прежнему слишком мало: например, для решения задачи аннотирования изображений (image captioning) потребовалось бы огромное количество пар (изображение, описание).
Бороться с этой проблемой можно двумя способами. Первый — использование краудсорсинга, то есть привлечение людей, готовых за относительно небольшие деньги разметить много данных. Во многих ситуациях (например, когда речь заходит об оценке поисковой выдачи) без него никак, и мы обязательно познакомим вас с этим подходом. Второй же способ состоит в использовании наряду с размеченными и неразмеченных данных. В самом деле, в той же задаче аннотирования изображений у нас есть огромное количество никак не связанных друг с другом изображений и текстов — и мы можем использовать их для того, чтобы, например, помочь компьютеру понять, какие слова в принципе могут стоять рядом в предложении. Подходы, связанные с использованием неразмеченных данных для решения задач обучения с учителем, объединяются термином self-supervised learning и очень активно используются сейчас. Важной составляющей является обучение представлений (representation learning) — задача построения компактных векторов небольшой размерности из сложных по структуре данных (например, изображений, звука, текстов, графов) так, чтобы близкие по структуре или семантике данные получали метрически близкие представления. Делать это можно разными способами — например, используя фрагменты моделей, обученных для решения какой-либо другой задачи, или строя модель, предсказывающую скрытую часть объекта по оставшейся его части — например, пропущенное слово в предложении. Этому будет посвящена отдельная глава нашего учебника.
Есть и относительно небольшой класс задач, относящихся к обучению без учителя (unsupervised learning), — это задачи, для которых нам известны только данные, а ответы неизвестны или вообще не существуют, а их поиск не является самоцелью. Классическим примером обучения без учителя является кластеризация — задача разделения объектов на группы, обладающие некоторыми (неизвестными нам, но, как мы в глубине души надеемся, интерпретируемыми) свойствами. Примером может служить кластеризация документов из электронной библиотеки по темам или кластеризация новостей с целью выделения крупных сюжетов.
Бывают и другие виды (и даже парадигмы) машинного обучения, так что если вы встретите задачу, которую никак не получается отнести к одному из перечисленных выше типов, не расстраивайтесь и знайте, что где-то дальше в учебнике вас ждёт рассказ про такие задачи.
Вопрос на подумать. Для следующих задач определите, относятся ли они к обучению с учителем, или без, или к чему-то промежуточному, попробуйте отнести их к более узким видам задач.
Предсказание курса евро к доллару на следующий день.
Стилизация текста. Например, перевод на бюрократический язык: «Пиппина и Мерри похитили!» $\mapsto$ «Граждане Тук, Перегрин Паладинович, 2990 года рождения, и Брендибак, Мериадок Сарадокович, 2982 года рождения, были похищены неустановленными лицами».
Детектирование котиков на изображении.
Обучение робокота запрыгивать на стол из произвольной позы.
Поиск наборов товаров, которые посетители супермаркета часто покупают вместе.
Это задача регрессии: предсказывается вещественное число (пусть и с небольшим количеством знаков после запятой).
Это задача генерации новых объектов (на основе уже существующих).
В зависимости от того, для чего мы детектируем котиков, это может быть задача регрессии (предсказание координат вершин прямоугольника, в котором находится котик) или классификации (если нас просто интересует, есть котик или нет).
Эту задачу можно решать по-разному. Например, создав физическую модель движения робокота и рассчитав оптимальную последовательность движений. Но если мы всё-таки хотим решать её с помощью машинного обучения, то можно поступить следующим образом. Создадим компьютерную симуляцию (чтобы не ломать настоящего робота) и модель, которая будет в каждый момент на основе конфигурации сочленений, высоты от пола, расстояния до стола, фазы Луны и других важных параметров предсказывать, как нужно дальше поворачивать лапы, изгибать спину кота и так далее, — и эту модель будем прогонять в симуляции, так или иначе меняя её в зависимости от того, насколько удачно робот справляется со своей задачей. Такая парадигма называется обучением с подкреплением (reinforcement learning), и о ней мы поговорим в отдельной главе.
Вы можете спросить: а почему это не обучение с учителем? Ведь у нас есть объекты — последовательности движений и ответы — запрыгнул кот на стол или нет. Проблема в том, что перебрать кучу траекторий (ввиду сложности задачи — действительно огромную кучу) и для каждой получить ответ — это очень долго и сложно; кроме того, нам хотелось бы иметь фреймворк, в котором можно было бы относительно легко адаптироваться, скажем, к изменению высоты стола.
Это задача обучения без учителя.
Вопрос на подумать. Ранжирование — это задача с таргетом из конечного упорядоченного множества $(1,\ldots,K)$. Но, казалось бы, её запросто можно было бы рассматривать как задачу классификации на $K$ классов или задачу регрессии. В чём же проблема? Почему так не делают?
На самом деле для решения задач ранжирования обычно строят модель, предсказывающую некоторое вещественное число, по которому затем сортируют объекты, — так почему бы это не регрессия? Дело в том, что функции потерь и метрики в этой задаче совсем другие: ведь нам неважно, какие именно вещественные числа мы предсказываем; мы просто хотим, чтобы более релевантным объектам сопоставлялись числа побольше.
Поймём теперь, почему задача «предскажите 10 самых релевантных объектов» непохожа на задачу классификации. Причина в том, что мир меняется, появляются новые объекты, и если к нам в руки попадёт объект более релевантный, чем текущий топ-1, все номера позиций поедут, и выученное нами соответствие объектов и номеров можно будет выкидывать на помойку.
Может показаться, что мы вас обманули, когда пугали сложностями: очевидно, что для любой задачи машинного обучения можно построить идеальную модель, надо всего лишь запомнить всю обучающую выборку с ответами. Такая модель может достичь идеального качества по любой метрике, но радости от неё довольно мало, ведь мы хотим, чтобы она выявила какие-то закономерности в данных и помогла нам с ответами там, где мы их не знаем. Важно понимать, какая у построенной модели обобщающая способность, то есть насколько она способна выучить общие закономерности, присущие не только обучающей выборке, и давать адекватные предсказания на новых данных. Для того чтобы предохранить себя от конфуза, поступают обычно так: делят выборку с данными на две части: обучающую выборку и тестовую выборку (train и test). Обучающую выборку используют для собственно обучения модели, а метрики считают на тестовой.
Такой подход позволяет отделить модели, которые просто удачно подстроились к обучающим данным, от моделей, в которых произошла генерализация (generalization), то есть от таких, которые на самом деле кое-что поняли о том, как устроены данные, и могут выдавать полезные предсказания для объектов, которые не видели.
Например, рассмотрим три модели регрессионной зависимости, построенные на одном и том же синтетическом датасете с одним-единственным признаком. Жёлтым нарисованы точки обучающей выборки. Здесь мы представим, что есть «истинная» закономерность (пунктир), которая искажена шумом (погрешности измерения, влияние других факторов и т.д.).
Левая, линейная модель недостаточно хороша: она сделала, что могла, но плохо приближает зависимость, особенно при при маленьких и при больших $x$. Правая «запомнила» всю обучающую выборку (и в самом деле, чтобы вычислить значение этой функции, нам надо знать координаты всех исходных точек) вместо того, чтобы моделировать исходную зависимость. Наконец, центральная, хоть и не проходит через точки обучающей выборки, довольно неплохо моделирует истинную зависимость.
Алгоритм, избыточно подстроившийся под данные, называют переобученным.
С увеличением сложности модели ошибка на обучающей выборке падает. Во многих задачах очень сложная модель будет работать примерно так же, как модель, «просто запомнившая всю обучающую выборку», но с генерализацией всё будет плохо: ведь выученные закономерности будут слишком специфическими, подогнанными под то, что происходит на обучающей выборке. Мы видим это на трёх графиках сверху: линейная функция очень проста, но и закономерность приближает лишь очень грубо; на правом же графике мы видим довольно хитрую функцию, которая точно подобрана под значения из обучающей выборки, но явно слишком эксцентрична, чтобы соответствовать какой-то природной зависимости. Оптимальная же генерализация достигается на модели не слишком сложной и не слишком простой.
В качестве иллюстрации для того же самого датасета рассмотрим модели вида
\[y\ =\ \text{ многочлен степени }D\]Ясно, что с ростом $D$ сложность модели растёт, и она достигает всё лучшего качества на обучающей выборке. А что, если у нас есть ещё тестовая выборка? Каким будет качество на ней? Вот так могут выглядеть графики среднеквадратичного отклонения (MSE) для обучающей и тестовой выборок:
Мы видим здесь типичную для классических моделей картину: MSE на обучающей выборке падает (может быть, даже до нуля), а на тестовой сперва падает, а затем начинает снова расти.
Замечание. Для моделей глубинного обучения всё немного интереснее: в некоторых ситуациях есть грань, за которой метрика на тестовой выборке снова начинает падать. Но об этом в своё время. Пока давайте запомним, что слишком сложная модель — это вредно, а переобучение — боль.
Точный способ выбрать алгоритм оптимальной сложности по данной задаче нам пока неизвестен, хотя какую-то теоретическую базу имеющимся философским наблюдениям мы дадим в главе про теорию обучения; при этом есть хорошо продуманная методология сравнения разных моделей и выбора среди них оптимальной — об этом мы обязательно расскажем вам в следующих главах. А пока дадим самый простой и неизменно ценный совет: не забывайте считать метрики на тестовой выборке и никогда не смешивайте её с обучающей!
Вопрос на подумать. Обсуждая переобучение, мы упоминали про сложность модели, но не сказали, что это такое. Как бы вы её определили? Как описать / сравнить сложность моделей для двух приведённых ниже задач? Почему, кстати, мы решили, что средняя модель ОК, а правая переобученная?
Сложность модели можно очень грубо охарактеризовать числом настраиваемых параметров модели, то есть тех, которые мы можем определить по данным в процессе обучения. Это не имеет никакого математического смысла, и о каких-то более серьёзных оценках мы поговорим в главе про теорию машинного обучения, но никто не бросит в вас камень, если вы скажете, что модель с 10 тысячами параметров сложнее, чем модель с 1000 параметров.
В первой задаче левая модель — это, судя по всему, линейная функция, у неё два параметра, вторая — наверное, квадратичная с тремя параметрами, а правая — многочлен какой-то высокой степени (на самом деле 11-й), у неё параметров намного больше. Центральная модель явно лучше, чем левая, справляется с тем, чтобы приблизить истинную закономерность; правая тоже вроде неплохо справляется с тем, чтобы приблизить её для обучающих данных, но вот два резких провала и крутое пике слева никак не объясняются имеющимися данными, и на двух тестовых точках в районе $0,5$ модель отчаянно врёт — так что есть причины считать, что она переобучилась.
Со второй задачей ситуация во многом похожая. Центральная модель явно лучше разделяет жёлтые и серые точки. На правой же картинке мы видим довольно неестественные выпячивания жёлтой и серой областей: например, к серой точке в центре картинки (которая наверняка была выбросом) протянулось серое «щупальце», захватившее и несколько тестовых (и даже обучающих) точек другого класса. В целом можно поспорить о том, плох ли правый классификатор, но он явно рисует слишком сложные границы, чтобы можно было поверить, что они отражают что-то из реальной жизни.
В курсе мы будем активно использовать слово «модель», и нужно заранее договориться о том, что мы имеем в виду, чтобы вам не казалось, что мы одним и тем же словом называем совсем разные вещи.
Мир, в котором мы живём, бесконечно сложен, и вряд ли у нас есть шанс хоть что-то измерить и предсказать совершенно точно, будь то форма Земли или вероятность того, что пользователь останется доволен поисковой выдачей. Но как-то работать нужно, и поэтому люди вводят (упрощённые) описания мироздания, которые и называют моделями.
Например, «Земля плоская» — это модель, и не такая плохая, как вам может показаться. Ей активно пользуются, когда всё происходит в масштабах одного города и кривизной поверхности можно пренебрегать. С другой стороны, если мы попробуем рассчитать кратчайший путь из Парижа в Лос-Анджелес, модель плоской Земли выдаст неадекватный ответ, она войдёт в противоречие с имеющимися данными, и её придётся заменить на «Земля круглая», «Земля имеет форму эллипсоида» и так далее — в той мере, в которой нам важна точность и в какой нам это позволяет (не)совершенство измерительной техники. Так, модель «Земля — это безымянная штука с шершавостями на месте горных хребтов» очень точная и замечательная, но, возможно, будет избыточно сложной для большинства практических задач и при этом слишком тяжёлой в плане вычислений.
То же самое верно и для машинного обучения. Если мы предсказываем цену квартиры, мы не можем учесть все на свете тонкости и сделать это совершенно точно. С одной стороны, нам фантазии не хватит, чтобы придумать все на свете факторы, влияющие на цену (да и вообще в природу на квантовом уровне внесена случайность). С другой стороны, данных у нас конечное количество, и, скажем, если мы даже знаем, что квартира, хозяин которой ходит с эльфийскими ушами и по ночам играет на арфе, продаётся за большие деньги, у нас просто нет другой квартиры, которая отличалась бы от этой лишь ушами хозяина, чтобы сделать хоть сколь-нибудь ответственный вывод о том, что именно уши повлияли на цену. Поэтому мы с самого начала должны примириться с тем, что мы ищем не истинную зависимость, а лишь приближённую — то есть строим модель. Например, такую: «цена квартиры линейно зависит от метража и логарифмически — от расстояния до ближайшего метро». Или такую: «цена квартиры линейно зависит от суммарного метража и как многочлен второй степени — от метража ванных комнат». Или вот такую: «в некоторых случаях цена квартиры линейно зависит от метража и логарифмически — от расстояния до ближайшего метро, а в некоторых она просто равна константе». В каждой модели у нас есть обучаемые (настраиваемые) параметры (в данном случае коэффициенты зависимостей, а у третьей модели ещё и правило, разделяющее одни случаи и другие), которые мы будем оптимизировать в ходе обучения. Кроме того, нам придётся научиться сравнивать разные модели.
Но, как мы видели в примере с формой Земли, не все модели являются предсказательными. Например, мы можем задуматься о том, как устроена вся совокупность квартир (виденных нами, не виденных нами и не существующих пока, но правдоподобных). «Половина квартир — двухкомнатные» — это тоже модель, и она, как мы увидим, может оказаться полезной для построения уже предсказательной модели цены, равно как и модель «расстояние от квартиры до ближайшего метро имеет нормальное распределение». Больше того, и для цены мы можем давать неточный ответ, а что-то в духе «ну, цена этой квартиры заключена между такими-то значениями» или «цена этой квартиры имеет нормальное распределение с такими-то параметрами, то есть вот такое значение, конечно, вероятнее всего, но вообще мы не очень уверены, и вот так можно выразить нашу неуверенность». Модели данных вы можете применить и для того, чтобы генерировать новые объекты, — и если генерировать квартиры с ценами звучит как сомнительное занятие, то генерация осмысленного текста или аниме точно заслуживает право на существование. Наконец, понимание того, как устроены данные, может оказаться полезным для поиска аномалий: так, если какая-то квартира уж совсем никак не соответствует модели (скажем, если это землянка по цене в три раза выше средней по рынку или если в ней на две жилые комнаты 10 ванных комнат), у нас есть повод заподозрить шутников или мошенников (но в то же время это может означать, что мы просто недостаточно данных собрали и модель в процессе обучения не повидала подобного).
В следующих главах вы узнаете, что модели машинного обучения бывают очень разными, что они могут служить разным целям и к ним могут предъявляться нетривиальные требования.
Изучая машинное обучение, вы нередко будете сталкиваться со словами модель и алгоритм, и иногда вам будет казаться, что это одно и то же, а иногда нет. Сейчас мы опишем, в чём, на наш взгляд, состоит разница между ними, и будем придерживаться этого разделения дальше в учебнике. Впрочем, не все придерживаются тех же терминологических соглашений, так что будьте осмотрительны.
Как уже было описано выше, модель — это некоторое суждение о мире вокруг нас. У модели могут быть настраиваемые параметры (например, коэффициенты линейной функции), и тогда нужен какой-то способ настроить их по конкретной обучающей выборке. Например, с помощью метода наименьших квадратов. Это и есть алгоритм (алгоритм обучения): инструкция, как по выборке обучить параметры модели. Естественно, для одной и той же модели может быть несколько различных алгоритмов обучения, и точно так же один и тот же алгоритм (например, уже упомянутый метод наименьших квадратов) может быть использован для обучения различных моделей (например, и для модели «цена квартиры линейно зависит от расстояния до метро», и для модели «цена квартиры логарифмически зависит от расстояния до метро»).