Дифференциальное и матричное исчисление

Производная как линейная аппроксимация

Не «скорость изменения», а лучшая линейная модель функции рядом с точкой

Шаг 23 из 117 · ~28 мин

Определение, из которого всё следует

Обычное определение — предел разностного отношения:

f(x)=limh0f(x+h)f(x)hf'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h}

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

f(x+h)=f(x)+f(x)h+o(h)f(x + h) = \htmlData{k=f}{f(x)} + \htmlData{k=lin}{f'(x)\,h} + \htmlData{k=rest}{o(h)}

Читается так: приращения — это f(x)hf'(x)h, а стремится к нулю быстрее самого hh. Производная — это тот единственный коэффициент, при котором так получается.

Такая формулировка переносится дословно: в многомерном случае вместо числа f(x)f'(x) будет матрица, а деления нигде нет. Именно поэтому здесь стоит потратить время на смену точки зрения.

Секущая становится касательной

Разностное отношение — наклон секущей через точки xx и x+hx+h. Производная — предел этих наклонов. Включите секущую и уменьшайте зазор:

x
0.8
f(x)
0.64
f'(x)
1.6
Производная 2x меняется линейно, поэтому наклон касательной равномерно растёт. В нуле касательная горизонтальна — это минимум.

Обратите внимание на x|x|: производная существует не всегда. Слева и справа наклоны разные, значит единой линейной аппроксимации нет. Это ровно та ситуация, которая позже возникнет с ReLU.

Правила

Три правила, из которых собирается всё остальное:

  • произведение: (fg)=fg+fg(fg)' = f'g + fg'
  • частное: (fg)=fgfgg2\left(\frac{f}{g}\right)' = \frac{f'g - fg'}{g^2}
  • цепочка: (fg)(x)=f(g(x))g(x)(f \circ g)'(x) = f'(g(x))\, g'(x)

Правило цепочки — самое важное во всём блоке. Смысл: коэффициенты линейных приближений перемножаются. Если внутренняя функция растягивает приращение в gg' раз, а внешняя — ещё в ff' раз, суммарное растяжение есть произведение.

Именно из этого и вырастет backprop, где перемножаются матрицы вместо чисел.

Предел и непрерывность — на уровне интуиции

Формальные ε\varepsilonδ\delta в этом плане не нужны, но словарь нужен.

Предел limxaf(x)=L\lim_{x \to a} f(x) = L означает: значения ff подходят к LL как угодно близко, если xx достаточно близко к aa. Про саму точку aa утверждение ничего не говорит — и именно поэтому предел разностного отношения имеет смысл, хотя в h=0h = 0 дробь не определена.

Непрерывность в точке — это limxaf(x)=f(a)\lim_{x \to a} f(x) = f(a): предел существует и совпадает со значением.

Связь односторонняя и её стоит помнить: дифференцируемость влечёт непрерывность, но не наоборот. x|x| непрерывна в нуле и не дифференцируема — это и есть контрпример.

Условие первого порядка

Если xx^* — точка локального экстремума и ff дифференцируема, то f(x)=0f'(x^*) = 0.

Причина понятна из линейной аппроксимации: при f(x)0f'(x^*) \ne 0 линейная часть f(x)hf'(x^*)h меняет знак вместе с hh, значит в одну сторону функция растёт, в другую убывает — экстремума нет.

Обратное неверно. У x3x^3 в нуле производная равна нулю, а экстремума нет — переключитесь на неё в графике выше и убедитесь. Такие точки называются критическими, и разбираться, что в них происходит, будет вторая производная.

Вся оптимизация в блоке 5 — это поиск точек, где градиент равен нулю. Стоит уже здесь усвоить, что это условие необходимое, но не достаточное.

Источники

Проверки

0 из 2
  1. Что такое производная

    Отметьте все верные утверждения.

  2. Численная производная

    Реализуйте central_difference(coeffs, x, h) — оценку производной многочлена центральной разностью.

    coeffs задаёт многочлен по возрастанию степеней: [a0, a1, a2, ...] означает a0+a1x+a2x2+a_0 + a_1x + a_2x^2 + \ldots Сначала напишите вычисление значения в точке, затем примените

    f(x)f(x+h)f(xh)2hf'(x) \approx \frac{f(x+h) - f(x-h)}{2h}

    Почему именно центральная разность, а не f(x+h)f(x)h\frac{f(x+h) - f(x)}{h}: у односторонней ошибка порядка hh, у центральной — порядка h2h^2. В разложении Тейлора линейные члены ошибки взаимно уничтожаются, и остаётся квадратичный. Это тот самый приём, которым в конце блока будем проверять свой автоград.

    функция central_difference

    Загрузка редактора…

    Ctrl/⌘ + Enter