22.5. Интегральное исчисление

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

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

22.5.1. Геометрическая интерпретация

Предположим, что у нас есть функция \(f(x)\). Для простоты будем считать, что \(f(x)\) неотрицательна (никогда не принимает значений меньше нуля). Мы хотим понять: какова площадь области, ограниченной \(f(x)\) и осью \(x\)?

%matplotlib inline
import torch
from IPython import display
from mpl_toolkits import mplot3d
from d2l import torch as d2l

x = torch.arange(-2, 2, 0.01)
f = torch.exp(-x**2)

d2l.set_figsize()
d2l.plt.plot(x, f, color='black')
d2l.plt.fill_between(x.tolist(), f.tolist())
d2l.plt.show()

В большинстве случаев эта область будет бесконечной или неопределённой (рассмотрим площадь под \(f(x) = x^{2}\)), поэтому часто говорят о площади между двумя концами, например, \(a\) и \(b\).

x = torch.arange(-2, 2, 0.01)
f = torch.exp(-x**2)

d2l.set_figsize()
d2l.plt.plot(x, f, color='black')
d2l.plt.fill_between(x.tolist()[50:250], f.tolist()[50:250])
d2l.plt.show()

Эту площадь мы будем обозначать с помощью символа интеграла:

(22.5.1)\[\textrm{Area}(\mathcal{A}) = \int_a^b f(x) \;dx.\]

Внутренняя переменная является фиктивной, подобно индексу суммы в \(\sum\), поэтому её можно эквивалентно записать с любым внутренним значением, которое мы выберем:

(22.5.2)\[\int_a^b f(x) \;dx = \int_a^b f(z) \;dz.\]

Существует традиционный способ попытаться понять, как можно аппроксимировать подобные интегралы: мы можем представить себе область между \(a\) и \(b\), разбитую на \(N\) вертикальных полоски. Если \(N\) велико, мы можем аппроксимировать площадь каждой полоски прямоугольником, а затем сложить площади, чтобы получить общую площадь под кривой. Давайте рассмотрим пример реализации этого подхода в коде. Истинное значение мы получим в следующем разделе.

epsilon = 0.05
a = 0
b = 2

x = torch.arange(a, b, epsilon)
f = x / (1 + x**2)

approx = torch.sum(epsilon*f)
true = torch.log(torch.tensor([5.])) / 2

d2l.set_figsize()
d2l.plt.bar(x, f, width=epsilon, align='edge')
d2l.plt.plot(x, f, color='black')
d2l.plt.ylim([0, 1])
d2l.plt.show()

f'approximation: {approx}, truth: {true}'

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

(22.5.3)\[\int_a^b x \;dx.\]

Любая функция, несколько более сложная, чем наш пример из кода выше

(22.5.4)\[\int_a^b \frac{x}{1+x^{2}} \;dx.\]

выходит за рамки возможностей такого прямого метода.

Вместо этого мы воспользуемся другим подходом. Мы будем интуитивно работать с понятием площади и изучим основной вычислительный инструмент, используемый для нахождения интегралов: основную теорему анализа. Это станет основой для нашего изучения интегрирования.

22.5.2. Основная теорема математического анализа

Чтобы глубже погрузиться в теорию интегрирования, введём функцию

(22.5.5)\[F(x) = \int_0^x f(y) dy.\]

Эта функция измеряет площадь между \(0\) и \(x\) в зависимости от того, как мы изменяем \(x\). Обратите внимание, что это всё, что нам нужно, поскольку

(22.5.6)\[\int_a^b f(x) \;dx = F(b) - F(a).\]

Это математическое кодирование факта, что мы можем измерить площадь до дальнего конца и затем вычесть площадь до ближнего конца, как показано в Fig. 22.5.1.

../_images/sub-area.svg

Fig. 22.5.1 Визуализация того, почему задачу вычисления площади под кривой между двумя точками можно свести к вычислению площади слева от точки.

Таким образом, мы можем вычислить интеграл на любом интервале, зная значение \(F(x)\).

Чтобы сделать это, рассмотрим эксперимент. Как это часто бывает в математическом анализе, представим, что происходит, когда мы изменяем значение на малую величину. Из предыдущего замечания мы знаем, что

(22.5.7)\[F(x+\epsilon) - F(x) = \int_x^{x+\epsilon} f(y) \; dy.\]

Это означает, что функция изменяется на величину, равную площади под небольшим участком графика функции.

