Зачем производная без деления
Что построили предыдущие главы
Часть V строит анализ слой за слоем. Глава 5.1 ввела расстояние и показала, что между процессами оно само есть процесс. Глава 5.2 построила топологию: открытые шары, окрестности, компактность. Глава 5.3 определила непрерывность — через -, доказала теорему о промежуточном значении бисекцией и теорему об экстремуме сеткой. К этому моменту у нас есть аппарат, которым можно сказать: функция непрерывна — её значения не делают скачков.
Производная — следующий слой. Она отвечает не на вопрос <<делает ли функция скачки>>, а на вопрос <<с какой скоростью она меняется>>. От непрерывности к гладкости: от того, что приращение мало при малом шаге, к тому, что приращение линейно по шагу с точностью до поправки высшего порядка. Непрерывность уже дала нам --язык; производная надстраивается прямо над ним, и потому глава многократно будет ссылаться на § 5.3.
Деление и предел как проблема
Классическое определение производной выглядит так:
Прежде чем переносить его в ToS, стоит точно понять, что здесь составляет трудность, а что — нет.
Не составляет трудности деление на ненулевой рациональный шаг. Если — конкретное ненулевое рациональное число, то — совершенно законное рациональное выражение; ничего проблемного в нём нет, и ниже в этой главе мы будем таким делением свободно пользоваться.
Трудность — в другом, и она двойная. Во-первых, классическое определение делает первичным объектом предел отношения при . Но при этом пробегает значения, стремящиеся к нулю, а на нуль делить нельзя; чтобы предел был определён, нужно рассматривать частное на всё более мелких шагах и переходить к пределу. Во-вторых, сам этот предел — завершённый объект <<>>, а завершённых пределов под нет: <<действительное>> в ToS само есть процесс. Нужна формулировка, в которой предел частного при не стоит на месте первичного определения.
Division-free критерий: {Division-free критерий: o(h)}
Первый слой производной в ToS — это критерий: правило, отвечающее на вопрос <<какое число является производной функции в точке >>. И формулируем мы этот критерий без деления.
Идея проста. Сказать <<наклон в точке равен >> — значит сказать, что приращение хорошо приближается линейным выражением . Насколько хорошо? Так, что ошибка приближения мала по порядку : меньше любой наперёд заданной доли от . Запишем это:
Деления здесь нет. Есть оценка вида — ошибка линейного
приближения убывает быстрее, чем сам шаг. В Rocq это определение
носит имя has_derivative и записано в файле
Differentiation.v:
Definition has_derivative (f : Q -> Q) (x L : Q) : Prop :=
forall eps : Q, 0 < eps ->
exists delta : Q, 0 < delta /\
forall h : Q, 0 < Qabs h -> Qabs h < delta ->
Qabs (f (x + h) - f x - L * h) < eps * Qabs h.Прочтём внимательно. — линейное приближение приращения. Разность — ошибка этого приближения. Критерий требует, чтобы ошибка была меньше — то есть сколь угодно малой долей шага — коль скоро шаг достаточно мал. Предел тут присутствует не как завершённый объект, а как --квантор — ровно тот же приём, которым в § 5.3 определялась --непрерывность. Критерий говорит, какое есть производная, не делая предел частного первичным.
Отметим точно уровень типа (предохранитель Части V). Здесь — функция, переводящая рациональное число в рациональное.
Это не процесс и не функция на фактор-классах
RealPoint; глава работает с рационально-значными функциями
рационального аргумента, и это honest-ограничение названо сразу.
Ещё одна деталь требует слова. Шаг берётся ненулевым:
условие записано как . Главная причина — содержательная:
производная проверяет поведение функции при малых ненулевых
сдвигах, то есть в проколотой окрестности точки . Нулевой
шаг неинформативен: при оценка обращается в слева и
истинна тривиально, локального содержания она не несёт. В коде
ненулевость вдобавок помогает обойти технические тонкости
рационального представления и отношения Qeq — но это
вторичный мотив, а не основной. Тот же приём применялся к
continuous_at в § 5.3; это сознательная деталь, не
недосмотр.
Производная-процесс: deriv_process и мост{Производная-процесс: deriv_process и мост}
Критерий § 4.1.3 говорит, какое число является производной. Но сам он не вычисляет: это предикат, проверка, а не построение. Для вычислительной стороны нужен второй слой — производная как процесс.
Идея процессного слоя прямо отвечает онтологии . Вместо того чтобы говорить о пределе при , мы фиксируем конкретную убывающую последовательность ненулевых шагов
и на каждом шаге считаем обычное разностное отношение. Получаем
процесс: на уровне — рациональное число
. Под производная — не
завершённый предел этого процесса, а сам процесс пошаговых
рациональных приближений наклона. В файле ProcessDerivative.v
это записано так:
Definition deriv_step (n : nat) : Q :=
1 / inject_Z (Z.of_nat (S n)).
Definition deriv_process (f : Q -> Q) (x : Q) : RealProcess :=
fun n =>
let h := deriv_step n in
(f (x + h) - f x) / h.{
Здесь деление есть — но это деление на , а заведомо
положительно: лемма deriv_step_pos устанавливает для
всякого . Это законное деление на ненулевой рациональный шаг, а не
запретный предел при . На простейших функциях процесс ведёт себя
ожидаемо: deriv_process_const показывает, что для константы
он эквивалентен постоянному процессу , а
deriv_process_id — что для тождества он
эквивалентен постоянному процессу .}
{ Два слоя — критерий и процесс — связывает мост: теорема
deriv_process_converges. Она утверждает: если есть
производная в точке в смысле критерия has_derivative,
то процесс разностных отношений эквивалентен постоянному процессу :
Содержательно мост говорит: division-free критерий и вычислительный
процесс согласованы — число , удовлетворяющее критерию,
есть в точности то, к чему сходится процесс разностных отношений.
Доказательство прямое: критерий даёт , лемма
deriv_step_vanishes находит уровень , начиная с которого
, и тогда
. Из моста немедленно следуют ещё два факта:
deriv_process_cauchy (процесс разностных отношений есть
процесс Коши) и derivative_is_process_construction
(производная предъявляется как Коши-процесс, эквивалентный
постоянному — E/R/R-форма результата).}
Стоит развести три статуса, чтобы дальше не путать (предохранитель
Части V). has_derivative — это критерий, предикат.
deriv_process — это процесс, конструкция.
deriv_process_converges — это теорема-мост между
ними. Три разные вещи, и глава всякий раз будет указывать, о которой
речь.
И здесь же — важная оговорка о том, чем deriv_process
не является. Сам по себе процесс разностных отношений — это
кандидат на производную, а не полное определение
дифференцируемости. Он берёт одну фиксированную последовательность
положительных шагов — то есть, по сути, это
правосторонний процесс разностных отношений. Поэтому его сходимость
сама по себе не заменяет двусторонний критерий
has_derivative, который проверяет все малые ненулевые
, в обе стороны. Классический контрпример — функция в
нуле: правосторонние разностные отношения сходятся к , но
двусторонней производной нет (к этому примеру глава вернётся в
§ 4.3.3). Полный смысл производной задаёт именно
has_derivative; теорема deriv_process_converges
утверждает лишь одно направление — если производная
существует в division-free смысле, то выбранный процесс разностных
отношений к ней сходится. Определять дифференцируемость как << процесс
deriv_process есть процесс Коши >> было бы ошибкой.
Про статус аксиом: ProcessDerivative.v в шапке заявляет
<< 0 axioms, 16 Qed >>; он импортирует ProcessCore,
ProcessArithmetic и Differentiation. К сквозной
оговорке о том, что заголовок файла не заменяет аудита конкретной
теоремы, глава вернётся в § 4.8.
Разбор E/R/R: производная как система
Производная — система, и к ней приложима методология E/R/R
(Часть I). Разбор разворачивает разметку из заголовка опорного файла,
где она дана прямо: элементы — разностные отношения; роль —
Cauchy-процесс, сходящийся к наклону; правило — условие
has_derivative.1 Ведём разбор в онтологическом порядке
Rules Roles Elements. Оговорка о статусе — та же, что в
Главах 5.1–5.3: речь о функциях , не об отображениях
фактор-классов; <<система>> — содержательная онтологическая
интерпретация, не объект System .
Rules — правила (закон ). Конституция
производной — division-free критерий
(has_derivative, § 4.1.3): ошибка линейного приближения
меньше . Это правило говорит, какое число
есть наклон, не делая предел частного первичным. К конституции
примыкает конкретный слой — правила дифференцирования (линейность
§ 4.2, произведение и степень § 4.4), мост между критерием и
процессом (§ 4.1.4) и единственность наклона (§ 4.5.1). Над у
правил есть усиление: для теоремы о среднем нужна не поточечная,
а равномерная дифференцируемость (udiff_on, § 4.6) —
та же перестановка кванторов, что отличала равномерную непрерывность в
§ 5.3.
Roles — значимость позиций (закон ). Центральная роль — наклон: коэффициент линейного приближения, который дифференцирование присваивает функции в точке. По эта роль структурно обоснована: критерий выделяет наклон однозначно (единственность, § 4.5.1). Вычислительную сторону роли несёт процесс разностных отношений — Cauchy-процесс, сходящийся к наклону (так роль и названа в заголовке файла). Сама функция при этом получает одну из качественных позиций: дифференцируема, равномерно дифференцируема.
Elements — носители (закон и принцип ). Элементы — функции , а в процессе — разностные отношения при . По наклон, если существует, тождественен себе (единствен). По носители процесса конечны на каждом шаге — рациональные разностные отношения, обозримые на любом уровне; завершённого <<предела при >> нет, производная актуальна как процесс приближений наклона.
Сведём разбор в таблицу.
| Компонент | Что фиксирует | E/R/R |
|---|---|---|
| функции ; разностные отношения | носители | Element |
| наклон ; процесс, сходящийся к наклону | роли | Role |
-критерий has_derivative | конституция (division-free) | Rule (конструкт.) |
| линейность, произведение, степень | правила дифференцирования | Rule (конструкт.) |
| мост критерий–процесс; единственность наклона | согласование | Rule |
равномерная дифференцируемость (udiff) | усиление для среднего | Rule |
| законы – | универсальный слой | Rule (универс.) |
Хорошая сформированность. Разметка однозначна: функции и разностные отношения суть элементы, наклон — роль, критерий — правило. Производная как роль определена корректно: критерий выделяет наклон единственным (§ 4.5.1) — это для роли. Самореференции нет: критерий квантифицирует по шагам и стоит над значениями функции — по операция выше операндов. Производная хорошо сформирована.
Разбор проясняет устройство главы. Два слоя — критерий и процесс — это различение правила и носителя: -критерий (Rule) говорит, что есть наклон, а процесс разностных отношений (Element-конструкция) его приближает; мост § 4.1.4 их связывает. Отсюда и предостережение § 4.1.4 о функции : односторонний процесс — лишь кандидат-носитель, а определяет производную именно двусторонний критерий-правило. А липшицевость § 4.7.3 показывает, как Rules производной порождают то, что в § 5.3 приходилось требовать для непрерывности. И тот же разбор задаёт образец Части V: каждое аналитическое понятие читается как система со своей E/R/R-структурой.
Замысел главы
Дальше глава движется так. § 4.2 — базовые правила дифференцирования: производная константы, тождества, линейность. § 4.3 — связь с § 5.3: дифференцируемость влечёт непрерывность. § 4.4 — произведение и степень, главные нелинейные правила. § 4.5 — единственность производной и приложение к оптимизации: теорема Ферма. § 4.6 — теорема о среднем через <<walk-точки>>. § 4.7 — следствия теоремы о среднем: монотонность, липшицевость. § 4.8 — итог.
{ Опорных файлов три. Differentiation.v — division-free
критерий и правила. ProcessDerivative.v — производная как
процесс и мост к критерию. MeanValueTheorem.v — сеточная
теорема о среднем и её следствия. Все три в своих шапках заявляют
статус << AXIOMS: none >>; точную оговорку о том, что этот заголовок
означает и чего не означает, глава даёт в § 4.8.}
Базовые правила дифференцирования
Производная не зависит от записи функции
Прежде чем доказывать содержательные правила, стоит зафиксировать две <<гигиенические>> леммы. Они говорят, что производная — свойство функции и числа, а не их синтаксической записи.
Первая лемма — экстенсиональность по функции. Если две функции
и поточечно равны, то есть для всякого , то
производная одной есть производная другой. В Differentiation.v
это has_derivative_ext: из forall w, f w == g w и
has_derivative f x L следует has_derivative g x L.
Доказательство очевидно — разность поточечно равна
, и оценка переносится без изменений.
Вторая лемма — экстенсиональность по значению производной. Если
как рациональные числа (в смысле Qeq), то есть
производная всякий раз, когда есть производная. Это
has_derivative_eq. Вместе обе леммы означают: понятие
<<производная>> корректно определено — оно не различает поточечно
равные функции и не различает Qeq-равные значения. Дальше мы
этим пользуемся не оговариваясь.
Простейшие случаи: константа и тождество
Два простейших правила задают базу для всего остального.
Производная константы есть нуль. Если — постоянная функция
, то её производная в любой точке равна . В коде это
deriv_const. Доказательство тривиально: ошибка линейного
приближения здесь
то есть тождественно нулевая, и неравенство выполнено при любом положительном и ненулевом . Содержательно: постоянная функция не меняется, её скорость изменения — нуль.
Производная тождества есть единица. Для функции
производная в любой точке равна — это deriv_id. Ошибка
приближения опять тождественно нулевая:
Содержательно: тождественная функция меняется с той же скоростью, с
какой меняется аргумент. Эти два правила — deriv_const и
deriv_id — послужат базой индукции в § 4.4.3, где из них
вырастет степенное правило.
Линейность производной
Дифференцирование — линейная операция. Это означает четыре правила,
собранные в SECTION 2 файла Differentiation.v.
Производная скалярного кратного: . Если
есть производная , то есть производная функции — это deriv_scale. Производная противоположной
функции: — это deriv_neg. Производная суммы:
— это deriv_sum. Производная разности:
— это deriv_sub.
Приём доказательства суммы стоит назвать, он типичен для всей главы. Ошибка линейного приближения суммы раскладывается на две ошибки:
Каждое слагаемое мало по своей производной; чтобы их сумма уложилась в , для каждого берётся оценка с , и неравенство треугольника для модуля собирает результат. Этот приём дробления на части — общий для всех правил, где приращение распадается на сумму.
Отметим экономию средств. Правило разности deriv_sub не
доказывается заново: оно выводится из deriv_sum и
deriv_neg через экстенсиональные леммы § 4.2.1 — разность
переписывается как сумма , и результат переносится.
Каждое следующее правило встаёт поверх уже доказанных, а не строится с
нуля.
Линейность переносится и в процессный слой. Файл
ProcessDerivative.v поднимает сумму и скалярное кратное в
процессную форму: deriv_sum_process утверждает, что процесс
разностных отношений суммы эквивалентен постоянному процессу
, а deriv_scale_process — что процесс для
эквивалентен постоянному процессу . Оба
доказываются единообразно и коротко: применяется мост
deriv_process_converges, а затем соответствующее правило
deriv_sum или deriv_scale из
Differentiation.v. То есть процессные правила — надстройка
над правилами-критериями через мост § 4.1.4, а не отдельные
доказательства.
Что значит линейность для теории
Линейность производной — не случайное совпадение, а отражение
устройства самого определения. В критерии has_derivative
приближающее выражение — это , и оно линейно по .
Дифференцирование сопоставляет функции её линейное приближение; и
коль скоро приближение линейно, линейные операции над функциями
переходят в линейные операции над приближениями. Сумма функций даёт
сумму наклонов, скалярное кратное — кратный наклон.
Стоит, однако, заранее предупредить: на этом линейность кончается. Произведение двух функций линейным правилом не описывается — наклон произведения не есть произведение наклонов. Почему так и каким правилом произведение всё же описывается — предмет § 4.4.
Дифференцируемость влечёт непрерывность
Гладкое — это непрерывное
Глава 5.3 ввела непрерывность; настоящий раздел связывает её с
производной. Утверждение простое: если функция дифференцируема в
точке, то она в этой точке непрерывна. В Differentiation.v
это deriv_implies_continuous: из has_derivative f x L следует continuous_at f x, где continuous_at —
определение непрерывности из § 5.3.
Содержательно связь очевидна. Если приращение приближается линейным с ошибкой порядка , то само приращение мало при малом шаге: оно не больше суммы линейной части и малой ошибки. И то и другое стремится к нулю вместе с — значит, не делает скачка в точке .
Доказательство уточняет, как именно выбрать для непрерывности. Берётся как минимум двух величин: , доставленного критерием производной при , и числа . На таком шаге ошибка приближения меньше , а линейная часть — меньше ; сумма не превосходит , что по выбору меньше . Полный код приводить не будем — важна идея: непрерывности собирается из производной и поправки на величину наклона.
Ограниченность вблизи точки
Из непрерывности извлекается ещё один технический факт, который
понадобится в § 4.4. Лемма continuous_bounded_near
утверждает: непрерывная в точке функция ограничена в
некоторой проколотой окрестности — существуют число и радиус
, такие что при .
Доказательство короткое: непрерывность при даёт
, на котором ; тогда
, и за берётся . Сам по себе факт
скромный, но в § 4.4.2 он окажется существенным: в доказательстве
правила произведения множитель нужно будет чем-то
ограничить, и ограничит его именно эта лемма. Роль её названа заранее,
чтобы появление continuous_bounded_near в § 4.4 не
выглядело неожиданным.
Иерархия: гладкое непрерывное{Иерархия: гладкое в непрерывном}
Итог раздела — одна строчка иерархии: дифференцируемость строго
сильнее непрерывности. Всякая дифференцируемая функция непрерывна —
это deriv_implies_continuous. Обратное неверно. Стандартный
пример — функция в нуле: она непрерывна, но не
дифференцируема, поскольку слева приращение ведёт себя с наклоном
, а справа — с наклоном , и единого линейного приближения
нет. Над этот пример работает так же, как над .
Подаём именно как стандартную интуицию, а не как отдельную
Rocq-теорему: леммы вида << не дифференцируема в нуле >> в
Differentiation.v нет, и приписывать репозиторию её не
следует. Этот же пример наглядно показывает, почему процесс
deriv_process из § 4.1.4 — с одними лишь положительными
шагами — не может быть самостоятельным определением производной:
у в нуле правые разностные отношения сходятся к , и процесс
deriv_process был бы процессом Коши, тогда как двусторонней
производной нет. Полное определение даёт только двусторонний критерий
has_derivative. Содержательный итог таков: глава поднялась
на ступень — от непрерывности § 5.3 к гладкости. Дальше эта
ступень несёт правила дифференцирования.
Произведение и степень
Квадрат: прямой счёт
Прежде чем браться за общее правило произведения, полезна разминка —
производная квадрата. Утверждение: для функции
производная в точке равна . В коде это deriv_square.
Доказательство — прямой алгебраический счёт. Ошибка линейного приближения здесь
то есть ровно . Остаётся заметить, что , коль скоро — для чего за достаточно взять сам . Содержательно важно вот что: ошибка приближения квадрата — это в точности квадратичный остаток , и именно он уходит в . Этот сюжет — <<нелинейность даёт квадратичный остаток>> — повторится в общем правиле произведения.
Правило произведения
{ Главное нелинейное правило: производная произведения. Если имеет производную , а — производную , то функция имеет производную
В Differentiation.v это deriv_product — самое
длинное доказательство файла (SECTION 4, около ста пятидесяти
строк). Приводить его целиком не будем; назовём идею.}
Идея — алгебраическое разложение ошибки приближения на три слагаемых:
Каждое из трёх слагаемых оценивается величиной
— отсюда дробление на три
части. Слагаемое содержит ошибку приближения , помноженную на
; чтобы оценить его, множитель нужно ограничить — и
здесь работает лемма continuous_bounded_near из § 4.3.2,
заранее для этого приготовленная. Слагаемое оценивается через
непрерывность (разность мала). Слагаемое —
через производную (ошибка её приближения мала по порядку ).
Сумма трёх оценок по и неравенство
треугольника дают требуемое.
{ Это полная теорема, не сеточная и не приближённая версия
(предохранитель Части V). У правила есть и процессная форма:
deriv_product_process в ProcessDerivative.v
утверждает, что процесс разностных отношений произведения эквивалентен
постоянному процессу . Доказана она, как и
процессные правила § 4.2.3, через мост
deriv_process_converges и саму deriv_product —
снова надстройка, а не отдельное доказательство.}
Степенное правило индукцией
Из правила произведения вырастает степенное правило: для всякого
натурального производная функции в точке
равна . В коде это deriv_power_succ.
Доказательство — индукция по . База: при речь о производной
, то есть тождества, и правило даёт —
это deriv_id из § 4.2.2. Шаг: степень записывается
как произведение , к нему применяется правило
произведения — множитель даёт наклон , множитель —
наклон по предположению индукции, — и алгебра сводит
результат к .
Степень рационального числа — это Qpow, рекурсивная функция;
она построена не здесь, а раньше по цепочке зависимостей — в файле
SeriesConvergence.v. То есть возведение в степень глава
получает готовым. Содержательно deriv_power_succ —
бесконечное семейство правил, по одному на каждое , свёрнутое
индукцией в одну теорему.
Почему произведение ломает линейность
Стоит вернуться к предупреждению из § 4.2.4. Производная произведения не есть произведение производных: правило даёт , а не . Произведение нелинейно по самой своей природе, и дифференцирование это наследует.
Видно это и алгебраически. Перемножая два линейных приближения — и , — получаем
Линейная по часть — ровно , наклон из правила произведения. А член — квадратичный остаток, и именно он уходит в . Это тот же сюжет, что в § 4.4.1, где ошибка квадрата оказалась равной : всякий раз, как приближение первого порядка взаимодействует с самим собой через умножение, появляется остаток порядка , и определение ровно для того и устроено, чтобы такой остаток поглощать.
Единственность и теорема Ферма
Производная единственна
Критерий has_derivative проверяет, является ли данное число
производной. Но не может ли критерию удовлетворять сразу несколько
разных чисел? Лемма deriv_unique отвечает: нет. Если и ,
и суть производные в точке , то (в смысле
Qeq).
{ Доказательство — от противного. Пусть ; тогда , и можно взять . Оба критерия — для и для — доставляют свои оценки ошибки; складывая их и применяя неравенство треугольника, получаем для подходящего ненулевого
что невозможно. Значит, . Содержательно: линейное приближение
приращения, если оно вообще существует, ровно одно — поэтому оборот
<<производная в точке >> корректен, он называет единственный
объект. Процессная форма этого факта — deriv_process_unique
в ProcessDerivative.v: два постоянных процесса, отвечающих
двум производным одной функции, эквивалентны. По разбору § 4.1.5 это
-корректность роли <<наклон>>: производная определена однозначно.}
Аффинная функция и квадратичная потеря
Перед теоремой Ферма — две подготовительные производные из
SECTION 5 файла. Производная аффинной функции в любой точке равна — это deriv_affine;
ошибка линейного приближения здесь тождественно нулевая. Производная
квадратичной потери: для функции производная
в точке равна — это
quadratic_loss_derivative, прямой счёт в духе § 4.4.1.
Квадратичная потеря — модельная целевая функция: её минимум достигается при , и она будет нужна в § 4.5.4 как пример для градиентного спуска.
Теорема Ферма: минимум зануляет производную
Главный результат раздела — теорема Ферма. Если функция имеет в
точке локальный минимум и дифференцируема в этой точке, то её
производная там равна нулю. В коде это local_min_zero_deriv:
из local_min f x и has_derivative f x L следует
.
Содержательно теорема говорит вот что. В точке локального минимума линейное приближение приращения не может иметь ненулевого наклона. Будь наклон положителен, шаг влево (отрицательный ) уменьшил бы значение; будь отрицателен, значение уменьшил бы шаг вправо. И то и другое противоречит тому, что в точке минимума для всех малых . Значит, .
Доказательство разбирает знак . Если , берётся ; критерий производной даёт , на котором ошибка приближения меньше . Тогда для шага нужного знака — влево при , вправо при — приращение оказывается строго отрицательным, что противоречит минимальности. Остаётся .
Это полная теорема. Что касается аудита аксиом (предохранитель
Части V): в финале Differentiation.v стоит, среди прочих,
Print Assumptions local_min_zero_deriv — и именно по
этому выводу, а не по заголовку файла, устанавливается фактический
аксиомный статус теоремы. К общей оговорке глава вернётся в § 4.8.3.
Связь с градиентным спуском
Последний подраздел — мост к оптимизации. Лемма
gradient_step_uses_derivative связывает шаг градиентного
спуска с производной квадратичной потери: первый шаг
Правая часть — это <<вес минус скорость обучения, помноженная на производную потери>>: множитель — ровно производная квадратичной потери из § 4.5.2.
{ Honest-замечание о статусе этой леммы (предохранитель Части V:
громкие имена называть тем, что они есть).
gradient_step_uses_derivative — не глубокая теорема. Её
доказательство — это разворачивание определений
gd_weight, gd_error, contraction и
тождество ring. По существу это проверка согласованности:
введённый в GradientDescent.v объект gd_weight
действительно реализует <<градиентный шаг>> в смысле производной этой
главы. Полезная сшивка двух файлов — но самостоятельным содержанием
она не является, и называть её следует именно так.}
В саму теорию градиентного спуска — сходимость весов, скорость,
выбор — глава не углубляется: это материал
GradientDescent.v и, возможно, отдельной будущей главы. Здесь
важно одно — идентификация направления шага с производной
квадратичной потери; этим мост и исчерпывается.
Теорема о среднем: walk-точки
Классическая теорема о среднем и почему её нельзя взять прямо
Классическая теорема о среднем утверждает: для функции , дифференцируемой на отрезке , найдётся внутренняя точка , в которой
Деление на здесь не составляет принципиальной трудности: коль
скоро , знаменатель ненулевой, и частное законно. Существенно
другое — сама форма теоремы: оборот <<найдётся внутренняя
точка >>. Это чистое утверждение существования, и конструктивно
оно слабое — та же трудность, что с argmax в теореме об
экстремуме § 5.3, где пришлось брать индексную версию вместо точки
максимума.
Поэтому MeanValueTheorem.v не доказывает классическую форму с
точкой . Он доказывает её конструктивные следствия — те
оценки приращения через границы производной, ради которых теорема о
среднем обычно и применяется. Ход тот же, что в § 5.3: вместо
неуловимой точки — сеточная конструкция, дающая проверяемые
неравенства.
Walk-точки: лейбницево-точная цепочка{Walk-точки: лейбницево-точная цепочка}
Сеточная конструкция строится на walk-точках — цепочке
с фиксированным шагом . В
MeanValueTheorem.v это рекурсивная функция:
Fixpoint walk_point (x step : Q) (n : nat) : Q :=
match n with
| O => x
| S n' => walk_point x step n' + step
end.Может возникнуть вопрос: зачем рекурсия, если -я точка — это
просто ? Причина — honest-деталь, и она прямо названа в
шапке файла. Телескопирование, на котором держится всё доказательство
§ 4.6.4, складывает приращения функции по последовательным точкам
цепочки. Чтобы слагаемые склеились, -я точка одной записи и
-я точка другой должны совпадать лейбницево —
синтаксически, как термы, — а не только по отношению Qeq.
Рекурсивное определение walk_point это совпадение
обеспечивает; замкнутая формула — нет. Лемма
walk_point_qeq отдельно доказывает, что walk-точка
Qeq-равна , а walk_point_in_interval —
что при шаге все точки остаются в отрезке .
Здесь же файл вводит равномерную дифференцируемость на отрезке — усиление поточечного критерия:
Definition udiff_on (f f' : Q -> Q) (a b : Q) : Prop :=
a < b /\
forall eps : Q, 0 < eps ->
exists delta : Q, 0 < delta /\
forall x h : Q, a <= x -> x <= b ->
0 < Qabs h -> Qabs h < delta ->
Qabs (f (x + h) - f x - f' x * h) < eps * Qabs h.Отличие от has_derivative — в порядке кванторов. У
поточечного критерия для каждой точки свой . У
udiff_on один и тот же годится для всех
точек отрезка сразу. Именно это и нужно: одной оценкой накрыть все
шаги сетки, сколько бы их ни было. В терминах § 4.1.5 это усиление
Rules: равномерная дифференцируемость — то же по роли, что
равномерная непрерывность в § 5.3.
Архимедова сетка: шаг можно сделать сколь угодно малым
Чтобы сетка приближала отрезок как угодно точно, её шаг должен быть
сколь угодно мал. Лемма walk_step_pos устанавливает, что
шаг положителен, а walk_step_small — что для
всякого найдётся такое число делений , при котором этот
шаг меньше .
{ Доказательство walk_step_small опирается на архимедово
свойство. В самом MeanValueTheorem.v используется лемма с
именем Archimedean_nat; близкие архимедовы леммы в других
файлах цепи могут называться иначе. Содержательно это один и тот же
шаг рассуждения: найти конечное , при котором рациональная сетка
становится тоньше заданного . Архимедовость — то самое
<<топливо>> -рассуждений, которое в § 5.1 уже делало
шкалу процессов сколь угодно мелкой, — здесь позволяет за
конечное число делений сделать сетку как угодно частой.
Никакой завершённой бесконечности для этого не нужно.}
Главная теорема: ограниченная производная — ограниченное приращение
Главная теорема файла — bounded_deriv_bounded_increment.
Если на отрезке функция равномерно дифференцируема и её
производная ограничена по модулю числом , то полное приращение
функции от до конца сетки оценивается так:
причём можно взять любым.
Идея доказательства — телескопирование. Полное приращение от до конца сетки записывается как сумма приращений по отдельным шагам walk-цепочки. Каждый шаг оценивается равномерной дифференцируемостью: приращение на одном шаге не больше , помноженного на длину шага. Индукция по числу шагов собирает эти оценки: после шагов накопленное приращение не превосходит , а при , равном полному числу делений, это даёт . Полный код — большая индукция; здесь важна схема: равномерность даёт оценку одного шага, телескоп складывает шаги.
Назовём результат честно (предохранитель Части V). Это не
классическая теорема о среднем с точкой . Это сеточное
следствие теоремы о среднем: оценка полного приращения через
верхнюю границу производной. Картину замыкает лемма
walk_endpoint_qeq — конец walk-цепочки при шаге
Qeq-равен правому концу ; то есть сетка
действительно проходит весь отрезок от до .
Следствия: монотонность и Липшиц
Нулевая производная — почти постоянство
Первое следствие главной теоремы — случай нулевой производной. Если на отрезке производная функции тождественно равна нулю, то полное приращение функции сколь угодно мало: для всякого
В коде это zero_deriv_near_constant — прямое следствие
§ 4.6.4 при .
Формулировку стоит прочесть аккуратно. Теорема не утверждает полной формы << постоянна на всём отрезке >>. Текущий файл доказывает именно сеточную -форму: приращение между концами walk-цепочки можно сделать сколь угодно малым. Полное утверждение о равенстве всех значений — скажем, для любых из отрезка — вполне формулируемо как пропозиция, но потребовало бы отдельной теоремы и дополнительных мостов; здесь оно не доказывается. Под сеточная -форма уместна и содержательна: она говорит, что разность на концах можно загнать ниже любого порога. Это сеточный результат — оценка по сетке walk-точек.
Знак производной задаёт монотонность
{ Второе следствие связывает знак производной с ростом и убыванием.
Лемма pos_deriv_increases: если на отрезке производная
отделена снизу положительным числом , то функция на сетке
выросла — приращение строго
положительно. Двойственная лемма neg_deriv_decreases: если
производная отделена сверху отрицательным числом, функция убыла.}
Содержательно это классическое следствие теоремы о среднем — <<положительная производная означает рост>>, — но в сеточной форме и без точки . Доказательства повторяют телескоп § 4.6.4, только оценка одного шага берётся не сверху, а снизу. Это сеточные результаты, как и всё в § 4.6–4.7.
Липшицевость из ограниченной производной
Третье следствие — липшицевость. Лемма
bounded_deriv_lipschitz_local даёт локальную оценку:
вблизи точки — приращение
функции пропорционально шагу с постоянным коэффициентом. Лемма
nonneg_deriv_approx_nondec утверждает, что неотрицательная
производная делает функцию приближённо неубывающей. Лемма
udiff_continuous_at замыкает связь с § 4.3: равномерная
дифференцируемость влечёт непрерывность в каждой точке отрезка —
через udiff_pointwise (равномерная дифференцируемость даёт
поточечную) и deriv_implies_continuous из § 4.3.1.
Здесь стоит отметить, как замкнулся круг. В § 5.3 липшицевость вводилась как условие — конструктивная замена равномерной непрерывности, которую над нельзя получить даром. Теперь липшицевость выводится — из ограниченной производной. В разборе § 4.1.5 это значит: Rules производной порождают правило, которое в § 5.3 приходилось требовать для непрерывности. То, что в главе о непрерывности приходилось требовать, глава о производной доказывает.
Точные случаи: аффинная и квадратичная
Завершают раздел точные случаи — функции, для которых сеточная
картина и классическая теорема о среднем сходятся. Лемма
affine_udiff устанавливает, что аффинная функция равномерно
дифференцируема на любом отрезке; quadratic_udiff — то же
для квадрата. А лемма mvt_quadratic_midpoint даёт для
квадрата точное равенство теоремы о среднем:
Содержательно: для квадрата та самая <<точка >> из классической теоремы находится явно и точно — это середина отрезка . Здесь сеточная картина § 4.6 и классическая формулировка встречаются в одной проверяемой точке.
{ Одно honest-замечание о файле. MeanValueTheorem.v
заканчивается на лемме mvt_quadratic_midpoint — без
финального блока Check и Print Assumptions, который
есть, например, в Differentiation.v. Это не признак
незавершённости доказательств: все восемнадцать лемм файла закрыты
Qed. Это лишь отсутствие сводки аксиомного аудита в конце
файла; такой аудит для нужной теоремы запускается командой
Print Assumptions отдельно.}
Что построено и что готовится. Итог главы
Итог в трёх столбцах
Соберём сделанное в режиме инфраструктуры — что построено, чего нет и что глава готовит дальше.
Построено и проверено:
- division-free критерий производной
has_derivativeи его экстенсиональные леммы; - производная как процесс разностных отношений
deriv_processс безопасным ненулевым шагом ; мостderiv_process_convergesмежду критерием и процессом;deriv_process_cauchy; - линейность дифференцирования (скаляр, противоположность, сумма, разность) — в форме критерия и в процессной форме (
deriv_sum_process,deriv_scale_process); - дифференцируемость влечёт непрерывность;
- правило произведения (полная теорема, дробление ) — в форме критерия и процессной (
deriv_product_process); степенное правило индукцией; единственность производной; - теорема Ферма
local_min_zero_deriv; - равномерная дифференцируемость
udiff_onи walk-точки; bounded_deriv_bounded_increment— сеточное следствие теоремы о среднем — и монотонность с липшицевостью как дальнейшие следствия.
Не построено в этой главе:
- классическая теорема о среднем с точкой — доказаны только сеточные следствия, и это сознательный выбор;
- производная функции на фактор-классах
RealPoint— глава работает лишь с функциями ; - производные высших порядков и ряд Тейлора — за пределами опорных файлов;
- цепное правило для композиции — в
Differentiation.vего нет; - правило Лопиталя — вынесено за пределы главы; отдельный файл для него в репозитории есть, но включение потребовало бы своего раздела и отдельной сверки, что перегрузило бы и без того плотную главу.
Готовит дальше:
- интеграл — следующий аналитический слой Части V;
- градиентный спуск как приложение — мост к нему намечен в § 4.5.4, полная теория содержится в
GradientDescent.v.
Что осталось бы для производной на классах
Глава честно ограничилась функциями . Назовём конкретно,
какого шага не хватает до производной на фактор-классах
RealPoint — так же, как § 5.1 называла недостающее звено
для расстояния на классах.
Понадобилось бы, во-первых, доказать корректность критерия
has_derivative относительно эквивалентности — что
производная не меняется при замене представителя класса другим
эквивалентным. Во-вторых, поднять само определение с рациональных
функций на функции фактор-классов. Ни того ни другого в опорных
файлах нет; это честная граница главы, очерченная конкретно, а не
общими словами.
Оговорка о статусе аксиом
{ Предохранитель Части V требует точности в вопросе об аксиомах. Все
три опорных файла — Differentiation.v,
ProcessDerivative.v, MeanValueTheorem.v — в своих
шапках заявляют статус << AXIOMS: none >> (ProcessDerivative.v —
<< 0 axioms, 16 Qed >>). Однако все они импортируют файлы, через
которые проходит классический слой: Differentiation.v
опирается на SeriesConvergence.v и GradientDescent.v,
а те — на MonotoneConvergence.v, несущий аксиому
classic; ProcessDerivative.v опирается на
Differentiation.v. Кроме того,
MeanValueTheorem.v импортирует EVT_idx.v, а в
EVT_idx.v аксиома classic объявлена локально
(этот файл разбирался в § 5.3). Это не значит, что каждая теорема о
среднем зависит от classic — значит лишь, что для
конкретной теоремы нужно смотреть Print Assumptions.}
{ Точная формулировка — и именно не огульная — такова. Импорты
проходят через файлы с классическим слоем, и поэтому заголовок файла
сам по себе не заменяет команды Print Assumptions для
конкретной теоремы (правило, принятое ещё с Главы 4.6). Не следует
утверждать <<зависимости тянут classic>> как общий приговор
каждой теореме — фактический аксиомный статус даёт только
Print Assumptions именно этой теоремы. В финале
Differentiation.v такая проверка выписана для ключевых
теорем — deriv_product, deriv_power_succ,
local_min_zero_deriv,
gradient_step_uses_derivative, — и именно эти выводы
дают фактическую картину. У MeanValueTheorem.v и
ProcessDerivative.v финального блока Print Assumptions нет; для нужной теоремы его следует запускать отдельно.}
{ Для полноты аудита назовём и два honest-факта из глубины цепи,
установленных дословной сверкой исходных файлов: лемма
partial_sum_tail в SeriesConvergence.v оставлена
незавершённой через Abort (с авторским комментарием, что
прямая формулировка телескопа неудобна и свойство Коши доказывается
иначе), а доказательство mct_inc_least в
MonotoneConvergence.v содержит Restart — первая
попытка доказательства брошена и заменена второй. На теоремы
настоящей главы это не влияет, но в честной картине зависимостей
такие места должны быть названы.}
Итог главы
Глава построила производную — слой анализа над непрерывностью
§ 5.3. Главный поворот в том, как устроено само понятие.
Существование производной задаётся без деления —
division-free критерием , который говорит, какое число линейно
приближает приращение. Вычислительная же сторона — это
процесс разностных отношений с безопасным ненулевым шагом, и мост
deriv_process_converges связывает обе стороны. Главная
осторожность главы: из теоремы о среднем доказаны сеточные следствия,
а не классическая форма с точкой .
Построено: division-free критерий производной и производная-процесс, связанные мостом; линейность, правило произведения, степенное правило, единственность; теорема Ферма; сеточная теорема о среднем и её следствия — монотонность и липшицевость.
На чём стоит: на --аппарате непрерывности § 5.3, на архимедовом свойстве как топливе -рассуждений, на процессной онтологии , в которой производная — не завершённый предел, а процесс приближений наклона.
Дальше: интеграл как следующий аналитический слой Части V; градиентный спуск как приложение производной к оптимизации.
Часть: Часть V. Топология и анализ процессов · Том: «Математика»
Понятия: Формализация
Навигация: ← Глава 3. Непрерывность · Глава 5. Интеграл →
Footnotes
-
E/R/R-разметка в шапке файла
ProcessDerivative.v; здесь разворачивается по образцу Части I. ↩