Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Cartman0/48e2ca5c84d2a5f99f9dd373b6a39a03 to your computer and use it in GitHub Desktop.
Save Cartman0/48e2ca5c84d2a5f99f9dd373b6a39a03 to your computer and use it in GitHub Desktop.
ホップフィールドネットワーク
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# ホップフィールドネットワーク"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 参考"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "- https://www.tcom242242.net/entry/2016/12/15/184603\n- http://www.sist.ac.jp/~kanakubo/research/neuro/hopfieldnetwork.html\n- http://rishida.hatenablog.com/entry/2014/03/03/174331"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 概要"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "ボルツマンマシンの前身\n\n画像などのビット列情報を複数記憶でき,\n似たビット列を入力すると,記憶したビット列を復元し想起させる.\n\n想起ネットワークともいう.\n\n通常のニューラルネットワークとは違い,\n重みとバイアス(しきい値)は固定して入力値(状態)を変化させ平衡させていく.\n\n\n以下のエネルギー関数をだんだん小さくしていく(準)最適化問題を解いていることになる.\n$$\nE= -\\frac{1}{2}\\sum_{ij}^{n} w_{ij} x_i x_j + \\sum_{i} \\theta _i x_i \\ \n$$\n\nなので,"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "ネットワークは,完全グラフを考える.\n\n扱う値は以下.\n\n\n- 入力状態は,$\\{1, -1 \\}$のみ\n\n- グラフの辺は,結合係数(重み)を持ち同じ入力値同士だとこの重みが大きくなる.\nこの重みが記憶情報に該当する.\n\n"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## ベクトルと行列おさらい"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "- ベクトルの内積は類似度を表す:スカラーであり,同じようなベクトル同士だと正,逆向き同士だと負,無関係の場合0(直交)となる.つまり類似度に相当する.\n \n$$\nw = \\vec{x}^T \\cdot \\vec{y} = \\vec{y}^T \\cdot \\vec{x}\n= \\sum_{i=1}^n x_i y_i \n= x_1y_1 + x_2y_2 + \\cdots x_ny_n\n$$\n\n- 自分との内積は大きさを表す.\n\n$$\n\\vec{x}^T \\cdot \\vec{x} = \\sum_{i=1}^n x_i^2= x_1^2 + x_2^2 + \\cdots x_n^2\\\\\n||x|| = \\sqrt{\\vec{x}^T \\cdot \\vec{x}}\n$$\n\n(厳密にはルートをとると大きさになるが2乗のままのほうが都合がいいことが多い.)\n\n- ベクトルの大きさは平方和(分散)を表す:\n\n$(x_1, x_2, \\cdots, x_n)$を標本の大きさ$n$の身長,体重などのデータとする.\n平均$0$になるように差分・変換したデータ$(x_1, x_2, \\cdots, x_n)=(x_1-\\mu, x_2-\\mu, \\cdots, x_n-\\mu)$\nの分散を考えると\n\n$$\nS(\\vec{x}) = \\sum_{i=1}^n (x_i - \\mu)^2\n$$\n\n今,平均0なので\n\n$$\nS(\\vec{x}) = \\sum_{i=1}^n x_i^2\n$$\n\nつまり,ベクトルの大きさ(自分との内積)は平方和になる.\n\n$$\n\\vec{x}^T \\cdot \\vec{x} = \nS(\\vec{x}) = \\sum_{i=1}^n x_i^2\n$$\n\n- 同様にして,ベクトル$y$もデータと考えればその内積は平方和(共分散)になる.\n\n$$\nS(\\vec{x}, \\vec{y}) = \\sum_{i=1}^{n} (x_i - \\mu_x)( y_i - \\mu_y)\n$$\n\n平均0に変換しているとすると,\n\n$$\nS(\\vec{x}, \\vec{y}) = \\sum_{i=1}^{n} x_i y_i \n$$\n\nつまり,異なるベクトルの内積は,共分散(平方和)に該当する(厳密には1/nが必要).\n\n\n$$\n\\vec{x}^T \\cdot \\vec{y} \n= \\vec{y}^T \\cdot \\vec{x}\n= S(\\vec{x}, \\vec{y}) = \\sum_{i=1}^{n} x_i y_i \n$$\n\n- 共分散は大きさが最大1になるように標準化すれば相関係数になるので,\n内積は相関係数に該当する(厳密には標準化が必要).\n\n$$\nr_{xy} = \\frac{S(x, y)}{S(x) S(y)}\n$$\n"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 重みの求め方"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### 訓練データの相関係数行列(分散共分散行列)を置く場合が多い"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "$$\nw_{ij} = x_{i}x_{j} \\\\\nw_{ii} = 0\n$$\n\n訓練データ複数の場合\n\\begin{equation}\nw_{ij} = \\sum_{s} x^{s}_i x^{s}_j \n\\end{equation} \n\n\nこの重みが何を表しているかを考える.\n真理値表のように書くと\n\n|$x_{i}$|$x_{j}$|$w_{ij}$|\n|:-----:|:-----:|:------:|\n|1|1|1|\n|1|-1|-1|\n|-1|1|-1|\n|-1|-1|1|\n\nつまり,\n- $+1$(正)のとき,同じ値を表し,\n- $-1$(負)のとき,反転していることを表している.\n\n\n\n\n"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 入力状態の更新方法"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "1. まず重み$w_{ij}=x_i x_j$を計算し,しきい値$\\theta$も0などで決めておく.\n\n2. ランダムにノード$i$を選ぶ.\n\n3. ノードiへ入力されたとして,重み結合を使った線形和を計算.\nしきい値と比較して大きければ1, 同じなら0, 小さければ-1を新しい状態$x_i^{new}$に更新する.\n定式化すると以下の値になる.\n\n$$\ny_i = \\sum_j w_{ij}x_j - \\theta_i \\\\\nx_{i}^{new} \n= \n\\left\\{\n\\begin{array}\n\\\\1 & (y_i > 0)\\\\\nx_{i} & (y_i = 0)\\\\\n-1 & (y_i < 0)\\\\\n\\end{array}\n\\right.\n$$\n\n4. エネルギー関数が変化しなくなるまで2-3を繰り返す.\n\n\n更新を繰り返していくと,エネルギー関数が小さくなっていく.\n\n$$\nE= -\\frac{1}{2}\\sum_{ij}^{n} w_{ij} x_i x_j + \\sum_{i} \\theta _i x_i \\ \n$$\n\n第1項は重みのもつ符号情報と入力情報があっているかを見ている.\n第1項の符号を真理値表のように確認する.\n\n|$w_{ij}$|$x_{i}$|$x_{j}$|$w_{ij}x_{i}x_{j}$|$- w_{ij}x_{i}x_{j}$|\n|:------:|:-----:|:-----:|:----------------:|:-----------------:|\n|+(同じ)|1 |1 |正 |負 |\n|+(同じ)|-1 |-1 |正 |負 |\n|+(同じ)|1 |-1 |負 |正 |\n|+(同じ)|-1 |1 |負 |正 |\n|-(反転)|1 |-1 |正 |負 |\n|-(反転)|-1 |1 |正 |負|\n|-(反転)|1 |1 |負 |正|\n|-(反転)|-1 |-1 |負 |正|\n\n負の時エネルギー関数が小さくなる.\nつまり,重みの符号情報と入力状態が一致しているとき負になる.\n"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### $y_i$の線形和は何を計算しているか?"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "$$\ny_i = \\sum_j w_{ij}x_j - \\theta_i \\\\\n$$\n\nの線形和が何を計算しているのかを確認する.\n\n- 重みが正(入力が同じだった)の場合:\n - $x_j=+1$が多いと,和を取ると正に大きくなりしきい値を超えやすく+1になりやすい.\n - $x_j=-1$が多いと,負の絶対値が大きくなりしきい値を超えにくく-1になりやすい.\n\nつまり,入力の多数決を行っており,出現回数の多い値が新しい入力状態へ更新される.\n\n- 重みが負(入力が反転だった)の場合:\n - $x_j=+1$が多いと,負の絶対値が大きくなりしきい値を超えにくく-1になりやすい.\n - $x_j=-1$が多いと,正に大きくなりしきい値を超えやすく+1になりやすい.\n\nつまり,出現回数の多かった値の反転が新しい入力状態へ更新される.\n"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 更新ごとにエネルギー関数が小さくなる証明"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "http://www.sist.ac.jp/~kanakubo/research/neuro/hopfieldnetwork.html\n"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### "
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 例:2ノードの場合"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "- 入力状態:$x_1, x_2$\n- 重み $w_{12}$のみ\n\n重みのパターン\n\n|$x_{1}$|$x_2$|$w_{12}$|\n|:-:|:-:|:-:|\n|1|1|1|\n|-1|-1|1|\n|1|-1|-1|\n|-1|1|-1|\n"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 例:3ノードの場合"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "重みは$\\{2, 0, -2\\}$の3パターンになる.\n\n"
},
{
"metadata": {},
"cell_type": "markdown",
"source": ""
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 実装"
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "import scipy as sp\nimport matplotlib.pyplot as plt\n\ntrain_vec_x = sp.matrix([[1, -1, -1, -1, -1, -1, -1, -1, -1, -1, \n -1, -1, -1]])\nn = train_vec_x.shape[1]\ninitail_state_x = sp.matrix([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, \n -1, -1, -1])\nindex_array = sp.arange(n)\nthreshold = 0\nthreshold_vec = sp.full(initail_state_x.shape, threshold)\niterate_count = 10000\n\ndef train_weights(train_vec_x):\n '''\n W = mat 0\n W_1 = vec_x_1.T dot vec_x_1\n W += W_1\n repeat.\n '''\n train_num, n = train_vec_x.shape\n W = sp.zeros((n, n))\n for i in sp.arange(train_num):\n W_i = train_vec_x[i].T.dot(train_vec_x[i])\n sp.fill_diagonal(W_i, 0)\n W += W_i\n \n return W\n\ndef choice_Node(index_array):\n return sp.random.choice(index_array)\n\ndef calc_ward(state_x, index_array, weight_mat, threshold_vec):\n '''\n y_i = sum w_ij x_j - theta_i\n '''\n \n node_idx = choice_Node(index_array)\n# print(node_idx)\n# print(\"state_x:\", state_x.T)\n# print(\"weight_mat[node_idx]:\", weight_mat[node_idx])\n# print(\"th\", threshold_vec)\n# print(\"th id\", threshold_vec[node_idx].T)\n y_i = weight_mat[node_idx].dot(state_x.T) - threshold_vec.T[node_idx]\n# print(y_i)\n y_i = sp.asscalar(y_i)\n state_x.T[node_idx] = 1 if y_i > 0 else -1 if y_i < 0 else state_x.T[node_idx]\n return state_x\n\ndef update(initail_state_x, index_array, W, threshold_vec, iterate_count):\n state_x = initail_state_x\n for i in sp.arange(iterate_count):\n state_x = calc_ward(state_x, index_array, W, threshold_vec)\n return state_x\n\nW = train_weights(train_vec_x)\nW\nindex_array\nthreshold_vec\n# calc_ward(initail_state_x, index_array, W, threshold_vec)\nvec_x = update(initail_state_x, index_array, W, threshold_vec, iterate_count)\nvec_x",
"execution_count": 235,
"outputs": [
{
"data": {
"text/plain": "matrix([[ 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]])"
},
"execution_count": 235,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "fig = plt.figure()\nax = fig.add_subplot(1,1,1) \nax.set_xticks(sp.linspace(0-.5, train_vec_x.shape[1]-.5, train_vec_x.shape[1]+1), minor=True)\nax.set_yticks(sp.linspace(0-.5, train_vec_x.shape[0]-.5, train_vec_x.shape[0]+1), minor=True)\nax.matshow(train_vec_x, vmin=-1, vmax=1)\nax.grid(True, which='minor')\n# plt.colorbar()\nplt.show()",
"execution_count": 230,
"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"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "plt.matshow(W, vmin=-1, vmax=1)\nplt.colorbar()",
"execution_count": 231,
"outputs": [
{
"data": {
"text/plain": "<matplotlib.colorbar.Colorbar at 0x26036891eb8>"
},
"execution_count": 231,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 288x288 with 2 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "fig = plt.figure()\nax = fig.add_subplot(1,1,1) \nax.set_xticks(sp.linspace(0-.5, vec_x.shape[1]-.5, vec_x.shape[1]+1), minor=True)\nax.set_yticks(sp.linspace(0-.5, vec_x.shape[0]-.5, vec_x.shape[0]+1), minor=True)\nax.matshow(vec_x, vmin=-1, vmax=1)\nax.grid(True, which='minor')\n# plt.colorbar()\nplt.show()",
"execution_count": 236,
"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"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.7.0",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"toc": {
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"base_numbering": 1,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "165px"
},
"toc_section_display": true,
"toc_window_display": true
},
"gist": {
"id": "",
"data": {
"description": "ホップフィールドネットワーク",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment