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

Как видите, взаимное движение цены и размера как будто предсказуемо. Однако оно не ограничено фиксированными шагами или категориями, их масштаб скользит. Дом может стоить 180 тысяч, 305 тысяч или иметь какую-то промежуточную цену.
Теперь представьте, что вы продаёте свой дом. Его площадь 1850 квадратных футов (~172 квадратных метра) — больше среднего, но явно не особняк. Вы видели, почём продаются дома в вашем районе, но цены колеблются. Какой будет справедливая цена?
Можно, например, позвонить своему другу-риэлтору, чтобы он дал неточную прикидку. Но лучше будет взглянуть на паттерн прошлых продаж и нарисовать соответствующую им линию. Вы берёте линейку, кладёте её на миллиметровку и рисуете какой-то график, который кажется вам правильным. Затем находите площадь своего дома на оси X, проводите пунктирную линию до линии и определяете прогнозируемую цену.

Какую бы линию вы ни нарисовали, она будет прямой, направленной вверх: чем больше дома, тем выше цены. Она может быть неидеальной, зато позволяет превратить квадратные футы в цену, которая кажется разумной.
И хотя вы можете нарисовать разные линии, все они соответствуют одной формуле. В каждой из них берётся площадь дома (независимая (explanatory
) переменная), умножается на число (наклон slope
) и прибавляется ещё одно число (свободный коэффициент intercept
).

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

В нашем случае наклон — это «цена за квадратный фут». Это величина, которую прибавляет к общей сумме каждый дополнительный фут. Если наклон равен 150, то дом в 1000 кв. футов, исходя из одной площади, должен стоить 150 тысяч долларов. Чем круче наклон, тем быстрее растут цены с увеличением площади дома.

Свободный коэффициент — это место начала прямой. Это прогнозируемая цена дома площадью ноль квадратных футов. Сама по себе она особого смысла не имеет (никто не покупает дом в ноль квадратных футов), но задаёт отправную точку, например минимальную цену, которую следует ожидать при покупке самой маленькой студии. Если два района повышают цены с одинаковым коэффициентом на квадратный фут, то низ цен будет выше у того, у которого выше свободный коэффициент.
Теперь, когда мы знаем, что каждая прямая соединяет независимую переменную с прогнозом при помощи лишь наклона и свободного коэффициента, остаётся вопрос: какой прямой стоит доверять при выставлении цены дома?
Чтобы ответить на него, нам нужно найти способ измерения того, насколько точно линия соответствует уже имеющимся у нас данным.
Возьмём один из домов в нашем датасете. Линия даёт понять, что его должны были продать за 350 тысяч. Но реальная цена составила 375 тысяч. Эта разница в 25 тысяч — «погрешность», определяющая, насколько ошибочной была прямая для этой точки. Если скинуть цену слишком сильно, то потеряешь деньги, если задрать её слишком высоко, то дом могут и не купить.

Хорошая прямая обеспечивает малый разрыв между прогнозом и реальными значениями. Проще всего измерить точность аппроксимации прямой, сложив эти разрывы, то есть погрешности.
Разумеется, способов измерения погрешностей много. И именно выбор способа их комбинирования превращает гадания в регрессию.
Один из простейших способов — применить абсолютную погрешность, как мы делали это в предыдущем примере. Надо взять разность между прогнозируемой и истинной ценой (вне зависимости от того, какая из них выше), обращаясь с ним, как с расстоянием. Если дом был продан за 375 тысяч, а одна из прямых прогнозирует 350, то погрешность составит 25 тысяч. Ещё один прогноз даёт цену 360 тысяч? Он отличается от реальности на 15 тысяч. И чем меньше погрешность, тем лучше.
Для сравнения прямых мы просто складываем абсолютные погрешности для всех домов. Линия с наименьшей суммарной погрешностью и будет победительницей.
Если мы пытаемся определить цену собственного дома, то это интуитивно понятно: лучше ошибиться на 10 тысяч, чем на 30 тысяч.
Однако абсолютная погрешность относится ко всем ошибкам одинаково — две умеренные ошибки считаются равными одной большой. Это может маскировать проблемы прямой.
Если ваши прогнозы всегда немного ошибочны, то вы постоянно близки к истине. Но если одна оценка точно определяет цену, а другая ошибается на 100 тысяч. то сложно понять, надёжна ли модель, или ей просто повезло. Целостность важнее, чем случайные совпадения, особенно если цены со временем меняются.
Представим, что мы каждую неделю мониторим цены домов в нашем районе. Чаще всего оценки будут немного отличаться, допустим на 10 тысяч в плюс или минус. Особо волноваться не о чем. Но однажды дом, в точности похожий на ваш, продаётся на 150 тысяч ниже рынка. На следующей неделе другой продаётся по слишком высокой цене. Вас это не только удивит: вы совершенно перестанете доверять своим оценкам.
Чтобы вернуть себе доверие к оценкам, можно сделать так, чтобы большие погрешности значили больше, а не в равной мере с маленькими. Например, это можно сделать, увеличив скорость роста штрафа (penalty) с увеличением погрешности. По сути, мы будем составлять на графике кривую погрешности, а не прямую. Чем дальше мы движемся, тем круче становится штраф. Вот что значит использование нелинейной шкалы: небольшие промахи едва влияют на показатели, а крупные приводят к взрыву.

