🔴 Сложный ⏱️ 50 минут

Монотонность функций

📋 Содержание урока

Монотонность функций ↗️

Ты обучаешь модель и смотришь на кривую обучения: 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) обеспечивает сохранение порядка сигнала; монотонные ограничения monotone_constraints в XGBoost/LightGBM/CatBoost и монотонные нейросети дают гарантии для скоринга и регуляторных требований; монотонное убывание loss — базовый критерий здоровья обучения.

📈 В метриках и калибровке: AUC-ROC, корреляция Спирмена, Kendall's tau, NDCG инвариантны к строго монотонным преобразованиям скоров; изотоническая регрессия (алгоритм PAV) и калибровка Платта исправляют вероятности, сохраняя ранжирование.

🔧 В оптимизации и алгоритмах: бинарный поиск работает только по монотонному предикату; метод бисекции и подбор порога по recall опираются на монотонность; расписания learning rate строятся как явно убывающие функции.

📉 В экономике и жизни: кривая спроса убывает по цене, сложный процент растёт монотонно по времени, а «монотонность полезности по количеству блага» — базовая аксиома микроэкономики.


Интересные факты

💡 Монотонность автоматически даёт «приличное» поведение. В 1904 году Анри Лебег доказал, что монотонная функция не может быть слишком дикой: у неё не более чем счётное число точек разрыва, и все они — простые скачки. Сравни это с функцией Вейерштрасса, у которой график непрерывен, но изломан в каждой точке. Стоит потребовать всего лишь сохранения порядка — и такие патологии становятся невозможны. Скромное требование оказывается очень сильным.

💡 AUC — это переодетая статистика Манна–Уитни 1947 года. Формулу «доля пар, где позитив выше негатива» статистики Манн и Уитни придумали за десятилетия до машинного обучения, для непараметрического сравнения двух выборок. Их критерий строился именно на рангах, чтобы не зависеть от вида распределения — и как раз поэтому современная AUC инвариантна к монотонным преобразованиям скоров. ML-инженеры пользуются ранговым критерием из середины XX века, часто об этом не подозревая.

💡 PAV пролежал на полке 47 лет. Алгоритм Pool Adjacent Violators опубликован в 1955 году как чисто статистический инструмент оценивания при ограничении монотонности. В машинное обучение его принесли Здрозны и Элкан в 2002-м, применив к калибровке наивного байесовского классификатора и деревьев. Сегодня это sklearn.isotonic.IsotonicRegression — три строчки кода, за которыми полвека истории.

💡 Регуляторы требуют монотонности юридически. В кредитном скоринге во многих странах модель обязана быть монотонной по ряду признаков: рост дохода не должен снижать балл, рост числа просрочек не должен его повышать. Это не про качество модели, а про объяснимость и защиту от дискриминации: немонотонную модель невозможно защитить перед клиентом и надзорным органом. Поэтому в 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. В коде проверяй монотонность через np.diff, но сначала почисти данные

Шаблон: y = y[np.isfinite(y)], затем np.all(np.diff(y) > 0) для строгого возрастания или >= 0 для неубывания. Обязательно разделяй по промежуткам, если у функции есть разрывы, и помни, что для зашумлённых кривых обучения нужен не строгий критерий, а «убывает скользящее среднее за $k$ шагов».


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

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!