{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# SVRGと数値実験\n",
"\n",
"この章では、NIPS 2013で発表されたstochastic variance reduced gradient (SVRG)という学習アルゴリズムを実装し、それを線形モデルおよび非線形モデルに適用し、そのパフォーマンスをほかのアルゴリズムと比較しつつ、著名なベンチマークデータを用いて検証することを主な目標とする。\n",
"\n",
"性能評価を行う数値実験は我流ではなく、SVRGを提案した元の論文(*Accelerating Stochastic Gradient Descent using Predictive Variance Reduction*, NIPS 2013, link)での数値実験を模倣するという方針である。\n",
"\n",
"__目次__\n",
"\n",
"- アルゴリズムの定式化\n",
"\n",
"- SVRGの実装\n",
"\n",
" - 汎用的なSVRG\n",
" \n",
" - Chainer向けのSVRG\n",
"\n",
"- 数値実験の概要\n",
"\n",
"- 学習と性能検証\n",
"\n",
" - 線形モデル向けの検証(目的関数が凸である)\n",
" \n",
" - 線形モデル向けの検証(目的関数が非凸である)\n",
" \n",
" - パフォーマンスの評価\n",
"\n",
"___"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## アルゴリズムの定式化\n",
"\n",
"基本的な問題設定をまず述べておく。目的関数は実数値を返す関数の和である。定義域は$\\mathbb{R}^d$である。我々の損失関数の表記を前の章から継承させると、以下のようになる。\n",
"\n",
"\\begin{align*}\n",
"\\min_{w \\in \\mathbb{R}^{d}} F(w), \\quad F(w) = \\frac{1}{n} \\sum_{i=1}^{n} L(w;z_{i}).\n",
"\\end{align*}\n",
"\n",
"この関数を高速に最小化する方法として、確率的勾配降下法(SGD)が有名であることは前の章で述べた通りである。SGDでは、パラメータ空間を探索しながら、全サンプルを使った場合と同じ方向へと平均的に動くが、コストは圧倒的に安いというメリットがある。\n",
"\n",
"一方、各ステップにおいてSGDがデータセットのごく小さな部分集合しか使わないため、ステップサイズが極限$t \\to \\infty$において$\\alpha_{(t)} \\to 0$でなければ収束しない。サブサンプルを取ることで、SGDの各ステップの更新が、GDを毎回別の目的関数に対して実行することに等しい。永遠に相異なる方向へ引っ張られてしまうから収束しないのである。\n",
"\n",
"そこで、SVRGを提案した二人の基本的なアイディアは、以下のような折衷案である。\n",
"\n",
"- ほとんどすべての更新では、ミニバッチの大きさが$B \\ll n$と小さくて、安価である。\n",
"\n",
"- ごく一部の更新では、全サンプル($n$個)を使って、正確な勾配ベクトルを計算し、それを以後の更新を安定化させるために何度も再利用する。\n",
"\n",
"簡明な発想で、容易に実装できる強い学習アルゴリズムである。詳細を見ていこう。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SVRGの更新則は基本的に2つのループから成る。まずは$\\tilde{w}_{0}$を初期化する。これを「基準ベクトル」として使う。外側のループでは、バッチの全体を使って、この基準ベクトルでの勾配を計算し、内側のループの演算に使う。具体的な算法として、各$s = 1,2,\\ldots$に対して、以下を行う。\n",
"\n",
"0. $\\tilde{w} = \\tilde{w}_{(s-1)}$\n",
"\n",
"0. $\\displaystyle \\tilde{g} = \\frac{1}{n} \\sum_{i=1}^{n} \\nabla L(\\tilde{w};z_{i})$\n",
"\n",
"0. $w_{(0)} = \\tilde{w}$\n",
"\n",
"0. 内側のループでは$w_{(0)}$を$T$回だけ繰り返して更新し、$w_{(T)}$を返す。\n",
"\n",
"0. $\\tilde{w}_{s} = w_{(T)}$と置く。\n",
"\n",
"もっとも重要な計算は$\\tilde{g}$である。最小化したい$F$が$n$個の関数の和であることを考えると、この$\\tilde{g}$はまさに$\\tilde{w}$での理想の更新方向である。$w_{(0)}$の設定は単に内側のループに先立つ初期化である。次は、内側のループの中身を見ていく。各$t=0,1,\\ldots,T$に対して、以下を行う。\n",
"\n",
"0. 無作為に$I_{t} \\in \\{1,\\ldots,n\\}$をサブサンプル。\n",
"0. $\\Delta_{t} = \\nabla L(\\tilde{w};z_{I_{t}}) - \\tilde{g}$\n",
"0. 重みベクトルを更新:$\\displaystyle w_{(t+1)} = w_{(t)} - \\alpha \\left(\\nabla L(w_{(t)};z_{I_{t}}) - \\Delta_{t} \\right)$\n",
"\n",
"このアルゴリズムの設計は実に明瞭である。この$\\Delta_{t}$は、基準ベクトル$\\tilde{w}$に着目し、$n$個のデータ点ではなく、たったの1点を使うことによる「誤差」を次元ごとにまとめたベクトルである。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"言うまでもなく、このアルゴリズムが良い解に至るためには、いくつかの仮定が必要である。特に重要なのは、基準ベクトルを定期的に更新しておけば、$\\tilde{w}$で測った誤差と$w_{(t)}$での本当の誤差がさほど変わらない、ということである。\n",
"\n",
"あとは、SGDと同様に、$w_{(t)}$を条件として、無作為に選んでいる$I_{t}$について期待値を取ると、以下のようにバッチ全体を使った場合と一致する。\n",
"\n",
"\\begin{align*}\n",
"\\mathbf{E} \\left( \\nabla L(w_{(t)};z_{I_{t}}) - \\Delta_{t} \\right) & = \\frac{1}{n} \\sum_{i=1}^{n} L(w_{(t)};z_{i}) - \\mathbf{E} \\left( \\nabla L(\\tilde{w};z_{I_{t}}) - \\tilde{g}\\right)\\\\\n",
"& = \\frac{1}{n} \\sum_{i=1}^{n} L(w_{(t)};z_{i}).\n",
"\\end{align*}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## SVRGの実装\n",
"\n",
"ここで、SVRGを2回実装する。最初は、前の章で紹介した方法論に則って、`Algo_SVRG`という完全なる自作で、`Algo_LineSearch`のサブクラスとして汎用的なものである。その後は、Chainerを前提としたニューラルネットワーク向け実装である。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import math\n",
"import numpy as np\n",
"import chainer as ch\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import algorithms\n",
"import models\n",
"import models_ch\n",
"import dataclass\n",
"import helpers as hlp"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"### 汎用的なSVRG"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"class Algo_SVRG(algorithms.Algo_LineSearch):\n",
" '''\n",
" Stochastic variance reduced gradient descent.\n",
" '''\n",
" def __init__(self, w_init, step, batchsize, replace,\n",
" out_max, in_max, thres, store, lamreg):\n",
"\n",
" super(Algo_SVRG, self).__init__(w_init=w_init,\n",
" step=step,\n",
" t_max=(out_max*in_max),\n",
" thres=thres,\n",
" store=store,\n",
" lamreg=lamreg)\n",
" self.out_max = out_max\n",
" self.in_max = in_max\n",
" self.batchsize = batchsize\n",
" self.replace = replace\n",
"\n",
" # Computed internally.\n",
" self.nseen = 0\n",
" self.npasses = 0\n",
" self.idx_inner = 0\n",
" self.torecord = True\n",
"\n",
"\n",
" def newdir(self, model, data):\n",
" '''\n",
" Determine the direction of the update.\n",
" '''\n",
"\n",
" if self.idx_inner == 0:\n",
" self.w_snap = np.copy(self.w)\n",
" self.g_snap = np.mean(model.g_tr(w=self.w_snap,\n",
" data=data,\n",
" lamreg=self.lamreg),\n",
" axis=0, keepdims=True)\n",
" \n",
" shufidx = np.random.choice(data.n_tr,\n",
" size=self.batchsize,\n",
" replace=self.replace)\n",
" g_sgd = np.mean(model.g_tr(w=self.w,\n",
" n_idx=shufidx,\n",
" data=data,\n",
" lamreg=self.lamreg),\n",
" axis=0, keepdims=True)\n",
" correction = np.mean(model.g_tr(w=self.w_snap,\n",
" n_idx=shufidx,\n",
" data=data,\n",
" lamreg=self.lamreg),\n",
" axis=0, keepdims=True) - self.g_snap\n",
" return (-1) * (g_sgd-correction)\n",
"\n",
"\n",
" def monitor_update(self, model, data):\n",
" '''\n",
" Update the counters and convergence\n",
" monitors used by the algorithm. This is\n",
" executed once every step.\n",
" '''\n",
" self.t += 1\n",
" self.idx_inner += 1\n",
" if self.idx_inner == self.in_max:\n",
" self.idx_inner = 0\n",
"\n",
" # Check differences every \"epoch\" over data.\n",
" self.nseen += self.batchsize\n",
" if self.nseen >= data.n_tr:\n",
" self.torecord = True\n",
" self.npasses += 1\n",
" self.diff = np.linalg.norm((self.w-self.w_old))\n",
" self.w_old = np.copy(self.w)\n",
" self.nseen = self.nseen % data.n_tr\n",
" \n",
" \n",
" def cost_update(self, model, data):\n",
" '''\n",
" Update the amount of computational resources\n",
" used by the routine.\n",
"\n",
" Cost computation based on number of gradients computed:\n",
" - Each inner loop step requires mini-batch gradients for\n",
" two vectors, w and w_snap.\n",
" - Each outer loop step additionally requires a full\n",
" batch of gradients.\n",
" '''\n",
"\n",
" if self.idx_inner == self.in_max:\n",
" self.stepcost = 2 * self.batchsize + data.n_tr\n",
" else:\n",
" self.stepcost = 2 * self.batchsize\n",
" \n",
" self.cumcost += self.stepcost\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"### Chainer向けのSVRG\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"## Experiment setup.\n",
"\n",
"# Data-related.\n",
"data = dataclass.DataSet() # Initialize one data object; will be re-populated at each trial.\n",
"n = 500 # sample size\n",
"d = 2 # number of parameters\n",
"init_delta = 5.0 # controls support of random initialization\n",
"num_trials = 250 # number of independent random trials to conduct\n",
"cov_X = np.eye(d) # covariance matrix of the inputs.\n",
"\n",
"w_star = np.ones(d).reshape((d,1)) # vector specifying true model\n",
"\n",
"# Algorithm-related.\n",
"m_idx_todo = [0,1] # let's us manually pick and choose which methods to evaluate.\n",
"out_max = 5\n",
"batchsize = 1\n",
"in_max = 50\n",
"t_max = out_max*in_max # termination condition; maximum number of iterations.\n",
"thres = -1.0 # termination condition; if negative, runs for max iterations.\n",
"\n",
"def alpha_fixed(t, val): # step-size callback function.\n",
" return val\n",
"def make_step(u):\n",
" def mystep(t, model=None, data=None, newdir=None):\n",
" return alpha_fixed(t=t, val=u)\n",
" return mystep\n",
"alphaval = 0.05\n",
"\n",
"# Clerical.\n",
"mth_names = [\"svrg\", \"svrg-ch\"]\n",
"num_mths = len(mth_names)\n",
"mth_colours = [\"black\", \"blue\"]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Make choice of additive noise distribution (un-comment your choice).\n",
"#paras = {\"name\": \"norm\", \"shift\": 0.0, \"scale\": 20.0}\n",
"paras = {\"name\": \"lnorm\", \"meanlog\": 0.0, \"sdlog\": 1.75}\n",
"\n",
"# Put together risk function.\n",
"def risk(w):\n",
" mean_noise, var_noise = hlp.noise_risk(paras=paras)\n",
" return hlp.riskMaker(w=w, A=cov_X, b=math.sqrt(var_noise), w_star=w_star)\n",
"risk_star = risk(w=w_star) # optimal risk value."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"## Running the algorithms.\n",
"\n",
"# Prepare storage for performance metrics.\n",
"riskvals = np.zeros((num_trials,t_max,num_mths), dtype=np.float32)\n",
"loss_tr = np.zeros((num_trials,t_max,num_mths), dtype=np.float32)\n",
"truedist = np.zeros((num_trials,t_max,num_mths), dtype=np.float32)\n",
"\n",
"# Loop over trials.\n",
"for tri in range(num_trials):\n",
" \n",
" # Generate new data (with *centered* noise).\n",
" X = np.random.normal(loc=0.0, scale=1.0, size=(n,d))\n",
" noise = hlp.noise_data(n=n, paras=paras)\n",
" y = np.dot(X, w_star) + noise\n",
" data.init_tr(X=X, y=y)\n",
" \n",
" # Data for Chainer model.\n",
" Z = ch.datasets.TupleDataset(np.float32(X),\n",
" np.float32(y))\n",
" \n",
" # Initial weight settings.\n",
" w_init = w_star + np.random.uniform(low=-init_delta, high=init_delta, size=d).reshape((d,1))\n",
" w_init = np.float32(w_init)\n",
" \n",
" # Initialize models (hand-built).\n",
" mod_learner = models.LinearL2(data=data)\n",
" risk_star = risk(w=w_star) # optimal risk value.\n",
" loss_star = np.mean(mod_learner.l_tr(w=w_star, data=data))\n",
" \n",
" # Initialize models (Chainer-based).\n",
" mod_chainer = models_ch.MyChain(out_l0=d,\n",
" out_l1=1,\n",
" init_W=w_init.T,\n",
" init_b=None,\n",
" init_delta=init_delta,\n",
" nobias=True)\n",
" \n",
" mod_snap = models_ch.MyChain(out_l0=d,\n",
" out_l1=1,\n",
" init_W=w_init.T,\n",
" init_b=None,\n",
" init_delta=init_delta,\n",
" nobias=True)\n",
" \n",
" # Initialize algorithms (hand-built).\n",
" al_svrg = Algo_SVRG(w_init=w_init,\n",
" step=make_step(alphaval),\n",
" batchsize=batchsize,\n",
" replace=False,\n",
" out_max=out_max,\n",
" in_max=in_max,\n",
" thres=thres,\n",
" store=True,\n",
" lamreg=None)\n",
" \n",
" \n",
" # Run all algorithms and save their performance.\n",
" \n",
" ## ERM-SVRG.\n",
" mthidx = 0\n",
" if mthidx in m_idx_todo: \n",
" idx = 0\n",
" for onestep in al_svrg:\n",
" al_svrg.update(model=mod_learner, data=data)\n",
" # Record performance\n",
" loss_tr[tri,idx,mthidx] = np.mean(mod_learner.l_tr(w=al_svrg.w, data=data))-loss_star\n",
" riskvals[tri,idx,mthidx] = risk(w=al_svrg.w)-risk_star\n",
" truedist[tri,idx,mthidx] = np.linalg.norm(w_star-al_svrg.w)-0\n",
" idx += 1\n",
" \n",
" ## Replication of ERM-SVRG using Chainer.\n",
" mthidx = 1\n",
" if mthidx in m_idx_todo:\n",
" idx = 0\n",
" t = 0\n",
" iter_train = ch.iterators.SerialIterator(dataset=Z,\n",
" batch_size=batchsize,\n",
" repeat=True,\n",
" shuffle=False)\n",
" while t < t_max:\n",
" \n",
" # If condition holds, run \"outer loop\" update.\n",
" if t % in_max == 0:\n",
" \n",
" # Use the output of \"inner loop\" as new snapshot.\n",
" mod_snap = mod_chainer.copy(mode=\"copy\")\n",
" \n",
" # Use the full data set here.\n",
" X_batch, y_batch = ch.dataset.concat_examples(Z)\n",
" prediction_tr_snap = mod_snap(X_batch)\n",
" \n",
" # Compute loss and full-batch gradient.\n",
" loss_snap = ch.functions.mean_squared_error(prediction_tr_snap, y_batch) / 2.0\n",
" mod_snap.cleargrads()\n",
" loss_snap.backward()\n",
" \n",
" # Store the gradient list for use in inner loop.\n",
" grad_list = [np.copy(p.grad) for p in mod_snap.params()]\n",
" \n",
" \n",
" # Mini-batch computations for inner loop.\n",
" Z_batch = iter_train.next()\n",
" X_batch, y_batch = ch.dataset.concat_examples(Z_batch)\n",
" t += 1 # manage steps ourselves.\n",
" \n",
" # Predictions.\n",
" prediction_tr = mod_chainer(X_batch)\n",
" prediction_tr_snap = mod_snap(X_batch)\n",
"\n",
" # Loss computations (will feed the grad computations).\n",
" loss = ch.functions.mean_squared_error(prediction_tr, y_batch) / 2.0\n",
" loss_snap = ch.functions.mean_squared_error(prediction_tr_snap, y_batch) / 2.0\n",
" #old_loss = np.mean(mod_learner.l_tr(w=mod_chainer.l1.W.data.T, data=data))\n",
" \n",
" # Gradient computations.\n",
" mod_chainer.cleargrads()\n",
" mod_snap.cleargrads()\n",
" loss.backward()\n",
" loss_snap.backward()\n",
" \n",
" # Parameter updates.\n",
" zipped = zip(mod_chainer.params(), mod_snap.params(), grad_list)\n",
" for p, p_snap, mu in zipped:\n",
" grad = p.grad\n",
" grad_snap = p_snap.grad\n",
" if grad is None:\n",
" continue\n",
" else:\n",
" adjust = grad_snap - mu\n",
" p.data -= alphaval * (grad-adjust)\n",
"\n",
" # Record performance\n",
" loss_tr[tri,idx,mthidx] = np.mean(mod_learner.l_tr(w=mod_chainer.l1.W.data.T, data=data))-np.mean(mod_learner.l_tr(w=w_star, data=data))\n",
" riskvals[tri,idx,mthidx] = risk(w=mod_chainer.l1.W.data.T)-risk_star\n",
" truedist[tri,idx,mthidx] = np.linalg.norm(w_star-mod_chainer.l1.W.data.T)-0\n",
" idx += 1\n",
"\n",
"\n",
"# Finally, take statistics of the performance metrics over all trials.\n",
"ave_loss_tr = np.mean(loss_tr, axis=0)\n",
"ave_riskvals = np.mean(riskvals, axis=0)\n",
"ave_truedist = np.mean(truedist, axis=0)\n",
"sd_loss_tr = np.std(loss_tr, axis=0)\n",
"sd_riskvals = np.std(riskvals, axis=0)\n",
"sd_truedist = np.std(truedist, axis=0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__練習問題__\n",
"\n",
"0. `mod_snap`と`mod_chainer`の役割の違いを説明すること。\n",
"\n",
"0. `zipped`に基づくイテレーションでは、何が行われているか説明すること。\n",
"\n",
"0. Chainer向けのSVRGと自作のSVRGがまったく同じ性能を叩き出すと思われるか。その理由も併せて説明すること。"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"