Монотонность функций ↗️
Ты обучаешь модель и смотришь на кривую обучения: loss падает с 2.31 до 0.42. Потом добавляешь в пайплайн логарифмирование одного признака — и AUC не меняется вообще, ни в одном знаке после запятой. А коллега рядом жалуется, что после калибровки вероятностей его модель стала предсказывать «менее уверенно», хотя ранжирование объектов осталось ровно тем же. Три разные истории — и во всех трёх работает одно и то же свойство: монотонность.
Монотонность — это, по сути, ответ на вопрос «сохраняет ли функция порядок?». Если я взял два числа и одно из них меньше другого, останется ли это отношение после того, как я прогоню оба через функцию? Если да — функция возрастает. Если порядок переворачивается — убывает. Если то так, то эдак — функция немонотонна, и вот с этого момента начинаются все интересные вещи: экстремумы, оптимизация, точки перегиба, локальные минимумы, в которых застревает градиентный спуск.
Звучит почти тривиально. Но за этой простой идеей стоит огромный практический пласт. Именно монотонность объясняет, почему порог 0.5 по вероятности — это то же самое, что порог 0 по логиту. Почему деревья решений вообще не чувствуют, отмасштабировал ты признак или нет. Почему AUC и корреляция Спирмена называются «ранговыми метриками» и что это значит на самом деле. Почему в банковском скоринге регулятор может потребовать: «модель обязана быть монотонной по доходу» — и как это требование реализуется технически. И почему уравнение $x^3 + x = 10$ имеет ровно один корень, который ты найдёшь за пять секунд без всякой формулы Кардано.
В этом уроке мы разберём монотонность от строгого определения до рабочих инструментов: научимся доказывать её напрямую через знак разности значений, через композицию монотонных слоёв, через выделение целой части у дробей и через готовый справочник элементарных функций. Поймём тонкую разницу между «возрастает» и «неубывает», между «возрастает на каждом промежутке» и «возрастает на области определения». Научимся решать уравнения и неравенства, опираясь на монотонность как на аргумент. И в конце соберём всё это в ML-картину — сигмоида, softmax с температурой, ранговые метрики, изотоническая регрессия и монотонные ограничения в градиентном бустинге.
🎯 Ты узнаешь:
- Как звучит строгое определение возрастания и убывания и чем строгая монотонность отличается от нестрогой
- Четыре рабочих способа доказать монотонность без всякого анализа: разность, композиция, целая часть, справочник элементарных функций
- Почему $y = 1/x$ убывает на каждом из двух промежутков, но не убывает на своей области определения
- Как монотонность даёт бесплатный аргумент «корень единственный» в уравнениях и переворачивает знак в неравенствах
- Почему монотонные преобразования признаков не меняют AUC, как работает изотоническая калибровка и зачем в бустинге бывают монотонные ограничения
История: откуда это взялось?
Первым, кто всерьёз попробовал нарисовать «как величина меняется», был французский схоласт Николай Орем — примерно в 1350-х годах, в Парижском университете. Он придумал изображать интенсивность величины (скорости, теплоты, «качества») отрезками, отложенными от горизонтальной линии, — фактически изобрёл прообраз графика функции за три века до Декарта. И он же ввёл различие между «равномерным» и «неравномерным» изменением, то есть впервые формально разделил случаи, когда величина растёт ровно, растёт с ускорением или падает. Задача была совершенно практической по меркам эпохи: описать движение и объяснить, почему тело, разгоняющееся равномерно, проходит путь, равный пути тела, движущегося со средней скоростью, — так называемое правило Мертонского колледжа.
Строгие определения появились только в XIX веке, когда математика начала «наводить порядок» после бурного и не всегда аккуратного XVIII столетия. Огюстен Луи Коши в «Курсе анализа» (1821) и Бернард Больцано чуть раньше начали формулировать свойства функций через неравенства, а не через интуитивные картинки: не «функция идёт вверх», а «для любых $x_1 < x_2$ выполнено $f(x_1) < f(x_2)$». Это была не педантичность ради педантичности — на графиках-картинках математики того времени регулярно ошибались, а после работ Вейерштрасса, построившего непрерывную функцию с чудовищно изломанным графиком, стало окончательно ясно: интуиция про «гладкие кривые» врёт, и нужны определения, работающие без картинок. Именно поэтому определение монотонности, которым мы пользуемся до сих пор, сформулировано через пары точек и неравенства — самый надёжный фундамент из возможных.
Финальный аккорд поставил Анри Лебег в 1904 году: он доказал поразительную теорему — монотонная функция ведёт себя крайне «прилично», у неё не может быть более чем счётного числа разрывов, и все они устроены как простые скачки. То есть монотонность, задуманная как самое скромное требование к функции, автоматически влечёт очень сильную регулярность поведения. Именно поэтому монотонные функции — рабочая лошадка всей современной прикладной математики.
А мостик в сегодня получился прямым и на удивление коротким. В 1955 году группа статистиков (Айер, Брунк, Юинг, Рид, Силверман) опубликовала алгоритм PAV — Pool Adjacent Violators, который «чинит» немонотонную последовательность, усредняя нарушителей. Сорок семь лет спустя, в 2002 году, Здрозны и Элкан взяли ровно этот алгоритм и применили его к калибровке вероятностей в машинном обучении — так появилась изотоническая регрессия как стандартный метод в scikit-learn. А в библиотеках градиентного бустинга (XGBoost, LightGBM, CatBoost) есть параметр monotone_constraints, который заставляет модель быть монотонной по выбранному признаку: банк обязан гарантировать регулятору, что при росте дохода клиента скоринговый балл не падает. Определение Коши из 1821 года превратилось в строку конфига продакшн-модели.
Что такое монотонность: строгие определения
Интуиция
Представь турникет на входе в метро: люди проходят по одному и в том же порядке, в котором подошли. Никто не обгоняет, порядок сохраняется. Возрастающая функция — это ровно такой турникет для чисел: подал на вход меньшее число — на выходе получил меньшее значение. Всегда, без исключений, для любой пары.
Убывающая функция — это тот же турникет, но с зеркалом: порядок сохраняется, только перевёрнутый. Меньшее на входе — большее на выходе. Классический пример из жизни: чем больше времени ты потратил на дорогу, тем меньше времени осталось до дедлайна. Зависимость строго убывающая, и по значению одной величины всегда однозначно восстанавливается другая.
А вот немонотонная функция — это уже толпа без турникета. Порядок то сохраняется, то ломается. Парабола $y = x^2$: числа $-3$ и $-1$ идут в порядке $-3 < -1$, а их квадраты — в обратном ($9 > 1$). Зато $1 < 3$ и $1 < 9$ — порядок сохранился. Именно поэтому у параболы есть вершина: это точка, где функция «передумала».
Ключевой момент, который часто проскакивают мимо: монотонность — свойство не точки, а множества. Нельзя сказать «функция возрастает в точке $x = 2$» (по крайней мере, в школьном курсе такого понятия нет). Можно сказать «функция возрастает на промежутке $[1; 5]$» — потому что определение требует брать пару точек, а одной точки для пары не хватает.
Определение: Функция $f$ называется возрастающей на промежутке $X \subseteq D(f)$, если для любых $x_1, x_2 \in X$ из неравенства $x_1 < x_2$ следует $f(x_1) < f(x_2)$.
Определение: Функция $f$ называется убывающей на промежутке $X \subseteq D(f)$, если для любых $x_1, x_2 \in X$ из неравенства $x_1 < x_2$ следует $f(x_1) > f(x_2)$.
Функция, возрастающая или убывающая на $X$, называется строго монотонной на $X$. Есть и нестрогие версии, они тоже нужны:
- Неубывающая: из $x_1 < x_2$ следует $f(x_1) \leq f(x_2)$ — функции разрешено «постоять на месте»
- Невозрастающая: из $x_1 < x_2$ следует $f(x_1) \geq f(x_2)$
Разница между строгой и нестрогой версией не формальность. Константа $f(x) = 7$ — неубывающая и одновременно невозрастающая, но ни возрастающая, ни убывающая. И вот важное следствие: строго монотонная функция обратима (каждое своё значение принимает ровно один раз), а просто неубывающая — нет. Плато на графике означает, что несколько разных $x$ дают одно и то же $y$, и «отмотать назад» уже невозможно.
Полезные свойства, которые пригодятся дальше:
- Если $f$ возрастает, то $-f$ убывает (и наоборот) — умножение на $-1$ переворачивает порядок
- Сумма двух возрастающих функций возрастает
- Композиция двух возрастающих функций возрастает; композиция возрастающей и убывающей — убывает (правило знаков, как при умножении)
- Если $f$ непрерывна и строго монотонна на промежутке, у неё существует обратная функция $f^{-1}$, и она монотонна в ту же сторону
Примеры с разбором
Пример 1 (простой): докажи по определению, что $f(x) = 4x - 1$ возрастает на $\mathbb{R}$
Решение:
Шаг 1. Возьмём два произвольных числа $x_1$ и $x_2$ так, что $x_1 < x_2$. «Произвольных» — принципиально: если мы проверим только на конкретных числах, это не доказательство, а иллюстрация.
Шаг 2. Составим разность значений:
$$f(x_2) - f(x_1) = (4x_2 - 1) - (4x_1 - 1) = 4x_2 - 4x_1 = 4(x_2 - x_1)$$Шаг 3. По предположению $x_1 < x_2$, значит $x_2 - x_1 > 0$. Умножение на положительное число $4$ знак не меняет:
$$4(x_2 - x_1) > 0 \implies f(x_2) - f(x_1) > 0 \implies f(x_2) > f(x_1)$$Шаг 4. Мы получили ровно то, что требует определение: из $x_1 < x_2$ следует $f(x_1) < f(x_2)$.
Ответ: функция возрастает на всей числовой прямой.
📌 Обрати внимание на общий приём: знак разности $f(x_2) - f(x_1)$ и есть ответ на вопрос о монотонности. Положительна для любой пары — возрастает, отрицательна — убывает.
Пример 2 (средний): докажи, что $f(x) = x^2$ возрастает на $[0; +\infty)$
Решение:
Шаг 1. Берём $0 \leq x_1 < x_2$ и составляем разность:
$$f(x_2) - f(x_1) = x_2^2 - x_1^2$$Шаг 2. Разложим разность квадратов — это и есть главный трюк:
$$x_2^2 - x_1^2 = (x_2 - x_1)(x_2 + x_1)$$Шаг 3. Разберём каждый множитель отдельно:
- $x_2 - x_1 > 0$, потому что $x_1 < x_2$ по условию
- $x_2 + x_1 > 0$, потому что оба числа неотрицательны и хотя бы одно из них ($x_2$) строго больше нуля
Шаг 4. Произведение двух положительных чисел положительно, значит $f(x_2) > f(x_1)$.
Ответ: на $[0; +\infty)$ функция $y = x^2$ возрастает.
Проверим наш ответ: а что будет на отрицательной полуоси? Там $x_1 + x_2 < 0$, и произведение $(x_2 - x_1)(x_2 + x_1)$ становится отрицательным — то есть $f(x_2) < f(x_1)$, функция убывает. Ровно то, что мы знаем про параболу: убывает до вершины, возрастает после.
Пример 3 (сложный): верно ли, что $f(x) = \dfrac{1}{x}$ убывает на своей области определения?
Это, пожалуй, самая коварная задача во всей теме — и на ней сыплются даже те, кто уверенно строит графики.
Решение:
Шаг 1. Выпишем область определения: $D(f) = (-\infty; 0) \cup (0; +\infty)$. Это объединение двух промежутков, а не один промежуток.
Шаг 2. Проверим убывание на каждом куске отдельно. Возьмём $x_1 < x_2$, оба одного знака, и составим разность:
$$f(x_2) - f(x_1) = \frac{1}{x_2} - \frac{1}{x_1} = \frac{x_1 - x_2}{x_1 x_2}$$Шаг 3. Числитель $x_1 - x_2 < 0$ всегда. Знаменатель $x_1 x_2 > 0$, если оба числа одного знака. Значит вся дробь отрицательна: $f(x_2) < f(x_1)$ — на каждом из двух промежутков функция действительно убывает.
Шаг 4. А теперь проверим определение на всей области определения. Возьмём $x_1 = -1$ и $x_2 = 1$. Условие $x_1 < x_2$ выполнено. Считаем значения:
$$f(-1) = -1, \qquad f(1) = 1$$Получилось $f(x_1) = -1 < 1 = f(x_2)$ — функция выросла, хотя мы ожидали убывания. Определение нарушено.
Ответ: нет, неверно. Функция убывает на $(-\infty; 0)$ и убывает на $(0; +\infty)$, но не убывает на объединении этих промежутков. Правильная формулировка: «убывает на каждом из промежутков».
Почему так вышло: между двумя ветвями гиперболы находится разрыв, и определение монотонности через пары точек ничего не знает про «график идёт вниз» — оно тупо сравнивает значения. Пара точек с разных сторон от разрыва легко даёт контрпример.
Почему это важно
Формулировка «убывает на каждом из промежутков» — не занудство преподавателя, а прямая защита от ошибок в реальных вычислениях. Когда ты решаешь неравенство вида $\frac{1}{x} > \frac{1}{3}$ и по инерции «переворачиваешь» его как для монотонной функции, ты получаешь $x < 3$ и теряешь то, что все отрицательные $x$ решениями не являются. Верный ответ здесь $x \in (0; 3)$, и получить его можно, только помня про разрыв.
В инженерной практике ровно та же ловушка живёт в кусочно-заданных функциях и в данных с пропусками. Ты считаешь метрику «монотонно ли растёт выручка по когортам» и проверяешь через np.all(np.diff(x) > 0) — а в массиве где-то NaN, и сравнение с NaN возвращает False, ломая всю логику. Или считаешь монотонность калибровочной кривой, где в одном бине не оказалось ни одного объекта. Монотонность всегда проверяется на связном множестве, и первое, что стоит спросить у своих данных, — а связное ли оно.
Инструмент 1: знак разности и вынесение множителя
Интуиция
Первый и самый универсальный инструмент прямо следует из определения: посчитай $f(x_2) - f(x_1)$ и посмотри на знак. Но «посмотреть на знак» разности двух громоздких выражений — само по себе задача. Поэтому у метода есть техника, которая превращает его в почти механическую процедуру.
Техника такая: вынеси из разности множитель $(x_2 - x_1)$. Он всегда положителен (мы же выбрали $x_1 < x_2$), поэтому дальше остаётся исследовать знак только второго множителя — а он обычно куда проще исходного выражения. Практически для этого используют школьные формулы сокращённого умножения:
- $x_2^2 - x_1^2 = (x_2 - x_1)(x_2 + x_1)$
- $x_2^3 - x_1^3 = (x_2 - x_1)(x_2^2 + x_1x_2 + x_1^2)$
- $\dfrac{1}{x_2} - \dfrac{1}{x_1} = \dfrac{x_1 - x_2}{x_1x_2} = -(x_2 - x_1) \cdot \dfrac{1}{x_1x_2}$
- $\sqrt{x_2} - \sqrt{x_1} = \dfrac{x_2 - x_1}{\sqrt{x_2} + \sqrt{x_1}}$ (домножение на сопряжённое)
Представь, что ты выносишь за скобку «то, что точно положительно», и весь вопрос сводится к оставшемуся хвосту. Это очень похоже на то, как в физике выносят общий масштаб, чтобы работать с безразмерной величиной: лишнее убрано, суть видна.
Утверждение (критерий через разность): Функция $f$ возрастает на $X$ тогда и только тогда, когда для любых $x_1, x_2 \in X$ с условием $x_1 < x_2$ выполнено $f(x_2) - f(x_1) > 0$. Для убывания — то же самое со знаком $<$.
Примеры с разбором
Пример 1 (простой): докажи, что $f(x) = 5 - 2x$ убывает на $\mathbb{R}$
Решение:
Шаг 1. Берём произвольные $x_1 < x_2$ и считаем разность:
$$f(x_2) - f(x_1) = (5 - 2x_2) - (5 - 2x_1) = -2x_2 + 2x_1 = -2(x_2 - x_1)$$Шаг 2. Выносим положительный множитель: $(x_2 - x_1) > 0$, а перед ним стоит $-2 < 0$.
Шаг 3. Произведение отрицательного числа на положительное отрицательно, значит $f(x_2) - f(x_1) < 0$, то есть $f(x_2) < f(x_1)$.
Ответ: функция убывает на $\mathbb{R}$.
Обобщение: для линейной функции $y = kx + b$ разность всегда равна $k(x_2 - x_1)$, поэтому направление монотонности целиком определяется знаком $k$ — и это правило можно применять сразу, без выкладок.
Пример 2 (средний): докажи, что $f(x) = x^3$ строго возрастает на всей числовой прямой
Решение:
Шаг 1. Возьмём $x_1 < x_2$ и применим формулу разности кубов:
$$f(x_2) - f(x_1) = x_2^3 - x_1^3 = (x_2 - x_1)\left(x_2^2 + x_1x_2 + x_1^2\right)$$Шаг 2. Первый множитель положителен по выбору точек. Осталось разобраться со вторым — и это единственное место, где нужно подумать.
Шаг 3. Преобразуем второй множитель, «достроив» его до суммы квадратов. Умножим и разделим на 2:
$$x_2^2 + x_1x_2 + x_1^2 = \frac{2x_2^2 + 2x_1x_2 + 2x_1^2}{2} = \frac{(x_1 + x_2)^2 + x_1^2 + x_2^2}{2}$$Шаг 4. В числителе — сумма трёх квадратов, она неотрицательна. Ноль возможен, только если одновременно $x_1 = 0$ и $x_2 = 0$, но это противоречит условию $x_1 < x_2$. Значит второй множитель строго положителен.
Шаг 5. Произведение двух положительных множителей положительно: $f(x_2) > f(x_1)$.
Ответ: $f(x) = x^3$ строго возрастает на $\mathbb{R}$.
📌 Приём «свести выражение к сумме квадратов» — универсальный способ доказать положительность без всякого анализа. Запомни тождество $a^2 + ab + b^2 = \dfrac{(a+b)^2 + a^2 + b^2}{2}$, оно ещё пригодится.
Пример 3 (сложный): исследуй на монотонность функцию $f(x) = x + \dfrac{1}{x}$ на промежутке $(0; +\infty)$
Решение:
Шаг 1. Возьмём $0 < x_1 < x_2$ и составим разность, группируя слагаемые по частям:
$$f(x_2) - f(x_1) = (x_2 - x_1) + \left(\frac{1}{x_2} - \frac{1}{x_1}\right)$$Шаг 2. Вторую скобку приведём к общему знаменателю:
$$\frac{1}{x_2} - \frac{1}{x_1} = \frac{x_1 - x_2}{x_1x_2} = -\frac{x_2 - x_1}{x_1x_2}$$Шаг 3. Подставим обратно и вынесем общий множитель $(x_2 - x_1)$:
$$f(x_2) - f(x_1) = (x_2 - x_1) - \frac{x_2 - x_1}{x_1x_2} = (x_2 - x_1)\left(1 - \frac{1}{x_1x_2}\right) = (x_2 - x_1) \cdot \frac{x_1x_2 - 1}{x_1x_2}$$Шаг 4. Знаменатель $x_1x_2 > 0$ и множитель $(x_2 - x_1) > 0$. Значит знак всей разности определяется выражением $x_1x_2 - 1$.
Шаг 5. Разберём два случая:
- Если оба числа лежат в $(0; 1]$, то $x_1x_2 < 1$ (произведение двух чисел, не превосходящих 1, причём $x_1 < 1$ строго), значит $x_1x_2 - 1 < 0$ — разность отрицательна, функция убывает
- Если оба числа лежат в $[1; +\infty)$, то $x_1x_2 > 1$ (произведение двух чисел, не меньших 1, причём $x_2 > 1$ строго), значит $x_1x_2 - 1 > 0$ — разность положительна, функция возрастает
Ответ: на $(0; 1]$ функция убывает, на $[1; +\infty)$ возрастает; в точке $x = 1$ достигается наименьшее значение $f(1) = 2$.
Проверим наш ответ: $f(0{,}5) = 0{,}5 + 2 = 2{,}5$, $f(1) = 2$, $f(2) = 2 + 0{,}5 = 2{,}5$. Значения падают до единицы и растут после ✅
Бонус: мы попутно доказали известное неравенство $x + \dfrac{1}{x} \geq 2$ для всех $x > 0$ — минимум функции равен 2, значит меньше она нигде не бывает.
Почему это важно
Метод разности — это не «школьный способ, пока не выучили что-то посерьёзнее». Это единственный способ, который работает всегда, в том числе там, где более продвинутые инструменты неприменимы: для функций с изломами, для последовательностей (дискретных функций натурального аргумента), для функций, заданных таблицей или алгоритмом.
В прикладной работе это встречается постоянно. Когда ты проверяешь, монотонна ли кривая «recall в зависимости от порога» или «выручка по когортам», у тебя на руках не формула, а массив чисел — и единственный доступный критерий это как раз знак разности соседних элементов, np.diff. Когда доказываешь, что твоя эвристика ранжирования не переворачивает порядок объектов, ты фактически проверяешь знак разности. Метод из определения — это буквально то, что превращается в две строчки кода, и потому его стоит понимать до автоматизма.
Инструмент 2: композиция монотонных функций
Интуиция
Сложная функция — это конвейер: число проходит через несколько станций подряд. $y = \sqrt{3 - 2x}$ — сначала умножили на $-2$, потом прибавили 3, потом извлекли корень. Если каждая станция либо сохраняет порядок, либо переворачивает его, то итог считается как правило знаков при умножении: два переворота дают исходный порядок, один — перевёрнутый.
Именно поэтому не нужно возиться с разностью, если функция собрана из знакомых слоёв. Достаточно посчитать, сколько «переворотов» встретилось по дороге: чётное число — функция возрастает, нечётное — убывает.
Определение (монотонность композиции): Пусть $g$ монотонна на $X$, а $h$ монотонна на множестве значений $g$. Тогда композиция $h(g(x))$ монотонна на $X$, причём она возрастает, если $g$ и $h$ монотонны в одну сторону, и убывает, если в разные.
Шпаргалка по правилу знаков:
- возрастающая ∘ возрастающая = возрастающая («плюс на плюс»)
- возрастающая ∘ убывающая = убывающая
- убывающая ∘ возрастающая = убывающая
- убывающая ∘ убывающая = возрастающая («минус на минус»)
Важная деталь, о которой забывают: композиция монотонна только на том множестве, где монотонен внутренний слой. Если внутри $x^2$, то разговор идёт отдельно про $[0; +\infty)$ и отдельно про $(-\infty; 0]$ — на всей прямой $x^2$ немонотонна, и всё рассуждение разваливается.
Примеры с разбором
Пример 1 (простой): исследуй на монотонность $f(x) = \sqrt{x + 3}$
Решение:
Шаг 1. Найдём область определения: $x + 3 \geq 0 \implies x \geq -3$, то есть $D(f) = [-3; +\infty)$.
Шаг 2. Разложим функцию на слои. Внутренний слой $g(x) = x + 3$ — линейная функция с положительным коэффициентом, значит возрастает. Внешний слой $h(u) = \sqrt{u}$ на $[0; +\infty)$ тоже возрастает.
Шаг 3. Возрастающая от возрастающей даёт возрастающую — переворотов ноль.
Ответ: $f(x) = \sqrt{x+3}$ возрастает на $[-3; +\infty)$.
Проверим наш ответ напрямую через разность. Для $x_1 < x_2$ домножим на сопряжённое:
$$\sqrt{x_2+3} - \sqrt{x_1+3} = \frac{(x_2+3) - (x_1+3)}{\sqrt{x_2+3} + \sqrt{x_1+3}} = \frac{x_2 - x_1}{\sqrt{x_2+3} + \sqrt{x_1+3}} > 0$$Числитель положителен, знаменатель положителен — разность положительна ✅ Оба метода сошлись, но через композицию это заняло одну строчку.
Пример 2 (средний): докажи, что кросс-энтропия одного объекта $L(p) = -\ln p$ строго убывает по $p$ на $(0; 1]$
Здесь $p$ — предсказанная моделью вероятность правильного класса, а $L$ — вклад этого объекта в log-loss.
Решение:
Шаг 1. Разложим на слои: сначала $u = \ln p$, потом $L = -u$.
Шаг 2. Первый слой: натуральный логарифм — функция с основанием $e > 1$, значит на $(0; +\infty)$ она возрастает.
Шаг 3. Второй слой: умножение на $-1$ переворачивает порядок.
Шаг 4. Один переворот — итог убывающий.
Ответ: $L(p) = -\ln p$ строго убывает на $(0; 1]$; минимум $L(1) = 0$ достигается при $p = 1$.
Проверим наш ответ на числах:
$$L(0{,}1) = -\ln 0{,}1 \approx 2{,}303, \quad L(0{,}5) \approx 0{,}693, \quad L(0{,}9) \approx 0{,}105, \quad L(1) = 0$$Значения падают ✅
Что из этого следует: раз $L$ строго убывает по $p$, минимизация log-loss эквивалентна максимизации предсказанной вероятности правильного класса. Это не «интуитивно понятно», а строго следует из монотонности: убывающая функция достигает минимума ровно там, где её аргумент максимален. Вся логика обучения классификаторов через кросс-энтропию держится на этом одном свойстве.
Пример 3 (сложный): исследуй на монотонность $f(x) = 2^{-x^2}$
Эта функция — по сути ядро гауссовского вида: похожие «колокола» используются в RBF-ядрах SVM и в мерах похожести, основанных на расстоянии.
Решение:
Шаг 1. Область определения: $D(f) = \mathbb{R}$, ограничений нет.
Шаг 2. Разложим на слои: $u = x^2$, затем $v = -u$, затем $y = 2^{v}$.
Шаг 3. Ключевой момент: слой $x^2$ монотонен не на всей прямой, а на каждой полуоси отдельно. Значит и ответ будет из двух частей.
Шаг 4. Рассмотрим $[0; +\infty)$:
- $u = x^2$ возрастает (доказано в первом разделе)
- $v = -u$ — переворот, убывает
- $y = 2^v$ возрастает (основание $2 > 1$)
Итого один переворот — функция убывает на $[0; +\infty)$.
Шаг 5. Рассмотрим $(-\infty; 0]$:
- $u = x^2$ здесь убывает — это уже один переворот
- $v = -u$ — второй переворот
- $y = 2^v$ порядок сохраняет
Два переворота — функция возрастает на $(-\infty; 0]$.
Ответ: возрастает на $(-\infty; 0]$, убывает на $[0; +\infty)$; максимум $f(0) = 1$.
Проверим наш ответ:
$$f(-2) = 2^{-4} = 0{,}0625, \quad f(-1) = 0{,}5, \quad f(0) = 1, \quad f(1) = 0{,}5, \quad f(2) = 0{,}0625$$Растёт до нуля, падает после ✅ И заодно видно, почему такие «колокола» так хорошо работают как мера похожести: чем дальше объект от центра, тем меньше вес, причём убывание сначала плавное, а потом стремительное.
Почему это важно
Разложение на монотонные слои — это буквально то, как устроена нейросеть. Каждый слой сети — это композиция линейного преобразования и функции активации, и монотонность активации имеет прямые последствия. Сигмоида, tanh, ReLU, GELU, softplus — все монотонно неубывающие. Именно поэтому нейросеть с положительными весами оказывается монотонной по входу целиком: композиция возрастающих функций возрастает. На этом свойстве построены монотонные нейросети (monotonic networks, Sill, 1997) — сети, в которых часть весов принудительно держат неотрицательными, чтобы гарантировать: «при росте дохода клиента скоринговый балл не упадёт». Это не красивая теория, а требование финансовых регуляторов во многих юрисдикциях.
И обратная сторона медали: если хотя бы один слой немонотонен, гарантия ломается. Ровно поэтому произведение двух признаков или квадратичное преобразование внутри модели сразу лишает её монотонности по входу, а активации вроде Swish, слегка проваливающиеся ниже нуля, формально монотонными не являются — и это иногда полезно, потому что немонотонность добавляет выразительности. Понимание того, какой слой сохраняет, а какой ломает порядок, — это ровно та математика, которая позволяет читать архитектуру сети, а не заучивать её.
Инструмент 3: справочник элементарных функций, целая часть и оценка
Интуиция
Третий инструмент — самый быстрый: просто знать наизусть, как ведут себя базовые функции. Ты уже разобрал их в уроках 76–86, осталось собрать в одну таблицу и научиться ею пользоваться не задумываясь.
Справочник монотонности элементарных функций:
- $y = kx + b$: возрастает при $k > 0$, убывает при $k < 0$
- $y = x^n$, $n$ нечётное ($1, 3, 5, \dots$): возрастает на всей прямой
- $y = x^n$, $n$ чётное ($2, 4, 6, \dots$): убывает на $(-\infty; 0]$, возрастает на $[0; +\infty)$
- $y = \dfrac{1}{x}$ и вообще $y = \dfrac{1}{x^n}$ при нечётном $n$: убывает на каждом из промежутков $(-\infty; 0)$ и $(0; +\infty)$
- $y = \dfrac{1}{x^n}$ при чётном $n$: возрастает на $(-\infty; 0)$, убывает на $(0; +\infty)$
- $y = \sqrt{x}$: возрастает на $[0; +\infty)$
- $y = a^x$: возрастает при $a > 1$, убывает при $0 < a < 1$
- $y = \log_a x$: возрастает при $a > 1$, убывает при $0 < a < 1$
- $y = |x|$: убывает на $(-\infty; 0]$, возрастает на $[0; +\infty)$
К справочнику прилагается один приём, который закрывает целый класс задач: выделение целой части у дробно-линейной функции. Любую дробь вида $\dfrac{ax + b}{cx + d}$ можно переписать как «число плюс дробь с числовым числителем»:
$$\frac{ax+b}{cx+d} = A + \frac{B}{cx+d}$$После такого преобразования монотонность видна мгновенно: внутри $cx + d$ — линейная функция, снаружи — гипербола, а знак числителя $B$ решает всё. Технически это делается так: в числителе искусственно «собирают» знаменатель, а остаток оставляют константой.
Примеры с разбором
Пример 1 (простой): найди промежутки монотонности функции $f(x) = \dfrac{x+1}{x-2}$
Решение:
Шаг 1. Область определения: $x \neq 2$, то есть $D(f) = (-\infty; 2) \cup (2; +\infty)$. Уже видим два промежутка — значит финальный ответ будет в формулировке «на каждом из».
Шаг 2. Выделим целую часть. Прибавим и вычтем нужное в числителе, чтобы «собрать» знаменатель:
$$\frac{x+1}{x-2} = \frac{(x-2) + 3}{x-2} = \frac{x-2}{x-2} + \frac{3}{x-2} = 1 + \frac{3}{x-2}$$Шаг 3. Разберём получившееся по слоям. Внутри — $u = x - 2$, возрастает. Дальше $\dfrac{3}{u}$ — гипербола с положительным числителем, убывает на каждом из промежутков. Прибавление единицы вообще не влияет на монотонность — это просто сдвиг графика вверх.
Шаг 4. Возрастающая внутри, убывающая снаружи — итог убывающий.
Ответ: функция убывает на $(-\infty; 2)$ и убывает на $(2; +\infty)$ — на каждом промежутке отдельно.
Проверим наш ответ: $f(0) = \dfrac{1}{-2} = -0{,}5$, $f(1) = \dfrac{2}{-1} = -2$. Действительно, $0 < 1$, а $-0{,}5 > -2$ — убывает ✅ А вот пара с разных сторон от разрыва: $f(1) = -2$, $f(3) = 4$ — «выросла», что ещё раз подтверждает: объединять промежутки нельзя.
Пример 2 (средний): докажи, что $f(x) = \dfrac{x^2}{x^2+1}$ возрастает на $[0; +\infty)$
Эта функция — типичный «сжиматель» значений в интервал $(0; 1)$: похожие формулы используют, чтобы превратить неограниченную величину (расстояние, счётчик, длину текста) в ограниченный признак.
Решение:
Шаг 1. Область определения: знаменатель $x^2 + 1 \geq 1$ никогда не равен нулю, значит $D(f) = \mathbb{R}$.
Шаг 2. Выделим целую часть:
$$\frac{x^2}{x^2+1} = \frac{(x^2+1) - 1}{x^2+1} = 1 - \frac{1}{x^2+1}$$Шаг 3. Разбираем по слоям на промежутке $[0; +\infty)$:
- $u = x^2$ возрастает
- $u + 1$ возрастает (сдвиг ничего не меняет)
- $\dfrac{1}{u+1}$ — гипербола на положительных значениях, убывает (первый переворот)
- знак минус перед дробью — второй переворот
Шаг 4. Два переворота дают возрастание.
Ответ: функция возрастает на $[0; +\infty)$.
Проверим наш ответ:
$$f(0) = 0, \quad f(1) = \frac{1}{2} = 0{,}5, \quad f(2) = \frac{4}{5} = 0{,}8, \quad f(10) = \frac{100}{101} \approx 0{,}990$$Растёт и при этом никогда не достигает единицы ✅ Множество значений на этой полуоси — $[0; 1)$, что и делает такое преобразование удобным способом «упаковать» бесконечный диапазон в отрезок.
Пример 3 (сложный): что больше — $\dfrac{10^{100}+1}{10^{100}+2}$ или $\dfrac{10^{100}+2}{10^{100}+3}$?
В лоб такое не считается: числа астрономические, и калькулятор просто округлит обе дроби до единицы.
Решение:
Шаг 1. Заметим общую структуру. Обозначим $t = 10^{100}$ и рассмотрим функцию
$$g(t) = \frac{t+1}{t+2}$$Тогда первая дробь — это $g(t)$, а вторая — это $g(t+1)$ (подставь $t+1$ вместо $t$ и проверь: $\frac{(t+1)+1}{(t+1)+2} = \frac{t+2}{t+3}$ ✅).
Шаг 2. Раз обе дроби — значения одной функции в двух точках, задача свелась к вопросу о монотонности $g$.
Шаг 3. Выделим целую часть:
$$g(t) = \frac{(t+2) - 1}{t+2} = 1 - \frac{1}{t+2}$$Шаг 4. На положительных $t$ разбираем слои: $t + 2$ возрастает, $\dfrac{1}{t+2}$ убывает (первый переворот), минус перед дробью — второй переворот. Итог: $g$ возрастает.
Шаг 5. Раз $g$ возрастает и $t < t + 1$, то $g(t) < g(t+1)$.
Ответ: вторая дробь больше: $\dfrac{10^{100}+1}{10^{100}+2} < \dfrac{10^{100}+2}{10^{100}+3}$.
Проверим наш ответ на маленьких числах (монотонность-то работает при любом $t > 0$): при $t = 1$ получаем $\dfrac{2}{3} \approx 0{,}667$ и $\dfrac{3}{4} = 0{,}75$. Действительно, вторая больше ✅
Мораль: свести сравнение двух чисел к монотонности одной функции — стандартный ход. Он позволяет сравнивать величины, которые невозможно вычислить напрямую, и именно так работают многие оценки в вычислительной математике.
Почему это важно
Умение мгновенно называть монотонность базовой функции — это то, что отличает уверенное решение от медленного. На экзамене шаги «$\log_{0{,}5}$ убывает, значит знак переворачивается» должны занимать секунду, а не минуту размышлений. Но дело не только в скорости.
В прикладной работе справочник монотонности используется как чек-лист безопасности преобразований. Собираешься прологарифмировать признак — логарифм возрастает, значит ранжирование не пострадает, деревья ничего не заметят. Собираешься возвести признак в квадрат — стоп, это немонотонно на всей прямой, и если в данных есть отрицательные значения, объекты «слева» и «справа» от нуля склеятся, а модель потеряет способность их различать. Взять модуль — та же проблема. Взять $1/x$ — монотонно, но осторожно: на разных сторонах от нуля порядок ведёт себя по-разному, а при значениях, близких к нулю, признак взорвётся. Одна таблица монотонности предотвращает целый класс ошибок в feature engineering.
Забегая вперёд: производная
Все три инструмента выше требуют сообразительности: увидеть формулу сокращённого умножения, разложить на слои, выделить целую часть. Это нормально и полезно — так тренируется алгебраическая техника. Но справедливости ради стоит сказать: существует механический метод, который решает задачу «найди промежутки монотонности» почти без размышлений, одинаковым способом для любой функции.
Идея у него такая. Представь, что ты едешь на машине и смотришь только на спидометр со знаком: положительное число — движешься вперёд, отрицательное — сдаёшь назад. Не глядя на дорогу, только по спидометру, ты можешь точно сказать, на каких участках маршрута координата росла, а на каких падала. Для функции роль такого «спидометра со знаком» играет производная — величина, показывающая мгновенную скорость изменения функции. Где эта скорость положительна, функция растёт; где отрицательна — падает. Всё исследование превращается в шаблон: найти производную, найти её нули, расставить знаки на промежутках, выписать ответ.
Производную мы вводить пока не будем — она появится в уроке 133, а полноценное исследование монотонности с её помощью, вместе с алгоритмом и разбором задач, ждёт тебя в уроке 140 «Возрастание и убывание функции». Там же разбираются тонкости, которые с наскока неочевидны: например, что обнуление производной в отдельной точке строгой монотонности не мешает — функция $y = x^3$ строго возрастает, хотя её «спидометр» в нуле на мгновение показывает ноль.
Пока же держи в голове главное: производная — это удобный инструмент, а не определение. Первично именно то определение, которое мы разобрали сегодня, — через пары точек и неравенства. Оно работает всегда: и для функций с изломами, и для последовательностей, и для «функций», заданных массивом чисел в памяти компьютера, у которых никакой производной попросту нет. Не случайно все инструменты этого урока переносятся в код напрямую, а исследование через производную требует символьных вычислений.
И маленький мостик в машинное обучение, чтобы понимать, зачем это всё дальше пригодится: градиентный спуск — главный алгоритм обучения нейросетей — устроен ровно как «шагни туда, куда указывает убывание функции потерь». То есть связка «знак скорости изменения — направление монотонности» лежит в самом сердце обучения моделей. К уроку 140 ты придёшь уже с готовой интуицией, а сегодняшние методы останутся с тобой как фундамент, на котором эта интуиция стоит.
Монотонность и порядок: сигмоида, ранговые метрики, калибровка
Интуиция
Вернёмся к главной формулировке: монотонная функция сохраняет порядок. Это простое утверждение оказывается едва ли не самым практически ценным свойством во всём машинном обучении, и вот почему.
Огромное количество ML-задач по сути своей — задачи ранжирования, а не задачи точного предсказания числа. Какие письма поставить наверх в почте? Какие товары показать первыми? Кому из клиентов позвонить в первую очередь? Во всех этих задачах важен порядок объектов, а не абсолютные значения скоров. И если преобразование сохраняет порядок, то с точки зрения задачи ранжирования оно вообще ничего не меняет — какое бы страшное оно ни было.
Определение: Преобразование $T$ называется сохраняющим порядок (строго монотонно возрастающим), если из $a < b$ следует $T(a) < T(b)$ для любых $a, b$ из области определения. Метрика называется ранговой, если её значение зависит только от порядка объектов, а не от конкретных значений скоров.
Ранговые метрики: AUC-ROC, корреляция Спирмена, Kendall's tau, NDCG, Precision@k. Все они инвариантны к строго возрастающим преобразованиям скоров. Не ранговые: MSE, MAE, log-loss, Brier score — им абсолютные значения важны.
Примеры с разбором
Пример 1 (простой): порог по вероятности и порог по логиту
Модель бинарной классификации выдаёт логит $z$, из которого вероятность получается сигмоидой $p = \sigma(z) = \dfrac{1}{1 + e^{-z}}$. Ты хочешь ставить метку «положительный класс», если $p > 0{,}8$. Какому порогу по логиту это соответствует?
Решение:
Шаг 1. Сначала докажем, что сигмоида возрастает — разложим её на слои:
- $u = -z$ — переворот, убывает
- $v = e^{u}$ — возрастает по $u$, порядок сохраняет
- $w = 1 + v$ — сдвиг, порядок сохраняет
- $y = \dfrac{1}{w}$ — на положительных $w$ убывает, второй переворот
Два переворота — сигмоида строго возрастает по $z$.
Шаг 2. Раз функция возрастающая, неравенство $p > 0{,}8$ равносильно неравенству $z > z_0$, где $z_0$ — тот логит, которому отвечает вероятность $0{,}8$. Знак неравенства не переворачивается именно потому, что функция возрастает.
Шаг 3. Найдём $z_0$ из уравнения $\dfrac{1}{1+e^{-z_0}} = 0{,}8$:
$$1 + e^{-z_0} = \frac{1}{0{,}8} = 1{,}25 \implies e^{-z_0} = 0{,}25$$Шаг 4. Логарифмируем:
$$-z_0 = \ln 0{,}25 \implies z_0 = \ln 4 \approx 1{,}386$$Ответ: порог $p > 0{,}8$ по вероятности — это ровно порог $z > 1{,}386$ по логиту.
Проверим наш ответ: $\sigma(1{,}386) = \dfrac{1}{1 + e^{-1{,}386}} = \dfrac{1}{1 + 0{,}25} = 0{,}8$ ✅
Что из этого следует практически: раз сигмоида монотонна, ты можешь считать AUC хоть по логитам, хоть по вероятностям — результат будет побайтово одинаковым. И наоборот: если тебе нужно только ранжирование, применять сигмоиду вообще не обязательно, это лишняя операция.
Пример 2 (средний): монотонное преобразование признака и AUC
Модель выдала скоры для четырёх объектов. Посчитай AUC до и после логарифмирования скоров.
| Объект | Скор $s$ | Истинная метка |
|---|---|---|
| A | 0.9 | 1 |
| B | 0.6 | 0 |
| C | 0.4 | 1 |
| D | 0.1 | 0 |
Решение:
Шаг 1. Вспомним смысл AUC: это доля пар «положительный–отрицательный», в которых модель дала положительному объекту больший скор. Формально — вероятность того, что случайно взятый позитив получит скор выше случайно взятого негатива.
Шаг 2. Выпишем все пары. Позитивы: A (0.9), C (0.4). Негативы: B (0.6), D (0.1). Всего пар: $2 \times 2 = 4$.
- (A, B): $0{,}9 > 0{,}6$ ✅
- (A, D): $0{,}9 > 0{,}1$ ✅
- (C, B): $0{,}4 > 0{,}6$ ❌
- (C, D): $0{,}4 > 0{,}1$ ✅
Шаг 3. AUC $= \dfrac{3}{4} = 0{,}75$.
Шаг 4. Теперь применим логарифм — строго возрастающую функцию:
$$\ln 0{,}9 \approx -0{,}105, \quad \ln 0{,}6 \approx -0{,}511, \quad \ln 0{,}4 \approx -0{,}916, \quad \ln 0{,}1 \approx -2{,}303$$Шаг 5. Проверим порядок: было $0{,}9 > 0{,}6 > 0{,}4 > 0{,}1$, стало $-0{,}105 > -0{,}511 > -0{,}916 > -2{,}303$. Порядок тот же самый, хотя все числа изменились до неузнаваемости и даже сменили знак.
Шаг 6. Раз порядок не изменился, каждое из четырёх сравнений даст тот же результат, и AUC останется $0{,}75$.
Ответ: AUC до преобразования $= 0{,}75$, после $= 0{,}75$. Не изменилась.
📌 Это и есть математическая причина известного практического факта: нормализация, стандартизация и логарифмирование признаков не влияют на качество деревьев и на ранговые метрики. Дерево делает сплит по условию «признак $<$ порога» — а монотонное преобразование просто переносит порог в новое место, оставляя разбиение объектов идентичным.
Пример 3 (сложный): изотоническая регрессия и алгоритм PAV
Ты откалибровал классификатор и разбил объекты на 5 бинов по возрастанию предсказанной вероятности. Реальная доля позитивов в бинах получилась такой:
$$0{,}05; \quad 0{,}30; \quad 0{,}22; \quad 0{,}55; \quad 0{,}60$$Задача калибровки требует, чтобы эта последовательность была неубывающей (больше предсказанная вероятность — больше реальная доля позитивов). Приведи её к монотонному виду алгоритмом PAV.
Решение:
Шаг 1. Найдём нарушение монотонности — пару соседей, где следующий меньше предыдущего:
$$0{,}05 \leq 0{,}30, \quad \textbf{0,30} > \textbf{0,22} \;\;❌, \quad 0{,}22 \leq 0{,}55, \quad 0{,}55 \leq 0{,}60$$Нарушитель ровно один: пара $(0{,}30;\ 0{,}22)$.
Шаг 2. Суть алгоритма PAV (Pool Adjacent Violators): нарушителей объединяют в блок и заменяют их общим средним. Считаем среднее (бины у нас одинакового размера, поэтому веса равны):
$$\frac{0{,}30 + 0{,}22}{2} = \frac{0{,}52}{2} = 0{,}26$$Шаг 3. Подставим блок обратно:
$$0{,}05; \quad 0{,}26; \quad 0{,}26; \quad 0{,}55; \quad 0{,}60$$Шаг 4. Проверим монотонность заново — алгоритм итеративный, после объединения может вылезти новое нарушение слева:
$$0{,}05 \leq 0{,}26 \leq 0{,}26 \leq 0{,}55 \leq 0{,}60$$Все неравенства выполнены, новых нарушений нет — алгоритм останавливается.
Ответ: откалиброванная последовательность $0{,}05;\ 0{,}26;\ 0{,}26;\ 0{,}55;\ 0{,}60$ — она неубывающая.
Важное замечание: результат PAV — именно неубывающая (нестрого монотонная) функция: два соседних бина получили одинаковое значение. Это плата за исправление: там, где данные противоречили монотонности, алгоритм «склеивает» бины в плато. И именно поэтому изотоническая калибровка выдаёт ступенчатую кусочно-постоянную функцию, а не гладкую кривую, как у калибровки Платта (которая натягивает сигмоиду и всегда строго монотонна).
Ещё одно свойство, за которое PAV любят: он выдаёт наилучшее приближение в смысле суммы квадратов отклонений среди всех неубывающих последовательностей. То есть это не эвристика, а точное решение задачи оптимизации с ограничением монотонности.
Почему это важно
Понимание «что сохраняет порядок, а что нет» экономит часы отладки. Классическая сцена: человек перебирает нормализации признаков, гоняя градиентный бустинг, и удивляется, почему AUC не двигается ни на тысячную. Ответ: он перебирает монотонные преобразования, а бустинг на деревьях к ним нечувствителен по построению — время потрачено впустую. Тот же перебор для линейной модели с L2-регуляризацией или для kNN, наоборот, даст ощутимый эффект, потому что там масштаб признака влияет на расстояние и на штраф.
Обратная сторона — калибровка. Если тебе нужна не только «правильная сортировка», но и честная вероятность (например, чтобы умножить её на сумму сделки и получить ожидаемый доход), то монотонное преобразование внезапно становится критически важным: оно не меняет AUC, но полностью меняет log-loss и Brier score. Изотоническая регрессия и калибровка Платта — это как раз про то, чтобы найти монотонное преобразование, сохраняющее ранжирование модели, но исправляющее абсолютные значения. Одно свойство — монотонность — держит на себе обе стороны этой конструкции.
Монотонность как оружие: уравнения, неравенства, единственность корня
Интуиция
Есть отдельный класс задач, где монотонность работает не как объект исследования, а как инструмент доказательства. Логика тут элементарная: строго монотонная функция принимает каждое своё значение не более одного раза. Значит, если ты нашёл один корень уравнения $f(x) = c$ и доказал строгую монотонность $f$, — всё, других корней нет, задача закрыта.
Это чрезвычайно мощный аргумент. Уравнение $x^5 + x = 2$ ни при каком старании не решается «в лоб» формулами, но корень $x = 1$ виден невооружённым глазом, а монотонность гарантирует, что он единственный.
Второй сюжет — неравенства. Если применить к обеим частям неравенства возрастающую функцию, знак сохранится. Если убывающую — знак перевернётся. Это ровно то правило, из-за которого при решении логарифмических неравенств с основанием меньше единицы знак меняется на противоположный.
Утверждение: Если $f$ строго монотонна на $X$, то уравнение $f(x) = c$ имеет на $X$ не более одного корня. Если при этом $f$ непрерывна и на концах промежутка принимает значения по разные стороны от $c$, корень существует ровно один.
Примеры с разбором
Пример 1 (простой): реши уравнение $x^5 + x = 2$
Решение:
Шаг 1. Подберём корень. При $x = 1$: $1^5 + 1 = 2$ ✅ Корень найден.
Шаг 2. Докажем, что он единственный. Обозначим $f(x) = x^5 + x$ и посмотрим на слагаемые:
- $x^5$ — степенная функция с нечётным показателем, возрастает на всей прямой
- $x$ — линейная функция с положительным коэффициентом, возрастает
Шаг 3. По свойству суммы (сумма возрастающих функций возрастает) $f$ строго возрастает на $\mathbb{R}$.
Шаг 4. Строго возрастающая функция принимает значение $2$ ровно один раз, а мы уже знаем, где именно.
Ответ: $x = 1$ — единственный корень.
Пример 2 (средний): реши неравенство $\log_{0{,}5}(x) > \log_{0{,}5}(3x - 4)$
Решение:
Шаг 1. Сначала — область допустимых значений, без неё ответ почти наверняка будет неверным:
$$x > 0 \quad \text{и} \quad 3x - 4 > 0 \implies x > \frac{4}{3}$$Пересечение: $x > \dfrac{4}{3}$.
Шаг 2. Основание логарифма $0{,}5 < 1$, значит функция $\log_{0{,}5}(t)$ убывает. При переходе от значений функции к аргументам знак неравенства переворачивается:
$$\log_{0{,}5}(x) > \log_{0{,}5}(3x-4) \iff x < 3x - 4$$Шаг 3. Решаем полученное линейное неравенство:
$$x < 3x - 4 \implies 4 < 2x \implies x > 2$$Шаг 4. Пересечём с ОДЗ: $x > 2$ и $x > \dfrac{4}{3}$ дают $x > 2$.
Ответ: $x \in (2; +\infty)$
Проверим наш ответ: возьмём $x = 4$. Слева $\log_{0{,}5} 4 = -2$, справа $\log_{0{,}5} 8 = -3$. Действительно, $-2 > -3$ ✅ А теперь $x = 1{,}5$ (не входит в ответ, но входит в ОДЗ): слева $\log_{0{,}5} 1{,}5 \approx -0{,}585$, справа $\log_{0{,}5} 0{,}5 = 1$. Получается $-0{,}585 > 1$ — ложь ✅ Ответ подтверждается с обеих сторон.
Пример 3 (сложный): бинарный поиск порога по монотонности
У тебя есть обученный классификатор. Функция $R(t)$ — recall (полнота) при пороге $t \in [0; 1]$. Нужно найти порог, при котором recall равен ровно $0{,}90$. Как гарантировать, что бинарный поиск сработает?
Решение:
Шаг 1. Разберёмся, как устроен recall как функция порога. Recall $= \dfrac{TP}{TP + FN}$ — доля пойманных позитивов. Чем выше порог, тем меньше объектов модель называет позитивными, тем меньше $TP$, тем ниже recall.
Шаг 2. Докажем монотонность строго. Пусть $t_1 < t_2$. Множество объектов со скором $\geq t_2$ является подмножеством множества объектов со скором $\geq t_1$ (если скор перевалил больший порог, он тем более перевалил меньший). Значит $TP(t_2) \leq TP(t_1)$, а общее число позитивов $TP + FN$ от порога не зависит вообще — это константа, свойство датасета.
Шаг 3. Отсюда $R(t_2) \leq R(t_1)$: функция $R$ невозрастающая на $[0; 1]$. Обрати внимание — именно невозрастающая, не строго убывающая: если между двумя порогами не оказалось ни одного объекта, recall не изменится, будет плато.
Шаг 4. Что даёт монотонность для алгоритма. Предикат «$R(t) \geq 0{,}90$» истинен на начальном отрезке $[0; t^*]$ и ложен дальше — то есть он тоже монотонен по $t$. А монотонный предикат — это ровно то условие, при котором применим бинарный поиск: на каждом шаге сравнение $R(t_{\text{середина}})$ с $0{,}90$ позволяет уверенно отбросить ровно половину отрезка.
Шаг 5. Оценим скорость. Каждый шаг делит длину отрезка пополам, значит для точности $\varepsilon$ нужно примерно $\log_2 \dfrac{1}{\varepsilon}$ шагов. Для $\varepsilon = 10^{-3}$ это $\approx 10$ итераций вместо перебора тысячи порогов.
Ответ: бинарный поиск корректен, потому что $R(t)$ невозрастающая, а значит предикат «recall не ниже цели» монотонен по порогу; требуется около $\log_2(1/\varepsilon)$ итераций. Из-за плато найденный порог может быть не единственным — обычно берут наибольший $t$, при котором цель ещё достигается.
Что важно понимать: precision, в отличие от recall, монотонной по порогу не является — она скачет, особенно на маленьких выборках у высоких порогов. Поэтому бинарным поиском по precision пользоваться нельзя, только полным перебором по сетке. Это распространённая ошибка в самописных утилитах подбора порога.
Почему это важно
Аргумент «функция монотонна, значит корень единственный» — не школьный трюк, а один из базовых кирпичиков вычислительной математики. Метод бисекции, поиск температуры для калибровки softmax, подбор коэффициента в квантильной регрессии, поиск порога по нужному уровню полноты — всё это опирается на монотонность целевой функции. Ровно поэтому в документации к оптимизаторам всегда пишут «функция должна быть монотонной / унимодальной на отрезке»: без этого гарантии сходимости просто нет, и алгоритм может сойтись к чему угодно.
Практика: 30 заданий
Базовые (задания 1-10)
Задание 1: Докажи по определению, что функция $f(x) = 3x + 7$ возрастает на $\mathbb{R}$.
Задание 2: Возрастает или убывает функция $f(x) = -5x + 2$? Обоснуй.
Задание 3: Найди промежутки монотонности функции $f(x) = x^2$ и докажи ответ по определению.
Задание 4: Верно ли утверждение: «Функция $f(x) = \dfrac{1}{x}$ убывает на своей области определения»?
Задание 5: Докажи по определению, что $f(x) = \dfrac{1}{x^2}$ убывает на $(0; +\infty)$.
Задание 6: Сравни без вычислений: $2^{1{,}4}$ и $2^{1{,}5}$.
Задание 7: Сравни $\log_2 5$ и $\log_2 7$.
Задание 8: Сравни $\log_{0{,}5} 3$ и $\log_{0{,}5} 5$.
Задание 9: Докажи по определению, что $f(x) = \sqrt{x}$ возрастает на $[0; +\infty)$.
Задание 10: Значения loss по эпохам обучения: $2{,}30;\ 1{,}85;\ 1{,}60;\ 1{,}62;\ 1{,}41$. Является ли эта последовательность строго убывающей? Является ли невозрастающей?
Средние (задания 11-20)
Задание 11: Функция потерь одномерной модели: $L(w) = (w - 3)^2 + 1$. Найди промежутки монотонности и определи, в какую сторону нужно двигать $w$ из точки $w_0 = 0$, чтобы loss падал.
Задание 12: Найди промежутки монотонности функции $f(x) = x^3 - 3x$, доказав ответ через разность.
Задание 13: Исследуй на монотонность функцию $f(x) = \sqrt{4 - x^2}$.
Задание 14: Исследуй на монотонность функцию $f(x) = \dfrac{x}{x+1}$.
Задание 15: Линейная модель предсказывает $\hat{y} = w x + b$ по одному признаку $x$. При каких $w$ предсказание монотонно убывает по признаку? Что это значит содержательно?
Задание 16: При каких значениях параметра $a$ функция $f(x) = x^3 + ax$ возрастает на всей числовой прямой?
Задание 17: Докажи, что сигмоида $\sigma(x) = \dfrac{1}{1 + e^{-x}}$ строго возрастает, и сравни $\sigma(-1)$ и $\sigma(0{,}5)$ без калькулятора.
Задание 18: Модель выдала скоры $(0{,}10;\ 0{,}40;\ 0{,}35;\ 0{,}80)$ для объектов с метками $(0;\ 1;\ 1;\ 0)$. Посчитай AUC. Как она изменится после преобразования $s \mapsto s^3$? А после $s \mapsto (s - 0{,}45)^2$?
Задание 19: Докажи, что сумма двух возрастающих функций возрастает. Верно ли аналогичное утверждение для произведения?
Задание 20: Реши неравенство $\left(\dfrac{1}{3}\right)^{x} > \left(\dfrac{1}{3}\right)^{2x-1}$.
Продвинутые (задания 21-30)
Задание 21: При каких значениях $a$ функция $f(x) = \dfrac{ax + 1}{x + 2}$ убывает на каждом из промежутков своей области определения?
Задание 22: Докажи, что функция $f(x) = \sqrt{x+1} - \sqrt{x}$ убывает на $[0; +\infty)$.
Задание 23: Сравни без калькулятора: $\sqrt[3]{7}$ и $\sqrt{3}$.
Задание 24: Реши уравнение $x^3 + x = 10$.
Задание 25: Реши уравнение $2^x + x = 3$.
Задание 26: При каких значениях $a$ функция $f(x) = \left(\dfrac{1}{2}\right)^{ax + 3}$ возрастает на $\mathbb{R}$?
Задание 27: Логиты модели: $z = (2{,}0;\ 1{,}0;\ 0{,}1)$. Посчитай softmax при температуре $T = 1$ и при $T = 2$ (то есть для логитов $z/T$). Изменится ли предсказанный класс? Почему?
Задание 28: Доли позитивов по бинам калибровочной кривой: $0{,}10;\ 0{,}40;\ 0{,}30;\ 0{,}70$. Приведи их к неубывающему виду алгоритмом PAV (бины одинакового размера).
Задание 29: Расписание learning rate: $\eta(t) = \dfrac{\eta_0}{1 + kt}$, где $\eta_0 > 0$, $k > 0$, $t \geq 0$. Докажи строгое убывание и найди $k$, при котором за 100 шагов шаг обучения упадёт ровно в 10 раз.
Задание 30: Отладка кода. Найди ошибку и исправь её.
import numpy as np
xs = np.linspace(-5, 5, 11)
ys = 1 / xs
# проверяем, что 1/x убывает
print(np.all(np.diff(ys) < 0))
# ожидали True, получили False (и RuntimeWarning: divide by zero)
Частые ошибки
❌ Ошибка 1: объединяют промежутки монотонности знаком $\cup$
Неправильно: писать «функция $y = \dfrac{1}{x}$ убывает на $(-\infty; 0) \cup (0; +\infty)$».
Правильно: «функция убывает на $(-\infty; 0)$ и на $(0; +\infty)$» — на каждом промежутке отдельно. Контрпример к объединению: $-1 < 1$, но $f(-1) = -1 < 1 = f(1)$ — значение выросло.
💡 Почему важно: от этого напрямую зависит решение неравенств. Из $\frac{1}{x} > \frac{1}{3}$ «переворотом» получается $x < 3$, что включает все отрицательные числа — а они решениями не являются. Верный ответ: $x \in (0; 3)$.
❌ Ошибка 2: проверяют монотонность на нескольких точках вместо произвольной пары
Неправильно: подставить $x = 1, 2, 3$, увидеть рост значений и объявить функцию возрастающей.
Правильно: определение требует выполнения условия для любой пары $x_1 < x_2$, а не для выбранных. Контрпример: у функции $f(x) = x^3 - 30x$ значения в точках $1, 2, 3$ равны $-29$, $-52$, $-63$ — «убывает», а на $[4; 6]$ она уже растёт ($f(4) = -56$, $f(6) = 36$).
💡 Почему важно: это ровно тот способ, которым в код проникают неверные допущения. Проверка монотонности по нескольким точкам сетки ничего не доказывает — между узлами сетки функция может делать что угодно, и подобранный на такой «проверке» бинарный поиск сойдётся не туда.
❌ Ошибка 3: путают строгую и нестрогую монотонность
Неправильно: называть константу $f(x) = 5$ «возрастающей, только очень медленно», а неубывающую ступенчатую функцию — «возрастающей».
Правильно: возрастание требует строгого неравенства $f(x_1) < f(x_2)$. Константа неубывающая и невозрастающая одновременно, но не возрастающая и не убывающая.
💡 Почему важно: от строгости зависит обратимость. Строго монотонная функция имеет обратную, нестрого монотонная — нет. Именно поэтому изотоническая регрессия (выдающая неубывающую ступенчатую функцию с плато) необратима, и восстановить исходный скор по откалиброванной вероятности невозможно.
❌ Ошибка 4: говорят «функция возрастает в точке»
Неправильно: формулировка «в точке $x = 2$ функция возрастает».
Правильно: монотонность определена только на множестве, содержащем хотя бы две точки — определение требует пары $x_1 < x_2$. Корректно: «функция возрастает на промежутке, содержащем точку $x = 2$».
💡 Почему важно: «локальная» интуиция про рост в точке обманчива, и в уроке 140 ты увидишь, что даже мгновенная скорость роста в одной точке ещё не гарантирует возрастания в её окрестности. Привычка формулировать монотонность через промежуток избавляет от целого класса неверных выводов.
❌ Ошибка 5: забывают перевернуть знак при убывающей функции
Неправильно: из $\log_{0{,}5} x > \log_{0{,}5} 8$ получать $x > 8$.
Правильно: основание $0{,}5 < 1$, логарифм убывает, знак переворачивается: $x < 8$. Плюс обязательное ОДЗ $x > 0$. Итог: $x \in (0; 8)$.
💡 Почему важно: это самая массовая ошибка в показательных и логарифмических неравенствах на экзаменах. Простое правило-страховка: перед решением спроси себя «функция растёт или падает?» — и подставь одно число для проверки финального ответа.
❌ Ошибка 6: считают, что произведение возрастающих функций возрастает
Неправильно: «$f$ возрастает и $g$ возрастает, значит $fg$ возрастает».
Правильно: для суммы — верно всегда, для произведения — только если обе функции ещё и положительны на рассматриваемом промежутке. Контрпример: $f(x) = g(x) = x$ возрастают на $\mathbb{R}$, а $fg = x^2$ на $(-\infty; 0]$ убывает.
💡 Почему важно: отсюда растёт понимание, почему аддитивные модели (линейные, GAM) легко сделать монотонными по признаку, а модели с взаимодействиями признаков (произведениями) — нет. И почему monotone_constraints в бустинге реализуются именно как ограничения на структуру дерева, а не как простая проверка знаков.
Главное запомнить
✅ Возрастающая функция: из $x_1 < x_2$ следует $f(x_1) < f(x_2)$. Убывающая: из $x_1 < x_2$ следует $f(x_1) > f(x_2)$. Монотонность — это про сохранение или переворот порядка.
✅ Монотонность — свойство множества, а не точки: нужна пара точек, поэтому «возрастает в точке» — некорректная формулировка, а проверка на нескольких числах не является доказательством.
✅ Строгая монотонность ($<$) даёт обратимость функции; нестрогая ($\leq$, «неубывающая») допускает плато и обратимости не даёт.
✅ Промежутки монотонности никогда не объединяют знаком $\cup$: $1/x$ убывает на $(-\infty;0)$ и на $(0;+\infty)$, но не на объединении.
✅ Инструмент 1 — знак разности: вынеси множитель $(x_2 - x_1) > 0$ и исследуй оставшийся хвост. Помогают формулы разности квадратов, кубов и домножение на сопряжённое.
✅ Инструмент 2 — композиция: считай перевороты. Чётное число переворотов — возрастание, нечётное — убывание. Внутренний слой должен быть монотонен на рассматриваемом промежутке.
✅ Инструмент 3 — справочник и целая часть: $a^x$ и $\log_a x$ растут при $a>1$ и падают при $0
✅ Сумма возрастающих возрастает всегда; произведение — только для положительных функций. Умножение на $-1$ всегда переворачивает монотонность. ✅ Строго монотонная функция принимает каждое значение не более одного раза — отсюда бесплатный аргумент «корень единственный» в уравнениях типа $x^3 + x = 10$. Применение возрастающей функции к обеим частям неравенства знак сохраняет, убывающей — переворачивает. ✅ В ML монотонность = сохранение порядка: сигмоида и softmax с температурой не меняют ранжирование, поэтому AUC и другие ранговые метрики инвариантны к монотонным преобразованиям, а log-loss и калибровка — нет. Что было раньше: чётность и нечётность (урок 85) и периодичность (урок 86) — это, как и монотонность, свойства функции «в целом», описывающие её поведение на множестве, а не в точке. Из урока про степенную функцию (81) ты уже знаешь, что $x^3$ возрастает всюду, а $x^2$ имеет разворот в нуле — теперь эти факты получили строгое доказательство. Показательная и логарифмическая функции, которыми мы активно пользовались, подробно разбираются в уроках 111–119. Что дальше: следующий урок — экстремумы функций — прямое продолжение. Точка экстремума по определению есть точка, где монотонность меняет направление: возрастание сменяется убыванием (максимум) или наоборот (минимум). Без умения находить промежутки монотонности искать экстремумы невозможно. В уроке 133 появится производная, а в уроке 140 «Возрастание и убывание функции» та же самая тема монотонности будет разобрана заново — но уже механическим методом, через знак производной. Дальше по курсу: наибольшее и наименьшее значение функции (142), выпуклость и точки перегиба (143), построение графиков (144), где всё собирается вместе. Где это применяется в жизни и в ML/данных: 📊 В машинном обучении: монотонность активаций (сигмоида, tanh, ReLU, softplus) обеспечивает сохранение порядка сигнала; монотонные ограничения 📈 В метриках и калибровке: AUC-ROC, корреляция Спирмена, Kendall's tau, NDCG инвариантны к строго монотонным преобразованиям скоров; изотоническая регрессия (алгоритм PAV) и калибровка Платта исправляют вероятности, сохраняя ранжирование. 🔧 В оптимизации и алгоритмах: бинарный поиск работает только по монотонному предикату; метод бисекции и подбор порога по recall опираются на монотонность; расписания learning rate строятся как явно убывающие функции. 📉 В экономике и жизни: кривая спроса убывает по цене, сложный процент растёт монотонно по времени, а «монотонность полезности по количеству блага» — базовая аксиома микроэкономики. 💡 Монотонность автоматически даёт «приличное» поведение. В 1904 году Анри Лебег доказал, что монотонная функция не может быть слишком дикой: у неё не более чем счётное число точек разрыва, и все они — простые скачки. Сравни это с функцией Вейерштрасса, у которой график непрерывен, но изломан в каждой точке. Стоит потребовать всего лишь сохранения порядка — и такие патологии становятся невозможны. Скромное требование оказывается очень сильным. 💡 AUC — это переодетая статистика Манна–Уитни 1947 года. Формулу «доля пар, где позитив выше негатива» статистики Манн и Уитни придумали за десятилетия до машинного обучения, для непараметрического сравнения двух выборок. Их критерий строился именно на рангах, чтобы не зависеть от вида распределения — и как раз поэтому современная AUC инвариантна к монотонным преобразованиям скоров. ML-инженеры пользуются ранговым критерием из середины XX века, часто об этом не подозревая. 💡 PAV пролежал на полке 47 лет. Алгоритм Pool Adjacent Violators опубликован в 1955 году как чисто статистический инструмент оценивания при ограничении монотонности. В машинное обучение его принесли Здрозны и Элкан в 2002-м, применив к калибровке наивного байесовского классификатора и деревьев. Сегодня это 💡 Регуляторы требуют монотонности юридически. В кредитном скоринге во многих странах модель обязана быть монотонной по ряду признаков: рост дохода не должен снижать балл, рост числа просрочек не должен его повышать. Это не про качество модели, а про объяснимость и защиту от дискриминации: немонотонную модель невозможно защитить перед клиентом и надзорным органом. Поэтому в TensorFlow Lattice и в бустингах монотонные ограничения — это отдельная, тщательно поддерживаемая функциональность, а не экзотика. 1. Сначала посмотри на разрывы, потом на всё остальное Прежде чем что-либо доказывать, спроси: сколько кусков в области определения? Если знаменатель обнуляется или под корнем ограничение — сразу планируй ответ в формате «на каждом из промежутков». Половина ошибок в этой теме — не в вычислениях, а в том, что человек всё посчитал верно, а промежутки склеил. 2. В разности всегда выноси множитель $(x_2 - x_1)$ Это главный технический приём метода разности: он положителен по построению, поэтому после вынесения остаётся исследовать знак короткого «хвоста». Держи под рукой три формулы: разность квадратов, разность кубов и домножение на сопряжённое для корней. 3. Дробно-линейную функцию всегда «раскладывай в целую часть» Любую $\dfrac{ax+b}{cx+d}$ приводи к виду $A + \dfrac{B}{cx+d}$ — и монотонность становится видна мгновенно: знак $B$ полностью определяет направление. Пример: $\dfrac{x+1}{x-2} = 1 + \dfrac{3}{x-2}$, числитель $3 > 0$, значит убывает на каждом промежутке. 4. Считай перевороты, а не функции Правило знаков для композиции экономит массу времени. $y = \sqrt{\log_{0{,}5}(3-x)}$ выглядит страшно, но разбирается за 15 секунд: $3-x$ убывает (первый переворот), $\log_{0{,}5}$ убывает (второй), корень порядок сохраняет. Два переворота — функция возрастает на своей ОДЗ. 5. Чтобы сравнить корни разных степеней — возведи оба числа в степень НОК $\sqrt[3]{7}$ против $\sqrt{3}$: НОК(3, 2) = 6, возводим оба в шестую степень и получаем $49$ против $27$. Работает потому, что на положительной полуоси степенная функция монотонна и порядок сохраняет. Для отрицательных чисел приём ломается — там сначала выноси знак. 6. Нашёл корень — докажи монотонность, и задача закрыта Если уравнение «смешанное» ($2^x + x = 3$, $\sqrt{x} + x^3 = 2$, $\log_2 x + x = 1$), не пытайся преобразовывать. Подбери корень целыми числами, докажи строгое возрастание левой части (обычно достаточно сослаться на сумму возрастающих) — и единственность корня доказана. Это стандартный ход в задачах ЕГЭ уровня «С». 7. В коде проверяй монотонность через Шаблон: Монотонность выглядит как одно из самых простых определений во всём курсе — буквально «функция сохраняет порядок». Но именно эта простота делает её несущей конструкцией: на ней стоит поиск экстремумов, на ней стоит бинарный поиск, на ней стоят гарантии сходимости оптимизаторов, на ней стоит инвариантность ранговых метрик и вся логика калибровки вероятностей. И заметь: всё это ты сегодня разобрал, пользуясь только школьной алгеброй — разностью, формулами сокращённого умножения и правилом знаков для композиции. Когда в уроке 140 появится производная, она не отменит ни одного из этих рассуждений, а просто добавит быстрый механический способ получать тот же ответ. А в следующем уроке мы разберём, что происходит ровно в тех точках, где монотонность ломается: там живут экстремумы, и именно за ними охотится любой алгоритм оптимизации. Попрактикуйся на задачах и получи персональные рекомендации от AI
Связь с другими темами курса
monotone_constraints в XGBoost/LightGBM/CatBoost и монотонные нейросети дают гарантии для скоринга и регуляторных требований; монотонное убывание loss — базовый критерий здоровья обучения.
Интересные факты
sklearn.isotonic.IsotonicRegression — три строчки кода, за которыми полвека истории.
Лайфхаки и полезные трюки
np.diff, но сначала почисти данныеy = y[np.isfinite(y)], затем np.all(np.diff(y) > 0) для строгого возрастания или >= 0 для неубывания. Обязательно разделяй по промежуткам, если у функции есть разрывы, и помни, что для зашумлённых кривых обучения нужен не строгий критерий, а «убывает скользящее среднее за $k$ шагов».
Понял тему? Закрепи в боте! 🚀