Статья Автор: Деникина Н.В., Деникин А.В.

Ошибка одним числом

Четыре заказа из базы

заказкмсветофоровкурьеровехал, мин
112412
220213
334620
442620

Это четыре строки той самой базы выполненных заказов: что было в заказе и сколько он на самом деле ехал. На них и будем работать.

Зачем сравнивать наборы весов

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

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

Но заказов четыре. Возьмём два набора весов — назовём их A и B — и посмотрим, что каждый предсказывает на всех четырёх заказах.

наборвес при кмвес при светофорахвес при курьерахсборка
A2.751.5−0.59.5
B41.5−0.56.5

Два средних веса в наборах A и B совпадают. Различаются только два числа, они выделены: вес при километрах и время сборки.

заказехалпрогноз Aпромах Aпрогноз Bпромах Bкто точнее
11213.251.2511.50.5B
21314113.50.5B
32020.750.7521.51.5A
42020.50.522.52.5A

Счёт по заказам — 2:2. Набор A точнее на третьем и четвёртом, набор B — на первом и втором. Правило «лучше тот, кто точнее на большинстве заказов» ответа не даёт: большинства нет.

Можно придумывать и другие способы решить спор. Например, посмотреть на самый большой промах: у A это 1.25 минуты, у B — 2.5. Похоже на ответ, но он опирается на один заказ и ничего не говорит про остальные три.

Суть затруднения вот в чём. Качество набора весов описано четырьмя числами — по одному промаху на заказ. А сравнивать удобно одно число с одним. Значит, четыре промаха надо свернуть в одно, причём одним и тем же способом для любого набора весов — иначе сравнение снова будет нечестным.

Функция потерь

То, что нам сейчас нужно, давно придумано и называется функцией потерь.

Функция потерь (loss) — функция, которая берёт набор весов и выдаёт одно число: насколько плохо этот набор предсказывает на нашей таблице. Чем число больше, тем хуже. Ноль означает, что прогноз совпал с фактом на всех заказах.

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

Считается функция потерь в три шага, и первые два мы уже проделали руками, когда сравнивали наборы A и B:

  1. по каждой строке таблицы посчитать прогноз;
  2. вычесть из прогноза факт — получить промах на этом заказе;
  3. свернуть все промахи в одно число.

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

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

Самое простое лечение — взять модуль каждого промаха: тогда |+10| + |−10| = 20, и модель честно получает двадцать минут ошибки. Такая мерка действительно существует и применяется, её называют средним абсолютным отклонением.


Ученик мерит качество суммой отклонений прогноза от факта, без квадрата и без модуля. На двух заказах его модель опоздала на 10 минут и поспешила на 10 минут. Что покажет мерка и почему это плохо?

Есть и второй способ убрать знак — возвести каждый промах в квадрат. Оба годятся: и модуль, и квадрат сводят четыре промаха к одному числу. Но ведут себя по-разному, и с этого различия начнём.

MSE (mean squared error) — среднее квадратов промахов:

MSE = ( промах₁² + промах₂² + ... + промахₙ² ) / n

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

Посчитаем для наших двух наборов:

наборпромахиMSE
A1.25, 1, 0.75, 0.50.84375
B0.5, 0.5, 1.5, 2.52.25

Теперь ответ есть, и он однозначный: набор A лучше. Обратите внимание, почему — не потому, что он точнее на большем числе заказов (счёт был равный), а потому, что у него нет ни одного крупного промаха. Один промах на 2.5 минуты у набора B утяжеляет всю сумму.

Это не значит, что MSE лучше модуля вообще. У них разные свойства, и то самое усиление крупных промахов бывает не достоинством, а бедой.

Когда модуль лучше

Добавим к нашим четырём заказам пятый — с испорченной записью. Курьер съездил на 2 км, по правилу это 14.5 минуты, но в журнал попало 48.5: он заехал поесть, а время в базе посчиталось от приёма заказа.

