{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "AF4MsnKVg--3" }, "source": [ "# Оптимизация функции одной переменной" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "smbncR4CvDmh" }, "source": [ "## Постановка задачи" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Oy646ASQhIB4" }, "source": [ "Одна из самых важных задач, связанных с функциями -- это задача **поиска минимума функции** или **задача оптимизации функции**.\n", "\n", "Эта задача решается нейронными сетями при обучении. Да, по сути, обучение нейронной сети -- это оптимизация одной большой и очень сложной функции с тысячами или даже миллионами аргументов.\n", "\n", "Чуть подробнее:
\n", "При обучении нейронной сети мы хотим измерять, насколько хорошо сеть справляется с поставленной задачей. Для этого вводится функция потерь -- такая функция, которая в качестве аргументов принимает правильные ответы и ответы нейронной сети, и выдает некоторое число -- ошибку. Понятно, что мы хотим, чтобы ошибка сети была минимальной.
\n", "То есть, ставится задача **минимизации функции потерь**.\n", "Мы хотим подобрать такие аргументы (параметры) нейронной сети, чтобы получить минимум функции потерь.\n", "\n", "Сейчас мы научимся минимизировать функции." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "GZQbYWqLvFpp" }, "source": [ "## Аналитический алгоритм поиска минимума функции одной переменной" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "y8UPfz74pD_r" }, "source": [ "Вспомним, что в ноутбуке по производным мы выяснили, что знак производной функции в точке показывает характер функции в этой точке -- убывает она, возрастает или имеет локальный экстремум. Давайте сформулируем **необходимое и достаточное условие существования экстремума функции $F$ в точке $x$**\n", "\n", "1. (необходимое условие) Если функция $F$ имеет экстремум в точке $x$, то либо $F$ не имеет производной в точке $x$, либо $F'(x) = 0$\n", "\n", "2. (достаточное условие) Если функция $F$ имеет производную в точке $x$ и $F'(x) = 0$, то в точке $x$ функция $F$ имеет экстремум.\n", "\n", "Иными словами, чтобы точка $x$ была точкой экстремума функции $F$, *необходимо*, чтобы $F$ в точке $x$ либо не имела производной, либо эта производная равнялась нулю. И чтобы чтобы точка $x$ была точкой экстремума функции $F$, *достаточно*, чтобы $F'(x)$ существовало и $F'(x) = 0$" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "VOUz6DMrrLYp" }, "source": [ "Мы далее в курсе будем рассматривать только дифференцируемые на всей области определения функции (т.е. имеющие производную на всей области определения). Для таких функций критерий экстремума в точке выглядит проще:\n", "\n", "1. Если $F'(x) = 0$, то в точке $x$ у функции $F$ экстремум.\n", "2. Если у функции $F$ экстремум в точке $x$, то $F'(x) = 0$\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "O-HGvEOPsKCs" }, "source": [ "Заметим, что мы говорили сейчас об *экстремумах*, а не *точках минимума*. Если в точке $x$ производная $F'(x) = 0$, то это может быть как точкой минимума, так и точкой максимума. \n", "\n", "Чтобы убедиться, что точка является точкой минимума, надо взять вторую производную $F''(x)$. Если $F'(x) = 0$ и $F''(x) > 0$, то $x$ -- точка минимума, если же $F'(x) = 0$ и $F''(x) < 0$, то $x$ -- точка максимума." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WSi46EGmstok" }, "source": [ "Итак, **алгоритм нахождения точек локальных минимумов функции F(x)**:\n", "1. найти корни уравнения $F'(x) = 0$ (найти те точки $x$, в которых производная равна 0)\n", "2. Для всех корней уравнения $x$ вычислить вторую производную $F''(x)$. Если она больше нуля, то это точка минимума.\n", "\n", "Этот алгоритм **аналитический** -- он основан на решении уравнений." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "MZPJXsSotP6P" }, "source": [ "> Пример #1
\n", "
\n", "$$F = 4x^2 - 3x + 5$$\n", "Найдем точки минимума этой функции:
\n", "1. Находим производную: $F'(x) = 8x - 3$\n", "2. Решаем уравнение $F'(x) = 8x - 3 = 0$, $x = \\frac{3}{8}$ -- получили единственный корень.\n", "3. Находим вторую производную функции $F$ в точке $\\frac{3}{8}$: $F''(x) = (8x - 3)' = 8 > 0$, поэтому полученная точка экстремума $x = \\frac{3}{8}$ -- точка минимума.
\n", "
\n", "Итого мы нашли единственную точку минимума $x = \\frac{3}{8}$
\n", "
\n", "Мы можем убедиться в правильности решения, посмотрев на график функции $F$:\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 279 }, "colab_type": "code", "id": "dVWJsK2uhC4y", "outputId": "766cf33e-87ce-45fb-ccb6-1d99d1710908" }, "outputs": [ { "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "def F(x):\n", " return 4*x**2 - 3*x + 5\n", "\n", "def plot_function(f):\n", " x = np.linspace(-1, 2, 100)\n", " y = list(map(f, x))\n", "\n", " plt.plot(x, y)\n", " plt.ylabel(\"Y\")\n", " plt.xlabel(\"X\")\n", " \n", "plot_function(F)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "vOTdgpIiu3FF" }, "source": [ "> Похоже на правду =)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ECa-6dCOwePp" }, "source": [ "Этот алгоритм хорошо и позволяет находить точные значения координаты точки минимума функции. Но он не всегда применим.\n", "\n", "Рассмотрим функцию, знакомую нам по ноутбуку по производным:
\n", "$F(x) = x^4 + 5x^3 - 10x$. Выглядит она так:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 296 }, "colab_type": "code", "id": "Y3t8nfaYvcjx", "outputId": "a6d5510f-7e83-4551-eb3f-1d7e023f7236" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": { "tags": [] }, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "def F(x):\n", " return x**4 + 5*x**3 - 10*x\n", "\n", "x = np.linspace(-5, 2, 100)\n", "y = list(map(F, x))\n", "\n", "plt.plot(x, y)\n", "plt.ylabel(\"Y\")\n", "plt.xlabel(\"X\")\n", "plt.scatter([-3.5518, -0.9439, 0.7457], [F(-3.5518), F(-0.9439), F(0.7457)])" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "GXqAXzmlwxgE" }, "source": [ "Мы помним, что у нее есть две точки минимума и одна точка максимума. Давайте допустим, что мы хотим найти координаты точек минимума, используя наш алгоритм. Нам нужно было бы вычислить производную
\n", "$F'(x) = 4x^3 + 15x^2 -10$
\n", "и решить уравнение
\n", "$4x^3 + 15x^2 -10 = 0$
\n", "Но это уравнение третьей степени, которое сложно (если не невозможно) решить аналитически. Значит, найти точки минимума нашим алгоритмом не получится. " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "YytARbPIxlEh" }, "source": [ "Очевидно, бывают еще более сложные функции, что уж говорить о функциях многих переменных. Поэтому рассмотрим другой алгоритм поиска минимума функций:" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6JTs_CLJxyzZ" }, "source": [ "## Алгоритм градиентного спуска: идея" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xKuuz-XO_iek" }, "source": [ "С этого момента и везде далее мы будем считать, что все рассматриваемые функции дифференцируемы на всей области определения." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WcAtHF-ZyCQm" }, "source": [ "Посмотрим на график этой коварной функции и на случайную точку $(x, y)$ на нем:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 279 }, "colab_type": "code", "id": "_SiGJ1apxd_V", "outputId": "c7f57e74-6ae5-468e-d906-c2ce6c1fadfe" }, "outputs": [ { "data": { "image/png": "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\nxnTw/+UlDlNwnf8tAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "def F(x):\n", " return x**4 + 5*x**3 - 10*x\n", "\n", "x = np.linspace(-5, 2, 100)\n", "y = list(map(F, x))\n", "\n", "plt.plot(x, y)\n", "plt.ylabel(\"Y\")\n", "plt.xlabel(\"X\")\n", "plt.scatter([-2], [F(-2)])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "URH7uH9PIp8u" }, "source": [ "Давайте представим, что мы не видим графика этой функции, но очень хотим найти точку минимума функции.\n", "\n", "Из ноутбука по производным мы помним, что знак производной функции в точке показывает, возрастает функция в этой точке или убывает (ну или имеет экстремум). Как нетрудно догадаться, производная в точке $(x, y)$ на нашем графике будет $< 0$, функция в этой точке возрастает.
\n", "Это значит, что **какая-то точка локального минимума функции находится правее точки $x$**.
\n", "(\"правее\" значит, что минимум функции достигается при значении аргумента $< x$).
\n", "Это отличное наблюдение! Это значит, что если мы уменьшим $x$ на некоторую величину $\\Delta x$, то мы можем стать ближе к точке минимума!" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "sppzD64HIrBt" }, "source": [ "Тогда алгоритм поиска точки минимума выглядит так:\n", "\n", "1. Берем случайную точку $x$ функции $F$\n", "2. Вычисляем производную $F'(x)$\n", "3. Если $F'(x) > 0$, уменьшаем $x$, если $F'(x) < 0$, увеличиваем $x$\n", "4. Повторяем 3 \n", "\n", "То есть, мы берем случайную точку и начинаем движение от нее к точке минимума, каждый шаг алгоритма вычисляя производную функции в точке, в которой сейчас находимся и сдвигая эту точку в направлении минимума.
\n", "Вычислять производную на каждом шаге нужно, потому что мы в какой-то момент можем \"перепрыгнуть\" через точку минимума, тогда производная поменяет знак и мы поймем, что нужно двигаться обратно.\n", "\n", "В идеале это \"движение\" должно выглядеть так:" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "LcTbeu4sKGsf" }, "source": [ "\"2020-01-30-19-01-37\"" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "KTrwC5lG_cN6" }, "source": [ "\n", "\n", "Остается два вопроса: на какую величину $\\Delta x$ уменьшать и когда останавливать алгоритм.\n", "\n", "Давайте попробуем выбрать $\\Delta x$. Это нетривиально, ведь мы не видим графика функции и не знаем, насколько далеко точка минимума. А численное значение производной нам показывает только факт убывания функции и скорость убывания (уго наклона графика), но не расстояние до точки минимума.\n", "\n", "Другими словами, минимум может быть в точке $x-0.2$, а может быть в точке $x - 200$. \n", "\n", "Если мы возьмем слишком большую величину, то можем просто перескочить через точку минимума. Примером такой величины может быть $\\Delta x = 2.5$:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 279 }, "colab_type": "code", "id": "QaS2QFV89lEY", "outputId": "9d1fdce2-170c-4d8d-ca42-ba8ef82a6b04" }, "outputs": [ { "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "def F(x):\n", " return x**4 + 5*x**3 - 10*x\n", "\n", "x = np.linspace(-5, 2, 100)\n", "y = list(map(F, x))\n", "\n", "plt.plot(x, y)\n", "plt.ylabel(\"Y\")\n", "plt.xlabel(\"X\")\n", "plt.scatter([-4.5], [F(-4.5)])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "jwHOjaK6ExA2" }, "source": [ "Итак, нужно брать $\\Delta x$ довольно маленьким. \n", "\n", "Если мы зафиксируем некоторую величину $\\Delta x$ и на каждом шаге алгоритма будем сдвигать $x$ на одинаковую величину $\\Delta x$ в направлении минимума, то это может занять очень много времени (например, когда точка минимума в точке $x = 1$, а мы стоим в точке $x = 1001$ и $\\Delta x = 1$, нам потребуется 1000 шагов алгоритма, чтобы дойти до минимума). Плюс, если мы стоим в точке $x = 1.5$, то, сдвинувшись на $\\Delta x = 1$ по направлению к точке минимума мы попадем в точку $x = 0.5$, далее опять сдвинувшись на $\\Delta x = 1$ по направлению к точке минимума мы попадем в точку $x = 1.5$ и будем так ходить туда-сюда, не приближаясь к точке минимума $x = 1$ ближе. " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "IIiJeLP3FZG0" }, "source": [ "Давайте еще раз внимательно посмотрим на график функции (выше) и увидим, что чем ближе точка к минимуму, тем плавнее график.
\n", "Более формально, что чем ближе точка к минимуму, тем меньше скорость убывания/возрастания функции, а значит, тем меньше модуль значения производной.\n", "\n", "Мы можем это использовать. Давайте зафиксируем некоторое маленькое число $\\epsilon$ и каждый шаг алгоритма будем двигать $x$ по направлению к минимуму на шаг $\\epsilon * |F'(x)|$. Тогда пока наша точка будет далеко от минимума, $|F'(x)|$ будет довольно большим и мы будем двигаться большими шагами, а по мере приближения к точке минимума $|F'(x)|$ будет уменьшаться, и наш шаг тоже будет уменьшаться. Так мы менее вероятно перескочим через точку минимума и подойдем к ней ближе в итоге." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Us3jbxBPQYBx" }, "source": [ "Ответ на второй вопрос -- когда останавливать алгоритм поиска минимума -- может быть разный. Действуя таким образом, ровно в точку минимума мы почти никогда не попадем, придется остановиться в какой-то точке возле минимума. Но для применений этого алгоритма нахождение точки около минимума вполне хватает. Чаще всего алгоритм останавливается после прохождения определенного количества шагов и/или достижения определенной близости к точке минимума. Близость, опять же, можно измерять значением производной в точке. Чем ближе, тем модуль производной меньше.\n", "\n", "Итак, теперь мы можем сформулировать итоговый алгоритм:" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "pFOSF91fQFwy" }, "source": [ "## Алгоритм градиентного спуска \n", "\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "gkXSHxXrUHYx" }, "source": [ "1. Берем случайную точку $x$ функции $F$, фиксируем $\\epsilon$ (например, $\\epsilon = 0.001$)\n", "2. Вычисляем производную $F'(x)$\n", "3. Изменяем $x$ : $x = x - \\epsilon F'(x)$ \n", "4. Повторяем 3, пока не пройдет определенное количество шагов и/или мы не станем достаточно близко к точке минимума.\n", "\n", "Этот алгоритм называется **алгоритм градиентного спуска**. \"Градиентного\" -- потому что мы \"спускаемся\" к точке минимума, вычисляя производную (градиент) функции на каждом шаге.\n", "\n", "Выглядит это как-то так:" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "9LzMHhcZSFo3" }, "source": [ "![alt text](https://rezaborhani.github.io/mlr/mlrefined_images/gifs/unnormalized_gradient_descent.gif)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "s9up3-ZTRDCS" }, "source": [ "Заметим, что, начиная движение из одной точки, мы можем найти только одну точку локального минимума. Если хочется найти несколько точек, можно запустить алгоритм градиентного спуска несколько раз из разных случайно выбранных точек. Но гарантии, что мы найдем все точки минимума или что найдем точку глобального минимума, нет." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "983ypt_BTzvW" }, "source": [ "Существует множество молификаций/оптимизаций алгоритма градиентного спуска, но о них мы говорить не будем. Центральная идея у них одна и та же -- спуск к точке минимума, используя градиент функции." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "txUBjU1AULu2" }, "source": [ "# Оптимизация функции многих переменной" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "IDs00e4nUPVD" }, "source": [ "Давайте перейдем к функциям многих переменных. \n", "\n", "Идея нахождения минимума функции многих переменных такая же, как и для функции одной переменной. \n", "\n", "Давайте рассмотрим функцию $F(x_1, x_2, \\dots, x_n)$ $n$ переменных.
\n", "Алгоритм выглядит так:\n", "\n", "1. Берем случайную точку $x = (x_1, x_2, \\dots, x_n)$ функции $F$, фиксируем $\\epsilon$ (например, $\\epsilon = 0.001$)\n", "2. Вычисляем частные производные $F'(x)$ по всем $n$ аргументам функции в точке $x = (x_1, x_2, \\dots, x_n)$, получаем градиент
\n", "$\\triangledown F = (F'_{x_1}(x_1, x_2, \\dots, x_n), F'_{x_2}(x_1, x_2, \\dots, x_n), \\dots, F'_{x_n}(x_1, x_2, \\dots, x_n))$\n", "3. Изменяем
\n", "$x_1 : x_1 = x_1 - \\epsilon F'_{x_1}(x_1, x_2, \\dots, x_n)$
\n", "$x_2 : x_2 = x_2 - \\epsilon F'_{x_2}(x_1, x_2, \\dots, x_n)$
\n", "$\\dots$
\n", "$x_n : x_n = x_n - \\epsilon F'_{x_n}(x_1, x_2, \\dots, x_n)$
\n", "или, в векторной записи,
\n", "$x = x - \\epsilon \\triangledown F(x)$\n", "4. Повторяем 3, пока не пройдет определенное количество шагов и/или мы не станем достаточно близко к точке минимума по каждой из координат" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "fD0EtDDlXXnM" }, "source": [ "То есть мы вычисляем частные производные по каждому аргументу функции, понимаем для каждого аргумента функции, возрастает или убывает функция по этому аргументу и меняем значения всех $n$ аргументов в ту сторону, где функция убывает." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "1T2C2T90ZUwr" }, "source": [ "В случае функции двух переменных алгоритм может выглядеть так:" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "HprDVYasZVfc" }, "source": [ "![alt text](https://thumbs.gfycat.com/AngryInconsequentialDiplodocus-size_restricted.gif)" ] } ], "metadata": { "colab": { "name": "Optimization.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 1 }