{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "W7cNmbENdx0R" }, "source": [ "# 最適化問題の基礎\n", "\n", "\n", "[この章の目的]\n", "最適化問題のイメージを掴み、一次元の単峰的な関数の最小値を探索できるようになる。" ] }, { "cell_type": "markdown", "metadata": { "id": "r244nZzmtIZ0" }, "source": [ "\n", "最適化問題とは、大雑把に言えば「ある量の最小値/最大値とそれを与える変数/パラメータの値を知ること」と言い換えられる. \n", "種々のデータ解析や学術的分野での計算をはじめ世の中の多くの問題は**最適化問題**に帰着される.例えば、\n", "- 商品の売り上げを最大化するための広告戦略を考える\n", "- ある製品の製造コストを最小化するための製造工程を設計する\n", "- 配達員の配達ルートを最適化(≒時間や燃料の消費を最小化)する\n", "- 機械学習のモデルのパラメータを調整し、予測精度を最大化する\n", "\n", "などなど。「人生も、何らかの目的関数$f(x)$(一般に$x$は多次元),たとえば幸福感(不幸感)を最大化(最小化)すること、という意味では最適化問題を考えていることに相当する」というと少し大げさでしょうか。\n", "\n", "\n", "この章では、最適化の基礎について説明する。 \n", "授業では実際に最適化で必要な数学的な操作をするコードを作ったりする訳ではないが、「ライブラリに入れてポンッ」ではなく、背後にあるモチベーションや概念を理解しておくことは自分が興味のある問題を最適化問題に帰着させて解くためには不可欠になる。\n", "\n", "※高校で微分をあまり勉強していないという方に向けて末尾に数学的準備の項を設けてあるのでチェックしてください.(よく知っているという方もさっと目を通してみてください) \n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "loZUoKQD9uYU" }, "source": [ "## 考えたい問題のイメージ" ] }, { "cell_type": "markdown", "metadata": { "id": "L1wUnmJn9xoF" }, "source": [ "以下で考えたい問題のポンチ絵\n", "\n", " \n", "\n", "> あなたは変数$x$のある特定の点$t$での関数値$f(t)$を観測して知っている。 \n", "> また、図中に**緑の線で示したような$f(x)$の振る舞いを予め知ることはできず \n", "> 都度$x$を変えて調べることで初めて対応する$y$の値が分かる**状況を考えよう。 \n", "> (そのことを点線で表現しています) \n", "> このとき、$x$を変えながら$f(x)$が最小となる点を探すには一般にどうすればよいだろうか?\n", "\n", "\n", "変数が2次元(やそれ以上)の場合も、\n", "\n", " \n", "\n", "(実際上の難しさが違うとはいえ)基本的なアイデアは同様なので、以下では1次元の場合のみ扱うことにする.\n", "\n", "\n", "---\n", "\n", "さて、1次元の場合に話を戻して...(図を再掲)\n", "\n", " \n", "\n", "\n", "$x$の値を$t$から更新していく方法として、色んな方法が考えられる。たとえば...\n", "\n", "1. ランダムに探索する(例:サイコロを振って、目が1-3なら$x$を適当な値だけ減らし出目が4-6なら$x$を増やしていく)\n", "2. xを適当な区間に分割(10等分,100等分, etc.)その点で値を調べる\n", "\n", "などが考えられる。\n", "\n", "ただし$x$が薬品の濃度で$f(x)$が薬品の副作用だとしたとき(※)には、$x$を変えて$f(x)$の値を調べる(測定する)と言っても限界がある。\n", "\n", "※「1変数の関数であるはずがない」ことは一旦忘れることにして、イメージしやすいようこの例にした\n", "\n", "1.の方法では、**同じところを何度か行き来するので明らかに無駄が多い**し、 \n", "2.の方法では**分割が少なすぎると十分な精度で最適解が見つからない** \n", "**かといって分割が多すぎるとコストがかさむ**。\n", "\n", "したがって、**できるだけ少ない試行回数で最適な値を見つける効率のよい探索方法**が必要となる。 \n", "そこで重要なのが、$x$を変えたときに関数$f(x)$がどのように変化するか、つまり微分(勾配)の情報である。\n", "\n", "**注意** \n", "そもそも$f(x)$の式の形がわかっていて$f'(x)=0$となる(つまり極値を持つ)$x$の値が計算できるのなら、わざわざ$x$を更新するなどという手続きは必要ない。 \n", "一般の問題では、関数やその勾配がそもそも書き下せなかったり極値を与える$x$($f'(x)=0$の解)を解析的に解けなかったりする。\n", "そんなときは以下で考えるような、$x$を更新していくような探索が必要となる。\n" ] }, { "cell_type": "markdown", "metadata": { "id": "P1xRaNCVtMju" }, "source": [ "## 最も基本的な最適化手法: 勾配法\n", "\n", "*以下では、微分の値のことを指して勾配と呼ぶことにする." ] }, { "cell_type": "markdown", "metadata": { "id": "B-PHr6IztBRE" }, "source": [ "さて、上の一次元の例をもっと簡略化することにして、単峰的(つまり1つしか谷が無い)場合を考えてみよう。\n", "\n", " \n" ] }, { "cell_type": "markdown", "metadata": { "id": "hsMxEg_frbpf" }, "source": [ "この様な場合、斜面の傾きに沿ってパラメータを更新していけばいずれ$f(x)$の最小値が見つかりそうだ。 \n", "点$x=t$での勾配は(あえて)偏微分で書くと$\\frac{\\partial f(x)}{\\partial x}|_{x=t}$となる。\n", "\n", "$x$の値を更新する際に、更新前の値を$x_{old}$,更新後の値を$x_{new}$と書くことにすると、 \n", "$x_{new} = x_{old} -\\eta \\frac{\\partial f(x)}{\\partial x}|_{x=x_{old}}$ と更新する。\n", "\n", ">注) $\\frac{\\partial f}{\\partial x}|_{x=t}$という表記に慣れていない方は、$f'(x=t)$のことと思って頂いて結構です\n", "\n", "\n", "\n", "微分(傾き)が正の場合は、$x$を正に増やすと$f(x)$の値が増える \n", "微分(傾き)が負の場合は、$x$を正に増やすと$f(x)$の値が減る \n", "ことから、微分の値の前にマイナスがついている理由も納得できるかと思います。\n", "\n", "最小化でなく最大化を考える場合はマイナス符号は不要で`+`となる。(上と同じように考えてみよう)\n", "\n", "上では、$\\eta$という係数(正の値)を導入したが、これは**傾いてる方向にどれくらいのスケールで$x$を更新するか**をコントロールするパラメータで、機械学習などの分野で学習率と呼ばれるものに対応している。 \n", "今の単峰的な関数の場合、学習率$\\eta$は適当な値をひとつ選べば十分である。" ] }, { "cell_type": "markdown", "metadata": { "id": "uIAvrbNCx0c1" }, "source": [ "ただし、上の$\\eta$が大きすぎたり小さすぎたりすると、なかなか効率的に$f(x)$の最適解を見つけられないことがある。\n", "\n", "$\\eta$が大きすぎると、$x$の更新幅が大きすぎて谷を跨いでしまい、なかなか谷の底に落ち込まない、といったことが起こりえる." ] }, { "cell_type": "markdown", "metadata": { "id": "jVRqeo3Hxbvx" }, "source": [ " \n" ] }, { "cell_type": "markdown", "metadata": { "id": "ETitsG3AyLI_" }, "source": [ "一方で$\\eta$が小さすぎると、なかなか更新が進まず、これまた効率の悪い探索となってしまう。\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": { "id": "xiFm1Ew9q5jk" }, "source": [ "これ以外にも、最初の図のように多峰的(山あり谷あり)な関数だと、 \n", "$\\eta$が小さいと局所的な谷に捕まってしまってなかなか大局的な谷にたどり着けない、 \n", "かといって$\\eta$が大きすぎるとあらぬ方向に飛んでいってしまう、といったことが起こりえる。\n", "\n", "その様な場合にはもう少し\"賢い\"最適化の手法を応用したり、更新の幅を徐々に減衰させるなどの工夫が必要になる。" ] }, { "cell_type": "markdown", "metadata": { "id": "cl4tMpwvU2OS" }, "source": [ "### $\\clubsuit$その他の最適化手法\n", "\n", "勾配法の他にもたくさん問題に応じて最適化手法が用いられる。 \n", "\n", "最適化問題自体、非常に話題が豊富なので、15コマ程度ましてや1コマで扱い切れるようなトピックではない。\n", "\n", "興味がある方は下記のキーワードなどで調べてみよう。\n", "\n", "たとえば機械学習では、勾配の情報だけでなくそれまでの更新の履歴を活用した各種の最適化手法がよく用いられる。→ AdaGrad, Adam, etc.\n", "\n", "また、物理学から着想を得た最適化手法もよく用いられる → 焼きなまし法(Simulated Annealing)\n", "\n", "最適化の手法自体に(広義の)機械学習の手法を使うこともある → ベイズ最適化 (おまけのノートブックもある)" ] }, { "cell_type": "markdown", "metadata": { "id": "cxTy2daMOgO5" }, "source": [ "### $\\clubsuit$目的関数の選択\n", "\n", "最適化問題を解く場合に最小化/最大化したい関数のことを目的関数と呼ぶ。\n", "\n", "データ分析をする上で最もよく出てくる目的関数はカイ自乗(chi-square)で、回帰の場合、予測$y_i$と観測値$f(x_i)$との間の二乗誤差$\\chi^2 = \\sum_i (y_i-f(x_i))^2$といったように定義される。 \n", "(データの数で割ったり平方根を取った値、平均二乗誤差を採用することも多い)\n", "\n", "機械学習の文脈では「予測の誤差(損失)を最小化したい」というモチベーションがあり、目的関数を損失関数/Loss functionなどと言ったりもする。\n", "\n", "目的関数の選び方は問題によってまちまちで、その選び方によって\"最適なモデル\"も変わり得る、ということに注意しておこう。\n", "\n", "たとえば、二乗誤差を考える際「正解が10のところを20と予測した場合」と「正解が1000のところを1010と予測した場合」とで二乗誤差の値自体は同じだが、 \n", "データの数値に対する誤差が占める割合に着目すれば、前者は2倍(100%)ずれていて、後者は1%しかずれていない。\n", "\n", "このようにスケールの異なる量が出てくる状況下では、目的関数の定義で対数を取ったりする場合もある。\n", "\n", "一般に目的関数の選択は、複数の量のバランス(トレードオフ)を考える必要があり、その選び方が問題の解釈や性能にも大きく影響する。" ] }, { "cell_type": "markdown", "metadata": { "id": "6r7qWIUQ27li" }, "source": [ "### 簡単な例でのプログラム\n", "\n", "下に凸な二次関数の最小値を、勾配降下法で求めてみよう. もちろん二次関数の場合は、極値を与える$x$の値は、 \n", "プログラムを書くまでもなく平方完成で求められるが、目的は数値計算になれるためなので気にしないことにする。\n", "\n", "$f(x)=5x^2 -4x + 3$とでもしましょう。 \n", "$x$についての微分はもちろん$\\frac{df(x)}{dx}=10x -4$になる。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "vQmG-t4Y3PAY" }, "outputs": [], "source": [ "def f(x):\n", " return 5.0 * x**2 - 4.0 * x + 3.0\n", "def dfdx(x):\n", " return 10.0 * x -4.0" ] }, { "cell_type": "markdown", "metadata": { "id": "--DHmqJp3f0E" }, "source": [ "はじめに$x=3.0$にいるとして、$\\eta=0.2,0.05,0.01,0.001$の4通りについて \n", "勾配降下法でパラメータを100回更新してみる。\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "vgoJsFe73raV" }, "outputs": [], "source": [ "step = 100\n", "etas = [0.2, 5.e-2, 1.e-2, 1.e-3]\n", "x_and_f = [ [] for i in range(len(etas))]\n", "for i in range(len(etas)): \n", " x = 3.0 #初期値\n", " x_and_f[i] += [ [ x, f(x) ] ] #結果をリストに格納\n", " for tstep in range(step): # step回だけ更新を繰り返す\n", " x = x - etas[i] * dfdx(x) # xnew = xold - eta * dfdx(at xold)になっている\n", " x_and_f[i] += [ [ x, f(x) ] ] #結果をリストに格納" ] }, { "cell_type": "markdown", "metadata": { "id": "P-v28tFN9uAj" }, "source": [ "アニメーションで見てみると... (少し実行に時間がかかります)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 456 }, "id": "NEu9t-eoCAhx", "outputId": "0cebb7be-d68a-46cd-8a63-1df1e5ae431f" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "from matplotlib import pyplot as plt\n", "from matplotlib import animation, rc\n", "rc('animation', html='jshtml')\n", "cols = [\"blue\",\"green\",\"orange\",\"purple\"]\n", "x = np.linspace(-6, 6, 100);y = f(x)\n", "\n", "fig_scatter = plt.figure(figsize=(10,5))\n", "plt.xlim(-4,4);plt.ylim(0,40)\n", "plt.plot(x,y)\n", "plt_scatter = []\n", "for nth in range(len(x_and_f[i])):\n", " plot_obj = []\n", " for i, eta in enumerate(etas): \n", " if nth == 0 :\n", " tl = \"eta=\"+str(eta)\n", " else :\n", " tl = \"\"\n", " plot_obj += [plt.scatter(x_and_f[i][nth][0],x_and_f[i][nth][1], c=cols[i],label=tl,alpha=0.7)]\n", " plt_scatter.append(plot_obj)\n", "plt.legend()\n", "plt.close()\n", "\n", "animation.ArtistAnimation(fig_scatter, plt_scatter, interval=100)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "ol7eW9lZ3vYI" }, "source": [ "グラフが描画できたら、再生ボタンを押してみよう。\n", "\n", "青($\\eta=0.2$)は$\\eta$が大きすぎて、谷を行ったり来たりしていることが分かる。一方で紫($\\eta=0.001$)は小さすぎて、なかなか最適解にたどり着かない。\n", "\n", "一般に考えたい関数に関して適切な$\\eta$を前もって知ることはできず、最適化したい量(関数)の振る舞いを見ながら試行錯誤することが必要になる。" ] }, { "cell_type": "markdown", "metadata": { "id": "tKDQnoQb-J7E" }, "source": [ "## 勾配の計算について\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "RYsa56Bt4TFB" }, "source": [ "### 解析的に微分が計算できる場合\n", "\n", "\n", "たとえば以下の例のように \n", "\n", "1. $f(x)= \\sum^p_{i=0} a_i x^i$ (多項式) \n", "2. $f(x)= \\exp{(-ax^2+bx+c)}$ (指数関数) \n", "3. $f(x)= \\ln{x}$ (自然対数) \n", "\n", "* $f(x)$が閉じた形で書き下せる\n", "* 興味のある区間(定義域)で微分形が計算でき、有限の値を持つ\n", "\n", "場合、$x$をその微分した表式に代入することで勾配法の実装が可能となる. \n", "([有限の値をもつ場合]と限定したのは、微分が発散してしまうとパラメータの更新には実用上意味をなさないため)\n", "\n", "ちなみに導関数$f'(x)=0$の解(根)がすべて手で計算できるなら数値計算する必要がないし、根を求めたいだけなら、勾配法を使う理由は(アルゴリズムの理解等の目的を除いて)特に必要ない。  \n", "※最も単純な求根アルゴリズムであるニュートン法についての説明についてはおまけのニュートン法の章に記載がある。\n", "\n", "大量の関数を考えて微分した表式が必要な場合は、いちいち関数の微分形を導出してコードにするのは面倒なので、SympyなどのモジュールやMathematicaなどの数式そのものの微分などを扱えるツールを使うのも一つの手である。" ] }, { "cell_type": "markdown", "metadata": { "id": "jzSF_CiSrcAp" }, "source": [ "### 数値的に勾配を計算する場合\n", "\n", "$f(x)$が具体的な$x$の形で書き下せない場合もある.\n", "\n", "たとえば「$f(x)$が条件$x$のもとで行った何らかの測定結果である場合」などがこれにあてはまる。\n", "\n", "より具体的な例をあげるなら...\n", "\n", ">あなたはとある医療薬品の効果(数値で表現できると仮定)を調べる研究をしているとして、 \n", "温度$x$を変えながら何回か測定して$f(x)$の値を調べている\n", "\n", "といった状況を想像してください.  \n", "このような場合、関数$f(x)$の具体的な表式がわからないので、勾配についても$x$に対する式として書き下すことはできない。\n", "\n", "しかし、微分の定義に立ち返って考えてみると、$f(x=a)$の値と、$x=a$から微小量$\\delta$だけ動かした場所での値$f(a+\\delta)$がわかっていれば$f'(x=a)$を\"近似的に\"計算することができる。\n", "\n", "$$\n", "\\left. \\frac{df(x)}{dx} \\right|_{x=a} = \\lim_{\\delta \\to 0} \\frac{f(a+\\delta) - f(a)}{\\delta}\n", "$$\n", "\n", "ただし、$\\delta$があまり小さくないと下の絵のように正しく勾配が計算できない一方で、$x$を調整する精度に限界があったり、勾配を計算する際のコンピュータの数値精度には限りがありますので、文字通りの意味で\"無限に小さい\"の$\\delta$を考えることはできず、有限の小さな値で$\\delta$を表現することになり、それにより数値計算に大きな誤差が紛れ込む危険性もある。\n", "\n", "$x$を動かしたときの関数の変動度合いがものすごく大きい(たとえば係数がめちゃくちゃデカイ)と、数値微分の精度は$\\delta$に対する依存性が強くなってしまう。\n", "\n", "\n", " \n", "\n", "\n", "解析的に微分ができる関数を使って、数値微分の簡単な例を示しておこう。\n", "\n", "関数 $f(x)= x^4 - 3x^3 + 2x - 1$ を $x=5$ で微分した値 $f'(5)$ は定義から277となるが、\n", "$x=5$ から $\\epsilon$ だけずらした点での値を使って数値微分してみると" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xwH40zbqgdfG", "outputId": "b71b0ea1-4690-45a7-a322-ee5262217fdd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "delta\t 1.0e+00 \tf'(5)\t 400.0000000000000 \t diff. 2.1e+00\n", "delta\t 1.0e-01 \tf'(5)\t 287.6709999999986 \t diff. 1.0e+00\n", "delta\t 1.0e-02 \tf'(5)\t 278.0517009999926 \t diff. 2.2e-02\n", "delta\t 1.0e-04 \tf'(5)\t 277.0105001695811 \t diff. -2.0e+00\n", "delta\t 1.0e-05 \tf'(5)\t 277.0010499943965 \t diff. -3.0e+00\n", "delta\t 1.0e-10 \tf'(5)\t 277.0002538454719 \t diff. -3.6e+00\n", "delta\t 1.0e-15 \tf'(5)\t 227.3736754432320 \t diff. 1.7e+00\n" ] } ], "source": [ "def f(x):\n", " return x**4 - 3.0* x**3 + 2.0*x -1.0\n", "def fp(x,delta):\n", " return (f(x+delta)-f(x))/delta\n", "x=5\n", "exact_fp = 277 \n", "for p in [0,-1,-2,-4,-5,-10,-15]:\n", " delta = 10**p\n", " print(\"delta\\t\",str(\"%5.1e\" % delta), \"\\tf'(\"+str(x)+\")\\t\", str(\"%18.13f\" % fp(x,delta) ),\n", " \"\\t diff.\",str(\"%5.1e\" % np.log10(abs(fp(x,delta)-exact_fp))))\n" ] }, { "cell_type": "markdown", "metadata": { "id": "ebgIJHf8hoti" }, "source": [ "となり, $\\epsilon=0.01$程度では微分の値の誤差が1, $\\epsilon=$ 1.e-5でも2桁程度の精度しかない。\n", "\n", "一番小さい$\\epsilon=$で精度が逆に悪くなっているのは、\n", "あまりに小さい$\\epsilon$だと$f(x+\\epsilon)-f(x)$という引き算部分で数値誤差が発生し、 \n", "さらに分母の小さな$\\epsilon$によってそれが増幅されるためで、\n", "微小な値にすればするほど厳密な答えを得られるというわけではない。" ] }, { "cell_type": "markdown", "metadata": { "id": "V2b6emNrSLR-" }, "source": [ "$\\clubsuit$ 進んだ注 \n", "中心差分という、分割する区間を中央をxに揃える方式だと、精度が若干改善される。このことは、テイラー展開から示すことができる[→参考](https://ja.wikipedia.org/wiki/有限差分)\n", "つまり、微分を下記の右辺のように評価する方法:\n", "\n", "$$\n", "\\left. \\frac{df(x)}{dx} \\right|_{x=a} \\approx \\lim_{\\delta \\to 0} \\frac{f(a+\\delta /2)-f(a-\\delta /2)}{\\delta }\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "s8sV0EIWR2Wk", "outputId": "198486ec-5851-423c-bbad-f2f11e0ae153" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "中心差分: 分割する区間の中央をxに揃える方式\n", "delta\t 1.0e+00 \tf'(5)\t 281.2500000000000 \t diff. 6.3e-01\n", "delta\t 1.0e-01 \tf'(5)\t 277.0424999999986 \t diff. -1.4e+00\n", "delta\t 1.0e-02 \tf'(5)\t 277.0004249999886 \t diff. -3.4e+00\n", "delta\t 1.0e-04 \tf'(5)\t 277.0000000424488 \t diff. -7.4e+00\n", "delta\t 1.0e-05 \tf'(5)\t 276.9999999827633 \t diff. -7.8e+00\n", "delta\t 1.0e-10 \tf'(5)\t 276.9991169770947 \t diff. -3.1e+00\n", "delta\t 1.0e-15 \tf'(5)\t 454.7473508864641 \t diff. 2.2e+00\n" ] } ], "source": [ "def fp2(x,delta):\n", " return (f(x+0.5*delta)-f(x-0.5*delta))/(delta)\n", "\n", "print(\"中心差分: 分割する区間の中央をxに揃える方式\")\n", "for p in [0,-1,-2,-4,-5,-10,-15]:\n", " delta = 10**p\n", " print(\"delta\\t\", str(\"%5.1e\" % delta), \"\\tf'(\"+str(x)+\")\\t\",str(\"%18.13f\" % fp2(x,delta) ),\n", " \"\\t diff.\",str(\"%5.1e\" % np.log10(abs(fp2(x,delta)-exact_fp))))" ] }, { "cell_type": "markdown", "metadata": { "id": "H0f2hs7yEEc0" }, "source": [ "## $\\clubsuit$その他の話題" ] }, { "cell_type": "markdown", "metadata": { "id": "bnKTRlQJEI55" }, "source": [ "冒頭にも書いたとおり、我々の身の回りにある多くの問題は最適化問題に帰着される。\n", "\n", "もう少し細かいことをいうと、今回考えたような連続的な変数に対して最大/最小値を探索することは連続最適化と呼ばれ、離散的な変数を含む離散最適化/組み合わせ最適化とは区別される。\n", "\n", "組合せ最適化には、巡回セールスマン問題、ナップサック問題などが含まれる。 \n", "過去の授業の最終課題として、「予め用意された日常的に使う食品群の中から、栄養バランスを考慮しつつ食品を選び献立作成に役立てる」という課題に着手した学生もいたが、\n", "これも材料の単位を個数・100gごとなどで離散化すれば、組合せ最適化問題として解くことができる。\n" ] }, { "cell_type": "markdown", "metadata": { "id": "BQcTACZvsYyW" }, "source": [ "## 数学的準備: 微分\n", "\n", "ある直線$y=ax+b$を考えたとき、直線の傾き$a$に着目すれば、$x$の増加分に対して$y$がどれだけ変化するかを知ることができる。\n", "\n", "一方、実社会で扱うデータは、一般に直線よりも複雑な形をしていて、それを式で表現しようと思うと、様々な関数の形を考える必要がある。 \n", "(たとえば何かの値の季節変動などをイメージしよう)\n", "\n", "そこで、直線の場合の傾きを、直線以外の関数に\"拡張\"しようと考えるのは至って自然な発想といえる。それが**微分**の概念である.\n", "\n", "微分(積分)の歴史は古く、人類史のどの時点でアイデアが確立したとするかは諸説あるが、\n", "最も代表的なものは、17世紀にニュートンとライプニッツが確立したとする説で、ニュートンは微分の概念を独自に定式化し、天体の軌道などを予測するなどの偉大な功績を残した.\n", "\n", "以下の内容は、厳密性はかなり犠牲にして微分の概念を導入している。\n", "(もちろん、大学の数学の教科書に載っている関数の連続性や微分の厳密な定義も非常に重要です)." ] }, { "cell_type": "markdown", "metadata": { "id": "OJqvQeu8wOgC" }, "source": [ "### 微分の基本的な考え方\n", "\n", "定義: ある変数$x$について関数$f(x)$が与えられているとき、 \n", "関数$f(x)$の$x=a$での微分を \n", "$f'(a)=\\lim_{\\delta \\to 0} \\frac{f(a+\\delta)-f(a)}{\\delta}$と定義する. \n", "\n", "ここで、$\\lim_{\\delta \\to 0}$は0に限りなく近い(無限小)の$\\delta$を考えることを意味する。 \n", "\n", "つまり、関数をある点からちょこっとだけ動かしたときに、 \n", "関数の値が変動する度合いがどれくらいかを表しています。 \n", "上の定義は「無限小の幅で関数を直線で近似して傾きを計算している」とも言いかえられるでしょう。\n", "\n", "**直線の例** \n", "$f(x) = ax + b $の$x=x_1$での微分値は定義に当てはめて計算すると \n", "$f'(x_1)= \\lim_{\\delta \\to 0} \\frac{f(x_1+\\delta)-f(x_1)}{\\delta}= \\lim_{\\delta \\to 0} \\frac{(a(x_1+\\delta)+b)-(ax_1+b)}{\\delta} = a $ となる。 \n", "つまり微分の値は直線の傾きに対応していて、 \n", "なおかつ微分の値はどこの場所($x$)で調べても定数$a$であることを意味している。\n", "\n", "\n", "**二次関数(放物線)の例** \n", "$f(x) = ax^2 + bx +c $\n", "の$x=x_1$での微分は、定義にならって計算すると\n", "$f'(x_1) = 2ax_1+b$となる(確かめてみよう) \n", "一方で$f(x)$を平方完成すると$f(x)=a(x+\\frac{b}{2a})^2 -\\frac{b^2}{4a} +c$となり、 \n", "$x=-b/(2a)$で傾きが0になる。 \n", "つまりこの二次関数は$x=-b/(2a)$で極値($a>0$なら最小値, $a<0$なら最大値)を持つ。\n", "\n", "微分が0というのは関数の形がそこで谷や峠になっていることを意味する。 \n", "実際上の例でも微分の値は$x_1=-b/(2a)$のとき、値は0になっている.\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "EKvfZuwG02Wv" }, "source": [ "a=2.0,b=4.0,c=5.0とでもして、図をかいてみよう" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Bh0Y1E-A03PF", "outputId": "8f311de7-2ee8-41e8-cce8-d37addcb1027" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt\n", "import numpy as np\n", "xr = np.arange(-5.0,3.0,0.01)\n", "yr = 2.0 * xr**2 + 4.0 * xr + 5.0\n", "fig = plt.figure(figsize=(10,2))\n", "plt.plot(xr,yr)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "1Vdm0nMX1oCX" }, "source": [ "確かに$x=-b/(2a)=-1.0$のところで極値(最小値)となっている。" ] }, { "cell_type": "markdown", "metadata": { "id": "HUp-OGlj6wOg" }, "source": [ "微分の値もplotしてみると" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ZyvYWUVX6xo6", "outputId": "f8e5746d-43d0-44ed-bd13-a8eb3bc8a433" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABj0AAAFfCAYAAAAVnA5PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAACY9UlEQVR4nOzdd3SUZf7+8fdMekgjPSFt6L23kIgNQVAEQRRUSsJid1ex4tpwdbGtbXXtoUgTEFBEQUUBE0In9E4qISEE0kmd+f3B1/yWFZVgwpNyvc6Zc5h77plcwJzJM8/nue+PyWaz2RAREREREREREREREWngzEYHEBERERERERERERERqQ0qeoiIiIiIiIiIiIiISKOgooeIiIiIiIiIiIiIiDQKKnqIiIiIiIiIiIiIiEijoKKHiIiIiIiIiIiIiIg0Cip6iIiIiIiIiIiIiIhIo6Cih4iIiIiIiIiIiIiINAr2Rgf4X1arlczMTNzd3TGZTEbHERERERGpczabjcLCQoKDgzGbdV2S/DF9bxIRERGRpqQm35nqXdEjMzOT0NBQo2OIiIiIiFx26enphISEGB1DGgB9bxIRERGRpuhivjPVu6KHu7s7cC68h4eHwWlEREREROpeQUEBoaGh1cfCIn9E35tEREREpCmpyXemelf0+GVptoeHhw7eRURERKRJ0TZFcrH0vUlEREREmqKL+c6kDYNFRERERERERERERKRRUNFDREREREREREREREQaBRU9RERERERERERERESkUah3PT1ERERERESkdlRVVVFRUWF0jHrPwcEBOzs7o2OIiIiISC1Q0UNERERERKSRsdlsZGVlkZeXZ3SUBsPLy4vAwMCLao4pIiIiIvWXih4iIiIiIiKNzC8FD39/f1xdXXUi/3fYbDZKSko4efIkAEFBQQYnEhEREZE/Q0UPERERERGRRqSqqqq64OHj42N0nAbBxcUFgJMnT+Lv76+trkREREQaMDUyFxERERERaUR+6eHh6upqcJKG5Zd/L/VAEREREWnYalT0eP/99+natSseHh54eHgQGRnJt99+W/34VVddhclkOu92zz331HpoERERERER+X3a0qpm9O8lIiIi0jjUaHurkJAQXn75Zdq0aYPNZmP27NmMGDGCHTt20KlTJwCmTJnCCy+8UP2chnh1UVllFU72Ws4sIiIiIiIi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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xr = np.arange(-5.0,3.0,0.01)\n", "yr = 2.0 * xr**2 + 4.0 * xr + 5.0\n", "yp = 4.0 * xr + 4.0 \n", "fig = plt.figure(figsize=(20,4))\n", "axs = [fig.add_subplot(121),fig.add_subplot(122)]\n", "axs[0].plot(xr,yr,label=\"f(x)\"); axs[0].legend()\n", "axs[1].plot(xr,yp,label=\"f'(x)\");axs[1].plot([-5,3],[0,0],color=\"gray\",linestyle=\"dotted\");axs[1].legend()\n", "plt.show();plt.close()" ] }, { "cell_type": "markdown", "metadata": { "id": "dstsTQdJ7sFs" }, "source": [ "$x<-1$では$f'(x)<0$で、$x>-1$では$f'(x)>0$となっていますね。" ] }, { "cell_type": "markdown", "metadata": { "id": "Z0uJ-5dE1xNE" }, "source": [ "これまでは、定義に即して微分の値を計算していましたが、毎回調べたい点で定義に立ち返るというのは面倒です。\n", "\n", "関数が閉じた形で与えられているとき(つまり、$f(x)$が$x$の具体的な表式で与えられているとき) \n", "多くはその微分$f'(x)$も$x$の関数として書き下すことができます。 \n", "\n", "そうすれば、$x$に特定の値を代入すれば好きな点での微分の値$f'(x)$を知ることができます。\n", "\n", "\n", "とりあえずは以下を公式的に抑えておけば問題は有りません。\n", "\n", "1. $x$の$x$に対する微分は1\n", "2. $a x^p$の$x$に対する微分は$apx^{p-1}$ ($a$は非ゼロの定数)\n", "3. $\\exp{(x)}$(ネイピア数$e$の$x$乗)の$x$に対する微分は$\\exp{(x)}$ \n", "4. $\\cos{x}$の$x$に対する微分は$-\\sin{x}$\n", "5. $\\sin{x}$の$x$に対する微分は$\\cos{x}$\n", "6. $\\log{x}$の$x$に対する微分は$1/x$ (x>0で定義される)\n", "\n", "いずれも、上の微分の定義や、指数関数/三角関数/対数関数の定義(c.f. マクローリン展開)から証明することができます。\n" ] } ], "metadata": { "colab": { "authorship_tag": "ABX9TyNgJ/vjuDqbrPwWEhR7i48L", "collapsed_sections": [ "tKDQnoQb-J7E", "BQcTACZvsYyW" ], "include_colab_link": true, "name": "Python_chapter7_Optimization.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3.9.13 64-bit", "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.10.9" }, "vscode": { "interpreter": { "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" } } }, "nbformat": 4, "nbformat_minor": 0 }