Именно здесь мы делаем приближение. Если рассмотреть узкую полоску площади, то видно, что она близка к площади прямоугольника с высотой, равной значению \(f(x)\), и шириной основания \(\epsilon\). Действительно, можно показать, что при \(\epsilon \rightarrow 0\) это приближение становится всё точнее. Таким образом, мы можем сделать следующий вывод:

(22.5.8)\[F(x+\epsilon) - F(x) \approx \epsilon f(x).\]

Однако теперь мы замечаем: это в точности тот паттерн, который мы ожидаем, вычисляя производную \(F\)! Таким образом, мы видим следующий довольно удивительный факт:

(22.5.9)\[\frac{dF}{dx}(x) = f(x).\]

Это основная теорема математического анализа. Мы можем записать её в развёрнутом виде как

(22.5.10)\[\frac{d}{dx}\int_0^x f(y) \; dy = f(x).\]

Она сводит задачу нахождения площадей (изначально довольно сложную) к утверждению о производных (понятие, которое гораздо лучше изучено). Одно последнее замечание: это не позволяет нам точно определить, чему равно \(F(x)\). Действительно, \(F(x) + C\) для любого \(C\) имеет одну и ту же производную. Это один из фундаментальных фактов теории интегрирования. К счастью, при работе с определёнными интегралами константы сокращаются, поэтому они не влияют на результат.

(22.5.11)\[\int_a^b f(x) \; dx = (F(b) + C) - (F(a) + C) = F(b) - F(a).\]

Это может показаться абстрактной бессмыслицей, но давайте на мгновение оценим, что это дало нам совершенно новую перспективу на вычисление интегралов. Наша цель больше не заключается в том, чтобы выполнять некий процесс «разрезания и суммирования», пытаясь восстановить площадь; вместо этого нам нужно лишь найти функцию, производная которой равна нашей функции! Это невероятно, поскольку теперь мы можем выписать множество довольно сложных интегралов, просто обратив таблицу из Section 22.3.2. Например, мы знаем, что производная \(x^{n}\) равна \(nx^{n-1}\). Следовательно, используя основную теорему (22.5.10), мы можем сказать, что

(22.5.12)\[\int_0^{x} ny^{n-1} \; dy = x^n - 0^n = x^n.\]

Аналогично, мы знаем, что производная \(e^{x}\) равна самой себе, а это означает, что

(22.5.13)\[\int_0^{x} e^{x} \; dx = e^{x} - e^{0} = e^x - 1.\]

Таким образом, мы можем свободно развивать всю теорию интегрирования, опираясь на идеи дифференциального исчисления. Каждое правило интегрирования выводится из этого единственного факта.

22.5.3. Смена переменных

Как и в дифференциальном исчислении, существует ряд правил, которые делают вычисление интегралов более удобным. На самом деле, каждому правилу дифференциального исчисления (таким как правило произведения, правило суммы и цепное правило) соответствует своё правило интегрального исчисления (соответственно, интегрирование по частям, линейность интегрирования и формула замены переменной). В этом разделе мы подробно рассмотрим, пожалуй, самое важное из этих правил — формулу замены переменной.

Сначала предположим, что у нас есть функция, которая сама по себе является интегралом:

(22.5.14)\[F(x) = \int_0^x f(y) \; dy.\]

Предположим, что мы хотим узнать, как выглядит эта функция, если мы композируем её с другой, чтобы получить \(F(u(x))\). Согласно цепному правилу, мы знаем

(22.5.15)\[\frac{d}{dx}F(u(x)) = \frac{dF}{du}(u(x))\cdot \frac{du}{dx}.\]

Мы можем преобразовать это утверждение в утверждение об интегрировании, используя основную теорему (22.5.10), как показано выше. Это даёт

(22.5.16)\[F(u(x)) - F(u(0)) = \int_0^x \frac{dF}{du}(u(y))\cdot \frac{du}{dy} \;dy.\]

Вспоминая, что \(F\) само по себе является интегралом, получаем, что левую часть можно переписать в виде

(22.5.17)\[\int_{u(0)}^{u(x)} f(y) \; dy = \int_0^x \frac{dF}{du}(u(y))\cdot \frac{du}{dy} \;dy.\]

Аналогично, учитывая, что \(F\) представляет собой интеграл, мы можем применить основную теорему (22.5.10) к выражению \(\frac{dF}{dx} = f\), и таким образом сделать вывод

(22.5.18)\[\int_{u(0)}^{u(x)} f(y) \; dy = \int_0^x f(u(y))\cdot \frac{du}{dy} \;dy.\]

Это формула замены переменных.

Для более интуитивного вывода рассмотрим интеграл от \(f(u(x))\) в пределах от \(x\) до \(x+\epsilon\). При малом \(\epsilon\) этот интеграл приблизительно равен \(\epsilon f(u(x))\), то есть площади соответствующего прямоугольника. Теперь сравним его с интегралом от \(f(y)\) от \(u(x)\) до \(u(x+\epsilon)\). Поскольку \(u(x+\epsilon) \approx u(x) + \epsilon \frac{du}{dx}(x)\), площадь этого прямоугольника приблизительно равна \(\epsilon \frac{du}{dx}(x)f(u(x))\). Следовательно, чтобы площади этих двух прямоугольников совпадали, необходимо умножить первый на \(\frac{du}{dx}(x)\), как показано на рисунке Fig. 22.5.2.

../_images/rect-trans.svg

Fig. 22.5.2 Визуализация преобразования одного тонкого прямоугольника при замене переменных.

Это говорит нам о том, что

(22.5.19)\[\int_x^{x+\epsilon} f(u(y))\frac{du}{dy}(y)\;dy = \int_{u(x)}^{u(x+\epsilon)} f(y) \; dy.\]

Это формула замены переменных, записанная для одного малого прямоугольника.

Если \(u(x)\) и \(f(x)\) выбраны корректно, это позволяет вычислять невероятно сложные интегралы. Например, если мы выберем \(f(y) = 1\) и \(u(x) = e^{-x^{2}}\) (что означает \(\frac{du}{dx}(x) = -2xe^{-x^{2}}\)), это может показать, что

(22.5.20)\[e^{-1} - 1 = \int_{e^{-0}}^{e^{-1}} 1 \; dy = -2\int_0^{1} ye^{-y^2}\;dy,\]

и, следовательно, преобразовав это

(22.5.21)\[\int_0^{1} ye^{-y^2}\; dy = \frac{1-e^{-1}}{2}.\]

22.5.4. Замечание о соглашениях о знаках

Внимательные читатели заметят нечто странное в приведённых выше вычислениях. А именно, вычисления вида

(22.5.22)\[\int_{e^{-0}}^{e^{-1}} 1 \; dy = e^{-1} -1 < 0,\]

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

Математики используют понятие ориентированных площадей. Это проявляется двумя способами. Во-первых, если мы рассматриваем функцию \(f(x)\), которая иногда принимает отрицательные значения, то и площадь также будет отрицательной. Так, например

(22.5.23)\[\int_0^{1} (-1)\;dx = -1.\]

Аналогичным образом, интегралы, вычисляемые справа налево, а не слева направо, также считаются имеющими отрицательную площадь.

(22.5.24)\[\int_0^{-1} 1\; dx = -1.\]

Стандартная площадь (от левой границы к правой для положительной функции) всегда положительна. Любое действие, связанное с её отражением (например, отражение относительно \(x\)-оси для получения интеграла от отрицательного числа или отражение относительно \(y\)-оси для получения интеграла с неправильным порядком интегрирования), приведёт к отрицательной площади. И действительно, двойное отражение даст пару отрицательных знаков, которые взаимно уничтожаются, в результате чего площадь снова становится положительной.

(22.5.25)\[\int_0^{-1} (-1)\;dx = 1.\]

Если этот разговор кажется вам знакомым, то это не случайно! В Section 22.1 мы обсуждали, как определитель представляет собой знаковую площадь, что во многом аналогично.

22.5.5. Многократные интегралы

В некоторых случаях нам придется работать в пространствах более высокой размерности. Например, предположим, что у нас есть функция двух переменных, например \(f(x, y)\), и мы хотим найти объём под \(f\), когда \(x\) изменяется в пределах \([a, b]\), а \(y\) — в пределах \([c, d]\).

# Construct grid and compute function
x, y = torch.meshgrid(torch.linspace(-2, 2, 101), torch.linspace(-2, 2, 101))
z = torch.exp(- x**2 - y**2)

# Plot function
ax = d2l.plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z)
d2l.plt.xlabel('x')
d2l.plt.ylabel('y')
d2l.plt.xticks([-2, -1, 0, 1, 2])
d2l.plt.yticks([-2, -1, 0, 1, 2])
d2l.set_figsize()
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
ax.set_zlim(0, 1)
ax.dist = 12

Запишем это как

