класс ⏱️ 75 мин

Действия с дробями

Действия с дробями ⚙️

Открой исходный код любого фреймворка глубокого обучения — PyTorch, JAX, TensorFlow. Там тысячи строк математики. И если вытащить из них самые фундаментальные операции, в основе почти всего окажутся… действия с дробями. Learning rate умножается на градиент. Вероятности перемножаются в цепных правилах. Веса нормализуются делением на норму. Метрики усредняются через дроби.

Это не преувеличение. Если ты хочешь понимать, что происходит внутри нейросети — не просто вызывать model.fit(), а по-настоящему понимать — тебе нужно свободно обращаться с дробями. Так же свободно, как программист обращается с циклами.

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

Ты узнаешь:
🎯 Как складывать и вычитать дроби с разными знаменателями (и почему без НОК не обойтись)
🎯 Почему умножение дробей проще сложения — и как этим пользоваться
🎯 Как деление на дробь превращается в умножение (и почему это работает)
🎯 Как все четыре действия живут внутри формул градиентного спуска, softmax и F1-score
🎯 Как считать быстро, не застревая в больших числах


Блок 1. Сложение дробей

На пальцах: почему нельзя просто сложить числители

Представь, что ты делишь задачи между двумя GPU. Первый GPU взял $\dfrac{1}{3}$ всей работы, второй — $\dfrac{1}{4}$. Сколько работы сделано в сумме?

Интуиция говорит: «Ну, $1 + 1 = 2$, а $3 + 4 = 7$, значит $\dfrac{2}{7}$?» Нет. Это грубая ошибка, и вот почему.

$\dfrac{1}{3}$ — это одна треть. $\dfrac{1}{4}$ — это одна четверть. Треть и четверть — это разные единицы измерения, как метры и дюймы. Складывать их напрямую — всё равно что говорить «1 метр + 1 дюйм = 2 метрадюйма». Бессмыслица.

Чтобы сложить части, нужно привести их к одной единице — к одному знаменателю. Нарезать всё на одинаковые куски.

Третьи:     [  1/3  ][  1/3  ][  1/3  ]
Четвёртые:  [ 1/4 ][ 1/4 ][ 1/4 ][ 1/4 ]

Двенадцатые (общий знаменатель):
[1/12][1/12][1/12][1/12][1/12][1/12][1/12][1/12][1/12][1/12][1/12][1/12]

1/3 = 4/12 (четыре двенадцатых)
1/4 = 3/12 (три двенадцатых)
1/3 + 1/4 = 7/12 (семь двенадцатых)

Строгое правило

Правило сложения дробей с разными знаменателями: 1. Найти наименьшее общее кратное (НОК) знаменателей 2. Привести каждую дробь к этому НОК (умножить числитель и знаменатель на нужный множитель) 3. Сложить числители, знаменатель оставить

$$\frac{a}{b} + \frac{c}{d} = \frac{a \cdot \frac{\text{НОК}(b,d)}{b} + c \cdot \frac{\text{НОК}(b,d)}{d}}{\text{НОК}(b,d)}$$

Для одинаковых знаменателей всё проще: $$\frac{a}{c} + \frac{b}{c} = \frac{a+b}{c}$$

Как найти НОК? Самый надёжный способ — разложить числа на простые множители.

$$\text{НОК}(12, 18): \quad 12 = 2^2 \cdot 3, \quad 18 = 2 \cdot 3^2$$ $$\text{НОК} = 2^2 \cdot 3^2 = 36$$

Берём каждый простой множитель в наибольшей степени.


Примеры с подробным разбором

Пример 1 (простой): $\dfrac{2}{5} + \dfrac{1}{3}$

Шаг 1: Находим НОК(5, 3). Числа 5 и 3 — взаимно простые (нет общих множителей), поэтому НОК = 5 × 3 = 15.

Шаг 2: Приводим первую дробь к знаменателю 15. Спрашиваем себя: «5 умножить на что даёт 15?» На 3. Значит, умножаем и числитель на 3: $$\frac{2}{5} = \frac{2 \times 3}{5 \times 3} = \frac{6}{15}$$

Шаг 3: Приводим вторую дробь. «3 умножить на что даёт 15?» На 5: $$\frac{1}{3} = \frac{1 \times 5}{3 \times 5} = \frac{5}{15}$$

Шаг 4: Складываем числители: $$\frac{6}{15} + \frac{5}{15} = \frac{11}{15}$$

Шаг 5: Проверяем, можно ли сократить. НОД(11, 15) = 1 — нельзя. Дробь несократима.

Ответ: $\dfrac{11}{15}$


Пример 2 (средний): $\dfrac{5}{6} + \dfrac{7}{8}$

Шаг 1: НОК(6, 8). Разложение: $6 = 2 \cdot 3$, $8 = 2^3$. НОК = $2^3 \cdot 3 = 24$.

Шаг 2: Приводим к знаменателю 24: $$\frac{5}{6} = \frac{5 \times 4}{6 \times 4} = \frac{20}{24}$$ $$\frac{7}{8} = \frac{7 \times 3}{8 \times 3} = \frac{21}{24}$$

Шаг 3: Складываем: $$\frac{20}{24} + \frac{21}{24} = \frac{41}{24}$$

Это неправильная дробь (числитель > знаменатель). Переводим в смешанное число: $41 = 1 \times 24 + 17$, значит $\dfrac{41}{24} = 1\dfrac{17}{24}$.

Ответ: $1\dfrac{17}{24}$


Пример 3 (ML-контекст): Macro F1-score

У тебя три класса в задаче классификации. F1 по каждому классу: - Класс A: $F1_A = \dfrac{2}{3}$ - Класс B: $F1_B = \dfrac{3}{4}$ - Класс C: $F1_C = \dfrac{5}{6}$

Macro F1 = среднее арифметическое = $\dfrac{F1_A + F1_B + F1_C}{3}$

Шаг 1: Складываем три дроби. НОК(3, 4, 6) = 12. $$\frac{2}{3} = \frac{8}{12}, \quad \frac{3}{4} = \frac{9}{12}, \quad \frac{5}{6} = \frac{10}{12}$$

Шаг 2: Сумма: $$\frac{8}{12} + \frac{9}{12} + \frac{10}{12} = \frac{27}{12} = \frac{9}{4}$$

Шаг 3: Делим на 3 (это умножение на $\dfrac{1}{3}$): $$\text{Macro F1} = \frac{9}{4} \cdot \frac{1}{3} = \frac{9}{12} = \frac{3}{4} = 0.75$$

Ответ: Macro F1 = 0.75


Почему это важно в ML

Сложение дробей — это базис для усреднения метрик. Каждый раз, когда ты считаешь macro-average precision, recall, F1 или любую другую метрику по нескольким классам — ты складываешь дроби. В коде это скрыто за np.mean(), но математика внутри именно такая.

Кроме того, softmax по определению — нормированная сумма: $$\sum_{i=1}^{n} \frac{e^{z_i}}{\sum_j e^{z_j}} = 1$$

Сумма всех выходных дробей softmax всегда равна 1 — это и есть свойство сложения правильных дробей, составляющих в сумме целое.


Блок 2. Вычитание дробей

На пальцах

Вычитание — это то же самое, что сложение, только вместо «добавляем» — «убираем». Правила приведения к общему знаменателю абсолютно те же.

Правило: Приводим к НОК, затем вычитаем числители. $$\frac{a}{b} - \frac{c}{d} = \frac{a \cdot \frac{\text{НОК}}{b} - c \cdot \frac{\text{НОК}}{d}}{\text{НОК}(b, d)}$$

ML-аналогия: В логистической регрессии функция потерь Log Loss для одного примера: $$L = -\left[y \cdot \log(p) + (1-y) \cdot \log(1-p)\right]$$

Здесь $(1 - y)$ и $(1 - p)$ — вычитание из 1. Если $y = \dfrac{3}{4}$ (мягкая метка), то $1 - y = \dfrac{1}{4}$. Вычитание дробей в действии.


Примеры с подробным разбором

Пример 1 (простой): $\dfrac{7}{8} - \dfrac{1}{6}$

Шаг 1: НОК(8, 6). $8 = 2^3$, $6 = 2 \cdot 3$. НОК = $2^3 \cdot 3 = 24$.

Шаг 2: Приводим: $$\frac{7}{8} = \frac{21}{24}, \quad \frac{1}{6} = \frac{4}{24}$$

Шаг 3: Вычитаем: $$\frac{21}{24} - \frac{4}{24} = \frac{17}{24}$$

Ответ: $\dfrac{17}{24}$


Пример 2 (средний): $2\dfrac{1}{3} - 1\dfrac{3}{4}$

Когда вычитаем смешанные числа, удобно перевести в неправильные дроби.

Шаг 1: Переводим: $$2\frac{1}{3} = \frac{7}{3}, \quad 1\frac{3}{4} = \frac{7}{4}$$

Шаг 2: НОК(3, 4) = 12. $$\frac{7}{3} = \frac{28}{12}, \quad \frac{7}{4} = \frac{21}{12}$$

Шаг 3: Вычитаем: $$\frac{28}{12} - \frac{21}{12} = \frac{7}{12}$$

Ответ: $\dfrac{7}{12}$


Пример 3 (ML-контекст): Residual в нейросети

В ResNet используются residual connections: вместо изучения функции $H(x)$ сеть изучает «остаток» $F(x) = H(x) - x$.

Если на входе $x = \dfrac{3}{5}$ и желаемый выход $H(x) = \dfrac{4}{5}$, то остаток: $$F(x) = \frac{4}{5} - \frac{3}{5} = \frac{1}{5}$$

А если $x = \dfrac{2}{3}$ и $H(x) = \dfrac{5}{6}$:

Шаг 1: НОК(3, 6) = 6. $$\frac{2}{3} = \frac{4}{6}$$

Шаг 2: $$F(x) = \frac{5}{6} - \frac{4}{6} = \frac{1}{6}$$

Сеть учится предсказывать «маленький шажок» $\dfrac{1}{6}$, а не целевое значение $\dfrac{5}{6}$. Это работает лучше для глубоких сетей — обучать поправку проще, чем всю функцию. Вот почему ResNet — это революция: она свелась к идее вычитания дробей!


Блок 3. Умножение дробей

На пальцах: никаких общих знаменателей!

Хорошая новость: умножать дроби проще, чем складывать. Никакого НОК не нужно. Просто умножаешь числитель на числитель, знаменатель на знаменатель.

Аналогия: «Половина от половины» = четверть. $\dfrac{1}{2} \cdot \dfrac{1}{2} = \dfrac{1}{4}$. Взял половину чего-то, потом ещё половину от этого — осталась четверть.

В геометрическом смысле: если у тебя прямоугольник $\dfrac{2}{3}$ на $\dfrac{3}{4}$, его площадь = $\dfrac{2}{3} \times \dfrac{3}{4} = \dfrac{6}{12} = \dfrac{1}{2}$.

[СХЕМА: Прямоугольник умножения дробей]

Весь квадрат 1×1 разбит на 12 равных частей:
по горизонтали: 4 части (знаменатель второй дроби)
по вертикали:   3 части (знаменатель первой дроби)

Закрашено: 2 вертикальных полосы × 3 горизонтальных полосы = 6 клеток из 12

Итого: 6/12 = 1/2

Строгое правило

Правило умножения дробей: $$\frac{a}{b} \cdot \frac{c}{d} = \frac{a \cdot c}{b \cdot d}$$ Результат можно сразу сокращать — как до умножения (удобнее!), так и после.

Лайфхак: Сокращай до умножения. Ищи, что числитель одной дроби и знаменатель другой делятся на одно число.

$$\frac{4}{9} \cdot \frac{3}{8}: \quad \text{сократим } 4 \text{ и } 8 \text{ на } 4, \text{ а } 3 \text{ и } 9 \text{ на } 3$$ $$\frac{\cancel{4}^1}{\cancel{9}^3} \cdot \frac{\cancel{3}^1}{\cancel{8}^2} = \frac{1 \cdot 1}{3 \cdot 2} = \frac{1}{6}$$

Вместо умножения $4 \times 3 = 12$ и $9 \times 8 = 72$ — сразу получаем $\dfrac{1}{6}$.


Примеры с подробным разбором

Пример 1 (простой): $\dfrac{5}{6} \cdot \dfrac{3}{10}$

Шаг 1: Ищем, что можно сократить до умножения.
5 и 10 делятся на 5: $5 \to 1$, $10 \to 2$.
3 и 6 делятся на 3: $3 \to 1$, $6 \to 2$.

Шаг 2: $$\frac{\cancel{5}^1}{\cancel{6}^2} \cdot \frac{\cancel{3}^1}{\cancel{10}^2} = \frac{1 \cdot 1}{2 \cdot 2} = \frac{1}{4}$$

Ответ: $\dfrac{1}{4}$


Пример 2 (средний): $1\dfrac{2}{3} \cdot 2\dfrac{1}{4}$

Шаг 1: Переводим в неправильные дроби: $$1\frac{2}{3} = \frac{5}{3}, \quad 2\frac{1}{4} = \frac{9}{4}$$

Шаг 2: Сокращаем: 9 и 3 делятся на 3. $$\frac{5}{\cancel{3}^1} \cdot \frac{\cancel{9}^3}{4} = \frac{5 \cdot 3}{1 \cdot 4} = \frac{15}{4} = 3\frac{3}{4}$$

Ответ: $3\dfrac{3}{4}$


Пример 3 (ML-контекст): Цепные вероятности в байесовском выводе

В наивном байесовском классификаторе вероятность сообщения является спамом вычисляется как произведение условных вероятностей:

$$P(\text{spam} | \text{слова}) \propto P(\text{spam}) \cdot P(\text{слово}_1|\text{spam}) \cdot P(\text{слово}_2|\text{spam}) \cdots$$

Допустим: - $P(\text{spam}) = \dfrac{1}{5}$ (20% писем — спам) - $P(\text{“деньги”}|\text{spam}) = \dfrac{3}{4}$ (75% спама содержит слово “деньги”) - $P(\text{“срочно”}|\text{spam}) = \dfrac{2}{3}$ (66% спама содержит слово “срочно”)

$$P = \frac{1}{5} \cdot \frac{3}{4} \cdot \frac{2}{3}$$

Разберём по шагам:

Шаг 1: $\dfrac{1}{5} \cdot \dfrac{3}{4} = \dfrac{3}{20}$

Шаг 2: $\dfrac{3}{20} \cdot \dfrac{2}{3}$. Сокращаем 3 и 3: $$\frac{\cancel{3}^1}{20} \cdot \frac{2}{\cancel{3}^1} = \frac{2}{20} = \frac{1}{10}$$

Ответ: $P = \dfrac{1}{10} = 0.1$. Вероятность 10% при данных условиях.

Почему это важно: Именно так работают наивные байесовские классификаторы в спам-фильтрах, классификации текстов, медицинской диагностике. Множество умножений дробей.


Пример 4 (ML-контекст): Weight decay (L2-регуляризация)

В обновлении весов с L2-регуляризацией: $$w{\text{new}} = w{\text{old}} \cdot \left(1 - \eta \lambda\right) - \eta \cdot \nabla L$$

Если $\eta = \dfrac{1}{100}$ и $\lambda = \dfrac{1}{10}$, то: $$\eta \lambda = \frac{1}{100} \cdot \frac{1}{10} = \frac{1}{1000}$$ $$1 - \frac{1}{1000} = \frac{999}{1000}$$

Каждую итерацию вес умножается на $\dfrac{999}{1000} = 0.999$ — постепенно «усыхая». Вот почему это называется weight decay. Это буквально умножение дроби на дробь в каждом шаге градиентного спуска.


Почему умножение дробей проще сложения

Разберёмся, почему не нужен НОК. При сложении $\dfrac{1}{3} + \dfrac{1}{4}$ мы спрашиваем: «Сколько одинаковых кусков вместе?» — и нам нужна единая «единица». При умножении $\dfrac{1}{3} \cdot \dfrac{1}{4}$ мы спрашиваем: «Какая часть части?» — и здесь знаменатели просто множатся, образуя новую «единицу» $\dfrac{1}{12}$.


Блок 4. Деление дробей

На пальцах: почему нужно перевернуть?

Давай разберёмся с нуля. Деление — это обратная операция к умножению. Вопрос $6 \div 2$ означает: «На какое число нужно умножить 2, чтобы получить 6?» Ответ: на 3.

Аналогично, $\dfrac{1}{2} \div \dfrac{1}{4}$ означает: «На какое число нужно умножить $\dfrac{1}{4}$, чтобы получить $\dfrac{1}{2}$?»

$$? \cdot \frac{1}{4} = \frac{1}{2}$$ $$? = \frac{1}{2} \cdot 4 = 2$$

Ответ: 2. А $\dfrac{1}{2} \div \dfrac{1}{4} = \dfrac{1}{2} \cdot \dfrac{4}{1} = 2$. Вот откуда берётся переворот — это буквально умножение на обратное число.

Обратное число (reciprocal): для $\dfrac{c}{d}$ обратное число — это $\dfrac{d}{c}$ (перевернули). Их произведение = 1: $\dfrac{c}{d} \cdot \dfrac{d}{c} = 1$.

Правило деления дробей: $$\frac{a}{b} \div \frac{c}{d} = \frac{a}{b} \cdot \frac{d}{c} = \frac{a \cdot d}{b \cdot c}$$

Запомни: «Переворачивай делитель и меняй ÷ на ×»


Примеры с подробным разбором

Пример 1 (простой): $\dfrac{4}{5} \div \dfrac{2}{3}$

Шаг 1: Переворачиваем делитель ($\dfrac{2}{3}$ → $\dfrac{3}{2}$) и меняем знак: $$\frac{4}{5} \cdot \frac{3}{2}$$

Шаг 2: Сокращаем: 4 и 2 делятся на 2: $$\frac{\cancel{4}^2}{5} \cdot \frac{3}{\cancel{2}^1} = \frac{2 \cdot 3}{5 \cdot 1} = \frac{6}{5} = 1\frac{1}{5}$$

Ответ: $1\dfrac{1}{5}$


Пример 2 (средний): $2\dfrac{2}{5} \div 1\dfrac{1}{3}$

Шаг 1: Переводим в неправильные дроби: $$2\frac{2}{5} = \frac{12}{5}, \quad 1\frac{1}{3} = \frac{4}{3}$$

Шаг 2: Переворачиваем делитель и умножаем: $$\frac{12}{5} \cdot \frac{3}{4}$$

Шаг 3: Сокращаем 12 и 4 на 4: $$\frac{\cancel{12}^3}{5} \cdot \frac{3}{\cancel{4}^1} = \frac{9}{5} = 1\frac{4}{5}$$

Ответ: $1\dfrac{4}{5}$


Пример 3 (ML-контекст): Нормализация по норме (unit vector)

Когда нормализуют вектор embedding, делят каждую координату на норму: $$\hat{x}_i = \frac{x_i}{|\mathbf{x}|}$$

Это деление числа на число, но если $x_i$ и $|\mathbf{x}|$ — дроби, то это деление дроби на дробь.

Допустим: $x_1 = \dfrac{3}{5}$, $|\mathbf{x}| = \dfrac{6}{5}$. $$\hat{x}_1 = \frac{35}{65} = \frac{3}{5} \div \frac{6}{5} = \frac{3}{5} \cdot \frac{5}{6} = \frac{3 \cdot 5}{5 \cdot 6} = \frac{15}{30} = \frac{1}{2}$$

Ответ: $\hat{x}_1 = 0.5$ — нормализованная координата.


Пример 4 (ML-контекст): Скорость обучения по длине градиента (gradient clipping)

В gradient clipping, если норма градиента превышает порог, делим градиент на его норму: $$g_{\text{clipped}} = g \cdot \frac{\text{threshold}}{|g|}$$

Если $\text{threshold} = \dfrac{1}{2}$ и $|g| = \dfrac{5}{4}$: $$\frac{\text{threshold}}{|g|} = \frac{12}{54} = \frac{1}{2} \cdot \frac{4}{5} = \frac{4}{10} = \frac{2}{5}$$

Градиент масштабируется на $\dfrac{2}{5} = 0.4$. Вот как работает gradient clipping — и в его основе деление дробей!


Почему это важно: деление как инверсия в линейной алгебре

В линейной алгебре (которая нужна для понимания нейросетей) деление матрицы $A$ на матрицу $B$ — это умножение $A$ на обратную матрицу $B^{-1}$. Это прямая аналогия деления дробей: $\dfrac{a}{b} = a \cdot b^{-1}$.

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


Блок 5. Комплексные операции: когда всё вместе

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

Порядок действий

Правило приоритета:
1. Скобки
2. Умножение и деление (слева направо)
3. Сложение и вычитание (слева направо)

Для дробей — те же правила, что и для целых чисел.


Пример 1: $\dfrac{1}{2} \cdot \dfrac{3}{4} + \dfrac{1}{3} \div \dfrac{2}{9}$

Шаг 1: Сначала умножение и деление.

Умножение: $\dfrac{1}{2} \cdot \dfrac{3}{4} = \dfrac{3}{8}$

Деление: $\dfrac{1}{3} \div \dfrac{2}{9} = \dfrac{1}{3} \cdot \dfrac{9}{2} = \dfrac{9}{6} = \dfrac{3}{2}$

Шаг 2: Теперь сложение. НОК(8, 2) = 8. $$\frac{3}{8} + \frac{3}{2} = \frac{3}{8} + \frac{12}{8} = \frac{15}{8} = 1\frac{7}{8}$$

Ответ: $1\dfrac{7}{8}$


Пример 2 (ML-контекст): Формула обновления momentum в SGD

Оптимизатор SGD с momentum обновляет веса по формуле: $$vt = \beta \cdot v{t-1} + (1 - \beta) \cdot \nabla L$$ $$wt = w{t-1} - \eta \cdot v_t$$

Вычислим с конкретными дробями: $\beta = \dfrac{9}{10}$, $v{t-1} = \dfrac{1}{5}$, $\nabla L = \dfrac{3}{4}$, $\eta = \dfrac{1}{20}$, $w{t-1} = \dfrac{7}{10}$.

Шаг 1: Вычисляем $v_t$.

$\beta \cdot v_{t-1} = \dfrac{9}{10} \cdot \dfrac{1}{5} = \dfrac{9}{50}$

$(1 - \beta) = 1 - \dfrac{9}{10} = \dfrac{1}{10}$

$(1-\beta) \cdot \nabla L = \dfrac{1}{10} \cdot \dfrac{3}{4} = \dfrac{3}{40}$

$v_t = \dfrac{9}{50} + \dfrac{3}{40}$. НОК(50, 40) = 200. $$v_t = \frac{36}{200} + \frac{15}{200} = \frac{51}{200}$$

Шаг 2: Вычисляем $w_t$.

$\eta \cdot v_t = \dfrac{1}{20} \cdot \dfrac{51}{200} = \dfrac{51}{4000}$

$w_t = \dfrac{7}{10} - \dfrac{51}{4000}$. НОК(10, 4000) = 4000.

$\dfrac{7}{10} = \dfrac{2800}{4000}$

$w_t = \dfrac{2800}{4000} - \dfrac{51}{4000} = \dfrac{2749}{4000} \approx 0.6873$

Ответ: Вес обновился с 0.7 до ≈ 0.687.

Вот почему momentum-оптимизаторы так работают: они «помнят» предыдущий градиент (через $\beta$) и плавно корректируют направление. Всё это — операции с дробями!


Практика: 30 заданий

Базовые (задания 1–10)

Задание 1: Вычисли $\dfrac{3}{7} + \dfrac{2}{7}$.


Задание 2: Вычисли $\dfrac{5}{8} - \dfrac{3}{8}$.


Задание 3: Вычисли $\dfrac{1}{4} + \dfrac{1}{6}$.


Задание 4: Вычисли $\dfrac{3}{4} \cdot \dfrac{8}{9}$.


Задание 5: Вычисли $\dfrac{5}{6} \div \dfrac{5}{12}$.


Задание 6: Вычисли $\dfrac{7}{10} - \dfrac{2}{5}$.


Задание 7: Вычисли $\dfrac{2}{3} \cdot \dfrac{3}{4} \cdot \dfrac{4}{5}$.


Задание 8: Найди НОК(12, 18, 24).


Задание 9: Вычисли $\dfrac{1}{2} + \dfrac{1}{3} + \dfrac{1}{6}$.


Задание 10: Вычисли $\dfrac{4}{9} \div \dfrac{8}{3}$.


Средние (задания 11–20)

Задание 11: Вычисли $\dfrac{5}{6} + \dfrac{3}{4} - \dfrac{1}{3}$.


Задание 12: Вычисли $2\dfrac{1}{4} - 1\dfrac{5}{6}$.


Задание 13 (ML): Precision модели = $\dfrac{7}{10}$, recall = $\dfrac{3}{5}$. Вычисли F1 = $\dfrac{2 \cdot P \cdot R}{P + R}$.


Задание 14: Вычисли $\left(\dfrac{2}{3} + \dfrac{1}{4}\right) \cdot \dfrac{6}{11}$.


Задание 15 (нормализация): Три признака: $x_1 = \dfrac{2}{3}$, $x_2 = \dfrac{5}{6}$, $x_3 = \dfrac{1}{2}$. Найди их среднее.


Задание 16: Реши уравнение: $\dfrac{x}{3} + \dfrac{x}{4} = 1$.


Задание 17: Вычисли $\dfrac{3}{8} \div \dfrac{9}{16} \cdot \dfrac{2}{3}$.


Задание 18 (dropout): Из 100 нейронов сначала $\dfrac{3}{10}$ выключается через dropout, затем из оставшихся ещё $\dfrac{1}{7}$. Какая доля нейронов осталась активной?


Задание 19: Упрости: $\dfrac{\dfrac{3}{4} - \dfrac{1}{6}}{\dfrac{5}{8} + \dfrac{1}{4}}$.


Задание 20 (train/test split): Датасет делится: $\dfrac{3}{5}$ — train, $\dfrac{1}{5}$ — validation, остаток — test. Какая доля идёт в test? Если всего 1500 примеров — сколько в каждом split?


Продвинутые (задания 21–30)

Задание 21 (cosine similarity): Два embedding-вектора: $$\mathbf{a} = \left(\frac{4}{5},\ \frac{3}{5}\right), \quad \mathbf{b} = \left(\frac{5}{13},\ \frac{12}{13}\right)$$ Оба единичные. Найди cosine similarity = $a_1 b_1 + a_2 b_2$.


Задание 22 (градиентный спуск с momentum): $v_0 = 0$, $\beta = \dfrac{4}{5}$, $\nabla L = \dfrac{1}{4}$. Найди $v_1$ и $v_2$.


Задание 23 (Bayes): $P(B|A) = \dfrac{2}{3}$, $P(A) = \dfrac{3}{8}$, $P(B) = \dfrac{1}{2}$. Найди $P(A|B) = \dfrac{P(B|A) \cdot P(A)}{P(B)}$.


Задание 24: Упрости выражение: $\dfrac{2}{3} \cdot \dfrac{9}{4} - \dfrac{1}{2} \div \dfrac{3}{4} + \dfrac{5}{6}$.


Задание 25 (взвешенное среднее): Четыре модели в ensemble с весами $\dfrac{1}{2}, \dfrac{1}{4}, \dfrac{1}{8}, \dfrac{1}{8}$ и accuracy $\dfrac{9}{10}, \dfrac{4}{5}, \dfrac{7}{10}, \dfrac{3}{5}$. Найди взвешенную accuracy.


Задание 26 (L1-нормализация): Вектор $\left(\dfrac{1}{2}, \dfrac{1}{3}, \dfrac{1}{6}\right)$. Проверь, что сумма = 1 (уже нормализован по L1).


Задание 27: Реши: $\dfrac{3}{x} + \dfrac{2}{5} = \dfrac{11}{15}$.


Задание 28 (learning rate schedule): Learning rate на шаге $t$: $\eta_t = \dfrac{\eta_0}{1 + \gamma \cdot t}$, где $\eta_0 = \dfrac{1}{10}$, $\gamma = \dfrac{1}{5}$. Найди $\eta_1$, $\eta_2$, $\eta_5$.


Задание 29 (attention): В механизме attention три ключа имеют scores $\dfrac{1}{2}, \dfrac{1}{3}, \dfrac{1}{6}$. Нормализуй, разделив каждый на сумму. Что получишь?


Задание 30 (финальное, комплексное): В одном шаге Adam-оптимизатора: $$w{\text{new}} = w - \frac{\eta}{\sqrt{\hat{v}} + \varepsilon} \cdot \hat{m}$$ Дано: $w = \dfrac{3}{4}$, $\eta = \dfrac{1}{100}$, $\hat{m} = \dfrac{1}{5}$, $\hat{v} = \dfrac{1}{25}$ (значит $\sqrt{\hat{v}} = \dfrac{1}{5}$), $\varepsilon = 0$ (для упрощения). Найди $w{\text{new}}$.


Частые ошибки

Ошибка 1: Складывать знаменатели
Неправильно: $\dfrac{1}{4} + \dfrac{1}{6} = \dfrac{2}{10} = \dfrac{1}{5}$
Правильно: $\dfrac{3}{12} + \dfrac{2}{12} = \dfrac{5}{12}$
Почему важно: Такая ошибка при подсчёте метрик даст совершенно неправильный результат. Например, неверная macro accuracy может привести к ложному выводу о качестве модели.


Ошибка 2: Переворачивать первую дробь при делении вместо второй
Неправильно: $\dfrac{3}{5} \div \dfrac{2}{7}$ → $\dfrac{5}{3} \cdot \dfrac{2}{7} = \dfrac{10}{21}$
Правильно: $\dfrac{3}{5} \cdot \dfrac{7}{2} = \dfrac{21}{10}$
Почему важно: В нормализации $\dfrac{x}{|x|}$ деление — это главная операция. Перевернуть не то — получишь вектор с неверной длиной, cosine similarity будет неверным.


Ошибка 3: Неправильный порядок операций
Неправильно: $\dfrac{1}{2} + \dfrac{1}{3} \cdot \dfrac{3}{4}$ — сначала сложить, потом умножить
Правильно: сначала умножение $\dfrac{1}{3} \cdot \dfrac{3}{4} = \dfrac{1}{4}$, потом $\dfrac{1}{2} + \dfrac{1}{4} = \dfrac{3}{4}$
Почему важно: В формулах ML типа $w - \eta \cdot g$ порядок операций критичен. Если сначала вычесть, а потом умножить — получишь совсем другой результат обновления весов.


Ошибка 4: Забыть сократить после умножения
Неправильно: Оставить $\dfrac{12}{36}$ как есть
Правильно: $\dfrac{12}{36} = \dfrac{1}{3}$
Почему важно: Несокращённые дроби быстро «раздуваются» в числах. При цепном применении (как в байесовских вычислениях) это приводит к числителям и знаменателям в тысячи — и к ошибкам округления.


Ошибка 5: Неправильный НОК (взять просто произведение вместо наименьшего)
Неправильно: НОК(6, 4) = 24 (взяли 6×4)
Правильно: НОК(6, 4) = 12
Почему важно: Ошибка в НОК не даёт неверный ответ (результат всё равно верный), но делает вычисления намного сложнее — работаешь с числами 24 вместо 12. В длинных расчётах это увеличивает шанс арифметической ошибки.


Ошибка 6: Смешивать сложение и умножение правил
Неправильно: $\dfrac{a}{b} + \dfrac{c}{d} = \dfrac{a+c}{b+d}$ (это «правило футболистов» — складывать всё подряд)
Правильно: $\dfrac{a}{b} + \dfrac{c}{d} = \dfrac{ad + bc}{bd}$
Почему важно: Это самая частая ошибка. Запомни: при сложении знаменатели НЕ складываются. При умножении — складываются (ну, умножаются). Это разные операции с разными правилами.


Главное запомнить

📝 Ключевые понятия

Сложение/вычитание одинаковых знаменателей: складываем/вычитаем только числители, знаменатель не трогаем: $\dfrac{a}{c} \pm \dfrac{b}{c} = \dfrac{a \pm b}{c}$

Сложение/вычитание разных знаменателей: ищем НОК, приводим обе дроби, только потом действуем с числителями.

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

Умножение — самая простая операция: числитель × числитель, знаменатель × знаменатель. НОК не нужен.

Лайфхак умножения: сокращай «по диагонали» до умножения — уменьшишь числа.

Деление на дробь = умножение на обратную дробь. Переворачивай делитель (вторую дробь), меняй знак операции.

Порядок операций: скобки → умножение/деление (слева направо) → сложение/вычитание (слева направо). Как в целых числах!

Смешанные числа в операциях: всегда сначала переводи в неправильные дроби, потом считай.

В ML все четыре операции нужны одновременно: формула Adam использует все четыре в одном шаге обновления весов.

Сумма вероятностей = 1 — это свойство сложения дробей: правильные дроби, покрывающие все исходы, в сумме дают 1. Фундамент теории вероятностей.


Лайфхаки и полезные трюки

1. «Диагональное сокращение» перед умножением
Перед тем как умножать, посмотри: числитель первой дроби и знаменатель второй делятся на что-то общее? Сокращай сразу.
Пример: $\dfrac{15}{8} \cdot \dfrac{4}{25}$: 15 и 25 делятся на 5, 4 и 8 делятся на 4. Результат сразу $\dfrac{3}{10}$ без промежуточных вычислений.

2. «Телескопическое» произведение
Если дроби выстроены в цепочку $\dfrac{1}{2} \cdot \dfrac{2}{3} \cdot \dfrac{3}{4} \cdot \ldots \cdot \dfrac{n-1}{n}$, все средние сокращаются и остаётся только $\dfrac{1}{n}$. Это часто встречается в вероятностных цепочках!

3. Деление на натуральное число = умножение на его обратное
$\dfrac{3}{4} \div 6 = \dfrac{3}{4} \cdot \dfrac{1}{6} = \dfrac{3}{24} = \dfrac{1}{8}$. Не надо помнить отдельное правило — это частный случай деления дробей.

4. Быстрое приведение к общему знаменателю для двух дробей
Если не хочется искать НОК — просто умножь числитель первой на знаменатель второй и наоборот:
$\dfrac{a}{b} + \dfrac{c}{d} = \dfrac{ad + bc}{bd}$ — работает всегда, хотя иногда нужно ещё сократить в конце.

5. Проверка сложения: переводи в десятичные
Посчитал $\dfrac{5}{6} + \dfrac{3}{8}$? Быстрая проверка: $0.833 + 0.375 = 1.208$. Твой ответ $\dfrac{29}{24} = 1.208$? ✅
Держи в уме «десятичный эквивалент» как контрольный.

6. При виде формулы ML — раскладывай на операции с дробями
Увидел страшную формулу типа RMSProp? Разложи её пошагово, заменив переменные конкретными дробями. Вычисли по шагам вручную хотя бы один раз. После этого формула перестанет быть страшной навсегда.


Связь с другими темами

Что нужно было знать до этого урока: - Понятие дроби, числитель и знаменатель — без этого нельзя делать операции - Умножение и деление целых чисел — нужно для нахождения НОК и сокращений

Что изучить дальше: - Десятичные дроби — это те же дроби, только со знаменателями 10, 100, 1000… Все float в Python — это десятичные дроби - Проценты — частный случай дробей со знаменателем 100; accuracy 87% = $\dfrac{87}{100}$ - Алгебраические дроби — то же самое, но числитель и знаменатель содержат переменные $x$; база для понимания рациональных функций - Теория вероятностей — все вероятности — дроби, правило условной вероятности и теорема Байеса — операции над ними

Где это нужно в жизни:

💻 В программировании: Каждый float в Python — дробь в двоичном представлении. Операции с float — это операции с дробями. Понимание помогает избегать ошибок накопления погрешности.

🤖 В ML/AI (конкретно): - Сложение — macro-average метрик, суммирование вероятностей в смесях распределений - Вычитание — residual connections (ResNet), вычисление ошибки предсказания - Умножение — цепные вероятности (Naive Bayes), learning rate × gradient, weight decay - Деление — нормализация (Min-Max, L1, L2), softmax, batch normalization

📊 В Data Science: Нормализация фичей, class imbalance ratio, веса классов в loss function, sample weights в обучении — всё это операции с дробями.

🔬 В статистике: Формула Байеса $P(A|B) = \dfrac{P(B|A) P(A)}{P(B)}$ — это деление произведения дробей на дробь. Вся байесовская статистика стоит на этой формуле.


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

💡 Алгоритм Евклида — 2300 лет и не устарел. Метод нахождения НОД (наибольшего общего делителя), который мы используем для сокращения дробей, придумал Евклид около 300 г. до н.э. Сегодня этот алгоритм используется в RSA-шифровании, которое защищает все HTTPS-соединения. Математика из античности в твоём браузере.

💡 Adam-оптимизатор — это 4 операции с дробями. Алгоритм Adam (2014), ставший стандартом обучения нейросетей, в каждом шаге выполняет: два умножения (обновление моментов), одно деление (нормализация на корень из дисперсии), одно вычитание (обновление веса). Четыре операции из этого урока — и ничего больше.

💡 «Правило 80/20» — это дробь. Принцип Парето ($\dfrac{4}{5}$ результатов от $\dfrac{1}{5}$ усилий) используется в ML для работы с class imbalance. Дроби — это язык, на котором описывается неравенство распределений.

💡 Softmax — обобщение нормализации дробей. Если у тебя есть дроби $\dfrac{a}{a+b+c}$, $\dfrac{b}{a+b+c}$, $\dfrac{c}{a+b+c}$ — это самая простая версия softmax при $e^x = x$ (линейный случай). Настоящий softmax просто заменяет $a$ на $e^a$ для численной устойчивости и «заострения» распределения.


💡 Совет: Не пытайся «выучить правила» действий с дробями как заклинания. Вместо этого каждый раз объясняй себе, почему правило именно такое. Почему при сложении нужен НОК? Потому что разные знаменатели — разные единицы. Почему при делении переворачиваем? Потому что делить на $\dfrac{c}{d}$ — то же самое, что умножать на $\dfrac{d}{c}$. Понимание — это лучшая память.

Следующий шаг: Возьми любую формулу из документации PyTorch (например, AdamW) и попробуй вычислить один шаг вручную с конкретными числами-дробями. Это лучший способ закрепить материал и одновременно понять, как работает оптимизатор. 🚀

Есть вопросы?

Задай вопрос AI-учителю в Telegram

🤖 Открыть бота →
💬 Есть вопрос? Спроси бота!