Таблица 1. Пять заказов, последний с испорченной записью.

заказкмсветофоровкурьеровв журналепо правилу
11241212
22021313
33462020
44262020
521248.514.5

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

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

Разберём один вес целиком, w = 5. Первый заказ: 5 · 1 + 1.5 · 2 − 0.5 · 4 + 8 = 14, в журнале 12, промах +2. Пятый, тот самый испорченный: 5 · 2 + 1.5 · 1 − 0.5 · 2 + 8 = 18.5, а в журнале 48.5, промах −30. Все пять промахов: 2, 4, 6, 8, −30. Сумма квадратов 4 + 16 + 36 + 64 + 900 = 1020, делим на 5 — получаем MSE 204. Сумма модулей 2 + 4 + 6 + 8 + 30 = 50, делим на 5 — получаем 10.

Остальные веса считаются так же:

Таблица 2. Обе мерки при шести разных весах.

веспять промаховсумма квадратов÷ 5 = MSEсумма модулей÷ 5 = средний модуль
2−1, −2, −3, −4, −361326265.2469.2
30, 0, 0, 0, −341156231.2346.8
41, 2, 3, 4, −321054210.8428.4
52, 4, 6, 8, −3010202045010
63, 6, 9, 12, −281054210.85811.6
74, 8, 12, 16, −261156231.26613.2

Минимумы выделены. MSE опускается ниже всего при w = 5, а средний модуль — при w = 3. Мелкий перебор с шагом 0.0002 подтверждает: это и есть точные минимумы, между целыми точками ничего лучше не спрятано.

Куда смотреть в таблице 2

Читаем её сверху вниз: вес при километрах растёт от 2 до 7. В столбце «пять промахов» первые четыре числа относятся к нормальным заказам, пятое — к испорченному.

С ростом веса эти две группы ведут себя противоположно.

  • Четыре нормальных промаха растут: в строке w = 3 они нулевые, в строке w = 5 это 2, 4, 6, 8, в строке w = 7 уже 4, 8, 12, 16.
  • Промах на испорченной записи по модулю убывает: −34 в строке w = 3, потом −30, потом −26. Прогноз на этом заказе растёт и понемногу догоняет завышенное время из журнала.

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

Почему мерки решают по-разному

Сравним строки w = 3 и w = 5 по двум столбцам сумм.

Сумма модулей растёт с 34 до 50, то есть становится хуже. Разберём по частям: испорченная запись подешевела с 34 до 30 — выигрыш 4. А четыре нормальных заказа добавили 2 + 4 + 6 + 8 = 20. Ухудшение перевесило, и модуль остаётся на w = 3.

Сумма квадратов за те же два шага падает с 1156 до 1020, то есть становится лучше. Те же части, но в квадратах: вклад испорченной записи упал с 34² = 1156 до 30² = 900 — выигрыш 256. А четыре нормальных заказа добавили 2² + 4² + 6² + 8² = 120. Теперь перевесил выигрыш, и квадрат уезжает на w = 5.

Вот и весь механизм. Возведение в квадрат раздуло выигрыш от одной записи с 4 до 256, а потери четырёх заказов — всего с 20 до 120. Причина в том, что квадрат огромного промаха огромен непропорционально: 34 минуты дают 1156 — больше, чем все остальные заказы вместе, даже когда они испорчены.

Чем обошёлся выбор MSE

Посмотрите на строку w = 5, столбец промахов: 2, 4, 6, 8, −30. Это и есть цена. На четырёх нормальных заказах прогноз теперь врёт на 2, 4, 6 и 8 минут, хотя при w = 3 не врал вовсе. Модель испорчена для всех обычных заказов, чтобы подстроиться под одну кривую запись.

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

У разных функций потерь разные свойства и разные области применения — выбор зависит от задачи. С модулем, кстати, тоже умеют работать: излом в нуле обходят.

Ошибка как функция одного веса

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

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

факт = 3 · км + 1.5 · светофоры − 0.5 · курьеры + 8

Проверьте по любой строке таблицы — сходится. Например, третий заказ: 3 · 3 + 1.5 · 4 − 0.5 · 6 + 8 = 20, и в журнале ровно 20.

Теперь сделаем вид, что один из четырёх весов мы забыли — вес при километрах. Три остальных подставим в модель прямо из правила: 1.5, −0.5 и 8. Менять их мы не будем и думать про них тоже; про такие параметры говорят, что их зафиксировали (или заморозили).

Остаётся один неизвестный вес — обозначим его w. Вот в чём смысл такой постановки: ответ нам заранее известен, он равен 3. Значит, мы сможем проверить, приведёт ли метод именно к нему. Все четыре веса отпустим в пятом разделе, когда метод будет разобран.

Прогноз при пробном весе w отличается от факта только первым слагаемым — остальные три параметра зафиксированы и в обеих формулах одинаковы:

прогноз = w · км + 1.5 · светофоры − 0.5 · курьеры + 8

Вычитаем одно из другого. Светофоры, курьеры и сборка сокращаются, остаётся только первое слагаемое:

промах = прогноз − факт = (w − 3) · км

Вот откуда тройка: это тот самый вес, который мы «забыли». Отсюда сразу видно и то, что минимум придётся ровно на w = 3, и то, что значение минимума равно нулю: при верном весе промах на каждом заказе обращается в ноль.

Осталось возвести промахи в квадрат и усреднить, как велит MSE. Квадрат промаха равен (w − 3)² · км², множитель (w − 3)² от номера заказа не зависит и выносится, а среднее квадратов километров по таблице равно (1 + 4 + 9 + 16) / 4 = 7.5:

MSE(w) = 7.5 · (w − 3)²

Функция оказалась параболой: у неё ровно один минимум, и он в точке w = 3.

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

Та же мерка на модулях даёт другую функцию: средний модуль промаха равен 2.5 · |w − 3|, где 2.5 — среднее километров.

w012345
MSE(w)67.5307.507.530
средний модуль7.552.502.55

Зачем нам понадобится наклон

Вот что здесь важнее самих формул. Функция потерь — это функция от весов: меняем вес, меняется число. Значит, её можно нарисовать: по горизонтали вес, по вертикали ошибка. MSE даёт параболу, средний модуль — «галочку» с вершиной в тройке.

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

Вот откуда берётся наклон и зачем он нужен: он превращает слепой перебор в осмысленное движение. Как его посчитать — третий раздел; как выбрать длину шага — четвёртый.

Заодно видна ещё одна причина работать с квадратами. Посмотрите на оба графика рядом.


MSE(w) = 7.5 · (w − 3)²0123456−300наклон есть в каждой точкесредний модуль = 2.5 · |w − 3|0123456−2.5+2.5здесь излом:наклона нетна дне наклона нетпо горизонтали вес при километрах, по вертикали ошибка; минимум обеих функций в w = 3зелёным — наклон: слева касательные к параболе, справа сами ветви галочки

У параболы наклон есть в каждой точке: в w = 1 касательная идёт вниз с наклоном −30, ближе к дну она становится всё положе, а ровно в минимуме — горизонтальна, наклон 0. Именно это и значит «дно гладкое»: подходя к минимуму, наклон плавно убывает до нуля, и сам он служит указателем, далеко ли до дна.

У «галочки» всё иначе. Слева от тройки наклон равен −2.5, справа +2.5, и между этими значениями нет ничего: функция переключается с одного на другое мгновенно. В самой нижней точке наклона нет вовсе — какой из двух считать верным, сказать невозможно. Причём излом приходится именно туда, куда мы стремимся.

Обратите внимание и на то, что наклон галочки не подсказывает расстояние до дна: он равен ±2.5 и в двух километрах от минимума, и в сотой доле от него.

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


Реши практическую задачу

Печать