(22.5.26)\[\int_{[a, b]\times[c, d]} f(x, y)\;dx\;dy.\]

Предположим, что нам нужно вычислить этот интеграл. Я утверждаю, что это можно сделать, последовательно вычисляя сначала интеграл по \(x\), а затем переходя к интегралу по \(y\), то есть

(22.5.27)\[\int_{[a, b]\times[c, d]} f(x, y)\;dx\;dy = \int_c^{d} \left(\int_a^{b} f(x, y) \;dx\right) \; dy.\]

Давайте разберёмся, почему это так.

Рассмотрим рисунок выше, где функция разбита на \(\epsilon \times \epsilon\) квадратов, индексируемых целочисленными координатами \(i, j\). В этом случае наш интеграл приблизительно равен

(22.5.28)\[\sum_{i, j} \epsilon^{2} f(\epsilon i, \epsilon j).\]

После дискретизации задачи мы можем суммировать значения на этих квадратах в любом порядке, не беспокоясь о том, что значения изменятся. Это проиллюстрировано на рисунке Fig. 22.5.3. В частности, мы можем записать

(22.5.29)\[\sum _ {j} \epsilon \left(\sum_{i} \epsilon f(\epsilon i, \epsilon j)\right).\]
../_images/sum-order.svg

Fig. 22.5.3 Иллюстрация того, как разложить сумму по множеству квадратов в сумму по столбцам (1), а затем сложить полученные суммы по столбцам (2).

Сумма внутри представляет собой точную дискретизацию интеграла

(22.5.30)\[G(\epsilon j) = \int _a^{b} f(x, \epsilon j) \; dx.\]

Наконец, отметим, что если объединить эти два выражения, то получим

(22.5.31)\[\sum _ {j} \epsilon G(\epsilon j) \approx \int _ {c}^{d} G(y) \; dy = \int _ {[a, b]\times[c, d]} f(x, y)\;dx\;dy.\]

Таким образом, объединяя всё вместе, получаем, что

(22.5.32)\[\int _ {[a, b]\times[c, d]} f(x, y)\;dx\;dy = \int _ c^{d} \left(\int _ a^{b} f(x, y) \;dx\right) \; dy.\]

Заметим, что после дискретизации мы лишь изменили порядок сложения списка чисел. Это может показаться незначительным, однако этот результат (называемый теоремой Фубини) верен не всегда! В математике, с которой мы сталкиваемся при решении задач машинного обучения (непрерывные функции), это не вызывает опасений, однако можно привести примеры, где это утверждение неверно (например, функция \(f(x, y) = xy(x^2-y^2)/(x^2+y^2)^3\) на прямоугольнике \([0,2]\times[0,1]\)).

Заметим, что выбор порядка интегрирования: сначала по \(x\), а затем по \(y\), был произвольным. Мы могли бы так же легко выбрать сначала интегрирование по \(y\), а затем по \(x\), чтобы увидеть

(22.5.33)\[\int _ {[a, b]\times[c, d]} f(x, y)\;dx\;dy = \int _ a^{b} \left(\int _ c^{d} f(x, y) \;dy\right) \; dx.\]

Часто мы будем использовать векторную запись и говорить, что для \(U = [a, b]\times [c, d]\) это

(22.5.34)\[\int _ U f(\mathbf{x})\;d\mathbf{x}.\]

22.5.6. Замена переменных в кратных интегралах

Как и в случае с одной переменной в (22.5.18), возможность замены переменных в многомерном интеграле является ключевым инструментом. Подведём итог результата без вывода.

Нам нужна функция, которая переопределяет параметры области интегрирования. В качестве такой функции можно взять \(\phi : \mathbb{R}^n \rightarrow \mathbb{R}^n\), то есть любую функцию, которая принимает \(n\) вещественных переменных и возвращает \(n\). Чтобы выражения оставались наглядными, будем считать, что \(\phi\) является инъективной, то есть она никогда не «сворачивается» сама на себя (\(\phi(\mathbf{x}) = \phi(\mathbf{y}) \implies \mathbf{x} = \mathbf{y}\)).

В этом случае мы можем сказать, что

(22.5.35)\[\int _ {\phi(U)} f(\mathbf{x})\;d\mathbf{x} = \int _ {U} f(\phi(\mathbf{x})) \left|\det(D\phi(\mathbf{x}))\right|\;d\mathbf{x}.\]

где \(D\phi\) — это якобиан \(\phi\), представляющий собой матрицу частных производных \(\boldsymbol{\phi} = (\phi_1(x_1, \ldots, x_n), \ldots, \phi_n(x_1, \ldots, x_n))\),

(22.5.36)\[\begin{split}D\boldsymbol{\phi} = \begin{bmatrix} \frac{\partial \phi _ 1}{\partial x _ 1} & \cdots & \frac{\partial \phi _ 1}{\partial x _ n} \\ \vdots & \ddots & \vdots \\ \frac{\partial \phi _ n}{\partial x _ 1} & \cdots & \frac{\partial \phi _ n}{\partial x _ n} \end{bmatrix}.\end{split}\]

При более внимательном рассмотрении мы видим, что это напоминает цепное правило для функции одной переменной (22.5.18), за исключением того, что вместо величины \(\frac{du}{dx}(x)\) подставлена величина \(\left|\det(D\phi(\mathbf{x}))\right|\). Давайте разберемся, как интерпретировать этот член. Вспомним, что величина \(\frac{du}{dx}(x)\) показывала, насколько мы растянули нашу ось \(x\), применив преобразование \(u\). Аналогичный процесс в многомерном пространстве заключается в определении того, насколько мы растягиваем площадь (или объём, или гиперобъем) маленького квадрата (или маленького гиперкуба), применяя преобразование \(\boldsymbol{\phi}\). Если \(\boldsymbol{\phi}\) соответствует умножению на матрицу, то мы знаем, что определитель уже дает ответ.

С некоторыми усилиями можно показать, что якобиан обеспечивает наилучшее приближение многомерной функции \(\boldsymbol{\phi}\) в точке с помощью матрицы так же, как производные и градиенты позволяют аппроксимировать функцию прямыми или плоскостями. Таким образом, определитель якобиана в точности отражает коэффициент масштабирования, который мы выявили в одномерном случае.

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

(22.5.37)\[\int _ {-\infty}^{\infty} \int _ {-\infty}^{\infty} e^{-x^{2}-y^{2}} \;dx\;dy.\]

Прямая работа с этим интегралом ни к чему не приведёт, но если мы выполним замену переменных, то сможем существенно продвинуться вперёд. Если мы положим \(\boldsymbol{\phi}(r, \theta) = (r \cos(\theta), r\sin(\theta))\) (то есть \(x = r \cos(\theta)\), \(y = r \sin(\theta)\)), то, применив формулу замены переменных, увидим, что это эквивалентно

(22.5.38)\[\int _ 0^\infty \int_0 ^ {2\pi} e^{-r^{2}} \left|\det(D\mathbf{\phi}(\mathbf{x}))\right|\;d\theta\;dr,\]

где

(22.5.39)\[\begin{split}\left|\det(D\mathbf{\phi}(\mathbf{x}))\right| = \left|\det\begin{bmatrix} \cos(\theta) & -r\sin(\theta) \\ \sin(\theta) & r\cos(\theta) \end{bmatrix}\right| = r(\cos^{2}(\theta) + \sin^{2}(\theta)) = r.\end{split}\]

Таким образом, интеграл имеет вид

(22.5.40)\[\int _ 0^\infty \int _ 0 ^ {2\pi} re^{-r^{2}} \;d\theta\;dr = 2\pi\int _ 0^\infty re^{-r^{2}} \;dr = \pi,\]

где последнее равенство получается тем же вычислением, которое мы использовали в разделе Section 22.5.3.

Мы встретимся с этим интегралом снова, когда будем изучать непрерывные случайные величины в Section 22.6.

22.5.7. Итоги

  • Теория интегрирования позволяет нам отвечать на вопросы о площадях или объёмах.

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

  • Интегралы в многомерном пространстве можно вычислять, сводя их к последовательному применению интегралов от функции одной переменной.

22.5.8. Упражнения

  1. Что такое \(\int_1^2 \frac{1}{x} \;dx\)?

  2. Используйте формулу замены переменных для интегрирования \(\int_0^{\sqrt{\pi}}x\sin(x^2)\;dx\).

  3. Что такое \(\int_{[0,1]^2} xy \;dx\;dy\)?

  4. Используйте формулу замены переменных, чтобы вычислить \(\int_0^2\int_0^1xy(x^2-y^2)/(x^2+y^2)^3\;dy\;dx\) и \(\int_0^1\int_0^2f(x, y) = xy(x^2-y^2)/(x^2+y^2)^3\;dx\;dy\) и убедиться, что они различны.

Обсуждения