Skip to content

Instantly share code, notes, and snippets.

@kskkwn
Last active November 18, 2021 12:28
Show Gist options
  • Save kskkwn/3d48c4986353977dc24681b9017c0e27 to your computer and use it in GitHub Desktop.
Save kskkwn/3d48c4986353977dc24681b9017c0e27 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# はじめに\n",
"\n",
"最近,最適輸送を覚えてちょいちょい使っています.\n",
"特にSinkhorn iterationを用いることで,行列計算だけで最適輸送距離をだいたい計算でき,さらに自動微分で勾配が求まるため,色々な問題のロス関数として最適輸送を使うことができます.\n",
"ところで,最適輸送の式はもともと線形計画問題なので,輸送計画の行列がコストに依存しないとすると,簡単に勾配(らしきもの)を求めることができます.\n",
"以下では,自動微分を用いたときと,この方法で求めた勾配を用いたときで,実際にどの程度の差がでるものなのか気になったので,適当なデータに対して両方の手法を適用してみて結果を比較します.\n",
"結果,どちらもそんなに変わらないように思えるので,MLのような雑な最適化で済むようなタスクでは自動微分じゃないほうがいいのではないかと思っています.\n",
"\n",
"\n",
"\n",
"# 最適輸送問題\n",
"\n",
"適当な2つの2次元空間上の点群$X = \\{x_1, \\ldots, x_n\\}$と$Y = \\{y_1, \\ldots, y_m\\}$の間の最適輸送を考えます."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pylab as plt\n",
"from scipy.stats import norm"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import torch\n",
"import torch.nn\n",
"from torch.optim import Adam\n",
"\n",
"import ot"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<torch._C.Generator at 0x7f336b100030>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"torch.random.manual_seed(1234)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"X = torch.randn(10, 2)\n",
"Y = torch.randn(10, 2) + np.ones(2)*5\n",
"\n",
"n = X.shape[0]\n",
"m = Y.shape[0]\n",
"\n",
"a = torch.ones(n)/n\n",
"b = torch.ones(m)/m"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X.detach()[:,0], X.detach()[:,1])\n",
"plt.scatter(Y.detach()[:,0], Y.detach()[:,1], marker=\"x\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"これらの点群の間の最適輸送問題は以下のように定義されます.ただし,ground metric (点同士の距離)として$L_2$距離の二乗を使います.つまり,$C\\in \\mathbb R^{n\\times m}$の成分$C_{ij} = \\|x_i - y_j\\|^2_2$です.\n",
"\n",
"$$\\min_{P\\in U(a,b)} \\left \\lt P, C \\right \\gt$$\n",
"ここで,$P$は輸送行列で$P_{ij}$は点$x_i$と$y_j$の間の対応関係の強さを表します.$U$は質量保存則を満たす行列の集合であり,$U=\\{P\\in [0,1]^{n\\times m} | P \\mathbf 1_m = \\mathbf a, P^\\top \\mathbf 1_n = \\mathbf b\\}$と書くことができます.\n",
"$\\mathbf a, \\mathbf b$はそれぞれ$X, Y$に含まれる各点の重みを表すベクトルです.ここでは単純に各点群に含まれるすべての点が同じ重みを持つとします.つまり$\\mathbf a = \\mathbf 1_n/n$,$\\mathbf b = \\mathbf 1_m/m$です.\n",
"\n",
"以下ではこの最小化問題の解を輸送コストと呼びます.(輸送コストのrootは2-Wasserstein距離とも呼ばれます.)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"この問題は線形計画問題なので,適当なソルバーに突っ込むと,そこそこのサイズの点群に対しても解を求めることができます.\n",
"しかし,ソルバー(例えば単体法)は微分できないので,輸送コストをロス関数として用いたいなどの機械学習における用途としては使いにくいです.\n",
"また,点群のサイズを$N$として,計算量も$O(N^3)$かかってしまいます.\n",
"\n",
"そこで,Sinkhorn iterationを使ってエントロピー正則化つきの最適輸送問題を解くということがよくやられています.\n",
"エントロピー正則化つきの最適輸送は以下のように書けます.\n",
"\n",
"$$\\min_{P\\in U(a,b)} \\left \\lt P, C \\right \\gt - H(P)$$\n",
"\n",
"ここで,$H(P)$は輸送行列$P$のエントロピーを表し,$H(P) = - \\sum_{i,j} P_{ij} \\log P_{ij}$です.\n",
"$\\epsilon$はエントロピー正則化の強さを表します.\n",
"\n",
"この最適化問題に対して,Sinkhorn iterationと呼ばれる反復法を用いて最適解を見つけることができることが知られています.\n",
"Sinkhorn iterationにはいくつかの表記の仕方がありますが,ここでは後ろの実装と合わせるためにsoftminを用いた表記を用います.\n",
"\n",
"$$\n",
"\\mathbf f^{(l+1)} = \\text{Min}_\\epsilon ^{\\text{row}} (S(\\mathbf f^{(l)}, \\mathbf g^{(l)})) + \\mathbf f^{(l)} + \\epsilon \\log(\\mathbf a) \\\\\n",
"\\mathbf g^{(l+1)} = \\text{Min}_\\epsilon ^{\\text{col}} (S(\\mathbf f^{(l+1)}, \\mathbf g^{(l)})) + \\mathbf g^{(l)} + \\epsilon \\log(\\mathbf b)\n",
"$$\n",
"ここで,$S(\\mathbf f, \\mathbf g)_{ij} = C_{ij} - f_i - g_j$です.\n",
"また,$\\text{Min}_\\epsilon ^{\\text{row}}$は行方向へのsoftminを表します.softminは以下の様な関数です.\n",
"\n",
"$$\\min_\\epsilon \\mathbf z = -\\epsilon \\log \\sum_{i} e^{-z_i/\\epsilon}$$\n",
"\n",
"\n",
"$\\mathbf f, \\mathbf g$を適当に初期化して,この反復を収束するまで行います.\n",
"その後以下のように$P$を求めることができます.\n",
"\n",
"$$P_{ij} = e^{f_i/\\epsilon} e^{-C_{ij}/\\epsilon} e^{g_j/\\epsilon}$$\n",
"\n",
"では実際に実装して$P$を求めます."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"epsilon = 0.01"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def softmin(z, epsilon):\n",
" return -torch.logsumexp(-z/epsilon, dim=1)*epsilon"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def sinkhorn(C):\n",
" n,m = C.shape[:2]\n",
" f = torch.ones(n).double()\n",
" g = torch.zeros(m).double()\n",
" C = torch.sum((X[:, None] - Y[None])**2, dim=2)\n",
" C_max = C.max()\n",
" C = C/C.max()\n",
"\n",
" for i in range(200):\n",
" S = C - f[:, None] - g[None]\n",
" f = softmin(S, epsilon=epsilon) + f + epsilon * torch.log(a)\n",
" S = C - f[:, None] - g[None]\n",
" g = softmin(S.t(), epsilon=epsilon) + g + epsilon * torch.log(b)\n",
" P = torch.diag(torch.exp(f/epsilon)) @ torch.exp(-C/epsilon) @ torch.diag(torch.exp(g/epsilon))\n",
" return (P * C).sum() * C_max, P"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"C = torch.sum((X[:, None] - Y[None])**2, dim=2)\n",
"cost, P = sinkhorn(C)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(P.detach())\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X.detach()[:,0], X.detach()[:,1])\n",
"plt.scatter(Y.detach()[:,0], Y.detach()[:,1], marker=\"x\")\n",
"for i,p_i in enumerate(P):\n",
" for j,p_ij in enumerate(p_i):\n",
" plt.plot([X.detach()[i, 0], Y.detach()[j,0]], \n",
" [X.detach()[i, 1], Y.detach()[j,1]], \n",
" alpha=float(p_ij.detach().numpy())*2, c=\"gray\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Sinkhornの微分\n",
"\n",
"先述したように,Sinkhorn iterationは単に行列の掛け算の形で書くことができます (上ではsoftminを使った表記でしたが,softminも$\\epsilon>0$で微分可能な関数です).\n",
"そのため,Sinkhornは微分可能な演算になっています.\n",
"実際にpytorchなどを用いると,容易にSinkhornで求まる輸送コストをロスに使ってパラメータの最適化を行うことができます.\n",
"ここでは簡単に$X$と$Y$の間の輸送コストが小さくなるように$X$を動かしていく問題を考えます."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"original_X = X.clone().detach()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 8.83 s, sys: 8.34 ms, total: 8.84 s\n",
"Wall time: 8.86 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"X = original_X.clone().detach()\n",
"X.requires_grad = True\n",
"\n",
"hist_X = []\n",
"hist_X.append(X.detach().numpy().copy())\n",
"hist_cost = []\n",
"\n",
"\n",
"optimizer = Adam([X], lr=0.1)\n",
"for i in range(100): \n",
" C = torch.sum((X[:, None] - Y[None])**2, dim=2)\n",
" cost, P = sinkhorn(C)\n",
" cost.backward()\n",
" optimizer.step()\n",
" optimizer.zero_grad()\n",
" hist_X.append(X.detach().numpy().copy())\n",
" hist_cost.append(cost.detach().numpy())\n",
"hist_X = np.array(hist_X)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ロスの履歴と移動の軌跡をプロットします."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0, 'iterations')"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(hist_cost)\n",
"plt.ylabel(\"cost\")\n",
"plt.xlabel(\"iterations\")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X.detach()[:,0], X.detach()[:,1])\n",
"plt.scatter(Y.detach()[:,0], Y.detach()[:,1], marker=\"x\")\n",
"\n",
"plt.scatter(original_X.detach()[:,0], original_X.detach()[:,1], c=\"C0\")\n",
"\n",
"plt.plot(hist_X[:,:,0], hist_X[:,:,1], c=\"C0\", lw=0.4, alpha=0.6)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"左にあった$X$(青点)が$Y$(オレンジ×)の方に移動しているのがわかります.\n",
"実際にSinkhornの微分を使って輸送コストが小さくなるように最適化を実行することができました."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# $P$を用いたSinkhornの微分"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ようやく本題です.\n",
"エントロピー正則化つきの場合の輸送コスト$L_\\epsilon$は以下のように書くことができます.\n",
"\n",
"$$\n",
"L_\\epsilon = \\left \\lt P^*, C \\right \\gt - \\epsilon H(P^*)\n",
"$$\n",
"ここで,$P^*(C) = \\text{argmin}_{P\\in U(a,b)} \\left \\lt P, C \\right \\gt$ です.\n",
"\n",
"このとき,$L$の$C$に関する微分は以下です.\n",
"$$\n",
"\\frac{\\partial L_\\epsilon}{\\partial C} = P^*(C) + \\frac{\\partial P^*(C)}{\\partial C} - \\epsilon \\frac{\\partial H(P^*(C))}{\\partial C}\n",
"$$\n",
"右辺第2項, 第3項はコストが少し変わったときの最適な輸送行列の変化に依存していますが,例えば勾配を使って点を少しずつ動かすようなタスクでは輸送行列は大体の場合同じで,たまに切り替わるという挙動をしそうな気がします.この場合は,右辺第2,3項は無視しても最適化の結果には大きな影響がないのではないかという気がします.\n",
"\n",
"Sinkhorn iterationsでは自動微分を使って勾配を計算しました.自動微分の計算のためには$f$や$g$の中間値を保存し,かつ,backward計算する必要があります.これに対して$P^*$はSinkhorn iterationsの最後の値を保存しておくだけで計算可能です(そもそもSinkhorn じゃなくても計算できます).\n",
"実際にやってみます."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"import torch.autograd"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"class Sinkhorn_P(torch.autograd.Function):\n",
" @staticmethod\n",
" def forward(ctx, C):\n",
" n,m = C.shape[:2]\n",
" f = torch.ones(n).double()\n",
" g = torch.zeros(m).double()\n",
" C_max = C.max()\n",
" C = C/C.max()\n",
"\n",
" for i in range(200):\n",
" S = C - f[:, None] - g[None]\n",
" f = softmin(S, epsilon=epsilon) + f + epsilon * torch.log(a)\n",
" S = C - f[:, None] - g[None]\n",
" g = softmin(S.t(), epsilon=epsilon) + g + epsilon * torch.log(b)\n",
" P = torch.diag(torch.exp(f/epsilon)) @ torch.exp(-C/epsilon) @ torch.diag(torch.exp(g/epsilon))\n",
" ctx.save_for_backward(P)\n",
" return (P * C).sum() * C_max, P\n",
"\n",
" @staticmethod\n",
" def backward(ctx, grad_output1, grad_output2):\n",
" P, = ctx.saved_tensors\n",
" \n",
" return P*grad_output1\n",
" \n",
"def sinkhorn_P(C):\n",
" return Sinkhorn_P.apply(C)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 3.48 s, sys: 3.4 ms, total: 3.48 s\n",
"Wall time: 3.48 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"X_P = original_X.clone().detach()\n",
"X_P.requires_grad = True\n",
"\n",
"hist_X_P = []\n",
"hist_X_P.append(X_P.detach().numpy().copy())\n",
"\n",
"optimizer = Adam([X_P], lr=0.1)\n",
"for i in range(100): \n",
" C = torch.sum((X_P[:, None] - Y[None])**2, dim=2)\n",
" cost, P = sinkhorn_P(C)\n",
" cost.backward()\n",
" optimizer.step()\n",
" optimizer.zero_grad()\n",
" hist_X_P.append(X_P.detach().numpy().copy())\n",
"hist_X_P = np.array(hist_X_P)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAD4CAYAAADxeG0DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABFgUlEQVR4nO29eXCb2Xnm+xyCC7jvJEhKbFEbRW3UQkmU2HaNx7G6Y/nGHc91Kr5lzSS5uZ3xtcftLO5xe26NldS91Ul3JbEy19WZLieuuDvLOO0lvpbTbbviid2WxFUbF5GiIFIkARAEQOw7cO4f4CEBEgTwAR8BfOD7q3K5CYLnO4DIB+d7znuel3HOQRAEQSiXolxPgCAIgsgMEnKCIAiFQ0JOEAShcEjICYIgFA4JOUEQhMIpzsVFm5qa+L59+3JxaYIgCMUyOjpq4pw3b348J0K+b98+jIyM5OLSBEEQioUxNh/vcbJWCIIgFA4JOUEQhMIhIScIglA4JOQEQRAKh4ScIAhC4ZCQEwSRHpzjhvYGLr9zGSf/5iQu/+NHcEN7I9ez2pXIUn7IGKsD8HUAxwFwAL/FOb8lx9gEQeQhP30VT4x3cc3/GN6wD+AcVxemsKT7HG78L8CV/VdyPcNdhVwr8usA3uWcHwHQC2BKpnEJgsg3OAe8NnRNvYvPrxgAzvGyxYqrdgfKQwFcH/1qrme468h4Rc4YqwXwQQC/AQCccz8Af6bjEgSRpzAGPP8q3p56Gx9yu3HQ70e/14e3aqrxWkMdmHs51zPcdcixIu8CsALgG4yxO4yxrzPGKjc/iTH2ImNshDE2srKyIsNlCYLIFRzA19sPwMuKcNHrAwPwWkMdwBg0lZoczy5P2dzER8amPnIIeTGAMwDe4JyfBuAC8KXNT+Kcv8k57+Oc9zU3b4kKIAhCIXiDXvx88ef4b2jGwUBg/fGXLVaoi8rw0pmXcji7POWnrwLvvrIh3pxHvv7pq7IML4eQLwJY5JwPrn39DiLCThBEgWHymDBqGMGlBz/AiYc/xpOe53H52Hm8XVONq3YHvlV6AFe6PprraeYNN7Q3cPkfP4K373wNGHwDT7716xsiPvgG4LXJsjLP2CPnnBsYYwuMsW7O+TSADwOYzHhmBEHkFXO2OVh9VlzqGAB79HPgwmfQ9fyr+BFj6+LUpa6NeOgEbmhv4NrNa/CGvPiThjpwAFen3gX+sC7yhAufAZ5/VZb3i8nRfJkxdgqR8sNSAFoAv8k5X93u+X19fZzSDwlCOYybxlFeXI4DdQc2HuQ8VoQ2f73LufzOZehd+o0HOMeDuYWNr79ilfx+McZGOed9mx+XpfyQc353zf8+yTl/IZGIEwShHMI8jNv622gqb4oVcWCrCJGIAwA455hdnd0i4i9brLFPjPbMMyQneeQEQeQ/gVAAt/S3cKrlFGpKa3I9nbwnzMOYskzB4XfgQO0BtFW2RcQ8qs7+rZpqvLW3Bz+qOhvxyAFZ7BUScoIgtuD0OzFmHEN/Wz9KVaW5nk5ewznHlGUKdr8dPQ09qC2rBQC8dOaldY/cUcTwVk01/qJZg2tnvwCIDWGZ9hRIyAmCiGHFvYJZ6yye7XgWRYzimLaDc47H1scweozoaejB0cajMd8XMQXXx67jL8GgqWjFtbNf2IgvkGmjEyAhJwgiClGZcrH9Yq6nsqPc0N7A9bHrMLgM0FRq8NKZlyTlwxhcBjy2PsaBugM4WH9w2+dd2X9l+3Fl3FMgIScIAgAwaZ5ESVEJTrWcyvVUtsA5hyvggt1vhyvggjvoRiAU2Pb5jDGUqcpQUVKB2tJa1JbVorgoInfRZYHgHHqXHtduXgOASA18AoF1+p24b7qP1opWDHQMyPoaM4GEnCB2OZxzjC6Por2qHe1V7TmdSyAcwIp7BUa3EYFwAAwRUWWMoaqkClWlVWipaEFFcQWKi4rBthFdzjl8IR+cASdsfhsWHAsIhoPg4Hht+DV4Q178zqoVtWGO1xrq4A15cX30q7gy/fOIb/2hV2LGC4VDuG+6DwaGC5oLUBWpdvy9kAIJOUHsYoLhIG7rb+N443HUqeuyem3OOaw+KxYcC/CFfACA4qJitFS04FjjMZSoStIemzEGdbEa6mI1msqbYr5n8VoAzuEqKsLnrFYAkZyYf78wBdiHIgd1omri52xz0Ll06G3uRWXJlhipvICEnCB2Ke6AGyPLIzinOYfy4vKsXfOJ7QncQTcAoK6sDofqD2Xt+gDWywLfrqlGezCEq3YHrtodkW9GnbZ0+p24v3Ife6v34lL7pazNLx1IyAlih+CcwxP0wBP0IBAOIMRDAAAVU0GtUqOipGLb0r4bj3+A63f+YmMz7vTnceXAx2Sbm8VrwZR5CpfaL617xzuFyWPCnG0OYR5GRUkFumq7crqyjS4LfK2hbkPEAeD5V8EBPFi5jxAPob+9P7PKnSydfiUhJ4gM8Qa9MLgMMHvNiI68ELf35apylKhKUMyKwcERCAfg9DvhcrjWN+w4OEpVpdhXsw/LN74A+/y/QF9fDTAGvVMH+/c/i5lnvo3Dn/hGxvNdsC/A6DHiUvulbT3mTDF5THhiewLOOZrKm3C65XTe+MrrZYGjX43YKVEYb/wuZk79O5xoPrleD542P301EoolygxFWFYcDz5TSMgJQiJ2vx3ztvlI1QMAtUoNTaUGnTWdGa3efCEf5qxP8APDLXzY68bvWUL4s4Y6vGyx4lN2B76zdBOHM1zRTZmnUMSKcLb1bNpjbIcr4MK0ZRqBcABN5U0423o2b+vQr3R9NLKxueaJBy7/Ee7+4LOouf82BorKwH752cwusNZFKeb0pkg83OTBywEJOUEkIczDWHAsYNm1DMYYqkurcbD+oOy+bpmqDN2NR/DJihLUe8twwetbD1l6q6Yar1eX4hNp/vGLyhRNpQZ7qvfINucwD+Ox9TEsXgsqSypxvOm4Mk6CMhZZGV/4DBYG/k8sLI/g9Eevo7y0UZ7TlmtdlJ7Yn6Br8I11QX/S8zy6ZDwIJCAhJ4g4hHkYc/Y5mNwmMMawt3ovzmnO7ZgVEY2mqg1/jtikvNca6tBW1ZbWeIFwAIP6QVkrU1wBF6bMUwjzMA7UHcCh+kOyjJtNfB/8PYwZxtDGwxubmTKK7I0nP8Q1/2MMRz32a/7HuPbkh7I3pyYhJ4gojG4j5mxzAIB9tfuwv21/1ufw0unPw/79z8Y89uVVB2o+8HnJY7kCLowuj+JC2wWUqcoynpveqce8Yx5VJVXobelFSVH6JYK5RGvTwug24qzmbOwdhIwf1NdHvxppTo1IazwG4PMrhki9Ogk5QciLP+THQ8tDuINutFS0ZG3lHRfOcWXmfcBmxXcaNbhWXYprDj8+ZTYAM+8D+6+kLDZGtxFamzbjzBTOOWatszB5TGirbMMFzYXcvT8Z4gv5MLo8ir1Ve9Hf1r9zF+Ic/35hCp+2O/DNmmq8vrbXcdXuAFuYIo+cIOTC5DFBa9WiuKgYRxqOoKKkItdTivFuP/H8qxFPPLraIcU//tnVWXhD3ozEKszDmDJPwRFw4GDdQUXaJ9FobVqY3Cac05zb+TsJxsDLavBWDfD6WlPq1xrqIt8rq5HdI5elQ5BUqEMQkSs453hif4Jl1zKayptwsO5gfq4u06w/5pzj3so91JXVYV/tvrQuHQwHMWmehCfowZGGI5mX4eUYX8iHseUx7Knag701e7N23RvaG/jK+/8VPu5ff0xdVIZrA3+YtrWyXYcgWpETu4IwD+Oh5SFsPhu6arvyP90vje47wXAQg/pBHGk4gsbyRsmXFALuDXpxtPEoqkqrJI+Rb8zb56F36dHX2pfRkf90uLL/CvQuPf5+6u+x4llJK2UxVUjIiYJGiJM76MaR+iNbMqMLBdEI4rzmPNTFakk/KywUZ8CJY43HCkLAA+EAxpbH0FrRurNeeAL8IT9ONJ3Ab//ab+/4tWQRcsbYHAAHgBCAYLylP0Fkk2A4iAnzBHxBX8GsLrfD4DJg3j4veVOTc46Z1RlYvBYcbTyqeAtFoHPqMGebw5nWM5I/1OTkjvFO1iKB5VyRf4hzbpJxPIKQTCgcwoR5At6gF8eajuVtWp1cTFumEeIhXGi7IOnnntqfYtG5iMP1h9Hd0L1Ds8suYR7G2PIYastqcakjtyFXC/YFNFc0y1LymQpkrRAFQXTfxGONx1BdWp3rKe0onHOMLI+grbJN0klNk8eEGcsM9tbkf6KfFMweMybNkzjdcjrnd1++kA+LzsWs7sPIJeQcwI8YYxzAf+ecv7n5CYyxFwG8CACdnZ0yXZbY7XDOobVpsexejts3sRDxBr0YMgxJ6m7vDrhx33QfdWV1uNh+MT8rddKAc44J8wQA4NmOZ3P+ujjnGDGM4Hzb+axeVy4hf5ZzvsQYawHwY8bYQ875z6KfsCbubwKR8kOZrkvsYgwuA7RWLfbX7S+o1WUiTB4Tpi3TuNh+MaVa6DAP44HpAYLhIM62nlXsScx4uAIujC2P4Wjj0bSqdHaCB6YH6G7ozvr7LIuQc86X1v7fyBj7LoDzAH6W+KcIIj3sfjsmTBNorWjNuReaTR5bH8Phd6QcPztvn8eSYwnHm4+nvHJXClqrFmavGZfaL+VNPO6ScwllqrItHYmyQcYZk4yxSsZYtfhvAJcBjGc6LkFsJhAOYMQwgie2J7jQdgH767Kfg5ILRHKhiqlwquVUUhG3++24uXQTRSjCpY5LBSXigXAAt3S3UKIqwTnNubwRcYffgSXHUs42juVYkbcC+O7aL1cxgL/jnL8rw7gEAWCjTM7qs+Jk88mstgXLNf6QH4P6QZxoOpE0uTDMw7i/ch+Mscw722QDiadXDS4DHlsfo0/Tl7VqkFQIhAO4Y7yDZzsyzDDPgIyFnHOuBdArw1wIYgsr7hXMrM7gUP2hgimTSxWzx4wpyxT62/qTnkpccCxgwb6Ak80nc161kRISuueI2IEyVRkGOgZyNOH4cM5xW3cbF9ou5PSDk8oPibzEH/LjrvEuaspqdrQlWb6itWph99sx0D6Q8LV7gh7cNd5FW2WbcvYLJHTPERuaqdyR5IKR5RGcaDqR8zsEEnIirxA2is1nw6mWU8roNiMjnHPcMd5Bg7oh4alAzjkeWh7CFXChT9OXm2qUNcG9ob2B62PXYXDqoalqS54nstY9B0BEvIWgR3WwByJphWaPGQMdA3lpE02YJtBR1ZEXHzAk5ETeYPVaMWGewMG6g7vORgEiB0mG9ENJV582ny1S5lbfjZ7GnuxNMJo1a+TG4Wdx7dYfwhv04GWLFQ6rFde81wAgNTEXIg7gsnMUhm/2orWiFR878DH86sFfxTnNuR1+IemhtWpRXlyO9qr2XE8FgAxVKwSRKaFwCHeMd7DgWMCl9ktorWzN9ZSyjsljwohhBP3t/duKuPCK5+3zGGgfQHNFc3YnuTGRdWvE98Pfhzfowe9ZrHjW40F1mMMb9OD62PXkY7wb64VfXZgC52EY3Aa8NfEWHpgexHz/hvYGLr9zGSf/5iQuv3MZN7Q3Mn8dib7ehiXnEjwhT15VTdGKnMgpOqcOT2xP0Nvcq4xNuh3g0eojeIKehHsBJo8JU+YpnGw+mftwqyhr5BODb+BDq0WYKCvFv5aX40/XmigYXIbtf16I+Jonftk5iqsLU2gNBvFpuwNv11TDF/bh+tj19VX9De0NXLt5Dd6QFwCgd+lx7eY1AElW/tshYbM1mhX3CoxuI063nJZ+zR2EVuRETvCH/BjSD8EdcGOgY2BXiniYhzFsGIZapcbJ5pNxRTzMwxhdHoXRbcSzHc/mXsQFa2K+UKyCtqQEAx7vuogDgKZSk/hn17og4flXoXcb8FpDHX5WrkZ1OLw+RvSHwfWx6+siLvCGvMlX/pu4ob2By//4Ebx952vA4Bt48q1fj/1g8dq2XZlbvVY8sT3JOxEHaEVO5IA52xwMbgNOt5zO+W5/rnAH3BhZHsHpltPbBnwZ3UbMrM7gVPOp/Pug4xzT/99ngaIinPX5AAAvW6x4raEO6uJyvHTmpcQ//6FXAM5hcC+jQd0Ai9eCf6quiqkjX/8w4Dx2hR9V1ZJw5b+J6FX9nzTUgQO4OvUu8Id1kSds2myNxuF3YNI8mbcNSWhFTmQNb9CLm7qbUDEV+tv6d62IG1wG3Fu5h0vtl+KKuFiFmz1mDLTn390KD4cx+v3fQcX9f0D36d/Gjat/i+80anDV7sAfOgK4dvErSe0Ozjnume7D5rPh5XMvo7SoNEZA1Sp15MPgp5HSRE1Fq/hB/JrDic+sWgEkWflvImZVH91DU7CNiLsDbtxbuYf+9v68LYOlFTmRFR5bH8PsMWen8W0eM2WeAgffdmVn8pjw0PIwP1fh2Ggnd7SyDfVnXwSefxVXGAM+dwV49xV8Ql0LHPhYwjHcATdGl0dxrOkYGtQNOFB3ALOrs7jx5AYMLsNGS7SujwLTPwcG38B/73ken2QWfMxuxpfNq/i7mmqoi8qSr/yj2Lyqf9lijX3Cu69sEXNP0IPR5dG8LYEUUPNlYkfxBD24s3wHz9Q+g46qjlxPJ2cEw0EMG4bRVdsVdxUpKlJKVaXoaejJy5WfJ+jBsGEY5zTnIjEJaTSIXnAsQOfU4WzrWRQXRdaRo8uj6GnoQUVJxdYfWPOvfUNvYFCtxkWPF/+jphrf3NuDl85+QdJG50f+8SMwuA3rIn7V7sBbNdV4a28PflR1duNA0pqYi7jgS+2X1ueaa6j5MpF11lfhbbt7FW7323HXeBd9rX1xxWrVu4px03h+VKRsg8VrwZR5KlbUJDSIFgedakprYroZmT1mqFXq+CK+Nqbnl/4rhu9/Axc9XpQA+PTvLuDTEj/oOOe4sv8K3p58G76wD44ihrdqqvEXzRpcO/sFoOujkSeqawHGIjX9hiFcbL+YNyKeiPyfIaE4fCEfRg2j6KzpzHrAfr6xYF+AwW2I209TNEUI8VBeNEXYjgXHAoxuY9pRCa6AC6PLo+ht7o35oArzMCbNkwnDplx+J8Z++Hlc8ng3xCqOBZKMMeMYrh69ikP1h3B97Dr+EgyailZci17Vr43pC/kwqB9MOfM9HyAhJ2RFVKSc05xLGvRUyAirpLKkMu7pRJEh0tPYk5P86lSZtkyDg+Ns69m0fn7ePr9eOrn5g0w0J97uw8HqWcXke3+AgbvfRpGwPESZIJCymE+YJ6Cp1KCxvBFX9l/Z3o5RqIgDJOSETATCAYwuj0JToUF/W3+up5NT/CE/hgxD6Gnoidu5ZnZ1FlafNa830DjnGDOOoaWiBXur96b98/Vl9XE/yJ7an6K+rD5h6eWcbQ4Xaw6ARZcFioyWNQskGVqrFmqVOqX9GaWKOEBCTsiA3qnHE9sTnGk9A3WxOtfTySkieva85vyWwC9/yI+R5RF0Vneir37LflXesF6Z0ngU9ep6yT8vrJTteoo6/A4su5e3zVFZsC/A4rNEbLm287GbqELMUxBxnVMHT9CDY03Hkj5XbGwqUcQBEnIiA8I8jDvGO6gurVZOhOoOMrs6C2fAGTd6VufUYc42hz5NX14nOoqDSuuVKRJJZKUAkQ+JRE0Ypi3TAIDe5qgWBxI2VQVmjxk6pw59muQfmKIaJ5+qU6SizFkTOUdUWpxuOZ2X9c7ZRBzg0VRocLD+4Jbv3TXeRWVJZd5/2Jk9ZkxbpjHQPiC5hVoyK0U8Z0g/hHOac3FF/q7xLurV9Xim5pm05i9w+B2YWZ1JyeITdw9KFnGAhJyQCOcck+ZJBHkwrystskWio/Y2nw33V+6jt6U37/tmztvnYfFacLH9ouR/U/EebK5K2czdlbvobujestLnnGPQMIj9tfvRUtGS1vwFotHGQEfihhxARPDvGu9ue/egJEjIiZRxB9wYM46hu747dxGqeYTeqce8Yz7uam7aMg130K2ID7sJ8wRKikrSCoNacCxA79QnXcVPW6bRqG7csvkbCAdwW3dblg87f8i/bpEkE2abz4YJ00RebzhLQTYhZ4ypAIwAWOKcJz6jSyiOOdscjG4j+tv6FX0LKhcTpgkUsaItt++BUADDy8PYV7Mv75tjcM4xsjyCjqoOyQ0SOOe4u3IX1SXVSc8KLNgXwMHRWdMZ87iwNfrb+jPeNwiEA7itv42LbckP8Jg9ZjyyPkrr7iNfkfMv8iUAUwDy+x6SkITYnGoub971h3uAyPsxZBjCgdoDWxpgGFwGaK3avN/QBCIfOLf1t9M6TSo2B082nUza5szoNsLsNW9pW2fymDCzOiOLrREKh3BLdwvnNeeTnl1Ydi3jqeMpLmguFIyIAzIJOWNsD4ArAP4fAL8nx5hE7jF7zJg0T+Js69ntj1DvImw+G+6t3NtS0cE5x33TfZQWleb9hiawERmQzkpY59Rh3h7fTtqM1WvFnG1uywJg3Y9vy3xFHOZh3NTdRF9rX9LS1yXnEoxuY962j8sEuVbkXwXwMoD41f0AGGMvAngRADo7O7d7GpEHcM4xZZlCMEwbmoI52xzMXjM+0PGBmPdjc5JfvmNwGfDU/nTL60gG5xwPTA9QpipLKZPb6XfGze+eNE9CxVSyNGcI8zB+sfQLnGk9k3ShMWebgzPgzMumEHKQsZAzxj4GwMg5H2WM/Zvtnsc5fxPAm0Ak/TDT6xI7gy/kw4hhBIfqD2VcQVAICC+4trR2yzH1BfsC9C69YoKVHq0+gj/kl2yRiZOqRxqOpBQn4A64ccd4J6ZyhHOO0eVRtFW1yZKCKVbiZ1rPoLKkMuFzH60+QpiHcbzpeMbXzVfk+O0bAPArjLGPAlADqGGMvc05/7QMYxNZROfUYc4euRVW4uk2uRFd7Y83HY854SgOQtWX1Sti30B8GDWoG3Co/pCknzW6jXi0+ggXNBdSys7xBD0YWR7BQPtGNUggHMCgfhDHG48n9dRTIXolnkzEJ82TUKvUkl+30shYyDnnrwB4BQDWVuR/QCKuLMQfekVxBS6157/Hmw1W3CuRQyXt/TEfag6/Yz3sKd9rw4GN4/ZHGo7EzX1JxJR5CmEexkDHQErP94V86+V/ohRRVKZcaLsgS0eoUDiU8kr8rvEuGssb08qKURr5fz9I7CjiDy2VCoTdwrRlGr6Qb0tsq9amhcVjUcwBknSP2wfCAQwbhrG/dn/KrdSiA6eEzbTiXsGsdVa29ysYDuKW7lbSzXfOOYYNw9hXu2/X2IOyCjnn/H8C+J9yjknsHCIXI50j2YVImIcxYhhBe1V7TA24OILfUtGSUnZHPpCuiFq9VjwwPUCfpi9l8Y8XOKW1aeHwO2RrVhwIB3BLdyvph1KYh3FbdxtHG4/uqoUJrch3IWEextjyGBrKGwqyFCsdxJ3JmZYzMdkxouTwbOvZpLfy+YLWqoUz4JQsoo+tj2H32yVVKsULnLq/ch9VpVWxwVcZIFb7ycolhdgr6d9KLkjIdxnC442XDbJbWXIuYcmxtGX1qrVqsepblVyqlytEPXt1aTVONp9M+eeiQ7+klOcJ60aIeJiHMagfxIG6A7JZGuIayeJlxQeKXF680iAh30UozePdaUSrtZKikpjqk2grJd3OONkmGA5iSD+Eww2HJXUc2u5OJBlOv3M9jraIFa3bK3Kuhu1+O+4Z7yW1/sTzlJ5gmAm781XvMoQwNZc3K8bj3WkC4QCG9cM4VH8oJgBMnHpU0u25WLVu19x5O0TgldQP9s2BU3EbM2eIxWvBQ8vDpDaPyWNa3wtQwl3TTkFCXuAIYZK64ipkxIbe+bbzMbfhT2xPYPaYFXXHsuJewSPrI0kb1sKCqSiukFwHb/KY8Nj6eD1wat4+D7PHnHZj5ngYXAYsOhZjjvDf0N7A9bHrMLgM0FRq8NKZl3Cy+STMHnPB5aakA+M8+4cs+/r6+MjISNavu9sQwnSm9YxihGmneWJ7AqvPilPNG01/xeZvU3kT9tXuy+0EJSA2NaX44cn6iSZC79RD59LhTMsZMMYwYZpAiaoEh+sPS536tszb52Hz2TZeE+e48eSHuHbzGrwh73rbt9KiUvxO7+/gxZMvynZtJcAYG+Wcb7mtphV5ARItTGSlRFg/al9WG7OhJzxiJW3+cs5xb+UeaspqJIm4yWPCtGU65VOa0QiBPdt6FmEexpB+CM/UPJNynXkqiDZvx5uOQ2vTwnzzLwC/C695ZtZF/GWLFY9LivHtmmq8M/POrhPy7SAhLzCcfifGjGOKEqadRhy1P9F0Iqa2eMG+AIPboCgrJd1Nze0OOaWCyCo52XxyvRRQbqvu/sp9FLNiuINujBhG0FWzD/uhBu58A/9HTTX+pKEOv2Gz44jfD3sRAziHwWWQ7fpKh4S8gHhqf4pl97KihGmnMXlMmLHEHrUXK9qqkipF1dGLuwcpJzVD4RCGl4ext3ovuqukN7oYN42jsqQSXbVdWPWuricaypXFwznHvy78K9xBN/ZU70FvS+/G2M+/CgD49OAb+JTdgdvlatwpK8Nf1tUCjMl6N6B0SMgLAGEb1JTWKEqYdpppyzT8IX9MJxhP0IMRw8iW1Xm+Y3AZMGefk/QhLc4MSK1mATbSCtur2tFe1b4jm5oOnwPfmvkWjjYcxQf3fnDr62IMeP5V+IbewKBajT6vD/+xtRlgDGqVGi+deUmWeRQCJOQKRwhTOp1eChVx1L6tqi3mqL3BZYDWplVM7Kzg0eoj+EK+lLrCCzK5OxPH3I80HkGDugHjpnGUqcpwpvWM1KnHJRQOYcw4hgcrD/DJw59ETdk24WOcw/7DP8A9tRoXPV6UAPjPFiu+ubcHL539Aq7svyLLfAoB5fw2E1vQOXV46niqOGHaSURN9WYPV/TYVFK6I+ccY8YxNJc3pxzDmqltFAgFcEsfOeZeXlyO2/rb6Krp2tLWLl3m7fPrnvvVY1e3t2g4h/HG70I7/nd49uRvgv3yHwPvvoJPD76BT1edBbo+Kst8CgX661cgnHOMm8ZRqiqVtEordERX++iaanHw52D9QUUl4YkM72ONx2Ky0BMhSguPNh5Nq1tRdDPkEA/h/aX3ZTsY5Q64cdd4F+piNapLq3Fecz6hRTPveAprsQr9vb8V8crXbBYAgDrikRMbkJArDH/Ij2HDMLobuiVVLRQ6k+ZJMLCYDzaL14IJ08SWgz/5jjhyLmXemZQWApH+rNOWaTzb8SwsXgtmLDOynNQUbQM9QQ9aKlrgDrqTWjRT5ikUFxWj9/k/Xa8bB7Ah5iTiWyAhVxDij/Wc5lzed2nPFsFwEMOGYXTVdsVUMcyuzsIZcCru6PaiYxF6l17SvDMpLQQiR/VNHhMutl/EE/sT2H32mA3idLH5bLi/ch89jT1Ydi0DQMK6d2EltVa0Yk/1nsiDm+egoH/LbEJCrhAy/WMtRET8QHQ5XnSS38H6gzmeoTQmzZMoYkUpe9vb5adLYdoyDQ6OU82n1g8ZnWo5ldZYAs45Js2TCIQDuNR+CWPGMeyp2oO2qrZtfyYUDuG2/jZ6GnsU0cQ63yAhz3MyrQMuVBbsC1h2L8dEzKab5JdrwjyMYcMwOqs7E4pdNOK1puthi5LVRnUj2qvacUt3S/Iho3iIVMSexh7UltXilv4WTjSdSFhRJZIT0ymTJCKQkOcxmdQBFyoi8KmyuDImfiDdJL9cI0RMyofPomMROqcu7dcaCocwqB/E4YbDUKvUuKm7KbkdXDymLdNwBpwY6BiAJ+jBLd2tpPngwn6R85DRboSEPE95an8Ko9uoOGHaSQKhAIYMQzEbvULYy4vLFdHRPhqzx4yHlocpbypyzvHA9ABlqrK0X2v06tfut2PcOp7x75gv5MOoYRRdtV3obuiOnKZdnUk6rt6px6JzUXH7GPlIxkLOGFMD+BmAsrXx3uGcfyXTcXcrog64urSaAq+iWPWuYtw0HlPJoeQKHq1NC7vPnvKeRyAciGSs1B+OyU+XgtVrxYR5ApfaL+Gx9TGCPJhx+eqiYxELjgWc05xDiaoEc7Y5WH3WmAjaeMyuzsIX8tFJZJmQY0XuA/BvOedOxlgJgPcZY//MOb8tw9i7ChHudLzpeMq1w7sBrU0Lq9cas3Ize8yYskzhvOa8oip4opMLU91U3C4/XQqLjkUYXAZcbLsYqQypbMXe6r1pjQVsJGzWldWt9wYdN41DrVInfV33Vu6htrRWcZvR+UzGQs4jgebOtS9L1v6X/ZBzhbPiXsHMamy4025HlKPVq+tjao9nV2fhCrow0D6gqFtysao+0nAk5SxwrVULm9+Wkf0gKlNONp/EL3S/yDjOQTSkFr6+2KxNFmsrenoerDuY9l0FER9ZPHLGmArAKICDAL7GOR+M85wXAbwIAJ2dnXJctmAQ4U5UWrhBvOhZJZcWio3r85rzUBerkz5ffIg1qhslNUTePMbo8ihaK1tRVVKFIcMQ+tv60zowJJhZnYEr4FqvFvKH/Litv500Nlk8T2kVRUpB1g5BjLE6AN8F8J845+PbPY86BEUQK5k91XvQUdWR6+nkDeLg0/m28+t3J9tlqCiBJecSlhxL6NP0pbSpKDYke5t70145i9X/scZjsPltMHvMON1yOu2FQiAcwOjyKPZW713/XRUVJ8k+HNafR3ebGZOVDkGccytj7KcAngewrZATGw0glNTkNxs8Wn0Ed9Adc3ciwsGk9KXMF6bMUwCQcpWJ0W3E7OpsRuV44nfrvOY8ZlZnUFFckVFyocljwkPLQ/S19q3fTeicOiw5l5JaPlSZkh3kqFppBhBYE/FyAB8B8CcZz6yAUWrN806ybgNUtMYk/U2YJqAqUikuHEzcbe2t3ov2qvaUfmbaMh05DdmRfkKjyC3vb+vHiGEEh+oPZeRHT5onEQqHYvYjpi3TCPNw0oqTR6uP4A/5qTIlC8ixIm8D8DdrPnkRgG9xzn8gw7gFhxx1wIWIJ+jBsGEYp1pOoaY0kk0tWpodqDsgW4RqthCvJ1UbSC6LTZT0nWg6gdv62xkd8gmEAhg2DGN/3f71Dcxozz1RxYuozKlX16ccv0tkhhxVK/cBpLcbs4uQow64EBFWQvShGFEVIcdpw2yz4l7Bo9VHKR/yyfSoPbBx3L5B3YCq0io8MD3I6G4vXjhbIBzAbd3tpJ2Vok+NKq22X8nQyc4sIEcdcCESz0qYt89jxb0Sk6GiFERZZKrJgWITNBPRFQuEo41HYXQb4Qw4M7KhpsxTCPFQzB6FqLhJdtxe3IlQpET2ISHfYbQ2LWy+zOqACw2R2tdR3bFuJUT3HVXaiVZRKthU3oTe+t6UfmbCNIHiouKMLDaxqXlOcw4PVh6gvap9I/5VIqIBR7SVAkQ2KxccC0k/bKTGDRDyQu/4DsE5xx3jHdSr69OuAy5E4pUR+kP+SDecpmOKizAVc0+1mXMwHMSQYQgH6zLrWGRwGTBvn0dfa9+W/QWpbNeAY9oyjRAPJf2weWp/CpPHROcgcggJ+Q4Q7zALERGfJ7YnMWWE4qj9hbYLijpqD2xYZqnOXS7vf9oyjSAP4kDdAdwx3smoVHFmdQaeoCfmjjHVTU0AmDBPoKSoRLbGzER6kJDLjNgoosMPsUyZpxBGeD2XA9jo4qO0o/ZAxMs3eUwpW2ZyeP/RAhsIBbDoWEx7FSxy7vdU7cHh+sPrjwdCAQwaBnG88XjCRQjnfL28MtUMdWLnICGXkUerj+AJeugWMwohGJ3Vnev11EKQmiuacar+VG4nKBERm1tRXIGzrWdTer7oap+J9x9t4TyxP0FdWV3anXxEZ6XNm5KiV2iyOwxx3D4TO4eQFxJyGYjOAKG62Q3ildaJyoZMjp/nClHbnuohm0AogNv62zjaeDTlkKx4CAvnTOsZ3DXezagd2pxtDiaPacudwZJzab1ZRaJFyHojiLaLGWW2EPJCQp4hYvMuWWjQbkPn1G2pdohXM64URAleqv62yE/P1PsXLe1ONJ3A2PJY2iWs0UmSm+8MpsxTYIwlPYGZqtgT2UdZf015hsFlgNamVaQw7SQTpgkUsSJcaLuw/pgcx89zhdR6bzmiZ4FIvnepqhStFa2Ytc6mPd52d0HC595TvSdpjECqx/KJ3EDqkyYPLQ8RCkcOThARguEghg3D6KrtWq9FjlczriQmzZNgYCnVe8sRPQtE9hWGDEPoqu3CinsFDCxtf11UCm1ebPhCPgzqB5P63GI/Q1OpSbtGndh5SMglkk4Y0m5AHE6J3kBTcvRsmIcxZBjCvpp9CZslCIQwnmw6mVHJqXjPTjWfwrh5PKN6c3FnFF0pBERsn0nzZNKyReHxZ9qIgth5SMglIP7IKHo2lnhd3UUKnxKjZ6X+O4uS00w7wRvdRsxaZ9Hb1Iu7K1urSlJFnNKMFzg2b5+HxWtJWlmVagULkR+QkKeI3qnHvGOeomc3Ee+o+ZR5ChxccdGzQPxDS4mQq+T00eojeINe7KvZh4erD9P+PRMVLuc057Z0Irq/EimbTGb76Jw6LDooQ1xJkJCngPBJlShMO4U4an6gdmPVJ2rGU7Uj8o1pyzSC4eAWKyIenHOMLI9kXHIqPOiWihYEw0HYfLaYTWIpxGtSDWz8Wx2qS142meqxfCK/ICFPgNKFaaeIV4onasaVmHy3fg6gUpNSZ/l4+enpsJ4x03gMM9aZmENTUojeZN18VD7Vf5f1D6YU3wMivyAh34Z4m3dEpLuRwWWIufWPVzOuFER/zFRFWfjYmZacCgvkZNNJ3DPdS3tDONEBK2ETJft3oU1N5UNCHgc5cqILkXHTOEqKSmJqiSfME1AxVdp2QC4xeUyYscykLMrrtfAZlpzO2+dh9phxuP4wJswTaX8oLLuW8dj6OO7Pz6zOIBAKJLWJxElN2tRUNiTkmxA9Iskj3CBe9Gq8mnElMbs6C3fQnVITCLlq4UWrv8qSSlSVVsHoNqZ9QGrKPIUwD2/5+ejep9FhWPGgk5qFAwn5GkoXpp1CBCxF++FKtp2iA7tO1p9M+ny5auGjc1rm7HPQVGiSCm08xGGhZ2qe2eKnC889FYsk1WP5hDLIWMgZY3sBfBNAKwAO4E3O+fVMx80mShamnUT44dEBS0q2nUROfKpesNRSxO0Qm8O9zb24t3Iv7cCwRL+nVq8V4+Zx9Lf1JwyzknIsn1AOcqzIgwB+n3M+xhirBjDKGPsx53xShrF3HCUL007BOce4aRxlxWWxfrgM7clyhWhFlmpOvKiFT6UUMRHi9+tIwxGMm8bTPjS04FiA3qmP+3sqstGT5bqneiyfUB4ZCznnXA9Av/bfDsbYFIAOAHkv5EoWpp0iXlSrXO3JcoXWqoXdb0/p0I44mv9M9TMZN0yYNE9CxVRoLG+EzqlL69CQ8NXLi8u3/J6K76WSjb7qXcWEeSLj06dEfiKrR84Y2wfgNIBBOceVGyFM+2v3kx8eRTw/XGp8az4hGjrXltWm1IQhXn56OkR/GOhcOjSqG9NqAhEIBzCkH0J3QzeayptiviflkI84lq/ETkxEasgm5IyxKgDfBvAFzrk9zvdfBPAiAHR2dsp1WcmQHx6fBfsCDO5YPzxezbhSEBt/x5uOo15dn/T5ckUwiM3RE00nMG4aT/n6mxF15vHyx8XvcCofrg9WIqt5agBe2DDOeeaDMFYC4AcA3uOc/1my5/f19fGRkZGMrysVUW51tvWs4oRpp4i+dY8+ai5qxrsbunM4u/SQ2hRZRDD0NPZkdF2xOXqo7lBGDaW1Ni1sPhtONZ/asoIWHzjnNecT/g6L6pYDdQcUaYcR8WGMjXLOt2Qay1G1wgD8FYCpVEQ8Vwg/nMqtNtjWD9cP4WC9Mv3wOdscLF5LSrXR0bnfmVpsIqdFU6nBgnMhrdpszjnuGO+gTl0XdwX90PIQYR5Omvkj7grornP3IIe1MgDgKoAHjLG7a499mXP+QxnGzph44U7Ehh9+XnN+PSVP6X74vZV7qCmt2ZI3Eg+5smGiw7PMXjM452nZGKI08kTTiS155lIOJBndRjy2PlZkfDCRPnJUrbwPIC93UMgPj0+h+eFiU/BIw5GUmhxHx7Rm8lpFTsvxpuOYMk+lfP3NiDzzeKWRUrJgZldn4Ql6Mi6ZJJRHwZ7sjD5+rDRh2imi/fBoiylehopSEFkhqTYlFtkwmZacipyWY43HMGGaSLsp8uzqLFxBV9zSxFSzYET6YVN5Ew7WH5Q8B0L5FKSQkx++lUL0w8VBmFT8aDkjGB5bH8MZcKK9qh1z9rm0/XBhycQTX61VC0fAkTQLRiQXplsdQxQGBSXkVB8en0L0w++b7qOyuDLpQRhAPostOvcbiPy+pXL9zSTKMxe17/Vl9eht7k04DiUXEoKCEXLyw+NTqH54vEMy8ZArgkHUpfc09mDaMp3y9TeTKM88EApg0BBpNJFsdR39b0iHfIiCEHLKS9lKofrh91buxdxZJEKuCAaL14Ip8xSONh7FhHki5etvJlGeuZTVNVmHxGYUL+QT5gkUM8pLiaYQ81IW7AtYdi/H3Flsh5wlp1qbFnafHXur90Jr06Z0/c0kKx98an+KFc9K0tV1mIcxqB+kqGViC4oR8u/dWcLr701DZ/Wgva4cv3/5INo0S/RLvYlC9MPHTeNQF6vRp9lyoG0LcvrhIqeluKgY3pA3rRVwojzz6LumZF67GCfTHBiiMFGEkH/vzhJe+c4DeAIhAMCS3Yr/671v49rlX8HFdhJxQTw/fNGxCL0rfvxpvhPvziIRcr1W4VUfrj+MWets2ncxifLMpbw24avTIR9iOxQh5K+/N70u4qx4FUWlFrhtB3H9x/P4tbMHcjy73BO9ao2XH65ELzXenUUi5PL+RU6L8MPTvYtJlGcuJfTq0eojeIPejPuEEoWNIoRcZ/Ws/VcYTOVFyH1g0+O7l4L0w+N0JtoOUR++v3Z/xn74nG0OZq8ZXbVdeGx9nNbKPlmeeaob86IlXUtFS0yYGUHEQxFC3l5XjiWrB0ARwr62mMd3M4XWTxOIxK5u7ky0HXJ5/yKnpbq0GmqVGq6AK63N82R55pPmSRSxoqRjS+m9SRCAQoT8i891x3jkAFBeosIXn1NexKpcFFo/zZz54Wt16YfqDmHWNpv2YTKdU4enjqdx5yNW6ftq9iUde9W7inFT8t6bBBGNIoT8hdORkq3oqpUvPte9/vhuY9w0jlJVacH004x3Z5EIufxwUbt9rOkYxk3jad/FTJgnUISiuPGyUqpNhLVDh3wIqcjSWEIquWosoXS288PlyhDJBeLOIpVmH3J6/6Iuva2yDYvORZzTnJO8sk+WZy6qVs5rziesNomOHKDQKyIRO9ZYgsgOYtVqWO7AF996AJ3Vg7Z6hhf6ffjcpecU6YdLWVnL6YeL2u2KkgrY/XZcaLsgeZxkexGi0USySFmplhJBxIOEXAGIVavJ2IWvfG8CnkAIrMSCZd8qvvGTgzhcs4oXTitHyKWmLsrlh4vr7q/djznHXEqedTwS7UWEeRijy6Noq2zDnuo9CceRUoZIEIlQ1o7YLmTcNA53wI1zmnP40x89WhNxE1hRpAzTE+B4/b3pXE8zZRx+B27qbuJ06+mURHzcNA5XwJWW9RGN3W/HTd1NdDd0Y8Y6gxNNJ9IS8QnTBJx+J863be2Z6Q168f7S++hu6E4q4jqnDpPmSTzb8SyJOJExtCLPU+L5waJungcawaOaMimlnn7RsZhysw9Z/fC1O5qDdQfxyPoorZV9svwW0eUnWRMIYKPZsxI3pon8hIQ8D9nOD96op4+taFBCPb3ww1MRLzmzYcR1q0qqYPVZkzYujkcyPzxRl59owjyMYcMwOqs74x4WIoh0IWslz1hyLuGh5WHcW+4vPteN8pLY6od8r6cPhoO4pbuF5vJmdDckn+eiY3Hb1y/1ujd1N9FY3ohV3ypqy2pxtPGo5HEWHYvrFshmERenL0tUJeht7k0o4u6AG+8vvY/jTcdJxAnZkWVFzhj7awAfA2DknB+XY8zdSLJsFKXV00s9ZSpXNoy47rHGY5gwT6SdGJjoLkKcvozX9X4ziZpJEIQcyFJHzhj7IAAngG+mIuRURx6L0rNR4iEqO/o0fSn54cOGYRyoO5Dx6xfX3VO9B/P2+aQ13NvNJ9G/h8VrwYRpIqXTlzOrM/AFfTjRfELSHAgiHjtaR845/xljbJ8cY+02lJ6NEg8pp0zlfP0TpgmoilSoLavFqnc1aQ13PJL586LRRLLTl9HNlQ/XH5Y8D4KQQtbu8xhjLwJ4EQA6Ozuzddm8RsnZKPGQesp0ybmUchVLIsQJy301+7DgWNi2E08yEvUyjW40carlVMJxfCEfBvWD6G3updArIitkTcg5528CeBOIWCvZum6+ouRslHjkyg8XiYPCD4/XiScVEp0yFY0mjjYeRYO6IeE4Zo8ZDy0PcbH9IkqKKPSKyA6085JllJ6NEg8pdxZyvn6dU4cFxwIO1x/GzOpMWpuJyU6ZikYTqTRF1lq1sPvtScsQCUJuSMizSKH64aoiVdb9cHGopq6sDiaPaUf88FTTCIXtUldWl9R2IYidQK7yw78H8G8ANDHGFgF8hXP+V3KMXSgUmh+eLPlvM3K9/lA4hOHlyKGaRcci2qvakx6Hj0cyP1w0mkjWFFnYLscaj6FeXS95HgQhB3JVrXxKjnEKge/dWdpS532o0woVS23VqgSEL52yH26ekOX1i+sebTyKSfMkTrecRnVpteRxEvrha40muhu60VTelHAcKbYLQewkZK3IyPfuLMV0MlqyuvDlf/42/vOHP4j/cOFYjmcnDzqnDouOxZRW1lJX7YkQ2d6H6g9hxrIzfrjNZ8O9lXu40HYBZaqyhGPN2+dh8pioCQSRF5CQy8jr701vtKMr8kFV/gRux368+VML/oP0yOu8Q0rYk9RVeyJER/rG8kaYPWZc6pDeUT6ZHy4aTSRr+BzdBCKZ7UIQ2YKEXEaiUwiLSlYRch0GUKSYdMLtkLqyFtUkmfrhotfl3qq90Ll00FSmd7gmkR8ObLTO69NsOTAXgxTbhSCyCQm5jGykEwJhnybmcaWSrh+eTtedaESvS1EffqrlFGpKaySPk8gPl9LgQnRoOq85D3WxWvI8CGInUX75RB6hxHTCROicOoybxuMm/20mFA7hlu4WGtWNONJwJKPrGlwG3Fu5h8P1h9czvqWKeDAcxM2lm2ipaImbuiilwcWCYwHTlml8oOMDJOJEXkIrchlRWjphIibNkyhiRXFX1psrcz7/S3vRptHL4oc/tDxEiIfQVN4Eo9uIi+0XJW8mJvPDpbSOE7ZLpidQCWInkSX9UCqUfpi/JPPDN1fmsOJVlFdY8X8//3F84szetK8b5mGMGEbQXtUOvUsPTYUGe2ukjyf88LOtZ+OKtIgGSJaNXoiJlITy2S79kKwVYh1XwIVf6H6B3ubebTc1oytzitRLYCo33PYu/OmPHqV9XdF0YX/dfmhtWhyuP5yWiEf3N90s4uvWT3ljUhF3+p0R26Ultb6iBJFryFohAKReabJRgRMGD1aBB2s3PS6NZdcytDYtuuu7MW2ZTitsKtnqWcqGrZQ6eYLIF0jIifX68FQqTTYqc4rWRVw8LpVpyzSC4SCaypuw7F5OK2wqmR8uRZgnzZMFdQKX2D3QkmMXEwqHcFt/Gw3qBvQ09qT0M3JU5oR5GEP6IVSWVMIT9KBMVYaTzScli3iy/p6T5knYfDacbzufUMSF7dKgbkipryhB5Bu0It+lpHvyMtPKHE/Qg2HDMI41HsOkeRInm0+m1XwhUZ65CNbaV7Mv6QEmOU+gEkSuICHfheidesw75tP2gV843ZFWSaVoQiz88P72/rT88GHDMPbX7kdrZeuW70sR5kzfB4LIF0jIdxlT5ikAQH9bf1avO22ZRiAcQGtFKwxuQ1r14cnyzA0uA+bscykJs8hvyfb7QBA7AQn5LkHkljxT/Qzaqtqyet3R5VFoKjQweoyoLq1Gb3Ov5HGS5ZmnKszifeis7kR7VbvkeRBEPkJCvgsQdsPZ1rOoLKnM2nWFH3608SimzFMZ++HxqkmkCLPIb8n2+0AQOw0JeYEjxW6QkxX3Ch6tPpLFD9/ulKkUYRZ55gPtA1AVqRI+lyCUBgl5AZMrH3hmdQa+oA+tla3Qu/Rp1Yen4oenKsyiXj2dvp4EoQRIyAuQXPnAnHOMLI9AU6GBw+9ATVFNWs2Ik/nhqQqzyG/pqO5AR5XygssIIlVkuddmjD3PGJtmjM0yxr4kx5hEeojckhNNJ7Iq4p6gBz9f+jm6arswZ5/DgdoDeKbmGcnjTJgn4PA74h7iEQeJqkqrcKwpces8T9CD95fex9HGoyTiRMGT8YqcMaYC8DUAHwGwCGCYMfZ9zvlkpmMT0siVDxzthz+0PEzLD0+Wuij88DMtZ1BVWpVwLFGvnk5fT4JQInL8lp8HMMs51wIAY+wfAHwcAAl5FhF+eLZ94Eerj+AJetBaEfHDB9oHZPfDl13LeGx7nJIwi3r1S+3S+3oShFKRQ8g7ACxEfb0IYEv6EmPsRQAvAkBnZ6cMlyWAiN0wbBjG3uq9WffDR5dH0VLRAoffAVWRKi0/PFnqYqrCvF6vXqnB3ur0c9EJQolk7b6Tc/4mgDeBSGOJbF23kMlVXbQ36MWQYQhHG45iyjKFE00nUKeukzxOoi5EQpjbKtuwp3pPwnFEvXq6fT0JQunIIeRLAKKXQHvWHiN2kFz54SaPCdOWafQ09ODh6kP0t/WjRCWvHy6E+XTLaVSXViccS/jz5IcTuxk5fvOHARxijHUhIuC/DuB/k2FcYhtEX8ts++Gzq7NwB93QVGqw5FxKyw9PFmolZaNS+PPp5LYQRCGRsZBzzoOMsc8BeA+ACsBfc84nMp4ZsYVc1UULP7y5vBkhHgJjLG0/PFGTh5nVGfhD/qR+eHS9+qH6Q5LnQRCFhiz3opzzHwL4oRxjEfGRUn4nJ76QD0P6IfQ09GDKMoXjTcdRr66XPI7oQhQvL2VdmCs1OFx/OOE4wp/vbe5NK7eFIAoRMhUVgPDDs+0DCz/8SMMRPFx9iAttF1CqKpU0RrImD1I2KsV80unrSRCFDAl5npOrnJDZ1Vm4gi5oKjVYdC7uiB8uZaNS+OHp5LYQRKFDQp6n5IMfHuZhMMZwuuW05HGSpS6mulEp5tNa0Up+OEFsAwl5HiLsBqX64YlSF6VsVPpCPgzqB8kPJ4gkkJDnGVKOo8tJtB8+ZZlKyw9P1oVIykYl+eEEkTok5HmE8MOzlRPyvTtLeP29aejdc2iuBf73iz0oL44cl5fqQyc7ZWrymDBjmUlJmIU/T344QaQGtQ7PA0ReSmVJZdJ4Vrn43p0lvPKd+zD4JsF5EVacXvz5Tx7hqa5VsngaXAbcN93HQPtAXBGfXZ2FzqlLKuKcc4wYRlCiKkFvcy+JOEGkCK3Ic4BYCeusHrTVqfDCRQ8+c/GXkh5Hl5PX3huHv3QKIU87VOV6hL3t8ISq8Pp703jhdOqbqw8tDxHm4W398DHjGJrLm3Gw/mDCcYQ/n25fT4LYzZCQZ5nISvgBPIEQWLEdy/5lfOMnh3C4xo4XTmdHyM0eM4yBSYRcBwEwhNz7AR75VdBZPSmNkSx1UYowmz1mTFmm0soxJwiChDzrvP7eNDyBEKBygRXbEHIfgmftcSkr4XTRWrWw++1oKTkJHbyRB/mGw9ZeV550jFT88FQbLj+2PobD70irTp0giAjkkWeZ9RVvqBJh796tj+8Qoh67iBXhVMspvPzcEZSXxKYmlpeo8MXnuhOOY3AZcG/l3rZ++GPrYyw5l3Cp/VJSP3x0eRQqFskxJxEniPShFXmWaa8rx1Ic0U5lJZwq0R58e105fvcjXWhtXYzJDRer/+jnffG57oR3BYlSF4Uf3lTehN7mXsnzIQgifRjn2e/x0NfXx0dGRrJ+3Xwg2iMXlJeo8OonTshirWwen6mcKK/S448uv4D/9ey+tMbMxA+PPx8D/ujyx9OeD0HsVhhjo5zzvs2Pk7WSZV443YFXP3ECHXXlYAA66splE3EgyoMHUFRqBCs1w207iD//sTat8dwBN95feh/HGo/FFXGzx4wRwwj62/vjbmrGn8+BtOdDEMRWyFrJAS+c7tixjc1orz0crAb8LVseT5VkqYtiozLRwZ3o6/JQBXgG8yEIIj60Ii8wYrz2cHn8x1Ng2jINs8eMi+0Xt4i42KgsLipOulEZfV0eqor7OEEQmUFCXmB88bnutKpRBGEexpB+CFWlVeunTL93ZwkDf/wv6PrSDVz64/fw+s/+CQdqD+CZmmd2fD4EQSSHrJUCI51qFEG8LkQxB5hUTiwHlvCNn3TjcI0LL5yu29H5EASRGlS1QgCIpC5qbVqc05yLsVIG/vhfsGT1gJWYwYqdCHs6ATB01JXjF1/6t7mbMEHsQrarWsloRc4Y+ySAawB6AJznnJM6K4DNdd1XP1iCDxxuiFsfLjYleaAePNC45XGCIHJPph75OIBPAPiZDHMhsoCwSpasHnCEYfCP4/qPF/BooS7u8zc2JYu2eZwgiFyTkZBzzqc459NyTYbYedbrulkAqsoZhLwd8Hhq8fp78f8ZabOSIPKfrG12MsZeBPAiAHR2dmbrssQm1i0RrkLIdQiAKvbxTdBmJUHkP0mFnDH2EwCaON/6L5zzf0r1QpzzNwG8CUQ2O1OeISErG1kvqVslO3mAiSCIzEkq5JzzX8rGRIjs8MXnuuNmvZBVQhDKherIdxlklRBE4ZFp+eGvAvhvAJoB3GCM3eWcPyfLzIgdg6wSgigsMhJyzvl3AXxXprkQBEEQaUBZKwRBEAqHhJwgCELhkJATBEEoHBJygiAIhZOT9EPG2AqA+axfeCtNAEy5nkQeQu9LfOh92R56b+Ij9/vyDOe8efODORHyfIExNhIvEnK3Q+9LfOh92R56b+KTrfeFrBWCIAiFQ0JOEAShcHa7kL+Z6wnkKfS+xIfel+2h9yY+WXlfdrVHThAEUQjs9hU5QRCE4iEhJwiCUDi7WsgZY68zxh4yxu4zxr7LGKvL9ZxyCWPsecbYNGNsljH2pVzPJ19gjO1ljP2UMTbJGJtgjL2U6znlE4wxFWPsDmPsB7meS77AGKtjjL2zpi9TjLGtnc1lZFcLOYAfAzjOOT8JYAbAKzmeT85gjKkAfA3ALwM4CuBTjLGjuZ1V3hAE8Puc86MA+gF8lt6bGF4CMJXrSeQZ1wG8yzk/AqAXO/z+7Goh55z/iHMeXPvyNoA9uZxPjjkPYJZzruWc+wH8A4CP53hOeQHnXM85H1v7bwcif5QU6A6AMbYHwBUAX8/1XPIFxlgtgA8C+CsA4Jz7OefWnbzmrhbyTfwWgH/O9SRySAeAhaivF0FitQXG2D4ApwEM5ngq+cJXAbwMIJzjeeQTXQBWAHxjzXL6OmOscicvWPBCzhj7CWNsPM7/Ph71nP+CyO3z3+ZupkS+wxirAvBtAF/gnNtzPZ9cwxj7GAAj53w013PJM4oBnAHwBuf8NAAXgB3dcyr4np3Jmkczxn4DwMcAfJjv7qL6JQB7o77es/YYAYAxVoKIiP8t5/w7uZ5PnjAA4FcYYx8FoAZQwxh7m3P+6RzPK9csAljknIu7tneww0Je8CvyRDDGnkfktvBXOOfuXM8nxwwDOMQY62KMlQL4dQDfz/Gc8gLGGEPE75zinP9ZrueTL3DOX+Gc7+Gc70Pk9+VfSMQBzrkBwAJjrHvtoQ8DmNzJaxb8ijwJ/y+AMgA/jvyt4jbn/D/mdkq5gXMeZIx9DsB7AFQA/ppzPpHjaeULAwCuAnjAGLu79tiXOec/zN2UiDznPwH427VFkRbAb+7kxeiIPkEQhMLZ1dYKQRBEIUBCThAEoXBIyAmCIBQOCTlBEITCISEnCIJQOCTkBEEQCoeEnCAIQuH8/zF2SFGKTQ1xAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X_P.detach()[:,0], X_P.detach()[:,1], c=\"C2\")\n",
"plt.scatter(Y.detach()[:,0], Y.detach()[:,1], marker=\"x\", c=\"C1\")\n",
"plt.scatter(original_X.detach()[:,0], original_X.detach()[:,1], c=\"C0\")\n",
"\n",
"plt.plot(hist_X_P[:,:,0], hist_X_P[:,:,1], c=\"C2\", lw=0.4, alpha=0.6)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"似たような感じで$X$を更新することができているように見えます.重ねて表示してみます."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X_P.detach()[:,0], X_P.detach()[:,1], c=\"C2\")\n",
"plt.scatter(Y.detach()[:,0], Y.detach()[:,1], marker=\"x\", c=\"C1\")\n",
"plt.scatter(original_X.detach()[:,0], original_X.detach()[:,1], c=\"C0\")\n",
"\n",
"plt.plot(hist_X_P[:,:,0], hist_X_P[:,:,1], c=\"C2\", lw=0.4, alpha=0.6)\n",
"plt.scatter(X_P.detach()[:,0], X_P.detach()[:,1], c=\"C2\")\n",
"\n",
"plt.plot(hist_X[:,:,0], hist_X[:,:,1], c=\"C0\", lw=0.4, alpha=0.6)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"多少軌跡がずれていますが,最終的な収束点はほぼ同じように見えます.また,実行時間はSinkhornの自動微分を用いると10s程度かかっているのに対して,3.8sなので倍以上速くなっています(今回はCPUで実行したのでGPUだとまた違うかも).\n",
"\n",
"\n",
"# おわりに\n",
"\n",
"Sinkrhon iterationをbackwardして求めた勾配と最適な輸送行列を使った勾配っぽいものを比較しました.\n",
"あんまり真面目に検証してないですが,少なくとも今回のタスクでは$P^*$を勾配として使っても問題なさそうでした.\n",
"点群の一致でしか検証してないので,勾配が大きくずれる条件やSinkhorn iterationを真面目にbackpropしない最適化できない問題(凸性が重要なときとか? 振動するとか?)があるかもしれません."
]
}
],
"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.9"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment