Логарифмическая функция 📊
Представь, что ты первый раз открыл настоящий датасет — не учебный, а живой. Столбец «сумма покупки»: половина значений от 200 до 3000 рублей, а где-то в глубине таблицы притаились три строки с суммами 4 800 000, 11 200 000 и 47 000 000. Ты строишь гистограмму — и видишь один гигантский столбик у левого края и три невидимые пылинки где-то у горизонта. Ты обучаешь линейную модель — и она сходит с ума: градиенты от трёх строк-монстров перевешивают сигнал от остальных ста тысяч. Ты пробуешь нормализацию — и она не помогает, потому что среднее и стандартное отклонение сами испорчены хвостом.
А потом ты пишешь одну строчку — X = np.log1p(X) — и всё встаёт на место. Диапазон в 47 миллионов превращается в диапазон от 5 до 17. Гистограмма становится похожа на нормальную колокольчиковую форму. Модель начинает учиться. Это не магия и не «хак от датасаентистов» — это работа конкретной математической функции, у которой есть строгое определение, область определения, график и набор свойств. Логарифмическая функция $y = \log_a x$.
В уроках 116–118 ты разобрался, что такое логарифм как число: $\log_a b$ — это показатель степени, в которую надо возвести $a$, чтобы получить $b$. Ты научился считать $\log_2 8 = 3$, применять свойства произведения и частного, переходить между основаниями. Сейчас мы делаем ровно тот же шаг, который делали с показательной функцией в уроке 111: превращаем операцию в функцию. Аргумент $x$ пробегает все допустимые значения, основание $a$ зафиксировано — и мы изучаем поведение целиком, а не отдельные значения.
И это поведение оказывается на удивление характерным. Логарифмическая функция — единственная из школьных функций, которая одновременно растёт неограниченно и растёт мучительно медленно; которая живёт только на положительной полуоси и падает в бесконечную пропасть у самого нуля; которая превращает умножение в сложение и тем самым спасает нейросети от арифметического обнуления. Разберём её по косточкам: область определения, множество значений, монотонность при разных основаниях, общую точку всех графиков, асимптоту, симметрию с показательной функцией и преобразования графика. И на каждом шаге посмотрим, где это торчит наружу в машинном обучении.
🎯 Ты узнаешь:
- Почему область определения $y = \log_a x$ — строго $x > 0$, а множество значений — вся числовая прямая $\mathbb{R}$, и как это находить для сложных выражений под знаком логарифма
- Как основание $a$ определяет направление монотонности — и как из одной этой монотонности вытекает вся техника сравнения логарифмов, без единой производной
- Почему все графики $y = \log_a x$ проходят через точку $(1; 0)$ и почему прямая $x = 0$ — вертикальная асимптота, к которой график прижимается, но никогда её не касается
- Как график логарифмической функции получается зеркальным отражением показательной относительно прямой $y = x$, и что при этом происходит с областью определения и множеством значений
- Почему логарифмическая шкала укрощает признаки с тяжёлым хвостом, чем
log1pбезопаснееlog, что происходит с log-loss при $p \to 0$ и почему логарифм спасает произведение вероятностей от антипереполнения
История: откуда это взялось?
Шотландский лэрд Джон Непер (John Napier, 1550–1617) двадцать лет своей жизни потратил на вычисление таблиц. Не ради красоты — ради навигаторов и астрономов, которые в те годы вручную перемножали шестизначные числа и теряли на этом дни. В 1614 году он опубликовал «Mirifici Logarithmorum Canonis Descriptio» — «Описание удивительной таблицы логарифмов». Само слово Непер собрал из греческих λόγος («отношение») и ἀριθμός («число»): «число отношений». Практически одновременно и независимо похожие таблицы построил швейцарский часовщик Йост Бюрги, но опубликовал их только в 1620-м и остался в тени.
Важно понять, что Непер изобрёл не функцию, а соответствие между двумя шкалами: одна росла арифметически, вторая — геометрически. Его логарифм даже не имел основания в нашем смысле. Функцией — то есть объектом, у которого есть область определения, график и свойства — логарифм стал только в XVIII веке, и главную роль тут сыграл Леонард Эйлер. В «Introductio in analysin infinitorum» (1748) он впервые системно определил $\log_a x$ как функцию, обратную к показательной $y = a^x$, — то самое определение, которым мы пользуемся до сих пор. Именно Эйлер закрепил обозначение $e$ и связку «показательная ↔ логарифмическая», превратив логарифм из вычислительного трюка в полноценный математический объект.
Дальше история сделала неожиданный поворот. В 1860 году немецкий физик Густав Фехнер, изучая восприятие человека, сформулировал закон: субъективная сила ощущения растёт как логарифм физического стимула. Громкость, яркость, вес — мозг везде работает по логарифмической шкале. Отсюда децибелы, звёздные величины, шкала Рихтера, шкала pH. А в 1948 году Клод Шеннон в работе «A Mathematical Theory of Communication» определил количество информации в сообщении как $-\log_2 p$ — и логарифмическая функция стала фундаментом теории информации. Сегодня, когда ты пишешь criterion = nn.CrossEntropyLoss() в PyTorch, ты запускаешь ровно эту функцию: логарифм вероятности со знаком минус. От таблиц Непера для звёздной навигации до функции потерь для навигации по пространству параметров нейросети — одна и та же кривая.
Блок 1: Паспорт функции $y = \log_a x$
Интуиция: машина, которая работает задом наперёд
Представь, что показательная функция $y = a^x$ — это станок: ты вставляешь показатель степени, а на выходе получаешь результат возведения. Вставил $x = 3$ при $a = 2$ — получил $8$. Вставил $x = -1$ — получил $0{,}5$. Вставил $x = 0$ — получил $1$.
Логарифмическая функция — тот же самый станок, запущенный в обратную сторону. Ты вставляешь результат, а получаешь показатель степени, который к нему привёл. Дал $8$ — получил $3$. Дал $0{,}5$ — получил $-1$. Дал $1$ — получил $0$.
И вот здесь сразу возникает главное ограничение. Станок $y = 2^x$ на выходе выдаёт только положительные числа — это мы подробно разбирали в уроке 111: $2^x > 0$ при любом $x$, никакая степень положительного числа не даст ни нуля, ни отрицательного значения. Значит, если запустить станок задом наперёд, на вход ему можно подавать только то, что он умел выдавать — только положительные числа. Попросить «какую степень двойки надо взять, чтобы получить $-4$» невозможно: такой степени просто не существует. Попросить «какую степень двойки надо взять, чтобы получить $0$» — тоже невозможно: $2^x$ подходит к нулю как угодно близко, но никогда его не достигает.
Отсюда напрямую: область определения логарифмической функции — только положительные $x$. Это не произвольный запрет из учебника, а прямое следствие того, как устроена показательная функция.
А что на выходе? Обратный станок выдаёт показатели степени. А показатель степени в $y = a^x$ может быть любым действительным числом — там область определения была вся прямая $\mathbb{R}$. Значит, множество значений логарифма — вся прямая $\mathbb{R}$: логарифм может быть и огромным положительным, и огромным отрицательным, и дробным, и иррациональным.
Определение: Логарифмической функцией называется функция вида
$$y = \log_a x,$$где основание $a$ — фиксированное число, причём $a > 0$ и $a \neq 1$, а аргумент $x$ пробегает все положительные значения. Значение $\log_a x$ — это показатель степени, в которую надо возвести $a$, чтобы получить $x$: равенство $y = \log_a x$ равносильно равенству $a^y = x$.
Паспорт функции $y = \log_a x$:
- Область определения: $D(y) = (0; +\infty)$ — только строго положительные $x$
- Множество значений: $E(y) = \mathbb{R}$ — вообще любое действительное число
- Функция непрерывна и строго монотонна на всей области определения
- График проходит через точку $(1; 0)$ при любом основании $a$
- График проходит через точку $(a; 1)$ — это способ «прочитать» основание с картинки
- Прямая $x = 0$ (ось $Oy$) — вертикальная асимптота
- Функция не является ни чётной, ни нечётной — она вообще не определена при $x < 0$, так что проверять симметрию бессмысленно
- Нулей у функции ровно один: $x = 1$
Почему ограничения на основание именно такие
На основание наложены два условия: $a > 0$ и $a \neq 1$. Разберём, откуда они берутся — это ровно те же условия, что были у показательной функции, и по тем же причинам.
Почему $a > 0$. Если бы основание было отрицательным, например $a = -2$, то выражение $(-2)^x$ теряет смысл для большинства $x$: при $x = 0{,}5$ это $\sqrt{-2}$, чего в действительных числах нет. Функция $(-2)^x$ существовала бы в отдельных изолированных точках, а не на промежутке — графика бы не получилось. Обращать такой объект нечего.
Почему $a \neq 1$. Функция $y = 1^x$ равна единице при любом $x$: $1^{-5} = 1$, $1^0 = 1$, $1^{100} = 1$. Это горизонтальная прямая, а не взаимно однозначное соответствие. Запустить её задом наперёд невозможно: на вход обратной машины пришло бы $1$, а ответом было бы «любое число сразу» — а функция обязана давать один ответ. Плюс к этому запись $\log_1 5$ означала бы «в какую степень возвести единицу, чтобы получить 5» — ответа нет вовсе.
Почему $a \neq 0$ (частный случай $a > 0$): $0^x$ при отрицательных $x$ — деление на ноль, при $x = 0$ — неопределённость. Обращать нечего.
Примеры с разбором
Пример 1 (простой): найди область определения функции $y = \log_4(x - 5)$
Решение:
Шаг 1. Под знаком логарифма стоит выражение $x - 5$. Основание $4$ в порядке: $4 > 0$ и $4 \neq 1$, никаких дополнительных условий оно не даёт.
Шаг 2. Единственное требование — то, что стоит под логарифмом, должно быть строго положительным:
$$x - 5 > 0$$Шаг 3. Решаем: $x > 5$.
Проверим наш ответ. Возьмём $x = 6$: $\log_4(6 - 5) = \log_4 1 = 0$ — значение существует ✅. Возьмём $x = 5$: $\log_4 0$ — не существует ❌. Возьмём $x = 4$: $\log_4(-1)$ — не существует ❌.
Ответ: $D(y) = (5; +\infty)$
Пример 2 (средний): найди область определения функции $y = \log_{0,3}(12 - 4x)$
Решение:
Шаг 1. Основание $0{,}3$ допустимо: оно положительно и не равно единице. Тот факт, что основание меньше единицы, на область определения не влияет — он повлияет только на монотонность, к которой мы придём в следующем блоке.
Шаг 2. Требуем положительности подлогарифмического выражения:
$$12 - 4x > 0$$Шаг 3. Переносим и делим:
$$-4x > -12 \quad \Rightarrow \quad x < 3$$Здесь мы делим на отрицательное число $-4$, поэтому знак неравенства переворачивается.
Проверим наш ответ. При $x = 0$: $\log_{0,3} 12$ — существует ✅. При $x = 3$: $\log_{0,3} 0$ — не существует ❌. При $x = 5$: $\log_{0,3}(-8)$ — не существует ❌.
Ответ: $D(y) = (-\infty; 3)$
📌 Обрати внимание: область определения оказалась лучом влево, а не вправо. Логарифм «требует положительности» от того, что стоит внутри, а не от самого $x$.
Пример 3 (сложный): найди область определения и множество значений функции $y = \log_3(x^2 - 6x + 14)$
Решение:
Шаг 1. Область определения. Требуем $x^2 - 6x + 14 > 0$. Выделим полный квадрат:
$$x^2 - 6x + 14 = (x^2 - 6x + 9) + 5 = (x - 3)^2 + 5$$Шаг 2. Квадрат $(x-3)^2$ неотрицателен при любом $x$, значит $(x-3)^2 + 5 \geq 5 > 0$ всегда. Подлогарифмическое выражение положительно при любом $x$ — ограничений нет.
$$D(y) = \mathbb{R}$$Шаг 3. Множество значений. Обозначим внутреннее выражение $t = (x-3)^2 + 5$. Мы только что выяснили: наименьшее значение $t$ равно $5$ (достигается при $x = 3$), а сверху $t$ ничем не ограничено — при больших $|x|$ квадрат растёт неограниченно. Значит, $t$ пробегает промежуток $[5; +\infty)$.
Шаг 4. Теперь применяем логарифм по основанию $3$. Основание больше единицы, функция $\log_3 t$ возрастает (это мы строго обоснуем в блоке 2). Значит, наименьшему $t = 5$ соответствует наименьшее значение $y = \log_3 5$, а при росте $t$ до бесконечности $y$ тоже растёт неограниченно.
$$E(y) = [\log_3 5; +\infty)$$Шаг 5. Прикинем численно: $\log_3 5 \approx 1{,}465$, потому что $3^1 = 3$, $3^{1,5} \approx 5{,}196$ — значит, ответ чуть меньше $1{,}5$ ✅.
Ответ: $D(y) = \mathbb{R}$, $E(y) = [\log_3 5; +\infty)$
Вывод: множество значений логарифмической функции — вся прямая только у «чистой» функции $y = \log_a x$. Как только внутрь попадает выражение, которое само не пробегает всю положительную полуось, множество значений сжимается.
Почему это важно
Условие $x > 0$ — не формальность, а самая частая причина ошибок в реальном коде. Когда ты применяешь np.log() к столбцу датафрейма, где есть нули (а нули есть почти всегда: «сумма покупки за месяц» у неактивного клиента, «количество кликов» у нового баннера), NumPy вернёт -inf, и дальше это -inf протечёт в среднее, в стандартное отклонение, в градиенты — и обучение развалится с nan через несколько шагов. Если в столбце попадётся отрицательное значение (например, «прибыль» может быть отрицательной), вернётся nan сразу. Именно поэтому в ML почти никогда не пишут просто log(x) для признака — пишут log1p(x), то есть $\ln(1 + x)$, у которой область определения сдвинута на единицу влево: $x > -1$, и ноль в неё честно попадает, давая $\ln 1 = 0$. Об этом подробно поговорим в блоке 6.
Блок 2: Монотонность — главный рычаг всей темы
Интуиция: логарифм не умеет «передумывать»
Возьми любое положительное число и начни его увеличивать. Скажем, при основании $2$: аргумент $1 \to 2 \to 4 \to 8 \to 16$, а логарифм $0 \to 1 \to 2 \to 3 \to 4$. Аргумент растёт — логарифм растёт. Всегда. Ни разу не бывает такого, чтобы ты увеличил $x$, а $\log_2 x$ при этом уменьшился.
А теперь возьми основание меньше единицы, например $0{,}5$. Аргумент $1 \to 2 \to 4 \to 8 \to 16$, а логарифм $0 \to -1 \to -2 \to -3 \to -4$. Аргумент растёт — логарифм падает. И снова: всегда, без исключений.
Вот эта предсказуемость и есть главное рабочее свойство логарифмической функции. Она строго монотонна — либо всюду возрастает, либо всюду убывает, в зависимости только от основания. Никаких «здесь растёт, а там разворачивается», как у параболы. Один раз определил направление по основанию — и дальше можешь сравнивать любые два значения, решать уравнения и неравенства, доказывать оценки.
Аналогия: представь два переводчика цен. Первый переводит рубли в доллары — чем больше рублей, тем больше долларов, порядок сохраняется. Второй переводит «сумму долга» в «оставшийся баланс» — чем больше долг, тем меньше баланс, порядок переворачивается. Оба перевода однозначны и не путаются, просто один сохраняет порядок, а второй его зеркалит. Логарифм при $a > 1$ — первый переводчик, при $0 < a < 1$ — второй.
Теорема о монотонности: Пусть $x_1$ и $x_2$ — положительные числа.
Если $a > 1$, то функция $y = \log_a x$ строго возрастает: из $x_1 < x_2$ следует $\log_a x_1 < \log_a x_2$.
Если $0 < a < 1$, то функция $y = \log_a x$ строго убывает: из $x_1 < x_2$ следует $\log_a x_1 > \log_a x_2$.
Доказательство через знак разности
Производной у нас пока нет — она появится только в уроке 133. И она нам не нужна: монотонность логарифма доказывается напрямую, через знак разности значений и свойство логарифма частного из урока 117.
Возьмём два числа $0 < x_1 < x_2$ и посмотрим на разность:
$$\log_a x_2 - \log_a x_1 = \log_a \frac{x_2}{x_1}$$Обозначим $q = \dfrac{x_2}{x_1}$. Поскольку $x_2 > x_1 > 0$, дробь $q > 1$.
Случай $a > 1$. Логарифм $\log_a q$ — это такое число $p$, что $a^p = q$. Мы знаем: $q > 1$, а показательная функция с основанием $a > 1$ даёт значения больше единицы только при положительном показателе (урок 113: $a^p > 1 \Leftrightarrow p > 0$ при $a > 1$). Значит, $p > 0$, то есть $\log_a q > 0$. Разность положительна — функция возрастает.
Случай $0 < a < 1$. Теперь показательная функция убывает, и $a^p > 1$ только при отрицательном $p$. Значит, $\log_a q < 0$, разность отрицательна — функция убывает.
Всё доказательство уместилось в четыре строчки и не потребовало ничего, кроме свойства логарифма частного и знания того, как ведёт себя $a^p$ относительно единицы.
Практическое правило сравнения
Из теоремы вытекает рабочий алгоритм, которым ты будешь пользоваться постоянно:
- Если основания одинаковые и $a > 1$ — больше тот логарифм, у которого больше аргумент. Знак сохраняется
- Если основания одинаковые и $0 < a < 1$ — больше тот логарифм, у которого меньше аргумент. Знак переворачивается
- Если основания разные — сначала сводим к одному основанию (формула перехода из урока 117) либо сравниваем каждое число с удобным «реперным» значением: чаще всего с нулём или с единицей
Примеры с разбором
Пример 1 (простой): сравни $\log_7 20$ и $\log_7 34$
Решение:
Шаг 1. Основания одинаковые: $a = 7$.
Шаг 2. Проверяем основание: $7 > 1$, значит функция $y = \log_7 x$ возрастает.
Шаг 3. Возрастающая функция сохраняет порядок аргументов. Поскольку $20 < 34$, получаем $\log_7 20 < \log_7 34$.
Проверим наш ответ грубой прикидкой. $7^1 = 7$, $7^2 = 49$. Значит, оба логарифма лежат между 1 и 2, но $\log_7 20$ ближе к середине, а $\log_7 34$ — заметно ближе к двойке ✅.
Ответ: $\log_7 20 < \log_7 34$
Пример 2 (средний): сравни $\log_{0,4} 6$ и $\log_{0,4} 15$
Решение:
Шаг 1. Основания одинаковые: $a = 0{,}4$.
Шаг 2. Проверяем: $0 < 0{,}4 < 1$ — функция убывает.
Шаг 3. Убывающая функция переворачивает порядок. Из $6 < 15$ следует $\log_{0,4} 6 > \log_{0,4} 15$.
Проверим наш ответ. Оба числа больше единицы, а основание меньше единицы — значит, оба логарифма отрицательны. Прикинем: $0{,}4^{-1} = 2{,}5$, $0{,}4^{-2} = 6{,}25$, $0{,}4^{-3} \approx 15{,}6$. То есть $\log_{0,4} 6 \approx -1{,}96$, а $\log_{0,4} 15 \approx -2{,}95$. И правда, $-1{,}96 > -2{,}95$ ✅
Ответ: $\log_{0,4} 6 > \log_{0,4} 15$
⚠️ Самая частая ошибка на этом месте — механически перенести привычку «больше аргумент — больше логарифм». При основании меньше единицы всё зеркалится.
Пример 3 (сложный): сравни $\log_5 8$ и $\log_{25} 64$
Решение:
Шаг 1. Основания разные — $5$ и $25$. Сводим к общему. Заметим, что $25 = 5^2$ и $64 = 8^2$.
Шаг 2. Применим свойство логарифма степени в обе стороны. Воспользуемся общей формулой $\log_{a^k} b^k = \log_a b$, но выведем её здесь честно, через переход к основанию $5$:
$$\log_{25} 64 = \frac{\log_5 64}{\log_5 25} = \frac{\log_5 8^2}{\log_5 5^2} = \frac{2\log_5 8}{2} = \log_5 8$$Шаг 3. Числа оказались равны.
Проверим наш ответ численно. $\log_5 8 = \ln 8 / \ln 5 \approx 2{,}0794 / 1{,}6094 \approx 1{,}292$. И $\log_{25} 64 = \ln 64 / \ln 25 \approx 4{,}1589 / 3{,}2189 \approx 1{,}292$ ✅
Ответ: $\log_5 8 = \log_{25} 64$
Вывод: одновременное возведение основания и аргумента в одну и ту же степень не меняет значение логарифма. Это «инвариант масштаба» — его удобно держать в голове, потому что он позволяет мгновенно узнавать замаскированные одинаковые числа.
Пример 4 (сложный): сравни $\log_2 5$ и $\log_5 2$, не вычисляя их
Решение:
Шаг 1. Основания разные, аргументы разные, и никакой общей степени тут не видно. Значит, работаем через реперную точку — сравним каждое число с единицей.
Шаг 2. Число $\log_2 5$. Основание $2 > 1$, функция возрастает. Сравним аргумент с основанием: $5 > 2$. Поскольку $\log_2 2 = 1$ и функция возрастает, из $5 > 2$ следует $\log_2 5 > \log_2 2 = 1$.
Шаг 3. Число $\log_5 2$. Основание $5 > 1$, функция возрастает. Аргумент $2 < 5$, поэтому $\log_5 2 < \log_5 5 = 1$.
Шаг 4. Первое число больше единицы, второе — меньше. Сравнение готово:
$$\log_2 5 > 1 > \log_5 2$$Проверим наш ответ. $\log_2 5 \approx 2{,}322$, $\log_5 2 \approx 0{,}431$ ✅
Ответ: $\log_2 5 > \log_5 2$
📌 Приём «сравнить каждое число с единицей» — рабочая лошадка для логарифмов с разными основаниями. Правило простое: логарифм больше единицы, когда аргумент и основание лежат по одну сторону от единицы в «одинаковом направлении», то есть при $a > 1$ нужно $x > a$, а при $0 < a < 1$ нужно $x < a$.
Почему это важно
Монотонность — это то, ради чего логарифм вообще применяют к данным. Когда ты пишешь y_log = np.log1p(y), обучаешь модель на логарифме таргета, а потом делаешь обратное преобразование np.expm1(pred) — ты опираешься именно на строгую монотонность: логарифм не меняет порядок объектов. Если товар A дороже товара B, то и логарифм цены A больше логарифма цены B. Поэтому все метрики, которые зависят только от порядка (ROC-AUC, ранговые корреляции Спирмена и Кендалла, NDCG в ранжировании), вообще не меняются после логарифмирования признака. Меняется только форма распределения и масштаб — а это как раз то, что мы и хотели поменять.
Отсюда же важный практический вывод: если модель, чувствительная только к порядку (например, решающее дерево или градиентный бустинг над деревьями), — логарифмирование признака ей не поможет вообще, потому что дерево делит по порогам, а пороги сохраняют порядок. А вот линейной регрессии, нейросети или методу k ближайших соседей, которые работают с расстояниями и суммами, логарифмирование помогает радикально. Это чисто математическое следствие теоремы о монотонности, а не эмпирическое суеверие.
Блок 3: Точка $(1; 0)$, знак логарифма и вертикальная асимптота
Интуиция: общий перекрёсток и бездонная пропасть
Нарисуй мысленно несколько графиков сразу: $y = \log_2 x$, $y = \log_{10} x$, $y = \ln x$, $y = \log_{0,5} x$. Все они разные по крутизне, два из них растут, один падает — но есть одна точка, где они все пересекаются. Это точка $(1; 0)$.
Причина элементарная: $\log_a 1 = 0$ при любом допустимом основании, потому что $a^0 = 1$ всегда. Какое основание ни возьми, чтобы получить единицу, надо взять нулевую степень. Единица — это «ноль по логарифмической шкале», её нейтральный элемент. Умножение на единицу ничего не меняет — и логарифм это честно отражает, ставя ей в соответствие ноль, который ничего не меняет при сложении.
Вторая опорная точка — $(a; 1)$: $\log_a a = 1$. Она полезна тем, что позволяет прочитать основание прямо с картинки: найди на графике точку с ординатой $1$ и посмотри её абсциссу — это и есть основание.
А теперь про пропасть. Что происходит, когда $x$ становится совсем маленьким? Возьмём $y = \log_{10} x$:
$$\log_{10} 0{,}1 = -1, \quad \log_{10} 0{,}01 = -2, \quad \log_{10} 0{,}000001 = -6, \quad \log_{10} 10^{-100} = -100$$Чем ближе $x$ к нулю, тем глубже проваливается график. И у этого падения нет дна: чтобы получить значение $-1000$, достаточно взять $x = 10^{-1000}$ — такое число существует, оно положительное, оно допустимо. Значит, для любого сколь угодно большого отрицательного числа найдётся $x$, при котором логарифм ещё меньше. График неограниченно уходит вниз, прижимаясь к оси $Oy$, но никогда её не пересекает и не касается — потому что при $x = 0$ функция просто не определена.
Определение: Прямая $x = x_0$ называется вертикальной асимптотой графика функции, если при приближении аргумента к $x_0$ значения функции неограниченно возрастают по модулю, а сам график подходит к этой прямой сколь угодно близко, не пересекая её.
Для функции $y = \log_a x$ вертикальной асимптотой служит прямая $x = 0$, то есть ось $Oy$.
Знак логарифма — таблица, которую стоит запомнить:
- При $a > 1$: $\log_a x > 0$, если $x > 1$; $\log_a x < 0$, если $0 < x < 1$
- При $0 < a < 1$: $\log_a x < 0$, если $x > 1$; $\log_a x > 0$, если $0 < x < 1$
- При любом допустимом $a$: $\log_a x = 0$ ровно тогда, когда $x = 1$
Единое правило-мнемоника: логарифм положителен, когда основание и аргумент находятся по одну сторону от единицы, и отрицателен, когда по разные. Проверь на примерах: $\log_2 8 = 3 > 0$ (оба больше 1 ✅), $\log_2 0{,}5 = -1 < 0$ (основание больше, аргумент меньше ✅), $\log_{0,5} 0{,}25 = 2 > 0$ (оба меньше 1 ✅), $\log_{0,5} 4 = -2 < 0$ (по разные стороны ✅).
Примеры с разбором
Пример 1 (простой): определи знак числа $\log_{0,6} 0{,}2$ без вычислений
Решение:
Шаг 1. Основание $0{,}6$ — меньше единицы.
Шаг 2. Аргумент $0{,}2$ — тоже меньше единицы.
Шаг 3. Основание и аргумент по одну сторону от единицы — значит, логарифм положителен.
Проверим наш ответ. $0{,}6^1 = 0{,}6$, $0{,}6^2 = 0{,}36$, $0{,}6^3 = 0{,}216$. Чтобы получить $0{,}2$, нужна степень чуть больше третьей: $\log_{0,6} 0{,}2 \approx 3{,}15$ — действительно положительное ✅
Ответ: $\log_{0,6} 0{,}2 > 0$
Пример 2 (средний): график функции $y = \log_a x$ проходит через точку $(81; 4)$. Найди основание $a$ и вычисли $\log_a \frac{1}{9}$
Решение:
Шаг 1. «График проходит через точку $(81; 4)$» означает, что при подстановке $x = 81$ получается $y = 4$:
$$\log_a 81 = 4$$Шаг 2. По определению логарифма переходим к показательной форме:
$$a^4 = 81$$Шаг 3. Решаем. Основание логарифма обязано быть положительным, поэтому отрицательный корень $a = -3$ отбрасываем:
$$a = 3$$Шаг 4. Теперь вычисляем второе:
$$\log_3 \frac{1}{9} = \log_3 3^{-2} = -2$$Проверим наш ответ. $3^4 = 81$ ✅, $3^{-2} = \frac{1}{9}$ ✅
Ответ: $a = 3$, $\log_a \frac{1}{9} = -2$
Пример 3 (сложный): найди все $x$, при которых значение функции $y = \log_{0,5}(x - 2)$ положительно
Решение:
Шаг 1. Область определения. Требуем $x - 2 > 0$, то есть $x > 2$. Без этого условия говорить о значениях функции бессмысленно.
Шаг 2. Условие положительности. Основание $0{,}5 < 1$. По таблице знаков логарифм с таким основанием положителен, когда его аргумент меньше единицы:
$$0 < x - 2 < 1$$Шаг 3. Решаем двойное неравенство, прибавляя 2 ко всем частям:
$$2 < x < 3$$Шаг 4. Условие $x > 2$ из первого шага уже учтено в левой части.
Проверим наш ответ. При $x = 2{,}5$: $\log_{0,5} 0{,}5 = 1 > 0$ ✅. При $x = 3$: $\log_{0,5} 1 = 0$ — не положительно, граница исключена ✅. При $x = 5$: $\log_{0,5} 3 \approx -1{,}585 < 0$ ✅
Ответ: $x \in (2; 3)$
Вывод: для логарифма с основанием меньше единицы «положительное значение» и «большой аргумент» — противоположные вещи. Вертикальная асимптота при этом сдвинулась вместе с графиком: теперь это прямая $x = 2$, и именно возле неё функция улетает в $+\infty$ (а не в $-\infty$, потому что основание меньше единицы и график перевёрнут).
Почему это важно: log-loss и граница $p \to 0$
Вот где вертикальная асимптота из абстрактного свойства графика превращается в поведение реальной нейросети.
Функция потерь для бинарной классификации — log-loss (она же бинарная кросс-энтропия) — для одного объекта с истинной меткой $y \in \{0, 1\}$ и предсказанной вероятностью $p$ выглядит так:
$$L(p) = -\big[\,y \ln p + (1 - y)\ln(1 - p)\,\big]$$Возьмём объект класса 1 ($y = 1$). Тогда $L(p) = -\ln p$ — это ровно наша логарифмическая функция, отражённая относительно оси $Ox$ (знак минус) и рассматриваемая на промежутке $p \in (0; 1]$. Посмотрим на её значения:
- $p = 1$ — модель абсолютно уверена и права: $L = -\ln 1 = 0$. Штрафа нет
- $p = 0{,}9$ — почти уверена: $L = -\ln 0{,}9 \approx 0{,}105$. Штраф крошечный
- $p = 0{,}5$ — не знает вообще: $L = -\ln 0{,}5 \approx 0{,}693$. Это ровно один нат неопределённости
- $p = 0{,}1$ — уверенно ошибается: $L = -\ln 0{,}1 \approx 2{,}303$
- $p = 0{,}01$ — уверенно и грубо ошибается: $L \approx 4{,}605$
- $p = 10^{-9}$ — модель с полной уверенностью выдала неверный ответ: $L \approx 20{,}7$
- $p \to 0$ — штраф уходит в $+\infty$
Вот она, вертикальная асимптота, в действии. Функция потерь спроектирована так, что уверенная ошибка наказывается неограниченно. Модель, которая сказала «вероятность класса 1 равна нулю», а класс оказался первым, получает бесконечный штраф — и это осмысленно: она заявила невозможность события, которое произошло.
Но у бесконечности есть цена в реальных вычислениях. Если сеть выдаст ровно $p = 0$ (а это легко случается при насыщении сигмоиды в числах с плавающей точкой), то np.log(0) вернёт -inf, loss станет inf, градиент — nan, и обучение мгновенно умрёт. Поэтому во всех библиотеках log-loss считается с «подпоркой»: sklearn обрезает вероятности до отрезка $[\varepsilon;\ 1-\varepsilon]$ с $\varepsilon \approx 10^{-15}$, а PyTorch идёт умнее и вообще не даёт вероятностям появиться на свет — nn.CrossEntropyLoss принимает не вероятности, а логиты, и считает логарифм и softmax одной устойчивой формулой (log-sum-exp), где деления на ноль просто не возникает. Всё это — инженерный ответ на одно математическое свойство: у $\ln x$ в нуле вертикальная асимптота.
Блок 4: График как зеркало показательной функции
Интуиция: одно и то же соответствие, прочитанное с другой стороны
В уроке 82 мы разбирали обратную функцию и главный геометрический факт: графики взаимно обратных функций симметричны относительно прямой $y = x$. Логарифмическая функция — самый важный пример этого правила во всей школьной математике.
Смотри, как это работает на числах. Возьмём $y = 2^x$ и составим табличку:
| $x$ | $-2$ | $-1$ | $0$ | $1$ | $2$ | $3$ |
|---|---|---|---|---|---|---|
| $2^x$ | $0{,}25$ | $0{,}5$ | $1$ | $2$ | $4$ | $8$ |
А теперь табличка для $y = \log_2 x$:
| $x$ | $0{,}25$ | $0{,}5$ | $1$ | $2$ | $4$ | $8$ |
|---|---|---|---|---|---|---|
| $\log_2 x$ | $-2$ | $-1$ | $0$ | $1$ | $2$ | $3$ |
Это одна и та же таблица, у которой поменяли местами строки. Точка $(3; 8)$ на графике показательной превращается в точку $(8; 3)$ на графике логарифмической. А обмен координат местами — это и есть отражение относительно биссектрисы первого и третьего координатных углов, прямой $y = x$.
Теорема о взаимной обратности: Функции $y = a^x$ и $y = \log_a x$ (при $a > 0$, $a \neq 1$) взаимно обратны. Для них выполняются тождества
$$a^{\log_a x} = x \quad (\text{при } x > 0), \qquad \log_a a^x = x \quad (\text{при любом } x).$$Их графики симметричны относительно прямой $y = x$.
Из этой симметрии автоматически вытекает всё, что мы уже выяснили другими способами — и это отличная перекрёстная проверка:
- Область определения $y = a^x$ — это $\mathbb{R}$; значит, множество значений $y = \log_a x$ — тоже $\mathbb{R}$. Отражение меняет оси местами
- Множество значений $y = a^x$ — это $(0; +\infty)$; значит, область определения логарифма — $(0; +\infty)$
- У показательной была горизонтальная асимптота $y = 0$; при отражении она превращается в вертикальную асимптоту $x = 0$ у логарифма
- Показательная проходила через $(0; 1)$; логарифмическая проходит через $(1; 0)$
- При $a > 1$ показательная возрастает — и логарифмическая возрастает. При $0 < a < 1$ обе убывают. Отражение относительно $y = x$ сохраняет характер монотонности
Форма графика: медленно, но неудержимо
Есть ещё одно наблюдение, которое стоит зафиксировать отдельно, потому что оно постоянно всплывает в анализе алгоритмов. Показательная функция $y = 2^x$ растёт взрывным образом: за 10 шагов от $1$ до $1024$. Значит, её зеркало — логарифм — растёт невероятно медленно: чтобы $\log_2 x$ вырос на единицу, аргумент должен удвоиться.
Прикинь масштаб: $\log_2$ от миллиона — примерно $20$. $\log_2$ от миллиарда — примерно $30$. $\log_2$ от числа атомов в наблюдаемой Вселенной ($\approx 10^{80}$) — всего $266$. Функция, которая неограниченно растёт, но за восемьдесят порядков аргумента набирает всего 266 единиц.
При этом важно не спутать «медленно растёт» с «ограничена сверху». Логарифм не имеет горизонтальной асимптоты и не стремится ни к какому потолку. Он превзойдёт любое наперёд заданное число — просто ему для этого нужен астрономический аргумент. Множество значений — вся прямая $\mathbb{R}$, и это ровно то, что доказано в блоке 1.
Примеры с разбором
Пример 1 (простой): точка $(5; 3)$ лежит на графике функции $y = f(x)$, обратной к $y = \log_a x$. Найди значение $\log_a 3$
Решение:
Шаг 1. Функция, обратная к логарифмической, — показательная: $f(x) = a^x$.
Шаг 2. При симметрии относительно $y = x$ точка $(5; 3)$ графика обратной функции соответствует точке $(3; 5)$ графика исходной. То есть $\log_a 3 = 5$.
Шаг 3. Проверим по-другому, через тождество. Из $(5; 3)$ на графике $a^x$: $a^5 = 3$. По определению логарифма это и означает $\log_a 3 = 5$ ✅
Ответ: $\log_a 3 = 5$
Пример 2 (средний): упрости выражение $5^{\log_5 12} + \log_3 3^{-7} + \log_{0,2} 1$
Решение:
Шаг 1. Первое слагаемое — прямое применение тождества $a^{\log_a x} = x$:
$$5^{\log_5 12} = 12$$Смысл: «возведи 5 в ту степень, в которую надо возвести 5, чтобы получить 12» — прямой и обратный станок гасят друг друга.
Шаг 2. Второе слагаемое — второе тождество $\log_a a^x = x$:
$$\log_3 3^{-7} = -7$$Шаг 3. Третье слагаемое — логарифм единицы, он равен нулю при любом допустимом основании:
$$\log_{0,2} 1 = 0$$Шаг 4. Складываем: $12 + (-7) + 0 = 5$.
Ответ: $5$
Пример 3 (сложный): построй график функции $y = \log_3 x$ по точкам, используя показательную функцию, и определи, между какими соседними целыми числами лежит $\log_3 50$
Решение:
Шаг 1. Сначала считаем степени тройки — это легко:
$$3^{-2} = \tfrac{1}{9}, \quad 3^{-1} = \tfrac{1}{3}, \quad 3^0 = 1, \quad 3^1 = 3, \quad 3^2 = 9, \quad 3^3 = 27, \quad 3^4 = 81$$Шаг 2. Переворачиваем пары — получаем точки графика логарифма:
$$\left(\tfrac{1}{9}; -2\right), \ \left(\tfrac{1}{3}; -1\right), \ (1; 0), \ (3; 1), \ (9; 2), \ (27; 3), \ (81; 4)$$Шаг 3. Соединяем плавной кривой: слева она круто уходит вниз вдоль оси $Oy$, справа медленно ползёт вверх. Обрати внимание, как растягиваются расстояния по оси $x$: чтобы подняться с 3 на 4, аргументу пришлось увеличиться с 27 до 81, то есть в три раза.
Шаг 4. Теперь про $\log_3 50$. Ищем, между какими степенями тройки лежит 50:
$$27 < 50 < 81, \quad \text{то есть} \quad 3^3 < 50 < 3^4$$Шаг 5. Функция $\log_3 x$ возрастает (основание $3 > 1$), поэтому она сохраняет эти неравенства:
$$\log_3 27 < \log_3 50 < \log_3 81 \quad \Rightarrow \quad 3 < \log_3 50 < 4$$Проверим наш ответ. $\log_3 50 = \ln 50 / \ln 3 \approx 3{,}912 / 1{,}0986 \approx 3{,}561$ ✅ — действительно между 3 и 4, и ближе к 4, что согласуется с тем, что 50 ближе к 81 по логарифмической шкале.
Ответ: $3 < \log_3 50 < 4$
Вывод: приём «зажать аргумент между соседними степенями основания» — самый быстрый способ оценить логарифм в уме. Он работает исключительно за счёт монотонности.
Почему это важно
Пара «логарифм ↔ экспонента» — это рабочий цикл преобразования данных, который ты будешь применять постоянно. Схема одна и та же: применил log к таргету → обучил модель на преобразованных данных → применил exp к предсказанию и вернулся в исходный масштаб. Именно потому, что эти функции строго взаимно обратны, ты можешь быть уверен, что при обратном переходе не потеряешь и не исказишь информацию.
Более того, это открывает целый класс моделей. Линейная регрессия на логарифме таргета — $\ln y = w_1 x_1 + w_2 x_2 + b$ — после возведения в экспоненту превращается в мультипликативную модель: $y = e^b \cdot e^{w_1 x_1} \cdot e^{w_2 x_2}$. То есть аддитивная модель в логарифмическом пространстве — это модель с перемножением факторов в исходном. Для цен, зарплат, времени доставки, длительности сессий это часто гораздо более честная гипотеза, чем «каждый фактор добавляет фиксированное число рублей»: там факторы действительно множатся («в этом районе на 20% дороже»), а не складываются. Коэффициент $w_1$ при этом читается как «изменение $x_1$ на единицу умножает $y$ примерно на $e^{w_1}$» — интерпретация в процентах, а не в абсолютных единицах.
Блок 5: Преобразования графика логарифмической функции
Интуиция: базовая кривая и четыре ручки настройки
Все преобразования графиков ты разбирал в уроке 84, и здесь работают ровно те же правила. Но у логарифма есть один эффект, которого нет ни у одной другой школьной функции, — и ради него стоит пройти этот блок внимательно.
Начнём с обычного набора. Базовая кривая — $y = \log_a x$ с асимптотой $x = 0$ и точкой $(1; 0)$.
Сдвиг по горизонтали: $y = \log_a(x - b)$. График сдвигается вправо на $b$ (при $b > 0$). Вместе с ним едет асимптота: теперь она проходит по прямой $x = b$. Область определения тоже сдвигается: $x > b$. Это самое важное преобразование для логарифма, потому что оно меняет саму область определения, а не только картинку.
Сдвиг по вертикали: $y = \log_a x + c$. График поднимается на $c$ вверх. Асимптота остаётся на месте ($x = 0$), область определения не меняется. Нуль функции переезжает: теперь $\log_a x + c = 0$ при $x = a^{-c}$.
Отражение относительно оси $Ox$: $y = -\log_a x$. Кривая переворачивается сверху вниз. И вот тут первый сюрприз: по свойству смены основания
$$-\log_a x = \log_{1/a} x$$То есть отражённая кривая — это не «какой-то новый объект», а логарифм с обратным основанием. Именно поэтому графики $y = \log_2 x$ и $y = \log_{0,5} x$ — зеркальные отражения друг друга относительно оси $Ox$.
Отражение относительно оси $Oy$: $y = \log_a(-x)$. График переезжает в левую полуплоскость, область определения становится $x < 0$, асимптота остаётся $x = 0$.
Модуль: $y = |\log_a x|$. Всё, что было ниже оси $Ox$ (то есть кусок при $0 < x < 1$), отражается наверх. Получается «галочка» с вершиной в точке $(1; 0)$: слева от единицы кривая падает к нулю, справа — растёт.
Уникальный эффект: растяжение = сдвиг
А вот то, чего нет у других функций. Посмотри на растяжение по горизонтали, $y = \log_a(kx)$ при $k > 0$. По свойству логарифма произведения (урок 117):
$$\log_a(kx) = \log_a k + \log_a x$$То есть сжатие графика в $k$ раз по горизонтали даёт ровно тот же результат, что и сдвиг вверх на постоянную $\log_a k$. Для параболы или синуса такое немыслимо: там растяжение и сдвиг — принципиально разные вещи. А логарифм превращает мультипликативное изменение аргумента в аддитивное изменение значения — это и есть его определяющее свойство, только записанное на языке преобразований графиков.
Ключевое свойство: для логарифмической функции умножение аргумента на константу эквивалентно сдвигу графика по вертикали:
$$y = \log_a(kx) = \log_a x + \log_a k, \qquad k > 0.$$Форма кривой при этом не меняется вообще — она только целиком поднимается или опускается.
Прямое следствие для практики: выбор единиц измерения не влияет на форму логарифмической зависимости. Перевёл цены из рублей в тысячи рублей — все логарифмы уменьшились на $\ln 1000 \approx 6{,}9$, но взаимное расположение точек, все разности и вся структура остались прежними. Именно поэтому в моделях с логарифмированным таргетом смена единиц измерения меняет только свободный член $b$ и не трогает ни один из коэффициентов $w_i$.
Примеры с разбором
Пример 1 (простой): опиши, как получить график $y = \log_2(x + 3)$ из графика $y = \log_2 x$, и укажи асимптоту
Решение:
Шаг 1. Внутри логарифма стоит $x + 3 = x - (-3)$, значит, сдвиг горизонтальный на $-3$, то есть влево на 3 единицы.
Шаг 2. Асимптота сдвигается вместе с графиком: была $x = 0$, стала $x = -3$.
Шаг 3. Область определения: $x + 3 > 0$, то есть $x > -3$ ✅ — согласуется с положением асимптоты.
Шаг 4. Контрольная точка: базовая точка $(1; 0)$ переезжает в $(-2; 0)$. Проверим: $\log_2(-2 + 3) = \log_2 1 = 0$ ✅
Ответ: сдвиг влево на 3; асимптота $x = -3$; $D(y) = (-3; +\infty)$
Пример 2 (средний): опиши преобразования для $y = \log_3(x - 2) - 1$ и найди точку пересечения графика с осью $Ox$
Решение:
Шаг 1. Два преобразования подряд: сдвиг вправо на 2 (из-за $x - 2$) и сдвиг вниз на 1 (из-за $-1$ снаружи).
Шаг 2. Асимптота: $x = 2$. Область определения: $x > 2$.
Шаг 3. Пересечение с осью $Ox$ — это $y = 0$:
$$\log_3(x - 2) - 1 = 0 \quad \Rightarrow \quad \log_3(x - 2) = 1$$Шаг 4. По определению логарифма: $x - 2 = 3^1 = 3$, откуда $x = 5$.
Шаг 5. Проверяем принадлежность области определения: $5 > 2$ ✅
Проверим наш ответ. $\log_3(5 - 2) - 1 = \log_3 3 - 1 = 1 - 1 = 0$ ✅
Ответ: сдвиг вправо на 2 и вниз на 1; асимптота $x = 2$; график пересекает ось $Ox$ в точке $(5; 0)$
Пример 3 (сложный): покажи, что графики функций $y = \log_2(8x)$ и $y = \log_2 x + 3$ совпадают, и найди, на сколько нужно сдвинуть график $y = \lg x$ по вертикали, чтобы получить график $y = \lg(1000x)$
Решение:
Шаг 1. Раскрываем первую функцию по свойству логарифма произведения:
$$\log_2(8x) = \log_2 8 + \log_2 x = 3 + \log_2 x$$Шаг 2. Это в точности вторая функция. Области определения тоже совпадают: для первой $8x > 0 \Leftrightarrow x > 0$, для второй $x > 0$. Функции тождественно равны ✅
Шаг 3. Проверим на контрольном значении $x = 2$: $\log_2 16 = 4$ и $\log_2 2 + 3 = 1 + 3 = 4$ ✅
Шаг 4. Теперь второй вопрос. Для десятичного логарифма:
$$\lg(1000x) = \lg 1000 + \lg x = 3 + \lg x$$Шаг 5. Значит, сжатие графика в 1000 раз по горизонтали равносильно сдвигу вверх ровно на 3 единицы.
Ответ: функции совпадают; график $y = \lg x$ надо сдвинуть вверх на $3$
Вывод: у логарифма горизонтальное масштабирование и вертикальный сдвиг — одно и то же преобразование. Это уникальная особенность, прямо вытекающая из формулы логарифма произведения.
Почему это важно
Каждый раз, когда ты видишь график в статье про машинное обучение с подписью «log scale» на одной из осей, — ты видишь применение этого блока. Логарифмическая ось делает три вещи сразу.
Во-первых, равные множители занимают равные расстояния: отрезок от 1 до 10 такой же длины, что и от 10 до 100 и от $10^{6}$ до $10^{7}$. Благодаря этому на одной картинке помещаются и мелкие, и гигантские значения — те самые «три строки-монстра» из вступления перестают выдавливать всё остальное к нулю.
Во-вторых, степенная зависимость превращается в прямую. Если $y = C x^{k}$, то $\ln y = \ln C + k \ln x$ — уравнение прямой с угловым коэффициентом $k$. Именно поэтому scaling laws больших языковых моделей всегда рисуют в двойных логарифмических осях: там степенной закон виден как идеальная прямая, а её наклон и есть показатель $k$. Прикинуть наклон по картинке легко, а вот на глаз опознать степенной закон на обычных осях невозможно.
В-третьих, экспоненциальная зависимость тоже спрямляется, но уже в полулогарифмических осях: если $y = C \cdot a^{x}$, то $\ln y = \ln C + x \ln a$ — прямая по $x$. Поэтому кривые обучения (loss по эпохам) и графики распространения эпидемий рисуют с логарифмом по оси $y$: экспоненциальное падение loss превращается в наклонную прямую, и сразу видно, продолжает ли модель учиться или вышла на плато.
Блок 6: Логарифмическая шкала в машинном обучении
Интуиция: функция-компрессор
Вернёмся к задаче из вступления и посмотрим на неё математически. Признак «сумма покупки» принимает значения от 200 до 47 000 000. Отношение максимума к минимуму — 235 000. Такое отношение называют динамическим диапазоном признака, и линейным моделям он противопоказан: вклад одного объекта в градиент оказывается в сотни тысяч раз больше, чем вклад другого, и обучение фактически подстраивается под несколько выбросов.
Логарифм работает как компрессор. Он превращает отношение в разность:
$$\ln \frac{x_{\max}}{x_{\min}} = \ln x_{\max} - \ln x_{\min}$$Отношение в 235 000 раз становится разностью всего в $\ln 235\,000 \approx 12{,}4$ единицы. Диапазон $[200;\ 47\,000\,000]$ превращается в $[\ln 200;\ \ln 47\,000\,000] \approx [5{,}3;\ 17{,}7]$. Максимум перестаёт быть в 235 тысяч раз больше минимума — теперь он больше всего в 3,3 раза. Порядок объектов при этом не изменился ни на йоту, потому что логарифм строго монотонен (блок 2).
Определение: Логарифмическим преобразованием признака называется замена значения $x$ на $\ln x$ (или $\log_{10} x$ — выбор основания влияет только на постоянный множитель и потому не меняет ни формы распределения, ни порядка объектов).
Про выбор основания стоит сказать отдельно, потому что новичков это часто смущает. По формуле перехода $\log_a x = \dfrac{\ln x}{\ln a}$ — любые два логарифма отличаются постоянным множителем. Для модели это означает: сменить основание — то же самое, что умножить признак на константу, а такое изменение линейная модель полностью компенсирует своим весом. Поэтому спорить, брать $\ln$ или $\lg$, содержательно бессмысленно; берут $\ln$, потому что он естественнее в формулах.
Почему log1p безопаснее log
Есть две причины, и обе строго математические.
Причина первая — область определения. Функция $\ln x$ определена при $x > 0$. Функция $\ln(1 + x)$, которую и реализует log1p, определена при $1 + x > 0$, то есть при $x > -1$. Разница ровно в одной точке — но эта точка $x = 0$ встречается в реальных данных постоянно: ноль покупок, ноль кликов, ноль дней просрочки. Для log ноль — это дырка в области определения и -inf на выходе, для log1p — совершенно обычная точка со значением $\ln 1 = 0$. Красиво тут то, что ноль переходит в ноль: признак «ничего не произошло» остаётся нулевым и после преобразования.
Строго говоря, log1p(x) — это композиция сдвига и логарифма: график $y = \ln(1 + x)$ получается из $y = \ln x$ сдвигом влево на единицу, вместе с асимптотой, которая переезжает в $x = -1$. Именно тот сдвиг, который мы разбирали в блоке 5, — только применённый ради спасения нулей.
Причина вторая — точность вычислений. Для очень маленьких $x$ значение $\ln(1 + x)$ близко к самому $x$. Скажем, при $x = 10^{-10}$ ответ равен примерно $10^{-10}$ с поправкой в районе $10^{-20}$. Если считать «в лоб» по формуле log(1 + x), то компьютер сначала выполнит сложение $1 + 10^{-10}$. Число с плавающей точкой двойной точности хранит около 16 значащих десятичных цифр, поэтому в сумме $1{,}0000000001$ от исходного $x$ уцелеет всего 6 цифр — остальные будут срезаны при округлении. Функция log1p реализована так, чтобы этого сложения не делать вовсе, и возвращает результат со всеми значащими цифрами. Это явление называют потерей значимости, и оно бьёт именно там, где данные близки к нулю, — то есть в самой густонаселённой части типичного признака с тяжёлым хвостом.
Обратное преобразование, кстати, тоже парное: к log1p идёт expm1, то есть $e^x - 1$, — по той же причине и с той же аккуратностью у нуля. Если ты обучал модель на log1p(y), возвращаться нужно через expm1(pred), а не через exp(pred) - 1.
Произведение вероятностей и антипереполнение
Вот, пожалуй, самая красивая причина, по которой машинное обучение живёт в логарифмах.
Предположим, модель оценивает вероятность целого текста из 2000 токенов. По цепному правилу вероятность последовательности — это произведение условных вероятностей:
$$P(\text{текст}) = p_1 \cdot p_2 \cdot \ldots \cdot p_{2000}$$Пусть каждая вероятность порядка $0{,}01$ — вполне типично для языковой модели со словарём в десятки тысяч токенов. Тогда
$$P \approx 0{,}01^{2000} = 10^{-4000}$$Число с плавающей точкой двойной точности не умеет представлять величины меньше примерно $10^{-308}$. Всё, что меньше, схлопывается в машинный ноль — это и называется антипереполнением (underflow). То есть честное вычисление произведения даст ровно $0$, а логарифм нуля — минус бесконечность, и вся дальнейшая арифметика превратится в nan. Причём проблема не в модели и не в данных: она чисто арифметическая, и от неё не спастись более аккуратным кодом умножения.
Логарифм решает её одним движением. По свойству логарифма произведения (урок 117):
$$\ln P = \ln p_1 + \ln p_2 + \ldots + \ln p_{2000}$$Каждое слагаемое — умеренное отрицательное число ($\ln 0{,}01 \approx -4{,}605$), сумма равна $2000 \cdot (-4{,}605) \approx -9210$. Это совершенно обычное число, которое спокойно хранится в любом формате с плавающей точкой. Никакого антипереполнения, никакой потери информации: $-9210{,}34$ и $10^{-4000}$ — это одно и то же значение, просто записанное в разных шкалах.
Именно поэтому в машинном обучении почти никогда не работают с вероятностями напрямую — работают с логарифмами вероятностей (log-probabilities, «логпробы»). Наивный байесовский классификатор складывает логарифмы вместо перемножения вероятностей. Скрытые марковские модели и алгоритм Витерби живут в логарифмической шкале. Перплексия языковой модели определена через среднее логарифмов. Beam search в декодере трансформера ранжирует гипотезы по сумме логпроб. И везде причина одна: произведение превращается в сумму, крошечные числа — в умеренные, а порядок при этом сохраняется — благодаря монотонности логарифма ранжирование по $\ln P$ идентично ранжированию по $P$.
Примеры с разбором
Пример 1 (простой): признак «число просмотров» принимает значения 1, 100, 10 000 и 1 000 000. Примени $\lg$ и оцени, во сколько раз сжался диапазон
Решение:
Шаг 1. Вычисляем десятичные логарифмы:
$$\lg 1 = 0, \quad \lg 100 = 2, \quad \lg 10\,000 = 4, \quad \lg 1\,000\,000 = 6$$Шаг 2. Исходный размах: $1\,000\,000 - 1 = 999\,999$.
Шаг 3. Размах после преобразования: $6 - 0 = 6$.
Шаг 4. Сжатие: примерно в $166\,666$ раз.
Шаг 5. Заметим главное: значения, отличавшиеся в 100 раз, теперь отличаются ровно на 2 — расстояния стали равномерными. Данные, «слипшиеся» у нуля, растащились по шкале.
Ответ: $0,\ 2,\ 4,\ 6$; размах сжался с 999 999 до 6
Пример 2 (средний): модель предсказала вероятности $0{,}8$, $0{,}5$, $0{,}2$ и $0{,}05$ для объектов, истинный класс у всех — первый. Вычисли log-loss каждого объекта и средний log-loss
Решение:
Шаг 1. Для объекта класса 1 потеря равна $L = -\ln p$.
Шаг 2. Считаем по очереди:
- $L_1 = -\ln 0{,}8 \approx 0{,}2231$
- $L_2 = -\ln 0{,}5 \approx 0{,}6931$
- $L_3 = -\ln 0{,}2 \approx 1{,}6094$
- $L_4 = -\ln 0{,}05 \approx 2{,}9957$
Шаг 3. Средний log-loss:
$$\bar{L} = \frac{0{,}2231 + 0{,}6931 + 1{,}6094 + 2{,}9957}{4} = \frac{5{,}5213}{4} \approx 1{,}3803$$Шаг 4. Интерпретация: значение $\ln 2 \approx 0{,}693$ соответствует модели, которая гадает наугад. Средний loss почти вдвое хуже — виноват в первую очередь четвёртый объект: одна уверенная ошибка перевесила два неплохих предсказания. Это прямое следствие того, что $-\ln p$ уходит в бесконечность у нуля.
Ответ: $0{,}223$; $0{,}693$; $1{,}609$; $2{,}996$; средний $\approx 1{,}380$
Пример 3 (сложный): в столбце «доход» есть значения $0$, $45\,000$ и $12\,000\,000$. Сравни, что даст log и что даст log1p, и объясни, почему разница между ними существенна только для нуля
Решение:
Шаг 1. Применяем $\ln x$:
- $\ln 0$ — не существует, NumPy вернёт
-infи предупреждение - $\ln 45\,000 \approx 10{,}7144$
- $\ln 12\,000\,000 \approx 16{,}3004$
Шаг 2. Применяем $\ln(1 + x)$:
- $\ln(1 + 0) = \ln 1 = 0$ — корректное значение
- $\ln 45\,001 \approx 10{,}7144$
- $\ln 12\,000\,001 \approx 16{,}3004$
Шаг 3. Сравниваем второй и третий результаты. Разница между $\ln 45\,000$ и $\ln 45\,001$ равна
$$\ln \frac{45\,001}{45\,000} = \ln(1{,}0000222) \approx 0{,}0000222$$То есть она проявляется только в пятом знаке после запятой — для модели это шум.
Шаг 4. А вот в нуле разница принципиальная: -inf против $0$. Одно значение делает столбец непригодным, второе — совершенно нормальным.
Шаг 5. Вывод про механику: прибавление единицы сдвигает график влево, и точка $x = 0$ уезжает с асимптоты внутрь области определения. При больших $x$ этот сдвиг незаметен, потому что логарифм растёт медленно и единица на фоне десятков тысяч ничего не меняет.
Ответ: log даёт -inf на нуле и ломает столбец; log1p даёт $0$; на больших значениях разница около $10^{-5}$ и не важна
Почему это важно
Логарифмическое преобразование — одна из тех редких вещей в машинном обучении, которая работает не по эмпирической случайности, а по строго доказуемой причине, и её последствия можно предсказать заранее. Оно (1) сохраняет порядок объектов, потому что функция строго монотонна; (2) сжимает динамический диапазон, потому что превращает отношения в разности; (3) делает правые скошенные распределения близкими к симметричным, потому что «умножить на 10» и «поделить на 10» после логарифма становятся симметричными смещениями на $\pm\ln 10$; (4) превращает мультипликативные модели в аддитивные и (5) спасает произведения вероятностей от антипереполнения. Каждый из этих пяти пунктов — прямое следствие свойств, которые мы разобрали в первых пяти блоках урока. Ни одного нового факта, только применение.
Практика: 30 заданий
Базовые (задания 1-10)
Задание 1: Найди область определения функции $y = \log_5(x - 3)$.
Задание 2: Найди область определения функции $y = \log_{0,2}(7 - 2x)$.
Задание 3: Найди значение функции $y = \log_3 x$ при $x = \dfrac{1}{9}$.
Задание 4: Вычисли значение функции $y = \log_a x$ при $x = 1$ для оснований $a = 7$, $a = 0{,}5$ и $a = e$. Какой вывод отсюда следует про графики?
Задание 5: Определи, возрастает или убывает каждая из функций: $y = \log_{0,7} x$, $y = \log_5 x$, $y = \ln x$, $y = \lg x$. Какие функции NumPy соответствуют двум последним?
Задание 6: Сравни числа $\log_6 11$ и $\log_6 15$.
Задание 7: Сравни числа $\log_{0,5} 3$ и $\log_{0,5} 8$.
Задание 8: Найди множество значений функции $y = \log_2 x$. Может ли логарифм быть отрицательным? Может ли он быть больше 1000?
Задание 9: Напиши уравнение вертикальной асимптоты графика функции $y = \log_3(x + 4)$.
Задание 10: Признак «число просмотров страницы» принимает значения $1$, $10$, $1000$ и $1\,000\,000$. Примени десятичный логарифм и посчитай, во сколько раз уменьшился размах (разность максимума и минимума).
Средние (задания 11-20)
Задание 11: Найди область определения функции $y = \log_2(x^2 - 9)$.
Задание 12: В коде вес признака считают выражением 1 / np.log(x). При каких $x$ это выражение определено?
Задание 13: Сравни числа $\log_2 3$ и $\log_4 9$.
Задание 14: Найди все значения $x$, при которых $\log_3 x < 2$.
Задание 15: Найди все значения $x$, при которых $\log_{1/2} x \geq -3$.
Задание 16: График функции $y = \log_a x$ проходит через точку $(27; 3)$. Найди основание $a$ и вычисли $\log_a \sqrt{3}$.
Задание 17: Опиши, как получить график функции $y = \log_2(x - 1) + 3$ из графика $y = \log_2 x$. Укажи асимптоту и найди точку пересечения с осью $Ox$.
Задание 18: Слой предобработки вычисляет признак $z = \log_2(x^2 + 4)$, где $x$ — любое действительное число. Какие значения может принимать $z$?
Задание 19: Вычисли log-loss $L = -\ln p$ для предсказанных вероятностей $p = 0{,}9$; $0{,}5$; $0{,}1$; $0{,}01$ (истинный класс — первый). Во сколько раз штраф при $p = 0{,}01$ больше, чем при $p = 0{,}9$?
Задание 20: Признак содержит значения $0$, $3$ и $999$. Что вернёт np.log и что вернёт np.log1p для каждого значения? Чем отличаются области определения этих функций?
Продвинутые (задания 21-30)
Задание 21: Найди область определения функции $y = \log_{x-1}(5 - x)$.
Задание 22: Сравни числа $\log_3 4$ и $\log_4 5$, не пользуясь калькулятором.
Задание 23: Найди все значения $x$, при которых $\log_2(x^2 - 3x) \leq 2$.
Задание 24: Найди множество значений функции $y = \log_{0,5}(x^2 - 4x + 7)$.
Задание 25: Докажи, что функция $y = \log_a x$ при $a > 1$ строго возрастает на всей области определения — не пользуясь производной.
Задание 26: Опиши график функции $y = |\log_2 x|$. Реши уравнение $|\log_2 x| = 1$ и найди все $x$, при которых $|\log_2 x| < 1$.
Задание 27: Признак принимает значения от $1$ до $10^9$. Сколько десятичных порядков занимает этот диапазон? Сколько бит нужно, чтобы закодировать целые числа в этом диапазоне? Какой длины получится диапазон после натурального логарифмирования?
Задание 28: Языковая модель оценивает последовательность из 2000 токенов, каждая условная вероятность равна $0{,}01$. Вычисли вероятность всей последовательности и её натуральный логарифм. Объясни, почему в коде считают именно логарифм.
Задание 29: Докажи, что графики функций $y = \log_a x$ и $y = \log_{1/a} x$ симметричны относительно оси $Ox$.
Задание 30: К признаку со значениями $0$, $5$, $100$ и $10\,000$ применили log1p. Вычисли результат, проверь, сохранился ли порядок значений, и посчитай, как изменилось отношение «максимум к минимуму ненулевого значения».
Частые ошибки
❌ Ошибка 1: забыть про область определения
Неправильно: решать $\log_2(x - 4) = 3$, получить $x - 4 = 8$, $x = 12$ и на этом успокоиться. Или, что хуже, решить $\log_3(x^2 - 3x) \leq 1$ только как $x^2 - 3x \leq 3$, полностью проигнорировав требование положительности.
Правильно: область определения выписывается первой строкой решения, до всех преобразований. Для $\log_2(x-4)$ это $x > 4$; ответ $x = 12$ проверяется на принадлежность и только тогда принимается. В неравенствах итоговое множество обязательно пересекается с областью определения — именно там теряются или, наоборот, добавляются лишние куски ответа.
Почему важно: область определения — не бюрократическая формальность, а часть самого объекта. Логарифм отрицательного числа не «равен чему-то странному», его просто не существует. В коде это моментально превращается в nan, который дальше протекает во всю модель. В задании 23 ровно из-за этого условия ответ распался на два куска вместо одного отрезка.
❌ Ошибка 2: не переворачивать неравенство при основании меньше единицы
Неправильно: из $\log_{0,5} x > \log_{0,5} 8$ сделать вывод $x > 8$.
Правильно: при $0 < a < 1$ логарифмическая функция убывает, значит переход к аргументам меняет знак неравенства на противоположный: $x < 8$. И, не забывая про область определения, финальный ответ $0 < x < 8$.
Почему важно: это ошибка номер один на экзаменах и в контрольных по всей теме логарифмов. Спасает единственная привычка: прежде чем что-либо писать, посмотри на основание и вслух скажи «возрастает» или «убывает». Три секунды дисциплины экономят целую задачу.
❌ Ошибка 3: считать, что логарифм ограничен сверху
Неправильно: «$\log_2 x$ растёт так медленно, что у него есть какой-то потолок» или «логарифм не может быть больше, скажем, ста».
Правильно: множество значений — вся прямая $\mathbb{R}$. Для любого наперёд заданного числа $M$ найдётся аргумент, при котором логарифм больше: достаточно взять $x = a^{M+1}$. Логарифм растёт медленно, но неограниченно. Горизонтальной асимптоты у него нет вообще; вертикальная есть, и это $x = 0$.
Почему важно: путаница «медленно растёт» ↔ «ограничен» ломает понимание сложности алгоритмов и оценок в анализе данных. Алгоритм со сложностью $O(\log n)$ не имеет никакого «максимального времени работы» — он просто масштабируется очень щадяще.
❌ Ошибка 4: путать отрицательный логарифм и логарифм отрицательного числа
Неправильно: «$\log_2 0{,}25 = -2$, значит логарифм может быть от отрицательных чисел» или наоборот — «раз логарифм только от положительных, он и сам всегда положительный».
Правильно: это два разных места. Аргумент обязан быть положительным всегда, без исключений: $\log_2(-8)$ не существует. А значение логарифма может быть любым — положительным, нулём или отрицательным: $\log_2 0{,}25 = -2$ существует прекрасно, потому что $0{,}25 > 0$.
Почему важно: именно на этом различии стоит вся конструкция log-loss: вероятности $p \in (0; 1]$ — законные положительные аргументы, а их логарифмы отрицательны, и поэтому перед ними ставят минус, чтобы потеря получилась неотрицательной.
❌ Ошибка 5: считать точку $x = 0$ частью графика
Неправильно: говорить «в нуле логарифм равен минус бесконечности» и рисовать график, упирающийся в точку $(0; -\infty)$ или касающийся оси $Oy$.
Правильно: при $x = 0$ функция не определена — точки на графике нет. «Минус бесконечность» — это не значение, а описание поведения: значения падают неограниченно, когда аргумент приближается к нулю справа. Прямая $x = 0$ — асимптота, к которой график прижимается сколь угодно близко, но никогда её не достигает.
Почему важно: ровно поэтому np.log(0) возвращает не число, а специальное значение -inf вместе с предупреждением. И ровно поэтому в реализациях log-loss вероятности обрезают снизу маленьким $\varepsilon$: асимптоту нельзя вычислить, её можно только обойти.
❌ Ошибка 6: применять log к признаку с нулями и отрицательными значениями
Неправильно: df['income_log'] = np.log(df['income']) для столбца, где встречаются нули (неактивные клиенты) или отрицательные значения (убытки).
Правильно: для неотрицательных данных с нулями — np.log1p(x), то есть $\ln(1+x)$: ноль честно переходит в ноль. Для данных, где встречаются отрицательные значения, обычный логарифм не подходит вообще — нужны знак-сохраняющие преобразования вроде $\operatorname{sign}(x)\ln(1+|x|)$ или преобразование Йео-Джонсона.
Почему важно: один -inf в столбце отравляет среднее, дисперсию, нормализацию и градиенты — обучение падает через несколько шагов, и найти причину бывает мучительно долго. Это не абстрактная осторожность, а самая частая практическая авария при работе с логарифмом.
❌ Ошибка 7: думать, что $\log(a + b) = \log a + \log b$
Неправильно: «раз логарифм превращает умножение в сложение, то и сумму он как-то раскладывает».
Правильно: свойство работает только для произведения: $\log_a(xy) = \log_a x + \log_a y$. Для суммы никакой формулы нет: $\lg(10 + 10) = \lg 20 \approx 1{,}301$, а $\lg 10 + \lg 10 = 2$ — числа разные.
Почему важно: отсюда же путаница с log1p: это $\ln(1 + x)$, а вовсе не $\ln x + 1$ и не $\ln x + \ln 1$. Разница принципиальная: при $x = 0$ первое равно нулю, второе не определено, а третье не определено тоже.
Главное запомнить
-
Область определения $y = \log_a x$ — только $x > 0$. Это прямое следствие того, что показательная функция $a^x$ выдаёт исключительно положительные значения. Проверка области определения — всегда первая строка решения.
-
Множество значений — вся прямая $\mathbb{R}$. Логарифм может быть любым числом: положительным, нулём, отрицательным, сколь угодно большим по модулю. Потолка нет ни сверху, ни снизу.
-
Основание задаёт монотонность, и только оно. При $a > 1$ функция строго возрастает, при $0 < a < 1$ — строго убывает. Ограничения на основание: $a > 0$ и $a \neq 1$.
-
Все графики проходят через точку $(1; 0)$, потому что $\log_a 1 = 0$ при любом основании. Вторая опорная точка — $(a; 1)$: она позволяет прочитать основание прямо с картинки.
-
Прямая $x = 0$ — вертикальная асимптота. График прижимается к оси $Oy$, но никогда её не касается. В точке $x = 0$ функции просто нет.
-
Знак логарифма: $\log_a x > 0$, когда основание и аргумент по одну сторону от единицы; $\log_a x < 0$, когда по разные; $\log_a x = 0$ ровно при $x = 1$.
-
Логарифмическая и показательная функции взаимно обратны: $a^{\log_a x} = x$ и $\log_a a^x = x$, а их графики симметричны относительно прямой $y = x$. Область определения и множество значений при этом меняются местами.
-
Логарифм растёт медленно, но неограниченно. Чтобы $\log_2 x$ вырос на единицу, аргумент должен удвоиться. $\log_2$ от миллиарда — всего около 30.
-
Сдвиг $y = \log_a(x - b)$ двигает вместе с графиком и асимптоту (она становится $x = b$), и область определения ($x > b$). А умножение аргумента на константу — то же самое, что сдвиг по вертикали: $\log_a(kx) = \log_a x + \log_a k$.
-
В ML логарифм делает три вещи сразу: сжимает динамический диапазон, сохраняя порядок объектов; превращает произведение вероятностей в сумму и снимает антипереполнение; даёт функцию потерь с бесконечным штрафом за уверенную ошибку. Для нулей в данных вместо
logберутlog1p, а обратно возвращаются черезexpm1.
Связь с другими темами курса
Что было до этого. Урок 111 «Показательная функция» дал нам $y = a^x$ со всеми её свойствами — именно оттуда мы взяли, что $a^x > 0$ всегда, и получили область определения логарифма. Урок 113 «Свойства показательной функции» дал критерий $a^p > 1 \Leftrightarrow p > 0$ при $a > 1$, на котором держится доказательство монотонности из блока 2. Урок 82 «Обратная функция» объяснил симметрию относительно прямой $y = x$ — без него блок 4 был бы просто набором фактов. Урок 84 «Преобразования графиков» дал технику сдвигов и отражений, которую мы применили в блоке 5. Уроки 116–118 разобрали логарифм как число, его свойства (произведения, частного, степени, перехода к новому основанию) и специальные виды — натуральный $\ln$ и десятичный $\lg$; все они использовались в решениях без дополнительных пояснений.
Что будет дальше. Урок 120 «Логарифмические уравнения» построен целиком на двух вещах из этого урока: на области определения (откуда берутся посторонние корни) и на строгой монотонности (откуда следует, что из $\log_a f = \log_a g$ можно переходить к $f = g$). Урок 121 «Логарифмические неравенства» — это систематизация приёма, который мы уже пробовали в заданиях 14, 15 и 23: переход к аргументам с обязательным разбором двух случаев по основанию. Урок 125 «Применение в задачах: рост и распад» использует пару экспонента-логарифм для расчёта времени удвоения и периода полураспада. В уроке 129 появятся пределы, и поведение логарифма у нуля получит точную формулировку. В уроке 133 придёт производная, а в 138 — знаменитая формула $(\ln x)' = \dfrac{1}{x}$, которая объяснит, почему логарифм растёт всё медленнее: скорость его роста обратно пропорциональна аргументу. Всё, что мы сегодня получили из знака разности и монотонности, там подтвердится другим инструментом.
Где это применяется в жизни и в ML/данных:
📊 В машинном обучении: log-loss и кросс-энтропия как функции потерь; log-probabilities вместо вероятностей в наивном Байесе, HMM, beam search и языковых моделях; логарифмирование признаков и таргета для линейных моделей; перплексия языковой модели; логарифмическая шкала для learning rate при подборе гиперпараметров (перебирают $10^{-5}, 10^{-4}, \ldots$, а не $0{,}1; 0{,}2; \ldots$).
📈 В data science: log-преобразование скошенных распределений (доход, цена, длительность сессии, размер файла); логарифмические оси на графиках scaling laws и кривых обучения; логарифмическая доходность в финансах $r = \ln\frac{P_t}{P_{t-1}}$, которая, в отличие от процентной, складывается по периодам.
💻 В информатике: сложность $O(\log n)$ у бинарного поиска и сбалансированных деревьев; глубина дерева поиска; количество бит для кодирования $N$ значений — это $\lceil \log_2 N \rceil$; энтропия Шеннона как теоретический предел сжатия данных.
🔬 В науке и технике: децибелы для громкости, шкала Рихтера для землетрясений, звёздные величины в астрономии, pH для кислотности, закон Вебера-Фехнера для восприятия. Везде, где человек или прибор реагирует на отношение величин, а не на их разность, появляется логарифмическая шкала.
Интересные факты
💡 Непер потратил на таблицы двадцать лет — а нужное основание нашёл не он. Логарифмы Непера были устроены иначе, чем наши: у них не было основания в современном смысле, и $\log 1$ не равнялся нулю. Идею взять основанием 10 (и тем самым сделать $\log 1 = 0$) подсказал англичанин Генри Бригс, который приехал к Неперу в 1615 году специально ради этого разговора. Бригс потом сам вычислил таблицы десятичных логарифмов для чисел от 1 до 20 000 и от 90 000 до 100 000 — с точностью до 14 знаков, вручную.
💡 Логарифмическая линейка долетела до Луны. Инструмент, построенный ровно на свойстве $\log(ab) = \log a + \log b$ (умножение сводится к сложению отрезков), оставался главным вычислительным средством инженеров до 1970-х. Астронавты Apollo брали с собой Pickett N600-ES — обычную логарифмическую линейку — как резервный вычислитель. Каждое деление на её шкале — это точка графика $y = \lg x$, отложенная физически.
💡 Мозг встроил логарифм на уровне восприятия чисел. Эксперименты с народностями Амазонии, у которых нет развитой системы числительных, показали: при просьбе расставить числа от 1 до 100 на отрезке люди располагают их логарифмически — 10 оказывается примерно посередине между 1 и 100. Линейное восприятие чисел появляется только после школьного обучения. Похожим образом ведут себя и дети до 6–7 лет.
💡 Число цифр в числе — это логарифм. Количество десятичных цифр в натуральном числе $n$ равно $\lfloor \lg n \rfloor + 1$. Именно так вычисляют длину чисел-гигантов, которые невозможно выписать: например, у числа Мерсенна $2^{82\,589\,933} - 1$ ровно $82\,589\,933 \cdot \lg 2 \approx 24\,862\,048$ цифр — и это посчитано логарифмом за одну операцию, а не пересчётом цифр.
💡 Энтропия — это логарифм, за который дали работу всей теории информации. Шеннон определил количество информации в событии как $-\log_2 p$ бит. Выбор логарифма был не случаен: он единственная функция, которая превращает независимые события (у которых вероятности перемножаются) в складывающуюся информацию. Именно из этого требования аддитивности логарифм и вытекает однозначно.
Лайфхаки и полезные трюки
1. Три вопроса, которые закрывают любую задачу на логарифмическую функцию
Перед решением спроси себя: (1) что под логарифмом и когда оно положительно — это область определения; (2) основание больше или меньше единицы — это направление монотонности; (3) есть ли сдвиги — это положение асимптоты. Ответив на три вопроса, ты решил девяносто процентов задачи ещё до первого преобразования.
2. Оценивай логарифм, зажимая аргумент между степенями основания
Чтобы прикинуть $\log_3 50$ в уме, найди ближайшие степени тройки: $27 < 50 < 81$, то есть $3^3 < 50 < 3^4$, значит ответ между 3 и 4. Приём работает всегда и не требует калькулятора — только монотонность. Для $\log_2$ полезно помнить: $2^{10} = 1024 \approx 10^3$, поэтому $\log_2 1000 \approx 10$, а $\log_2$ миллиона $\approx 20$.
3. Основание читается с графика по точке с ординатой 1
Если график $y = \log_a x$ дан картинкой, ищи на нём точку, где $y = 1$: её абсцисса и есть основание, потому что $\log_a a = 1$. Аналогично, точка с $y = -1$ даёт $\frac{1}{a}$. Это быстрее, чем подставлять произвольные точки и решать уравнение.
4. Сравнивая логарифмы с разными основаниями, ищи реперную точку
Первым делом сравни каждое число с нулём и с единицей — часто этого уже достаточно (задание 4 из блока 2). Если оба числа попали в один и тот же промежуток, переходи к общему основанию по формуле $\log_a b = \dfrac{\ln b}{\ln a}$ или используй инвариант $\log_{a^k} b^k = \log_a b$ — он мгновенно разоблачает замаскированные равные числа.
5. Помни, что $\log_a b = \dfrac{1}{\log_b a}$
Эта «перевёрнутая» формула экономит кучу времени. Из неё сразу следует, что если $\log_2 5 \approx 2{,}32$, то $\log_5 2 \approx 0{,}43$ — без всяких вычислений. И именно она стала ключом к сравнению $\log_3 4$ и $\log_4 5$ в задании 22.
6. В коде: log1p и expm1 — всегда парой
Правило простое: если преобразовал признак или таргет через np.log1p, возвращайся строго через np.expm1. Комбинация np.exp(x) - 1 даст тот же результат по формуле, но потеряет точность на маленьких значениях — ровно там, где данных обычно больше всего. И никогда не применяй log к столбцу, не проверив df[col].min().
7. Логарифмируй перед тем, как строить график с большим разбросом
Если на диаграмме рассеяния всё слиплось в углу, а пара точек улетела в бесконечность, — первым делом ставь логарифмическую шкалу (plt.xscale('log')). Заодно проверишь гипотезу: если после этого точки легли на прямую, зависимость степенная (в двойных логарифмических осях) или экспоненциальная (в полулогарифмических). Одна строчка кода даёт содержательный вывод о природе данных.
8. Для подбора гиперпараметров используй логарифмическую сетку
Learning rate, коэффициент регуляризации, температуру softmax перебирают не равномерно, а по степеням: $10^{-5}, 10^{-4}, 10^{-3}, \ldots$ Причина ровно та же, что и во всём этом уроке: у таких параметров значимо не абсолютное значение, а порядок величины, то есть отношение. Равномерная сетка в логарифмической шкале — это геометрическая прогрессия в исходной.
Логарифмическая функция — это, пожалуй, самый недооценённый инструмент из всей школьной программы. Внешне скромная кривая, которая ползёт вверх так медленно, что на графике почти незаметна, — но именно она позволяет уместить миллиард значений в отрезок длиной двадцать, спасает языковые модели от арифметического обнуления, задаёт форму функции потерь для каждой обученной сегодня нейросети и отвечает за то, что бинарный поиск в миллионе элементов заканчивается за двадцать шагов.
Ты разобрал её целиком: почему она живёт только на положительной полуоси, почему её значения покрывают всю прямую, как одно-единственное сравнение основания с единицей определяет всё поведение, откуда берётся вертикальная асимптота и как график зеркалит показательную функцию. Дальше — уравнения и неравенства с логарифмами, и там ты увидишь, что вся техника их решения сводится ровно к двум фактам из этого урока: область определения и монотонность. А ещё дальше, в разделе про производную, эта же кривая раскроется с новой стороны и объяснит, почему её рост замедляется в точности обратно пропорционально аргументу. Ты уже знаешь достаточно, чтобы читать любой график в логарифмической шкале и понимать, что за ним стоит.
Понял тему? Закрепи в боте! 🚀
Попрактикуйся на задачах и получи персональные рекомендации от AI
💪 Начать тренировку