Вместо того, чтобы измерять погрешность напрямую, мы возводим её в квадрат. Влияние этого очевидно из показанного выше графика: промах на 20 тысяч хуже промаха на 10 тысяч не в два, а в четыре раза. А как насчёт погрешности в 50 тысяч? Она стоит в двадцать пять раз дороже. Увеличение штрафов за погрешности быстро нарастает. Возведение погрешностей в квадрат делает нас ближе к прямой, которая остаётся стабильно близко к истине, а не той, которая колеблется между случайными удачными догадками и огромными промахами.
Всё, что мы сделали — измерение погрешностей, выбор их весов и сложение — сводится к одной простой идее: функции погрешности. Это просто правило для оценки того, насколько хорошо линия соответствует данным. Популярный вариант функции — квадратичная погрешность. Абсолютная погрешность — это ещё один, но они не единственные.
Выбор функций погрешностей зависит от приоритета. Например, в регрессии Деминга применяется другая функция погрешностей, учитывающая погрешности обеих переменных, а не только той, которую мы стремимся спрогнозировать. Она полезна, когда шумны оба измерения, например, при сравнении результатов замеров лабораторных экспериментов двумя разными инструментами.
К примерам данных близки многие прямые. Нам нужна не любая подходящая прямая, а лучшая (с наименьшей погрешностью). Какую бы функцию погрешностей мы не выбрали, цель остаётся той же: найти прямую, минимизирующую функцию погрешностей.
Из этого следует ещё один вопрос: откуда берутся эти линии? Один из вариантов их нахождения — простой перебор. Берём множество всех возможных сочетаний наклона и свободного коэффициента, а затем перебираем их одно за другим. Затем вычисляем погрешность и останавливаемся на наилучшей.
Это работает. По крайней мере, теоретически. Но возникает проблема: вариантов слишком много, бесконечно много. Чтобы проверить их все, потребуется вечность. Нам нужен более разумный алгоритм, чем вычисление погрешности для каждой возможной прямой.
Чтобы понять, с чем нам придётся столкнуться, представим график, на котором каждая точка обозначает отдельную линию: наклон и свободный коэффициент — это координаты, а вертикальная линия показывает, насколько плоха прямая, то есть её погрешность. В этом мире погрешностей чем выше точки, тем хуже прямые, а чем ниже, тем они лучше. Наша цель проста: найти самую нижнюю точку. Мы не будем рисовать этот график (вариантов слишком много), но если мысленно представить его, то задача становится понятной.
Например, если посмотреть на поверхность абсолютных погрешностей, то она довольно некрасивая. Она не такая плавная, как холм или долина. Больше похожа она на странную скульптуру-оригами с острыми краями и перегибами.

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

Это можно чётко увидеть на 2D-срезе: если закрепить свободный коэффициент на нуле, то одинаковую наименьшую погрешность будет давать множество наклонов.

Такая неоднозначность важна, потому что если данным одинаково хорошо соответствует множество прямых, то у нас не будет единственного лучшего ответа, а лишь набор одинаково хороших. Представьте, что вы пытаетесь продать дом, разумная цена которого будет равна 100 тысячам, 500 тысячам или 1 миллиону, в зависимости от выбранной прямой. Это неидеально.
Такая ситуация возникает, если примеры данных симметричны: небольшое изменение угла прямой приближает её к каким-то точкам, одновременно отдаляя её от других, не меняя при этом общую погрешность. На графике ниже показан пример этого. Допустимым решением будет любая прямая, проходящая через голубую область (например, красная).

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

Если бы мы стояли в любой точке этой поверхности, то для нахождения лучшей прямой достаточно было бы спуститься вниз по склону. Выбираем направление, в котором наклон самый крутой, делаем шаг и продолжаем двигаться вниз. Постепенно мы достигнем дна.
Не нужно исследовать все направления и беспокоиться, что зайдёшь в тупик. Откуда бы мы ни начали, если мы будем двигаться по самому крутому склону, то дойдём до наилучшего решения. Это может занять сто, тысячу или больше шагов, но рано или поздно мы там окажемся.
Разумеется, мы не по-настоящему будем ходить по холмам. В нашем случае под спуском вниз подразумевается подбор чисел: наклона и свободного коэффициента прямой. Каждая точка на поверхности погрешностей соответствует конкретной прямой. Соседние точки соответствуют прямым с близкими параметрами. Пошагово меняя наклон и свободный коэффициент, мы движемся по этому пространству, стремясь ко всё более низкой погрешности, пока не доберёмся до наилучшего соответствия.
На этом мы можем остановиться, зафиксировав наклон и свободный коэффициент найденной прямой. Она будет нашей наилучшим прогнозом стоимости дома.
Чтобы лучше понять происходящее при спуске по этой долине, можно рассмотреть только одну размерность — наклон. На графике ниже показано изменение погрешности при изменении наклона (с фиксированным свободным коэффициентом). Обратите внимание, что кривая плавная и чашеобразная, что позволяет без проблем двигаться вниз.

На каждом шаге нам нужно решить, двигаться влево или вправо. Чтобы сделать это, мы замеряем степень крутизны наклона в текущей точке. Этот показатель (крутизна кривой) называется производной.
Если производная положительна, это значит, что погрешность увеличивается при движении вправо, поэтому нужно двигаться влево. В случае отрицательной производной погрешность увеличивается при движении влево, поэтому нужно двигаться вправо.
Если вкратце, то производная указывает в сторону подъёма по холму. Так как мы хотим двигаться вниз, то перемещаемся в противоположном направлении.
Мы продолжаем так двигаться (проверять значение производной, меняя направление по необходимости), пока не доберёмся до точки, в которой наклон горизонтален. В ней производная становится нулём, и мы достигли минимума.

При использовании способа наименьших квадратов нулевая производная всегда обозначает минимум. Но в общем случае это не всегда так. Это может быть максимум или точка перегиба. Чтобы определить разницу между минимумом и максимумом, необходимо смотреть на вторую производную. Если вторая производная положительна, это минимум. Если отрицательна, то максимум. Если ноль, то это точка перегиба.
Такой процесс итеративной минимизации функции при помощи производных называется градиентным спуском.
Градиентный спуск — это интуитивно понятный и эффективный алгоритм, с которым особенно хорошо сочетается квадратичная погрешность.
Благодаря возведению погрешностей в квадрат всё остаётся плавным: никаких острых углов и резких скачков. Это важно, ведь градиентному спуску нужно измерять наклоны, а если функция не плавная, то не всегда можно определить чёткий наклон, по которому можно следовать.
Это было очевидно не всегда. В 1800-х годах математики, например Карл Витгенштейн, показали, что может существовать полностью непрерывная кривая, настолько зазубренная, что у неё вообще нет наклона ни в одной из точек. Это стало настоящим открытием: лишь то, что функция издалека выглядит плавной, не значит, что это действительно так.
С уменьшенной версией этой проблемы сталкивается минимизация абсолютной погрешности. Функция абсолютных значений может иметь неожиданный перегиб в нуле — именно там, где нам нужен чёткий наклон. Можно обойти эту неприятность при помощи особых трюков, но это не очень красиво и менее естественно.
Квадратичная же погрешность двигается плавно. Её производная чётка, непрерывна и имеет геометрический смысл — она не только указывает в направлении спуска вниз, то и сообщает, насколько большой шаг нужно делать. Никаких трюков не требуется.
По сути, это истинная причина того, что все возводят погрешности в квадрат, а не берут абсолютные значения, даже если этот выбор может быть не всегда лучшим. Благодаря квадратичной погрешности оптимизация становится простой и плавной; к тому же, как мы говорили выше, она гарантирует наличие единственного стабильного наилучшего решения.
Стоит также отметить, что существует множество способов нахождения минимума функции, но славы добился градиентный спуск; это произошло благодаря его близкому родственнику — стохастическому градиентному спуску, который активно применяется в обучении нейронных сетей.
Несмотря на всю свою сложность, глубокое обучение по-прежнему основывается на том же самом простом принципе: пошаговой подстройке параметров для минимизации погрешности, точно такой же, какую мы выполняли при помощи линейной регрессии и квадратичных погрешностей.
Soprin
"Существуют три вида лжи: ложь, наглая ложь и статистика". Есть хорошая книга "Как врать при помощи статистики" написанная еще в 50х года, там подробно описывается как можно манипулировать