Skip to content

Instantly share code, notes, and snippets.

@reiyw
Created May 15, 2017 23:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reiyw/2881d874c9a2adc7ec4399d0eb5b8c45 to your computer and use it in GitHub Desktop.
Save reiyw/2881d874c9a2adc7ec4399d0eb5b8c45 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4 Numerical Computation"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T00:41:52.974076",
"start_time": "2017-05-16T00:41:52.953854"
},
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"import seaborn as sns\n",
"sns.set_context('notebook')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"解析的ではなく,反復プロセスによって解の見積もりを更新する方法によって数学的問題を解くアルゴリズムを紹介.\n",
"\n",
"「ゼロから作るディープラーニング」第4章も参照."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.1 Overflow and Underflow"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"計算機上で連続的な計算を実行する際の基本的な困難さは、有限長のビットパターンで無限に多くの実数を表現する必要があることである.これは,ほとんどすべての実数について,計算機内の数値を表すときに近似誤差が発生することを意味する.多くの場合,これはちょうど丸め誤差である.丸め誤差の累積を最小限に抑えるように設計されていないと,実際に多くの操作で混乱し,理論上で動作するアルゴリズムが失敗する可能性がある.\n",
"\n",
"- 丸め誤差の例:\n",
" - underflow (アンダーフロー): ゼロに近い数値をゼロに丸めると発生する.\n",
" - overflow (オーバーフロー): 大きな数値を $\\infty$ または $-\\infty$ として近似するときに発生する."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 例: softmax"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\mathrm{softmax}(\\mathbf{x})_i = \\frac{\\exp(x_i)}{\\sum_{j=1}^n \\exp(x_j)} \\tag{dl 4.1}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$x_i$ がある定数 $c$ に等しいとする."
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T17:20:34.779064",
"start_time": "2017-05-15T17:20:34.770943"
},
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/ryo-t/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/numpy/core/numeric.py:301: FutureWarning: in the future, full((1, 5), 10) will return an array of dtype('int64')\n",
" format(shape, fill_value, array(fill_value).dtype), FutureWarning)\n"
]
},
{
"data": {
"text/plain": [
"array([[ 10., 10., 10., 10., 10.]])"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c = 10\n",
"x = np.full((1, 5), c)\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T17:20:34.939282",
"start_time": "2017-05-15T17:20:34.932136"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 22026.46579481, 22026.46579481, 22026.46579481, 22026.46579481,\n",
" 22026.46579481]])"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.exp(x)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T17:20:35.110828",
"start_time": "2017-05-15T17:20:35.102731"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.2, 0.2, 0.2, 0.2, 0.2]])"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# softmax(x)\n",
"np.exp(x) / np.exp(x).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"🙆"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$c$ がデカイと $\\exp(c)$ がオーバーフローし,softmax は $\\infty/\\infty$ で undefined."
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T17:20:35.456817",
"start_time": "2017-05-15T17:20:35.448988"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1000., 1000., 1000., 1000., 1000.]])"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c = 10e2\n",
"x = np.full((1, 5), c)\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T17:20:35.627112",
"start_time": "2017-05-15T17:20:35.619576"
},
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/ryo-t/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/ipykernel/__main__.py:1: RuntimeWarning: overflow encountered in exp\n",
" if __name__ == '__main__':\n"
]
},
{
"data": {
"text/plain": [
"array([[ inf, inf, inf, inf, inf]])"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.exp(x)"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T17:20:35.791973",
"start_time": "2017-05-15T17:20:35.784879"
},
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/ryo-t/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/ipykernel/__main__.py:2: RuntimeWarning: overflow encountered in exp\n",
" from ipykernel import kernelapp as app\n",
"/Users/ryo-t/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/ipykernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n",
" from ipykernel import kernelapp as app\n"
]
},
{
"data": {
"text/plain": [
"array([[ nan, nan, nan, nan, nan]])"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# softmax(x)\n",
"np.exp(x) / np.exp(x).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"🙀"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$c$ が小さいと $\\exp(c)$ がアンダーフローし,softmax は $0/0$ で undefined."
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T17:20:36.122965",
"start_time": "2017-05-15T17:20:36.115666"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[-1000., -1000., -1000., -1000., -1000.]])"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c = -10e2\n",
"x = np.full((1, 5), c)\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T17:20:36.299348",
"start_time": "2017-05-15T17:20:36.292132"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0., 0., 0., 0., 0.]])"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.exp(x)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T17:20:36.471426",
"start_time": "2017-05-15T17:20:36.462253"
},
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/ryo-t/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/ipykernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n",
" from ipykernel import kernelapp as app\n"
]
},
{
"data": {
"text/plain": [
"array([[ nan, nan, nan, nan, nan]])"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# softmax(x)\n",
"np.exp(x) / np.exp(x).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"🙀"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 解決策: $\\mathrm{softmax}(\\mathbf{z})$, where $\\mathbf{z} = \\mathbf{x} - \\mathrm{max}_i x_i$ を評価"
]
},
{
"cell_type": "code",
"execution_count": 158,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:52:51.977919",
"start_time": "2017-05-16T02:52:51.970542"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1000., 1000., 1000., 1000., 1000.]])"
]
},
"execution_count": 158,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c = 10e2\n",
"x = np.full((1, 5), c)\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 159,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:52:52.835121",
"start_time": "2017-05-16T02:52:52.828637"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0., 0., 0., 0., 0.]])"
]
},
"execution_count": 159,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"z = x - x.max()\n",
"z"
]
},
{
"cell_type": "code",
"execution_count": 160,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:52:53.621674",
"start_time": "2017-05-16T02:52:53.614464"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.2, 0.2, 0.2, 0.2, 0.2]])"
]
},
"execution_count": 160,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# softmax(z)\n",
"np.exp(z) / np.exp(z).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"🙆"
]
},
{
"cell_type": "code",
"execution_count": 168,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:54:31.187361",
"start_time": "2017-05-16T02:54:31.179770"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[-1000., -1000., -1000., -1000., -1000.]])"
]
},
"execution_count": 168,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c = -10e2\n",
"x = np.full((1, 5), c)\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 169,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:54:32.545695",
"start_time": "2017-05-16T02:54:32.539182"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0., 0., 0., 0., 0.]])"
]
},
"execution_count": 169,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"z = x - x.max()\n",
"z"
]
},
{
"cell_type": "code",
"execution_count": 170,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:54:33.683170",
"start_time": "2017-05-16T02:54:33.676232"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.2, 0.2, 0.2, 0.2, 0.2]])"
]
},
"execution_count": 170,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# softmax(z)\n",
"np.exp(z) / np.exp(z).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"🙆"
]
},
{
"cell_type": "code",
"execution_count": 161,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:53:13.741768",
"start_time": "2017-05-16T02:53:13.733959"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([-4, -3, -2, -1, 0])"
]
},
"execution_count": 161,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.array([1, 2, 3, 4, 5])\n",
"z = x - x.max()\n",
"z"
]
},
{
"cell_type": "code",
"execution_count": 167,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:54:14.693418",
"start_time": "2017-05-16T02:54:14.684733"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(array([ 0.01165623, 0.03168492, 0.08612854, 0.23412166, 0.63640865]),\n",
" array([ 0.01165623, 0.03168492, 0.08612854, 0.23412166, 0.63640865]))"
]
},
"execution_count": 167,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.exp(x) / np.exp(x).sum(), np.exp(z) / np.exp(z).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"🙆"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"普通はこういうトリックが必要だが,この本で説明されているさまざまなアルゴリズムの実装に関わるすべての数値的な考慮事項は明示的に記述されていない.Theano など低レベルライブラリの開発者は,deep learning アルゴリズムを実装する際に数値問題を念頭に置くべき.でもこの本のほとんどの読者は,低レベルライブラリに頼ってればOK牧場."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.2 Poor Conditioning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**conditioning**: 入力のわずかな変化に対して,関数がどれほど急速に変化するかを指す.入力の丸め誤差が出力に大きな変化をもたらす可能性があるため,入力がわずかに動いたときに急激に変化する関数は科学的計算には問題がある."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"関数 $f(\\mathbf{x}) = \\mathbf{A}^{-1}\\mathbf{x}$ を考える.$\\mathbf{A} \\in \\mathbb{R}^{n \\times n}$ が固有値を持つとき,**condition number** は"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\max_{i,j} \\left| \\frac{\\lambda_i}{\\lambda_j} \\right| \\tag{dl 4.2}\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 172,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T03:03:55.441515",
"start_time": "2017-05-16T03:03:55.430269"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1, 0, -1],\n",
" [ 0, 1, 0],\n",
" [ 1, 0, 1]])"
]
},
"execution_count": 172,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = np.array([[1, 0, -1], [0, 1, 0], [1, 0, 1]])\n",
"a"
]
},
{
"cell_type": "code",
"execution_count": 173,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T03:04:08.532103",
"start_time": "2017-05-16T03:04:08.496721"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1.4142135623730951"
]
},
"execution_count": 173,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.linalg.cond(a)"
]
},
{
"cell_type": "code",
"execution_count": 178,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T03:07:36.122498",
"start_time": "2017-05-16T03:07:36.115184"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1, 0, 0],\n",
" [ 0, 10, 0],\n",
" [ 0, 0, 100]])"
]
},
"execution_count": 178,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = np.diag([1, 10, 100])\n",
"a"
]
},
{
"cell_type": "code",
"execution_count": 179,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T03:07:43.120077",
"start_time": "2017-05-16T03:07:43.113720"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"100.0"
]
},
"execution_count": 179,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.linalg.cond(a)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"この値がデカイと,逆行列は入力の誤差を増幅する.実際には,誤差は逆行列自体の数値誤差によってさらに複合化される."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.3 Gradient-Based Optimization"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ほとんどの deep learning アルゴリズムには,ある種の最適化が必要.最適化とは,$x$ を変更することによって,ある関数 $f(x)$ を最小化または最大化するタスクのこと.$f(x)$ を最小化するという点では,ほとんどの最適化の問題に言及する.\n",
"\n",
"最小化または最大化したい関数は目的関数 (objective function) または最適化基準 (criterion) と呼ばれる.最小化するときには,コスト関数 (cost function),損失関数 (loss function),またはエラー関数 (error function) とも呼ばれる.\n",
"本書では、これらの用語を同じ意味で使用していますが、一部の機械学習の出版物では、これらの用語のいくつかに特別な意味が割り当てられています。\n",
"\n",
"読者はすでに微積分に精通していると仮定し,微積分の概念が最適化にどのように関係しているかを簡単に解説する."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 数値微分"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\\frac{df(x)}{dx} = \\lim_{h \\to 0} \\frac{f(x+h) - f(x-h)}{2h}$$"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-15T22:29:48.498958",
"start_time": "2017-05-15T22:29:48.475164"
},
"collapsed": true
},
"outputs": [],
"source": [
"def numerical_diff(f, x):\n",
" h = 1e-4\n",
" return (f(x+h) - f(x-h)) / (2*h)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$f_1(x) = 0.01x^2 + 0.1x$$"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T00:51:32.649193",
"start_time": "2017-05-16T00:51:32.644684"
},
"collapsed": false
},
"outputs": [],
"source": [
"def function_1(x):\n",
" return 0.01*x**2 + 0.1*x"
]
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T01:29:15.240928",
"start_time": "2017-05-16T01:29:15.235652"
},
"collapsed": true
},
"outputs": [],
"source": [
"def tangent_line(f, x):\n",
" d = numerical_diff(f, x)\n",
" y = f(x) - d*x\n",
" return lambda t: d*t + y"
]
},
{
"cell_type": "code",
"execution_count": 138,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T01:29:16.024307",
"start_time": "2017-05-16T01:29:15.706798"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x11ba486a0>]"
]
},
"execution_count": 138,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nxwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11ba48908>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.arange(0.0, 20.0, 0.1)\n",
"y = function_1(x)\n",
"plt.xlabel(\"x\")\n",
"plt.ylabel(\"f(x)\")\n",
"\n",
"tf = tangent_line(function_1, 5)\n",
"y2 = tf(x)\n",
"\n",
"plt.plot(x, y)\n",
"plt.plot(x, y2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 偏微分"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$f_2(x_0,x_1) = x_0^2 + x_1^2 \\tag{zero 4.6}$$"
]
},
{
"cell_type": "code",
"execution_count": 113,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T00:57:40.130810",
"start_time": "2017-05-16T00:57:40.125163"
},
"collapsed": true
},
"outputs": [],
"source": [
"def function_2(x):\n",
" if x.ndim == 1:\n",
" return np.sum(x**2)\n",
" else:\n",
" return np.sum(x**2, axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\\frac{\\partial{f_2}}{\\partial{x_0}}$$"
]
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T01:00:13.427465",
"start_time": "2017-05-16T01:00:13.421011"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"6.000000000012662"
]
},
"execution_count": 120,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def function_tmp1(x0):\n",
" return x0**2 + 0**2 # x_1^2 は定数なので何でもいいし結果も変わらない\n",
"\n",
"numerical_diff(function_tmp1, 3.0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\\frac{\\partial{f_2}}{\\partial{x_1}}$$"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T01:11:21.447041",
"start_time": "2017-05-16T01:11:21.426860"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"7.999999999999119"
]
},
"execution_count": 123,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def function_tmp1(x1):\n",
" return 0**2 + x1**2 # x_0^2 は定数なので何でもいいし結果も変わらない\n",
"\n",
"numerical_diff(function_tmp1, 4.0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 勾配 (gradient)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$x_0$ と $x_1$ の偏微分をまとめて計算したいとする.$(x_0,x_1)$ の両方の偏微分をまとめて,$(\\frac{\\partial{f}}{\\partial{x_0}}, \\frac{\\partial{f}}{\\partial{x_1}})$ として計算することを考える.$(\\frac{\\partial{f}}{\\partial{x_0}}, \\frac{\\partial{f}}{\\partial{x_1}})$ のように,すべての変数の偏微分をベクトルとしてまとめたものを勾配 (gradient) と呼ぶ."
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T01:17:29.142317",
"start_time": "2017-05-16T01:17:29.130767"
},
"collapsed": true
},
"outputs": [],
"source": [
"def numerical_gradient(f, x):\n",
" h = 1e-4 # 0.0001\n",
" grad = np.zeros_like(x) # x と同じ形状の零ベクトル\n",
" \n",
" for idx in range(x.size):\n",
" tmp_val = x[idx]\n",
" # f(x+h) の計算\n",
" x[idx] = float(tmp_val) + h\n",
" fxh1 = f(x)\n",
" \n",
" # f(x-h) の計算\n",
" x[idx] = tmp_val - h \n",
" fxh2 = f(x)\n",
" \n",
" grad[idx] = (fxh1 - fxh2) / (2*h)\n",
" x[idx] = tmp_val # 値を元に戻す\n",
" \n",
" return grad"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T01:16:26.739302",
"start_time": "2017-05-16T01:16:26.734207"
}
},
"source": [
"点 $(3,4)$ での勾配:"
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T01:17:33.709530",
"start_time": "2017-05-16T01:17:33.702926"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 6., 8.])"
]
},
"execution_count": 133,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numerical_gradient(function_2, np.array([3.0, 4.0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"勾配をベクトルだと思っていろんな点で求めて図示すると:"
]
},
{
"cell_type": "code",
"execution_count": 136,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T01:21:18.739328",
"start_time": "2017-05-16T01:21:18.355860"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x11baed860>"
]
},
"execution_count": 136,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n3ktS0g1WrFhBaGgomZmZ+Pn5feXzlIOqKitqa2vZvPl/Wb58ObNmzWLPnj2sX79eSPrRvr5u0tKS\n6e3tYvLkyVRWVvLMM8/IrgPGGzQ7O5uysjJaWxuRJIlVq1YJ0QJoa5O4du0ijY01/P/svXl4HNWB\nrv9KrX3fd9laLLc27/uCV8DGGDDrAAmEgSSTMMnkDiG/O7kzN5N778zczCSTSYbLGgMDARtsCIvB\nNsZ4XyTZli1ZslTa911qqfdWd1f9/mipsWxjbKlKwdZ5n6efrq7qrq9PV9X5zjlVXZ/FYuFnP/uZ\nZloff/wxAwMDnDx5Ej8/P+Lj48nP1yZEp7+/nV27Pqe+vp558+axcuUSTXTAc+z+/vevkZ+fz7lz\nZ1i2bDFz56ofOgOeBtqbb77N5s2b2br1BYKDgwkK8iE+Xv1bCHd2dlJeXs6CBQt4++03kSSJwsJC\nHA6H6nrHjx9nyZIlOBwOPvvsMw4cOICiKKxevZrY2FDVYrXtdju9vb2kp6fjdDopLi5m//79dHZ2\nEh0dzfz5noAqNcpnMBiIjvZkhrjdbi5cuMDx48cpLy/H7XaTlZVFXl7OhLWGh4cJCAjwvpZlmcbG\nRs6cOUNpaSkGgwF/f38KCwvHrfFnubXuiOG/I0nS0ovmzQZ+JUnSppHX/wEclyTpva9ZndLba6Kn\np4uKinIqKsro6enGx8eHzMwZzJo1h/z8Qnp7eyguPsHdd99HcPDEwhFcLhfV1ZWUlp6itlZCURSy\nsnJYsGAR2dk5vPzyczzyyHdISUmdkA54dtiammaKio6NmJWDzMxsVq5czb59e5gzZx633LJWNYOU\nZZnKynL2799Lf38fGRlZhISE0tfXw5NP/kD1e5oHBMi8/vobVFVVkpKSRkdHG7fddgerV69XVWeU\nU6eK+Pjj9713V/vRj36qSRY5wPCwkX/5l3/B5XIRHh7Bz372D5rc1c1gGGDHjrfp6urA6XQSFRXN\ns8/+veo6o+zdu4tjxw57X//3//4LzcKaKivL2b79TQCio2MpKJjFxo2bNdE6e/YM77+/HYCCglk8\n/fQPMBhsmmjt2vUniotPoNPpiItL4Dvf+S4REV/bv7lurFYrL730e3x9fTEajfj4+LBp093Mn7+I\nhIQIVW89e/p0MR999B5r197GyZNHsdvtzJkzn/XrN6h650ejcYg//vFV5syZz/DwMMXFx7FYLKSk\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11ba58438>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def _numerical_gradient_no_batch(f, x):\n",
" h = 1e-4 # 0.0001\n",
" grad = np.zeros_like(x) # x と同じ形状の零ベクトル\n",
" \n",
" for idx in range(x.size):\n",
" tmp_val = x[idx]\n",
" # f(x+h) の計算\n",
" x[idx] = float(tmp_val) + h\n",
" fxh1 = f(x)\n",
" \n",
" # f(x-h) の計算\n",
" x[idx] = tmp_val - h \n",
" fxh2 = f(x)\n",
" \n",
" grad[idx] = (fxh1 - fxh2) / (2*h)\n",
" x[idx] = tmp_val # 値を元に戻す\n",
" \n",
" return grad\n",
"\n",
"\n",
"def numerical_gradient(f, X):\n",
" if X.ndim == 1:\n",
" return _numerical_gradient_no_batch(f, X)\n",
" else:\n",
" grad = np.zeros_like(X)\n",
" \n",
" for idx, x in enumerate(X):\n",
" grad[idx] = _numerical_gradient_no_batch(f, x)\n",
" \n",
" return grad\n",
"\n",
"x0 = np.arange(-2, 2.5, 0.25)\n",
"x1 = np.arange(-2, 2.5, 0.25)\n",
"X, Y = np.meshgrid(x0, x1)\n",
"\n",
"X = X.flatten()\n",
"Y = Y.flatten()\n",
"\n",
"grad = numerical_gradient(function_2, np.array([X, Y]))\n",
"\n",
"plt.figure()\n",
"plt.quiver(X, Y, -grad[0], -grad[1], angles=\"xy\", color=\"#666666\")\n",
"plt.xlim([-2, 2])\n",
"plt.ylim([-2, 2])\n",
"plt.xlabel('x0')\n",
"plt.ylabel('x1')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"各地点において関数の値を最も減らす方向を示すのが勾配."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 勾配法"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"機械学習の問題の多くは,学習の際に最適なパラメータを探索する.最適なパラメータとは,損失関数が最小値を取るときのパラメータの値.勾配をうまく利用して関数の最小値を探すのが勾配法.\n",
"\n",
"ただし,各地点において関数の値を最も減らす方向を示すのが勾配であるため,勾配が指す先が本当に関数の最小値なのかどうかは保証されない."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\begin{split}\n",
"x_0 &= x_0 - \\eta\\frac{\\partial{f}}{\\partial{x_0}}\\\\\n",
"x_1 &= x_1 - \\eta\\frac{\\partial{f}}{\\partial{x_1}}\n",
"\\end{split} \\tag{zero 4.7}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"より一般的に書くと"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{x}' = \\mathbf{x} - \\epsilon\\nabla_\\mathbf{x}f(\\mathbf{x}) \\tag{dl 4.5}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$\\eta$ ($\\epsilon$) は**学習率** (learning rate) と呼ばれる.ニューラルネットワークの学習においては,学習率の値を変更しながら,正しく学習できているかどうか,確認作業を行うのが一般的."
]
},
{
"cell_type": "code",
"execution_count": 145,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:11:59.077861",
"start_time": "2017-05-16T02:11:59.057909"
},
"collapsed": true
},
"outputs": [],
"source": [
"def gradient_descent(f, init_x, lr=0.01, step_num=100):\n",
" x = init_x\n",
" x_history = []\n",
"\n",
" for i in range(step_num):\n",
" x_history.append(x.copy())\n",
"\n",
" grad = numerical_gradient(f, x)\n",
" x -= lr * grad\n",
"\n",
" return x, np.array(x_history)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"初期値 $(-3.0, 4.0)$,学習率 $\\eta = 0.1$:"
]
},
{
"cell_type": "code",
"execution_count": 151,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:19:07.649383",
"start_time": "2017-05-16T02:19:07.344296"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x11c55b128>"
]
},
"execution_count": 151,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n956I69z0aQP5xPQ4kIj6a91X3HRfw/ftqTyhK266j+lyoAVxpg0kqtmKYZJoCwNaFKENJKrZde56\n2wZ/pCtuuk833jZEgAOJY3ocSFT9imFHjlYbvu+ZI0clxVt8BMCJQ2gDCZt9nfvG24YatoXV2zb4\no5mfbYY+bSCfmB4HWsRCp8ufOXJUW3c8rGs/+yDT5UBiONMGWkT9dHmprW1maryRx8YPN50uZz1t\nIJ8IbaCFzJ4uHxoZmwnluTSaLh8Y6FSpRGgDeUNoAy1qOoS3Df5ozjPu6enyrTse1mk9y/Xm3zld\n0m8EqhLAseCaNtDCNq5fpXdtfvGC3z89Zb7mJT9YwqoALBZn2kCLmz7jvue+R/TY+OEF/Uz5RaN6\n8rEVkk5ZwsoAHKumoW1mN871g+7+N8d6MDMrSbpF0tmSDku6wt0fOdbPAXBspq91D42MzTtdPq1s\n/yPpZUtfHIAFm2t6vEPSdZLaJbU1+LUYb5B0krtvkvQhSR9f5OcAWIRjmS5/zmnjS1wNgGPV9Ezb\n3W80szWSJtz9707Q8V4p6au1z/+Wmc37z/gNG7qf9fqii57R9dc/3XDfUuwvlaSjR7sX/fMp7+/t\nffbY81Yf41/s/qnp8k9v/4mWdT+Zec+0Jx7rif7/v5j7W/f7Z38K+5uZ75p2n6TX1280sy53PzTP\nzzZysqTHZ70+YmYd7j7Z7AdKpWef2Hd1LVe5vLy2L/v+pdhfmvXGGMePtX/qPaWm+2PXx/gXv/+1\n5/XofZeertW/9X2tfNH/Zt8oafQ/X9Sy41/I/qn3FHf89WPPX31LvT/u+Jtpq1YbP6/YzO6R9C53\nH6/bvlHSHe7+m3N+cuPP/ISkb7n7F2uv97j72rl+plIZb1xgIFOPcizmNGGRxy4VZ/xDI2PPuknt\ntJOX67v3nqlf/uz52rWr9cffTFG+/0aKPHYp/vjL5Z6ml6DnOtMekvQdM7vE3b9du4nsBknvk3TN\nImt5UNLrJH3RzM6RRF8JEFn9Ot2StOG27oZnAgDimuua9sfM7D8k3Wlm2yW9WlN3fG9w90cXebwB\nSReY2UOamvO+bJGfAwBA4cx5Tbt2s9inJX1CUkXSy48jsOXuRyVdtdifBwCgyJpOgJnZSjP7sqbO\nhs+W9FeSHjSztwaqDQAAzDLXVavvS3JJG919xN0/J+kCSVvM7I4g1QGIYnh4QqOjsasAUG+u0H6r\n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\nT2NHNK0xQwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11c68abe0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"init_x = np.array([-3.0, 4.0]) \n",
"\n",
"lr = 0.1\n",
"step_num = 20\n",
"x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)\n",
"\n",
"plt.plot([-5, 5], [0,0], '--b')\n",
"plt.plot([0,0], [-5, 5], '--b')\n",
"plt.plot(x_history[:,0], x_history[:,1], 'o')\n",
"\n",
"plt.xlim(-3.5, 3.5)\n",
"plt.ylim(-4.5, 4.5)\n",
"plt.xlabel(\"X0\")\n",
"plt.ylabel(\"X1\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"🙆"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"初期値 $(-3.0, 4.0)$,学習率 $\\eta = 0.01$:"
]
},
{
"cell_type": "code",
"execution_count": 152,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:19:20.113890",
"start_time": "2017-05-16T02:19:19.823943"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x11c6d4438>"
]
},
"execution_count": 152,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAe0AAAFXCAYAAACP5RboAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFpNJREFUeJzt3XGMZWd53/Hv3Jldu7MdIwtuDGgTRkqTx1mEKNqIxSEx\nqMSFBMXEUWhiEgOOSexUbWOPiMlSIC2aCNEGEtTErePg1MKyTZ1mkNsVERKJoQWzXValTTB9WlIt\nkYNLp9YC610wzO7tH3PXjOfMnZldds573j3fj7Savfecued5fWF/es95n3OmRqMRkiSp+walC5Ak\nSdtjaEuSVAlDW5KkShjakiRVwtCWJKkShrYkSZWYKV3AVpaXTxTtSbv88lmOHz9VsoRi+jx26Pf4\n9+/fw2AwxZEjT5YupZg+f/99HjuUH/9wODc1aZsz7S3MzEyXLqGYPo8dHD9M/HejF/r8/fd57NDt\n8RvakiRVwtCW1HD06EmOHStdhaT1DG1JkiphaEtqWFzczcGDpauQtJ6hLalhaWkX999fugpJ6xna\nkiRVwtCWJKkShrYkSZUwtCVJqoShLanBPm2pmwxtSZIqUeSBIRHxPcBR4JrM/B8latjK4Ue/wqFH\njvHlJ07x/GfP8tqr5jmw74rSZUmtWFzczewsLCyUrkTSWq2HdkTsAu4EvtH2sbfr8KNf4c6HPv/0\n68eWTz792uBWHywt7WIwMLSlrilxevy3gX8DfLnAsbfl0CPHJrz/pVbrkCRpranRqL3HVUfEm4G9\nmbkYEQ8Dt2x1enxl5fSo7cekve7XH+LMmY3/u8w/7zJe/6of4OqX7G21JqlN8/OrP12MJhUx8bm4\nbYf2J4HR+M/fBf4ncG1m/p9Jv7O8fKK9Asfe9cHDPLZ8ctN9br72hRf9qfLhcI7l5ROlyyimz+Pf\nv38Pg8GAI0f6OX7o9/ff57FD+fEPh3MTQ7vV0+OZeXVmviIzXwl8DnjjZoFdymuvmt9yH0+VS5La\nVmT1eNednUEfeuRLPLb85Ib7PLb8JG9575/z/Oe4slwXn6NHT45nG6UrkbRWsdAez7Y768C+Kziw\n7wrefc9nOfb41zfc58xo5MpySVJrvLnKFl7/qh/Y1n53H/oCb3nvn/OuDx7m8KNf2eGqpJ3l87Sl\nbjK0t3D1S/Zy87UvZO/wbzM9mLg2gG+fPvOMmbfBrZr5PG2pm7ymvQ1nT5XD9laWw+r1cE+XS5Iu\nJGfa52g7K8thdaGap8olSReSM+1ztHZl+eNPnGQwNcW3T5/ZcF8XqUmSLiRD+zysPV2+/j7lG7n7\n0Be46z88anuYJOm7Ymh/l7bT0312Ju7MW7WwT1vqJq9pXwAH9l3Bu296KXuHe7a1v3dTkySdD0P7\nAnKRmi4W9mlL3eTp8QvIRWq6WPg8bambDO0LzEVqkqSdYmjvIBepSZIuJK9p77BzXaR250Of93q3\nJGlDhnZLtrtIDfD+5ZKkDRnaLTmw74pnPHhk1/TW/+ltDVMpR4+e5Nix0lVIWs9r2i0610VqZ1vD\nXKAmSQJDu5jtLFIDF6ipjMXF3czO2vIldc3UaDQqXcOmlpdPFC1w9VaOJ3b0GNuZde+aHnD6zKjV\n1rA2xt5lfR7//v17GAwGHDnSz/FDv7//Po8dyo9/OJybmrTNmXYH2BomSdoOF6J1hK1hkqStGNod\nY2uYJGkST493zLncv/ysOx/6PIceOeYqc0m6yBnaHXSurWHgtW5dWD5PW+omQ7vjttsadpazbkm6\neBnaFTg783bWrbbYpy11kwvRKrL2Vqjb4Qpzna+lpV3cf3/pKiSt1/pMOyKmgbuAAEbALZn5l23X\nUStn3ZLUXyVm2j8FkJkvB94B/FaBGqrnrFuS+qf10M7MjwC/Mn75AuCrbddwsTh7Q5abr33htva3\nr1uS6lbs3uMRcQ9wHfCzmfmxSfutrJwezcxMt1dYpT75Xx/jwY//L449/vUt9901M+DWn38JV79k\nbwuVqUbz86s/fTynVMTEe48XfWBIRDwXOAzsy8yTG+3ThweGXEjbvdYNcPO1L9z0OndtY7/QHL/j\n7+v4+zx2KD/+zR4Y0vrp8Yi4ISIOjl+eAs6M/+gCOJdr3V7nlqS6lOjT/hPgjyLik8Au4NbM/EaB\nOi5a57LC3NXl2oh92lI3tR7a49Pg/6Dt4/bR2RC++9AXvH+5zsnS0i4GA0Nb6hpvrnKRO7DvCn7p\ntT+0rX1dXS5J3eZtTHvgfO9ffv2rr+SH9j5rh6uTJG2XM+2eOJ+e7n9571Fn3ZLUIYZ2z5zrndQO\nPfKlHa5IkrRdnh7voXNZXf74Exu2z+si5/O0pW4ytHtsO9e6n/fsPW2WJEnahKHdc1vNul971QsK\nVKXS7NOWusnQFvDMWffjT5zkec/ew/WvDleP95R92lI3Gdp62tlZ91ml778rSXomV49LklQJQ1uS\npEoY2pIkVcLQltRw9OhJjh0rXYWk9QxtSZIqYWhLalhc3M3Bg6WrkLSeoS2pYWlpF/ffX7oKSesZ\n2pIkVcLQliSpEoa2JEmVMLQlSaqEoS2pwT5tqZsMbUmSKmFoS2qwT1vqJkNbUoN92lI3GdqSJFVi\nps2DRcQu4G5gHrgEWMzMh9qsQZKkWrU90/5F4InM/DHgNcDvtXx8SZKq1epMG3gQ+OPx36eAlZaP\nL0lStaZGo1HrB42IOeAh4K7MvG+zfVdWTo9mZqbbKUySpPKmJm1oe6ZNRHwvsATcsVVgAxw/fmrn\ni9rEcDjH8vKJojWU0uexg+N3/P0df5/HDuXHPxzOTdzW9kK0K4CPAf8oMz/e5rElbd/i4m5mZ2Fh\noXQlktZqeyHa24HLgXdGxMPjP3+r5RokbcE+bambWp1pZ+avAb/W5jElSbpYeHMVSZIqYWhLklQJ\nQ1uSpEoY2pIafJ621E2GtiRJlTC0JTX4PG2pmwxtSQ32aUvdZGhLklQJQ1uSpEoY2pIkVcLQliSp\nEoa2pAb7tKVuMrQlSaqEoS2pwT5tqZsMbUkN9mlL3WRoS5JUCUNbkqRKGNqSJFXC0JYkqRKGtqQG\n+7SlbjK0JUmqhKEtqcE+bambDG1JDfZpS91kaEuSVAlDW5KkShQJ7Yg4EBEPlzi2JEm1mmn7gBFx\nO3ADcLLtY0uSVLMSM+2/An6mwHElbZN92lI3TY1Go9YPGhHzwAOZ+bKt9l1ZOT2amZne+aIkSeqG\nqUkbWj89fq6OHz9V9PjD4RzLyyeK1lBKn8cO/R7/4uJuZmcvYWGhn+OHfn//fR47lB//cDg3cZur\nxyU12KctdZOhLUlSJYqcHs/MY8CW17MlSdJ3ONOWJKkShrYkSZUwtCU12KctdZOhLUlSJQxtSQ0+\nT1vqJkNbUoN92lI3GdqSJFXC0JYkqRKGtiRJlTC0JUmqhKEtqcE+bambDG1JkiphaEtqsE9b6iZD\nW1KDfdpSNxnakiRVwtCWJKkShrYkSZUwtCVJqoShLanBPm2pmwxtSZIqYWhLarBPW+omQ1tSg33a\nUjcZ2pIkVcLQliSpEoa2JEmVmJm0ISLetdkvZua7z/VgETEA7gBeDDwFvCUzv3iunyNJUh9tNtOe\nAW4HpoGpDf6cj58GLs3Mq4DfAN53np8jaQfZpy1108SZdma+KyKeD5zMzH9xgY73o8Cfjj//MxHx\nw1v9wv79e57x+rrrvs073vGtDbftxPbBAM6c2XPev1/z9vn5Z469a/U5fse/k9v7Pn63l90+ycTQ\nHlsAXrf+zYiYzcxTW/zuRi4Dvrbm9emImMnMlUm/MBg8c2I/O3sJw+El423N/Xdi+2DNjiWOX2r7\n6j6DidtL1+f4d277wYNw/Dhcfnk/x39WX7//1e3NHbpV305vLzv+SaZGo9GGGyLiQeCXMvPEuvcP\nAB/KzB/c9JM3/sz3A5/JzH83fv1YZu7d7HeWl09sXGBLhsM5lpdPbL3jRajPY4d+j3/1LNOAI0f6\nOX7o9/ff57FD+fEPh3MTL0Fvdk37MPDZiHgprC4ii4jfBP4jcM6L0MY+Bfzk+PNeBvzFeX6OJEm9\ns9k17d+OiP8M3BsR9wM/zuqK7/2Z+dfnebwl4JqI+DSr57xvPM/PkSSpdza9pj1eLPavgPcDy8CP\nfBeBTWaeAW4539+XJKnPJp4ej4jnRMRHWJ0Nvxj4Z8CnIuL6lmqTJElrbHZN+78DCRzIzEcz8w+A\na4CDEfGhVqqTVIR92lI3bRba12fm2zLz22ffyMxHgZcC/V1WKElSIZstRPvEhPe/CfzDHatIUnGL\ni7uZnYWFhdKVSFrLB4ZIavB52lI3GdqSJFXC0JYkqRKGtiRJlTC0JUmqhKEtqcE+bambDG1Jkiph\naEtqWFzczcGDpauQtJ6hLanBPm2pmwxtSZIqYWhLklQJQ1uSpEoY2pIkVcLQltRgn7bUTYa2JEmV\nMLQlNdinLXWToS2pwT5tqZsMbUmSKmFoS5JUCUNbkqRKGNqSJFWiSGhHxHURcV+JY0vamn3aUjfN\ntH3AiPgA8Grgc20fW5KkmpWYaX8a+NUCx5W0TfZpS920YzPtiLgJuG3d2zdm5ocj4pU7dVxJ372l\npV0MBrCwULoSSWtNjUaj1g86Du1bMvPnt9p3ZeX0aGZmeueLkvS0+fnVn17XloqYmrSh9Wva5+r4\n8VNFjz8czrG8fKJoDaX0eezQ7/GfObOHwWDQ2/FDv7//Po8dyo9/OJybuM2WL0mSKlFkpp2ZDwMP\nlzi2JEm1cqYtqcE+bambDG1JkiphaEtqsE9b6iZDW1KDz9OWusnQliSpEoa2JEmVMLQlSaqEoS1J\nUiUMbUkN9mlL3WRoS5JUCUNbUoN92lI3GdqSGuzTlrrJ0JYkqRKGtiRJlTC0JUmqhKEtSVIlDG1J\nDfZpS91kaEuSVAlDW1KDfdpSNxnakhrs05a6ydCWJKkShrYkSZUwtCVJqoShLUlSJQxtSQ32aUvd\nZGhLklSJmTYPFhHPAu4FLgN2AwuZ+UibNUja2uLibmZnYWGhdCWS1mp7pr0AfDwzXwG8Gfj9lo8v\naRvs05a6qdWZNvA7wFNrjv3Nlo8vSVK1pkaj0Y58cETcBNy27u0bM/NIRDwX+Chwa2Z+YrPPWVk5\nPZqZmd6RGiVtbH5+9aeL0aQipiZu2KnQniQiXgQ8ALw1Mz+61f7LyyfaLXCd4XCO5eUTJUsops9j\nh36Pf//+PQwGA44c6ef4od/ff5/HDuXHPxzOTQztthei7QMeBH4uM/9bm8eWJKl2bV/Tfg9wKfCB\niAD4Wma+ruUaJG3h6NGT49lG6UokrdVqaBvQkiSdP2+uIqnB52lL3WRoS2qwT1vqJkNbkqRKGNqS\nJFXC0JYkqRKGtiRJlTC0JTX4PG2pmwxtSZIqYWhLarBPW+omQ1tSg33aUjcZ2pIkVcLQliSpEoa2\nJEmVMLQlSaqEoS2pwT5tqZsMbUmSKmFoS2qwT1vqJkNbUoN92lI3GdqSJFXC0JYkqRKGtiRJlTC0\nJUmqhKEtqcE+bambDG1JkiphaEtqsE9b6qaZNg8WEXuA+4DLgW8Bb8rMv2mzBklbW1raxWAACwul\nK5G0Vtsz7V8Gjmbm1cC9wO0tH1+SpGq1OtPOzN+NiOnxy+8Dvtrm8SVJqtnUaDTakQ+OiJuA29a9\nfWNmHomIPwNeBFyTmZ/b7HNWVk6PZmamN9tF0gU2P7/60xXkUhFTEzfsVGhvJSKuBA5l5vdvtt/y\n8okyBY4Nh3MsL58oWUIxfR479Hv8+/fvYTAYcORIP8cP/f7++zx2KD/+4XBuYmi3ek07Ig5GxA3j\nl08Cp9s8vqTtsU9b6qZWr2kDdwP3jE+dTwM3tnx8SZKq1fZCtK8Ar2nzmJLO3eLibmZnbfmSusab\nq0hq8HnaUjcZ2pIkVcLQliSpEoa2JEmVMLQlSaqEoS2pwT5tqZsMbUmSKmFoS2rwedpSNxnakhrs\n05a6ydCWJKkShrYkSZUwtCVJqoShLUlSJQxtSQ32aUvdZGhLklQJQ1tSg33aUjcZ2pIa7NOWusnQ\nliSpEoa2JEmVMLQlSaqEoS1JUiUMbUkN9mlL3WRoS5JUCUNbUoN92lI3GdqSGuzTlrpppsRBI+JK\n4DBwRWZ+s0QNkiTVpvWZdkRcBrwPeKrtY0uSVLNWQzsipoA/AN4OnGrz2JIk1W5qNBrtyAdHxE3A\nbeve/hLwQGZ+KCKOAVdudXp8ZeX0aGZmekdqlLSx+fnVn7Z9SUVMTdywU6G9kYj4IvDY+OXLgP+S\nmVdv9jvLyyfaK3ADw+Ecy8snSpZQTJ/HDo7f8fd3/H0eO5Qf/3A4NzG0W12Ilpl/5+zfxzPtv9/m\n8SVJqpktX5Ia7NOWuqlIyxdAZs6XOrakzS0t7WIwgIWF0pVIWsuZtiRJlTC0JUmqhKEtSVIlDG1J\nkiphaEtq8HnaUjcZ2pIkVcLQltRgn7bUTYa2pAafpy11k6EtSVIlDG1JkiphaEuSVAlDW5KkSrT6\nPG1JknT+nGlLklQJQ1uSpEoY2pIkVcLQliSpEoa2JEmVMLQlSarETOkCuiwi9gD3AZcD3wLelJl/\nU7aq9kTEs4B7gcuA3cBCZj5Stqr2RcR1wOsz8w2la9lpETEA7gBeDDwFvCUzv1i2qvZFxAHgvZn5\nytK1tCkidgF3A/PAJcBiZj5UtKgWRcQ0cBcQwAi4JTP/smxVz+RMe3O/DBzNzKtZDa/bC9fTtgXg\n45n5CuDNwO+XLad9EfEB4D305/8rPw1cmplXAb8BvK9wPa2LiNuBPwQuLV1LAb8IPJGZPwa8Bvi9\nwvW07acAMvPlwDuA3ypbTlNf/iE6L5n5u3znS/s+4KsFyynhd4A7x3+fAb5ZsJZSPg38aukiWvSj\nwJ8CZOZngB8uW04RfwX8TOkiCnkQeOf471PASsFaWpeZHwF+ZfzyBXTw33xPj49FxE3AbevevjEz\nj0TEnwEvAq5pv7J2bDH+57J6puHW9itrxybj/3BEvLJASaVcBnxtzevTETGTmb35xzsz/31EzJeu\no4TMfBIgIuaAP2Z1ttkrmbkSEfcA1wE/W7qe9Qztscz8IPDBCdv+XkRcCRwCvr/VwloyafwR8SLg\nAeCtmfmJ1gtryWbff898HZhb83rQp8AWRMT3AkvAHZl5X+l6SsjMN0XE24DDEbEvM0+WruksT49v\nIiIORsQN45dPAqdL1tO2iNjH6umyN2TmR0vXo1Z8CvhJgIh4GfAXZctRmyLiCuBjwNsy8+7S9bQt\nIm6IiIPjl6eAM+M/neFMe3N3A/eMT51OAzcWrqdt72F1Mc4HIgLga5n5urIlaYctAddExKdZvabZ\nt//N993bWe2WeWdEnL22/ROZ+Y2CNbXpT4A/iohPAruAW7s2dp/yJUlSJTw9LklSJQxtSZIqYWhL\nklQJQ1uSpEoY2pIkVcKWL6nHxnd7ux94cWb+3/F7bwWuYvUOcfcC3wMk8Atn75glqQxn2lKPZebD\nrAbzXfD0DVVuBm5i9Wlfd2TmlcBn+c49qSUVYmhL+qfACyLinwAfAt4InASuZvX+0wD/Fnh9keok\nPc3QlnouM78F/ALwfuCB8TPTnwN8fc19xx8H9hYqUdKYoS0J4OXA/wN+PCJmWL2F6Xqdugez1EeG\nttRz4wfD/HPgR4CnWH0c4zJwWURMj3d7HvDlMhVKOsvQlnosIi4FPgz8emb+b+BNwD8G9gP/Cfi5\n8a5vBHzSm1SYDwyReiwi/jXwrMx8w5r3bgB+E3gVcA+rLV9/DVyfmceLFCoJMLQlSaqGp8clSaqE\noS1JUiUMbUmSKmFoS5JUCUNbkqRKGNqSJFXC0JYkqRKGtiRJlfj/zBUYVFnLb6MAAAAASUVORK5C\nYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11c16fbe0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"init_x = np.array([-3.0, 4.0]) \n",
"\n",
"lr = 0.01\n",
"step_num = 20\n",
"x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)\n",
"\n",
"plt.plot([-5, 5], [0,0], '--b')\n",
"plt.plot([0,0], [-5, 5], '--b')\n",
"plt.plot(x_history[:,0], x_history[:,1], 'o')\n",
"\n",
"plt.xlim(-3.5, 3.5)\n",
"plt.ylim(-4.5, 4.5)\n",
"plt.xlabel(\"X0\")\n",
"plt.ylabel(\"X1\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"小さすぎた 🙀"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"初期値 $(-3.0, 4.0)$,学習率 $\\eta = 1.0$:"
]
},
{
"cell_type": "code",
"execution_count": 153,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T02:19:26.663405",
"start_time": "2017-05-16T02:19:26.371969"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x11c81f080>"
]
},
"execution_count": 153,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\neOa2tk5kfd3IF0yNL1cBBlxPG6ZJaANAJ4Q2AHRCaANAJ4Q2AHRCaAMD5rRhmoQ2AHRCaAMDrqcN\n0yS0gQFz2jBNQhsAOiG0AaATQhsAOiG0AaATQhsYMKcN0yS0AaATQhsYMKcN0yS0gQFz2jBNQhsA\nOiG0AaATQhsAOiG0AaATQhsYMKcN0yS0AaATQhsYMKcN0yS0gQFz2jBNay0WLaU8L8knkjy71vr5\nFjUAwF53/eSHs7Pn9kqSB+67tVU5VzT6nnYp5eYkb0vy1NhrA8CV7A/sJNlZ3j8lo4Z2KWUlyS8k\neVOSJ8dcGwAOsj+wr3Z/K0d2eLyUcleSe/bd/T+TPFpr/e1SyjW9zsmT61lbO/aVLu8ZWSw2mq7f\n0px7T+bb/+ry1/m59n/ZnPufc+/7Tel/i5WdnfF+jyilfDLJHy5vvjjJf6213nLYc7a3LzT9RWex\n2Mj29oWWJTQz594T/et/vv3PsffXHXIY/MGRP9deLDZWDto26olotda/evnnUsqnkvzNMdcHgCtZ\nyZUPhR+Yno0Y+QIGzGkzNw/cd+sgoKd49niTka8kqbWearU2cLizZ49ndTXZ3GxdCYznckBP+eMB\ne9oA0AmhDQCdENoA0AmhDQCdENrAgOtpwzQJbQDohNAGBsxpwzQJbWDA9bRhmoQ2AHRCaANAJ4Q2\nAHRCaANAJ0a9njYAcP3saQNAJ4Q2AHRCaANAJ4Q2AHRCaANAJ4Q2AHRirXUBU1ZKuSnJI0lOJvlC\nktfUWv+obVXjKaU8K8nDSW5OciLJZq31N9pWNb5Syu1JvrvW+urWtRy1UspqkvuTvDDJU0l+sNb6\nybZVja+U8qIk/6LW+rLWtYyplHI8yYNJTiW5IclWrfX9TYsaUSnlWJJ3JilJdpLcXWv93bZVfTl7\n2of7oSSP11pvyW543du4nrFtJvlQrfVbk7w2yc+1LWd8pZR3JHlr5vP/le9IcmOt9SVJ7kvytsb1\njK6Ucm+Sf5vkxta1NPD9Sf6k1votSV6R5Gcb1zO2b0+SWutLk7w5yU+0LWdoLv8QXZda68/kS2/a\n1yX5dMNyWvjpJD+//Hktyecb1tLKx5L8SOsiRvTNSX4tSWqtH0/yDW3LaeL3k3xn6yIaeW+Styx/\nXklysWEto6u1vi/JDy9vPjcT/Dff4fGlUspdSe7Zd/edtdZzpZQPJ3lBktvGr2wcV+n/Odk90vD6\n8SsbxyH9v6eU8rIGJbVyc5LP7Ll9qZSyVmudzT/etdb/UEo51bqOFmqtn02SUspGkl/O7t7mrNRa\nL5ZSHkpye5Lval3PfkJ7qdb6QJIHDth2aynleUl+NcnXj1rYSA7qv5TygiSPJnlDrfUjoxc2ksPe\n/5n50yQbe26vzimwSUopX5vkbJL7a62PtK6nhVrra0opb0zyiVLK82utT7Su6TKHxw9RSjlTSrlj\nefOzSS61rGdspZTnZ/dw2atrrR9oXQ+j+GiSb0uSUsqLk/xO23IYUynl2Uk+mOSNtdYHW9cztlLK\nHaWUM8ubTyZ5evlnMuxpH+7BJA8tD50eS3Jn43rG9tbsnozzjlJKknym1vrKtiVxxM4mua2U8rHs\nfqY5t//m5+5N2Z2WeUsp5fJn23+71vq5hjWN6VeS/GIp5deTHE/y+qn17ipfANAJh8cBoBNCGwA6\nIbQBoBNCGwA6IbQBoBNGvmDGlt/29u4kL6y1/t/lfW9I8pLsfkPcw0m+OklN8n2XvzELaMOeNsxY\nrfWx7AbzO5MvfqHK30tyV3av9nV/rfV5SX4zX/pOaqARoQ38kyTPLaX8oyTvSvIDSZ5Ickt2v386\nSf5dku9uUh3wRUIbZq7W+oUk35fk7UkeXV4z/auS/Ome7x3/X0m+plGJwJLQBpLkpUn+X5KXl1LW\nsvsVpvtN6juYYY6ENszc8sIw/yzJNyV5KruXY9xOcnMp5djyYX85yR+3qRC4TGjDjJVSbkzyniT/\nuNb6P5K8Jsk/THI6yX9O8j3Lh/5AEld6g8ZcMARmrJTyr5M8q9b66j333ZHkx5P8jSQPZXfk6w+S\nvKrWer5JoUASoQ0A3XB4HAA6IbQBoBNCGwA6IbQBoBNCGwA6IbQBoBNCGwA6IbQBoBP/H/ImMwYk\nVThoAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11c9403c8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"init_x = np.array([-3.0, 4.0]) \n",
"\n",
"lr = 1.0\n",
"step_num = 20\n",
"x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)\n",
"\n",
"plt.plot([-5, 5], [0,0], '--b')\n",
"plt.plot([0,0], [-5, 5], '--b')\n",
"plt.plot(x_history[:,0], x_history[:,1], 'o')\n",
"\n",
"plt.xlim(-3.5, 3.5)\n",
"plt.ylim(-4.5, 4.5)\n",
"plt.xlabel(\"X0\")\n",
"plt.ylabel(\"X1\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"デカすぎた 🙀"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**line search** では幾つかの $\\epsilon$ に対して $f(\\mathbf{x} - \\epsilon\\nabla_\\mathbf{x}f(\\mathbf{x}))$ を計算して,目的関数が最小となるような $\\epsilon$ を選ぶ."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3.1 Beyond the Gradient: Jacobian and Hessian Matrices"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.4 Constrained Optimization"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.5 Example: Linear Least Squares"
]
},
{
"cell_type": "code",
"execution_count": 254,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T03:50:30.444138",
"start_time": "2017-05-16T03:50:30.437381"
},
"collapsed": false
},
"outputs": [],
"source": [
"A = np.eye(2)\n",
"b = np.array([1, 1]).reshape((2, 1))\n",
"\n",
"def f(x):\n",
" if x.shape[1] == 1:\n",
" return np.linalg.norm(A.dot(x) - b)**2 / 2\n",
" return np.linalg.norm(A.dot(x) - b, axis=0)**2 / 2"
]
},
{
"cell_type": "code",
"execution_count": 275,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T04:03:16.696282",
"start_time": "2017-05-16T04:03:16.674221"
},
"collapsed": false
},
"outputs": [],
"source": [
"step_size = 0.01\n",
"tolerance = 0.01\n",
"\n",
"x = np.array([[2.0], [2.0]])\n",
"history = []\n",
"\n",
"grad = A.T.dot(A).dot(x) - A.T.dot(b)\n",
"while np.linalg.norm(grad) > tolerance:\n",
" history.append(x.copy())\n",
" x -= step_size * grad\n",
" grad = A.T.dot(A).dot(x) - A.T.dot(b)"
]
},
{
"cell_type": "code",
"execution_count": 279,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T04:04:25.095028",
"start_time": "2017-05-16T04:04:25.089097"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"493"
]
},
"execution_count": 279,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(history)"
]
},
{
"cell_type": "code",
"execution_count": 278,
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T04:04:18.252565",
"start_time": "2017-05-16T04:04:18.245307"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(array([[ 1.00712059],\n",
" [ 1.00712059]]), 493)"
]
},
"execution_count": 278,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"history[-1]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-05-16T04:03:53.098527",
"start_time": "2017-05-16T04:03:53.090546"
}
},
"source": [
"x = [1, 1] で f(x) が最小なのでOK牧場."
]
}
],
"metadata": {
"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.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment