『統計的学習理論』の第2章のメモ(一様対数の法則, p.32)

一様対数の法則の不等式は以下に示す通り。すなわち、 1-\delta 以上の確率で次式が成り立つ。


\begin{align*}
\mathop{\rm sup} \limits_{g\in \mathcal{G}} \left\{ \mathbb{E}[g(Z)] - \frac{1}{n} \sum_{i=1}^{n} g(Z_i) \right\}
\leq 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (1/\delta)} {2n}}
\end{align*}

不等式の左辺における  \text{sup} の中身の符号を反転したものについても同様の不等式が成り立つので、結局  1-\delta 以上の確率で


\begin{align*}
\mathop{\rm sup} \limits_{g\in \mathcal{G}} \left| \mathbb{E}[g(Z)] - \frac{1}{n} \sum_{i=1}^{n} g(Z_i) \right|
\leq 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (2/\delta)} {2n}}
\end{align*}

が成り立つ。

右辺の  2/\delta は誤植ではない。実際、


\begin{align*}
 A(Z_1, \ldots, Z_n) &= \mathop{\rm sup} \limits_{g\in \mathcal{G}} \left\{ \mathbb{E}[g(Z)] - \frac{1}{n} \sum_{i=1}^{n} g(Z_i) \right\}\\
 B(Z_1, \ldots, Z_n) &= \mathop{\rm sup} \limits_{g\in \mathcal{G}} \left\{ - \mathbb{E}[g(Z)] + \frac{1}{n} \sum_{i=1}^{n} g(Z_i) \right\}\\
 C(Z_1, \ldots, Z_n) &= \mathop{\rm sup} \limits_{g\in \mathcal{G}} \left| \mathbb{E}[g(Z)] - \frac{1}{n} \sum_{i=1}^{n} g(Z_i) \right|
\end{align*}

とおくと、


\begin{align*}
\text{Pr} \left( A(Z_1, \ldots, Z_n) \gt 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (1/\delta)} {2n}}  \right) \lt \delta 
\end{align*}

であり、また


\begin{align*}
\text{Pr} \left( B(Z_1, \ldots, Z_n) \gt 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (1/\delta)} {2n}}  \right) \lt \delta 
\end{align*}

である。和事象の確率に関して成り立つ不等式(劣加法性)を使えば


\begin{align*}
& \text{Pr} \left( C(Z_1, \ldots, Z_n)  \gt 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (1/\delta)} {2n}} \right) \\
&= \text{Pr} \left( A(Z_1, \ldots, Z_n) \gt 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (1/\delta)} {2n}} 
\;\lor \right. \\
& \hspace{2cm} \left. B(Z_1, \ldots, Z_n)  \gt 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (1/\delta)} {2n}}  \right) \\
&\leq  \text{Pr} \left( A(Z_1, \ldots, Z_n)  \gt 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (1/\delta)} {2n}} \right) \\
& \hspace{5mm} + \text{Pr} \left( B(Z_1, \ldots, Z_n) \gt 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (1/\delta)} {2n}} \right) \\
& \lt \delta + \delta = 2\delta
\end{align*}

となる。つまり  1-2\delta 以上の確率で


\begin{align*}
\mathop{\rm sup} \limits_{g\in \mathcal{G}} \left| \mathbb{E}[g(Z)] - \frac{1}{n} \sum_{i=1}^{n} g(Z_i) \right|
\leq 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (1/\delta)} {2n}}
\end{align*}

である。  2\delta \delta に置き換えれば(つまり式の上では  \delta を2で割る)、 1-\delta 以上の確率で


\begin{align*}
\mathop{\rm sup} \limits_{g\in \mathcal{G}} \left| \mathbb{E}[g(Z)] - \frac{1}{n} \sum_{i=1}^{n} g(Z_i) \right|
\leq 2 \mathfrak{R} (\mathcal{G}) + (b-a) \sqrt{\frac{\log (2/\delta)} {2n}}
\end{align*}

が成り立つ。

『統計的学習理論』の第1章のメモ(AUC, p.12)

p.12に

 \mathbb{E}_{x_{-}\sim D_{-}} [ \text{TP}_{h} (h(x_{-})) ] = \text{AUC}(h)

という関係式が現れる。ここで  h は仮説、TPは真陽性率、AUCは曲線下面積(area under the curve)である。

なぜこの式が成り立つのか?

左辺はROC曲線のプロットに現れるTPの平均値である。 h(x_{-}) が値域全体を走るにつれて、  \text{TP}_{h} (h(x_{-})) は ROC曲線のTPの値を走るわけである。

プロットの領域は  1 \times 1 であり、特にFP軸の長さが1なので、平均値がそのままAUCに対応する。 面積をキープしたままROC曲線の高さをならして、現れる横長の長方形を想像すると、長方形の高さがTPの平均値である。

上記のスケッチを式で書いてみる。 hを固定し、 x を FP, y をTPとして、対応するROC曲線を  y = f_{h}(x) と表せば、面積は


\begin{align*}
\text{AUC}(h) = \int_{0}^{1} f_{h}(x) dx 
\end{align*}

である。右辺に平均値の定理を適用すれば、


\begin{align*}
f_{h}(c) = \int_{0}^{1} f_{h}(x) dx 
\end{align*}

となる  c 0 \lt c \lt 1 に存在する。この f_{h}(c)こそが、TPの平均値であり、AUCである。

ホップフィールドネットワークの記憶容量をさらに改善する試み:カーネルロジスティック回帰に基づく学習アルゴリズム

はじめに

以前の記事では、古典的なHopfieldモデルの記憶容量の限界を克服するため、記憶パタンを教師データと見なしてロジスティック回帰によりネットワークの重みを学習する手法を紹介した。その結果、従来のHebb則と比較して、想起性能(特にノイズ耐性)と記憶容量が改善されることを実験的に示した。

しかしながら学習アルゴリズムとしてのロジスティック回帰には、線形分離可能な範囲でしかパタンをうまく記憶できないという原理的な限界が残っていた。もし記憶パタン間の関係がより複雑かつ記憶パタン数が(非常に)多くなって線形分離が困難な場合、想起性能と記憶容量は頭打ちになると予想される。

そこで、非線形なデータ分離を可能にするカーネル法をロジスティック回帰に導入し、Hopfieldモデルの学習能力をさらに高めることを試みる。具体的には、カーネルロジスティック回帰に基づく学習アルゴリズムを実装し、そのノイズ耐性と記憶容量を評価する。

*本記事の内容は、以下の論文に基づいている。

www.jstage.jst.go.jp

カーネルロジスティック回帰に基づく学習

基本的な考え方はロジスティック回帰の話と同様で、記憶パタン  \mathbf{x}^{(p)} \in \{-1, 1\}^{N} を 目標出力  \mathbf{t}^{(p)} \in \{0, 1\}^{N} に変換し、ネットワークが正しく出力(想起)できるように学習する。しかし、今回は入力を直接扱う代わりに、カーネル関数を用いて高次元の特徴空間に写像し、その空間上でロジスティック回帰を行う。

準備

ネットワークのニューロン数を  N、記憶させるパタン数を  P とする。記憶パタン  \mathbf{x}^{(p)} と目標出力  \mathbf{t}^{(p)} の定義は同様である。

  •  \mathbf{x}^{(p)} = [x_{1}^{(p)}, \ldots, x_{n}^{(p)}]^\top:  p 番目の記憶パタン(要素は  \pm 1)。

  •  \mathbf{t}^{(p)} = [t_{1}^{(p)}, \ldots, t_{n}^{(p)}]^\top :  \mathbf{x}^{(p)} の値域を  \{0, 1\}^{n} に変換した目標出力ベクトル。  t_{i}^{(p)} = (x_{i}^{(p)} + 1) / 2 の関係がある。

カーネル法の導入

カーネル法では、入力ベクトル  \mathbf{x} を高次元(あるいは無限次元)の特徴空間へ写像する関数  \Phi(\mathbf{x}) を考える。この高次元空間では、元の空間では線形分離できなかったパターンも線形分離できる可能性が高まる。


\begin{align*}
 \mathbf{x} \in \mathbb{R}^{N} \mapsto \Phi(\mathbf{x}) \in \mathbb{R}^{D} \;\;\;\; (D \gg N)
\end{align*}

この特徴空間  \mathbb{R}^{D} における重みベクトル  \tilde{\mathbf{w}}_{i} \in \mathbb{R}^{D} を用いて、活性化ポテンシャル  h_i(\mathbf{x}) を計算する。


\begin{align*}
h_i (\mathbf{x}) = \tilde{\mathbf{w}}_{i}^{\top}  \Phi(\mathbf{x})
\end{align*}

表現定理によると、後述する損失関数を最小化する意味での最適な重みベクトル  \tilde{\mathbf{w}}_{i} は、学習データ(記憶パタン  \mathbf{x}^{(p)})の特徴ベクトル  \Phi (\mathbf{x}^{(p)}) の線形結合で表現できる。


\begin{align*}
\tilde{\mathbf{w}}_{i} = \sum_{p=1}^{P} \alpha_{i}^{(p)}  \Phi (\mathbf{x}^{(p)})
\end{align*}

ここで、 \alpha_{i}^{(p)} は各記憶パタン  \mathbf{x}^{(p)} に対応する係数(重み)である。この係数  \boldsymbol{\alpha}_{i} = [ \alpha_{i}^{(1)}, \ldots, \alpha_{i}^{(m)} ]^{\top} は双対変数と呼ばれる。ロジスティック回帰の学習では、最小化する対象は負の対数尤度であり、これはまた活性化ポテンシャル  h_i (\mathbf{x})= \tilde{\mathbf{w}}_{i}^{\top}  \Phi(\mathbf{x}) の関数である。L2ノルムで表される正則化項を導入することで、表現定理の十分条件は満たされる。

活性化ポテンシャル  h_i (\mathbf{x}) = \tilde{\mathbf{w}}_{i}^{\top}  \Phi(\mathbf{x}) に、  \tilde{\mathbf{w}}_{i} の双対表現を代入する。


\begin{align*}
 h_i (\mathbf{x}) &= \left( \sum_{p=1}^{P} \alpha_{i}^{(p)}  \Phi (\mathbf{x}^{(p)}) \right)^{\top} \Phi(\mathbf{x}) \\
&= \sum_{p=1}^{P} \alpha_{i}^{(p)} \Phi (\mathbf{x}^{(p)})^{\top} \Phi (\mathbf{x})
\end{align*}

しかし、特徴空間の次元  D は非常に大きくなるため、 \Phi(\mathbf{x}) を陽に計算するのは現実的ではない。そこで、特徴空間における内積  \Phi(\mathbf{x})^{\top} \Phi(\mathbf{y}) を、元の入力ベクトル  \mathbf{x}, \mathbf{y} だけを使って計算できるカーネル関数  K(\mathbf{x}, \mathbf{y}) を導入する(カーネルトリック)。

内積   \Phi (\mathbf{x}^{(p)})^{\top} \Phi (\mathbf{x}) はカーネル関数  K(\mathbf{x}^{(p)}, \mathbf{x}) で置き換えられるので、カーネル化された活性化ポテンシャルおよび対応するネットワークの出力  y_{i}(\mathbf{x}) は次のように計算される。


\begin{align*}
 h_i (\mathbf{x}) &= \sum_{p=1}^{P} \alpha_{i}^{(p)} K(\mathbf{x}^{(p)}, \mathbf{x}) \\
y_{i} (\mathbf{x}) &= \sigma(h_{i} (\mathbf{x}) )
\end{align*}

ここで  \sigma(z) = 1 / (1 + \exp(-z)) はシグモイド関数である。 \alpha_{i}^{(p)} は、 p 番目の記憶パタンがニューロン  i の出力決定に与える影響度を表すと解釈できる。

損失関数の定義

線形ロジスティック回帰と同様、損失関数は負の対数尤度に対して重みベクトルのL2正則化項を加えたもので定義される。


\begin{align*}
L(\boldsymbol{\alpha}) &\triangleq -\sum_{p=1}^P \sum_{i=1}^N \left[ t_{i}^{(p)} \log(y_{i}^{(p)}) + (1 - t_i^{(p)}) \log(1 - y_{i}^{(p)}) \right] + \lambda \sum_{i=1}^N \left\| \tilde{\mathbf{w}}_{i} \right\|_{2}^{2}  \\
&= -\sum_{p=1}^P \sum_{i=1}^N \left\{ t_{i}^{(p)} h_{i}^{(p)} - \log \left( 1 + \exp (h_{i}^{(p)}) \right)  \right\}  + \lambda \sum_{i=1}^N \sum_{p=1}^{P} \sum_{q=1}^{P} \alpha_{i}^{(p)} \alpha_{i}^{(q)} K(\mathbf{x}^{(p)}, \mathbf{x}^{(q)})   \\
&= \sum_{i=1}^N L(\boldsymbol{\alpha}_i) \\
L(\boldsymbol{\alpha}_i) &\triangleq  -\sum_{p=1}^{P} \left\{ t_{i}^{(p)} h_{i}^{(p)} - \log \left( 1 + \exp (h_{i}^{(p)}) \right)  \right\} + \lambda \sum_{p=1}^{P} \sum_{q=1}^{P} \alpha_{i}^{(p)} \alpha_{i}^{(q)} K(\mathbf{x}^{(p)}, \mathbf{x}^{(q)}) 
\end{align*}

ここで  y_{i}^{(p)} = y_{i} (\mathbf{x}^{(p)}) h_{i}^{(p)} = h_{i} (\mathbf{x}^{(p)}) である。また  \boldsymbol{\alpha} は、各ニューロンごとの双対変数を連結する形で  \boldsymbol{\alpha} = [ \boldsymbol{\alpha}_{1},  \ldots, \boldsymbol{\alpha}_{n}] とおいた双対変数である( P \times N 行列)。 \lambda は正則化パラメータである。L2正則化項の導入は表現定理からの要請に基づく。

勾配計算

損失関数  L( \boldsymbol{\alpha}_i) を双対変数  \alpha_{i}^{(q)} で偏微分すると、連鎖律より勾配は以下のようになる。


\begin{align}
\frac{\partial L(\boldsymbol{\alpha}_i)}{\partial \alpha_{i}^{(q)}} &= -\sum_{p=1}^{P}  \left\{ t_{i}^{(p)} \frac{\partial h_{i}^{(p)} }{ \partial\alpha_{i}^{(q)} }  - \frac{ \exp (h_{i}^{(p)}) }{1 + \exp (h_{i}^{(p)}) } \frac{\partial h_{i}^{(p)} }{ \partial \alpha_{i}^{(q)} } \right\} + \lambda \sum_{p=1}^{P} \alpha_{i}^{(p)} K(\mathbf{x}^{(p)}, \mathbf{x}^{(q)}) \\
&= -\sum_{p=1}^{P} \left\{ t_{i}^{(p)} K(\mathbf{x}^{(p)}, \mathbf{x}^{(q)}) - \sigma(h_{i}^{(p)}) K(\mathbf{x}^{(p)}, \mathbf{x}^{(q)}) \right\} + \lambda \sum_{p=1}^{P} \alpha_{i}^{(p)} K(\mathbf{x}^{(p)}, \mathbf{x}^{(q)}) \\
&= -\sum_{p=1}^{P} ( t_{i}^{(p)} -  y_{i}^{(p)} -  \lambda \alpha_{i}^{(p)} )  K(\mathbf{x}^{(p)}, \mathbf{x}^{(q)}) 
\end{align}

さらに勾配をベクトル・行列形式へ書き換えるために、以下の変数を用意する。

  •  \mathbf{y}_{i} \triangleq [y_{i}^{(1)}, \ldots, y_{i}^{(m)}]^\top

  •  \mathbf{t}_{i} \triangleq [t_{i}^{(1)}, \ldots, t_{i}^{(m)}]^\top

  •  \mathbf{K} \triangleq  [ K(\mathbf{x}^{(p)}, \mathbf{x}^{(q)}) ] (P \times P) カーネル行列

 \mathbf{y}_{i} はカーネル行列を用いて  \mathbf{y}_{i}= [ \sigma(  \sum_j \mathbf{K}_{p, j} \alpha_{i}^{(j)} ) ] = \sigma(\mathbf{K} \boldsymbol{\alpha}_{i}) と書くことができる。 \sigma(\cdot) は行列の各要素にシグモイド関数を適用する操作を表す。

上で求めた勾配に現れる  \sum_{p=1}^{P}( t_{i}^{(p)} -  y_{i}^{(p)} -  \lambda \alpha_{i}^{(p)} )   K(\mathbf{x}^{(p)}, \mathbf{x}^{(q)})  は、ベクトル  ( \mathbf{t}_{i}-  \mathbf{y}_{i} -\lambda \boldsymbol{\alpha}_{i}) と行列  \mathbf{K} の転置  \mathbf{K}^\top の積  \mathbf{K}^\top ( \mathbf{t}_{i}-  \mathbf{y}_{i} -\lambda \boldsymbol{\alpha}_{i}) q 番目の要素になっている。したがって、勾配ベクトル  \partial L(\boldsymbol{\alpha}_{i} )/\partial \boldsymbol{\alpha}_{i} 全体は次のように書ける。


\begin{align*}
 \frac{\partial L(\boldsymbol{\alpha}_{i} )}{\partial \boldsymbol{\alpha}_{i}} = \left[ \frac{\partial L(\boldsymbol{\alpha}_i)}{\partial \alpha_{i}^{(q)}} \right] =   -\mathbf{K}^\top ( \mathbf{t}_{i}-  \mathbf{y}_{i} -  \lambda \boldsymbol{\alpha}_{i} )
\end{align*}

ここで、カーネル行列  \mathbf{K} は対称行列であるから  \mathbf{K}^{\top} = \mathbf{K} となる。さらに、 \mathbf{y}_{i}=\sigma(\mathbf{K} \boldsymbol{\alpha}_{i}) を代入すると、次のように書ける。


\begin{align*}
 \frac{\partial L(\boldsymbol{\alpha}_{i} )}{\partial \boldsymbol{\alpha}_{i}} = -\mathbf{K} ( \mathbf{t}_{i} -  \sigma(\mathbf{K} \boldsymbol{\alpha}_{i})- \lambda \boldsymbol{\alpha}_{i})
\end{align*}

最終的に、双対変数行列  \boldsymbol{\alpha} = [ \boldsymbol{\alpha}_{1},  \ldots, \boldsymbol{\alpha}_{n}] に関する損失関数  L (\boldsymbol{\alpha}) の勾配行列は次式で与えられる。


\begin{align*}
\frac{\partial L (\boldsymbol{\alpha})}{\partial \boldsymbol{\alpha}} = 
\left[ \frac{\partial \left( \sum_j L(\boldsymbol{\alpha}_{j} ) \right) }{\partial \boldsymbol{\alpha}_{i}} \right] =
 \left[ \frac{\partial L(\boldsymbol{\alpha}_{i} )}{\partial \boldsymbol{\alpha}_{i}} \right] = 
 - \mathbf{K} (\mathbf{T} - \sigma(\mathbf{K} \boldsymbol{\alpha}) +  \lambda \boldsymbol{\alpha})
\end{align*}

ただし  \mathbf{T} = [\mathbf{t}_{1}, \ldots, \mathbf{t}_{n} ] = [\mathbf{t}^{(1)}, \ldots, \mathbf{t}^{(m)} ]^{\top} である。

勾配降下法

上で導出された勾配を用いて、学習率  \eta \boldsymbol{\alpha} を更新する。


\begin{align*}
\boldsymbol{\alpha}_{\text{new}} &=\boldsymbol{\alpha}_{\text{old}} - \eta \left.\frac{\partial L (\boldsymbol{\alpha}) }{\partial \boldsymbol{\alpha}} \right|_{ \boldsymbol{\alpha} =  \boldsymbol{\alpha}_{\text{old}}} \\
 &= \boldsymbol{\alpha}_{\text{old}}  - \eta \left\{ - \mathbf{K} (\mathbf{T} - \sigma(\mathbf{K} \boldsymbol{\alpha}_{\text{old}})  - \lambda \boldsymbol{\alpha}_{\text{old}})  \right\} \\
&= \boldsymbol{\alpha}_{\text{old}} - \eta \lambda  \mathbf{K} \boldsymbol{\alpha}_{\text{old}} - \eta \mathbf{K} \sigma(\mathbf{K} \boldsymbol{\alpha}_{\text{old}}) +  \eta \mathbf{K}\mathbf{T}
\end{align*}

  \eta \mathbf{K}\mathbf{T} は学習開始時点で一度だけ計算し、定数行列として結果を保存しておけば、更新の度に計算し直す手間が省ける。更新全体の計算量は  O (P^{2} N) であり、線形ロジスティック回帰における更新の計算量  O (P N^{2}) と対称的である。

カーネル法を用いた想起過程

現在の状態  \mathbf{s}(t) を用いて、カーネル化された活性化ポテンシャル(各ニューロンへの入力)を計算する。


\begin{align*}
 h_i ( \mathbf{s}(t)) &= \sum_{p=1}^{P} \alpha_{i}^{(p)} K(\mathbf{x}^{(p)},  \mathbf{s}(t))
\end{align*}

これは、「現在の状態  \mathbf{s}(t) と記憶パタン  \mathbf{x}^{(p)} の類似度  K(\mathbf{x}^{(p)},  \mathbf{s}(t))」に、「その記憶パターン  \mathbf{x}^{(p)} がニューロン  i の状態決定にどれだけ重要かを示す重み   \alpha_{i}^{(p)}」を掛けて、全ての記憶パターンについて足し合わせる、という意味になる。

各ニューロンへの入力と設定された閾値  \theta_i を比較して、次の状態  s_i(t+1) を決定する。


\begin{align*}
s_i(t+1) = \text{sign}( h_i(\mathbf{s}(t)) - \theta_i)
\end{align*}

これを全てのニューロン  i について行うことで、次の時刻の状態ベクトル  \mathbf{s}(t+1) が得られる。 ベクトル  \mathbf{h}(\mathbf{s}(t)) = [ h_1(\mathbf{s}(t)), \ldots, h_n(\mathbf{s}(t)) ]   \boldsymbol{\theta} = [ \theta_1, \ldots, \theta_n]を導入すれば、想起過程のベクトル表記を得る。


\begin{align*}
\mathbf{s}(t + 1) = \text{sign}(  \mathbf{h}(\mathbf{s}(t)) - \boldsymbol{\theta})
\end{align*}

ただし  \text{sign} (\cdot) はベクトルの各要素に符号関数を適用する操作を表す。

実験(ほぼ論文の翻訳)

読みたい人はこちらをクリック

実験条件

ニューロン数   N = 500 として実験した。ランダムな二値パタンを  P (x_i^{(p)} = 1) = 0.5 で生成した。 カーネル関数にはRBFカーネルを用いた。


\begin{align*}
K (\mathbf{x}, \mathbf{y}) = \exp(\gamma \| \mathbf{x} - \mathbf{y} \|^{2})
\end{align*}

学習アルゴリズムはHebb則、線形ロジスティック回帰(LLR)、およびカーネルロジスティック回帰(KLR)を比較した。 RBFのパラメタは  \gamma = 1/N とした。LLRとKLRの学習パラメータは、正則化  \lambda = 0.01、学習率  η = 0.1、更新回数は 200 とした。想起ダイナミクスはステップ数  T = 25 に設定し、オーバーラップ  m(t) = (1/N) \mathbf{s}(t)^{\top} \mathbf{x}^{\text{target}} を測定した。想起は  m(T) > 0.95 の場合に成功判定としている。

記憶容量評価

上述の通り、ネットワーク状態と目標出力パタンの最終オーバーラップが0.95を超えた場合に想起が成功したと見なした。元のパタンから開始して( \mathbf{s}(0) = \mathbf{x}^{(p)})、記憶負荷  \beta = P/N の関数として成功率を測定した。図1は、記憶容量の結果を示す。Hebb則の性能は  \beta \approx 0.14 付近で崩壊し、理論的予測 [2]と一致する。LLRは大幅な改善を示し、 \beta \approx 0.85 まで高い成功率を維持するが、その後急激に低下し、 \beta = 0.95 までには完全に失敗する。KLRはテストされた全範囲( \beta = 1.5 まで)で100%の成功率を達成し、維持している。これは、パタン数がニューロン数を大幅に超える( P > N)場合でも、パターンを安定して記憶し想起する能力を示している。

図1:Hebb則、LLR、KLRにおける想起成功率と記憶負荷( P/N)の関係( N = 500

ノイズ耐性評価

固定された負荷率( \beta = 0.2,  N = 500,  P = 100)において、初期オーバーラップ  m(0) の関数として、目標パタンとの最終オーバーラップを評価した。初期状態  \mathbf{s}(0) は、目標パタンにおいて  (1 - m(0))/2 の割合をビット反転させることによって生成した。図2は、 T=25 ステップ後の平均最終オーバーラップ  m(T) m(0) に対してプロットしたものである。Hebb則で学習したものはパタンを正確に想起できず、高いオーバーラップ初期値(例: m(0) = 0.9)でも最終オーバーラップは低いまま(約0.2-0.35)であった。LLRはノイズに対する頑健性が向上しており、初期オーバーラップが約0.4より大きい場合に想起( m(T) \approx 1.0)に成功している。KLRはさらに頑健性が向上しており、かなり低いオーバーラップの初期状態( m(0) \approx 0.2 付近から開始)からでも、完全な想起( m(T) = 1.0)を達成した。これは、KLRがHebb則とLLRの両方と比較して、かなり大きな吸引領域を持つことを示している。

図2:Hebb則、LLR、KLRにおける  \beta =0.2 での
最終オーバーラップ  m(T)と初期オーバーラップ  m(0) の関係 ( N=500)

カーネルパラメータ  \gamma の影響

カーネルパラメータの影響を調査するため、固定負荷  \beta = 0.3 N = 500,  P = 150)の条件で、 1/N に対してスケーリングされた異なる  \gamma の値でKLRの性能を評価した。図3に、スケーリングされたパラメータ  \tilde{\gamma} = \gamma N に対する想起成功率を示す。結果は、想起性能が  \gamma の選択に敏感であることを示している。 \gamma が小さすぎる場合( \tilde{\gamma} = 0.1 および  0.5)、ネットワークはパターンを想起できず、想起成功率は0%であった。これは、広すぎるカーネルが、特徴空間でパターンを効果的に分離できないことを示唆している。しかしながら、 \tilde{\gamma} \ge 1.0 \gamma \ge 1.0 に対応)の場合、ネットワークは実験でテストされた範囲( \tilde{\gamma} = 10.0 まで)内では常に100%の成功率を達成している。今回の実験にかかる設定では、より大きな  \gamma 値でも性能は低下しなかった。これは、他の実験で選択したデフォルト値である  \gamma = 1/N \tilde{\gamma} = 1.0)が、想起が成功する値の範囲内にあり、パラメタ値の選択が効果的であったことを示している。

図3:KLRにおける  \beta=0.3 での想起成功率とスケーリングされたカーネルパラメータ( \gamma N)の関係 ( N=500)

正則化パラメータ  \lambda の影響

さらに、負荷固定  \beta = 0.3 N = 500,  P = 150)で  \gamma = 1/N の場合に、L2正則化パラメータ  \lambda がKLR性能に与える影響を調べた。図4は、 \lambda に対する成功率をプロットしたものである。結果は、 \lambda の値が 0(正則化なし)から0.01までの範囲で、100%の成功率を達成したことを示している。この範囲での正則化が、上記の条件下でも想起性能を損なわず、学習の安定性や汎化の点でメリットがあることを示唆している。しかし、 \lambda が0.05以上に増加すると、成功率は急激に0%まで低下した。これは、過度に正則化を行うことで学習が著しく妨げられ、ネットワークがパターンを適切に適合を防ぐことを示している。これはおそらく、過度に制約された双対変数が原因だと考えられる。今回選択したデフォルト値  \lambda = 0.01 は、有効な範囲内にあり、より強い正則化によって引き起こされる性能低下を回避する。

図4:KLRにおける \beta=0.3 での想起成功率と正則化パラメータ \lambda の関係 ( N=500)

考察(ほぼ論文の翻訳)

読みたい人はこちらをクリック

今回の実験は、KLRがホップフィールドネットワークの性能を、ノイズ耐性の点だけでなく、特に記憶容量において大いに向上させることを明確に示している。KLRはテストされた全範囲、記憶負荷  \beta = 1.5 まで(図1)、完全な想起を達成した。これは、古典的なHebb限界( \beta \approx 0.14)をはるかに超え、 \beta \approx 0.9 付近で失敗したLLRを大幅に上回っている。パターン数がニューロン数を大幅に超える( P > N)場合でも、KLRがパターンをうまく記憶し想起する能力は特に注目に値する。この強化された頑健性も重要であり、KLRネットワークは、LLR( m(0) \approx 0.4)やHebb則と比較して、はるかに低いオーバーラップ( m(0) \approx 0.2)の初期状態からパターンを想起し、かなり大きな吸引領域(basin)を形成している(図2)。

この優れた性能は、KLRがRBFカーネルによって暗黙的に定義された高次元(潜在的に無限次元)の特徴空間を活用する能力に起因する可能性がある。これにより、各ニューロンに対して複雑な非線形決定境界を学習することができ、パターンが密に詰まっているか、元の入力空間で線形分離不可能であっても、効果的なパターン分離が可能となる。KLRが  P > N の領域(入力パターンが必然的に線形従属になる)でも完璧に動作するという事実は、カーネルに誘起された特徴空間内ではパターンが効果的に分離可能なままであることを強く示唆している。これは、線形分離可能性が困難になると性能が低下するLLRのような線形手法とは著しく対照的である。優れたノイズ耐性は、これらの非線形境界の有効性をさらに裏付けている。

性能はハイパーパラメータの選択に依存する。RBFカーネルパラメータ  \gamma に関する調査(図3)は、スケーリングされたパラメータ  \tilde{\gamma} = \gamma N が1.0未満の場合に性能が低いが、テストされた範囲( \tilde{\gamma} = 10.0 まで)内で  \tilde{\gamma} \ge 1.0 で最適な性能が達成され維持されたことを明らかにした。これは、我々が選択したデフォルトである  \gamma = 1/N ( \tilde{\gamma} = 1.0) が、合理的で効果的な選択であることを裏付けている。同様に、L2正則化パラメータ  \lambda(図4)は、 \lambda が0から0.01の間で最適な性能を示し、 \lambda \ge 0.05 で急激に低下した。これは、穏やかな正則化または正則化なしがここでは適切であることを確認している。

しかしながら、実用を考えるうえで無視できないのは計算コストである。学習中に  m \times m サイズのカーネル行列を扱うことで  O(P^{2}) オーダーの計算量またはメモリが必要であり、想起プロセスではステップごとに P 回のカーネル評価とそれに続く行列演算でおおよそ  O(PN) オーダーの計算量が必要とされる。Hebb則またはLLRにおける  O(N^{2}) の想起計算量と比較すると、特に  P N に近づくにつれてスケーラビリティの課題が生じる。実際、シミュレーション実験では、計算時間は  N P とともに著しく増加することを確認している。

今後の方向性としては、Nyströmのような近似法の有効性の検証、他のカーネル型(例:多項式カーネル)の評価、効率的なオンラインKLR学習ルールの開発、そして異なる正則化( \| \boldsymbol{\alpha} \|^2 \boldsymbol{\alpha}^{\top} \mathbf{K} \boldsymbol{\alpha})の効果を比較する、より詳細な分析が含まれる。

おわりに(ほぼ論文の翻訳)

カーネルロジスティック回帰(KLR)がHopfieldモデルのための強力な学習アルゴリズムとなり、従来のHebb則や線形ロジスティック回帰と比較して、記憶容量とノイズ耐性を大幅に向上させることを実証した。カーネル法の(implicitな)非線形特徴写像を実行することにより、KLRは効果的なパターン分離と想起を可能にする。

M5Stick2 PlusC で集音し、音声波形を表示する

こう書く。

#include <M5Unified.h>

// 画面の横幅に合わせてサンプル数を設定 (StickC Plus2は横向きで240px)
const int32_t record_length = 240; 
const uint32_t record_samplerate = 16000; // 16kHzサンプリング

int16_t* rec_data; // 音声データを格納するバッファへのポインタ
int32_t prev_y[record_length]; // 前回の描画位置を記憶する配列(チラつき防止用)

void setup() {
    auto cfg = M5.config();
    M5.begin(cfg);

    // 画面を横向きに設定
    MALLOC_CAP_8BIT;
    M5.Display.setRotation(3); 
    M5.Display.fillScreen(TFT_BLACK);

    // 録音用のメモリ領域(バッファ)を確保
    rec_data = (int16_t*)heap_caps_malloc(record_length * sizeof(int16_t), MALLOC_CAP_8BIT);
    
    if (rec_data == nullptr) {
        M5.Display.println("Memory allocation failed!");
        while (1) delay(10);
    }

    // 内蔵マイクの初期化と開始
    M5.Mic.begin();

    // 過去の描画位置配列を画面中央(y=67)で初期化
    for (int i = 0; i < record_length; i++) {
        prev_y[i] = M5.Display.height() / 2;
    }
}

void loop() {
    M5.update();

    // マイクからデータを record_length 分だけ録音
    if (M5.Mic.record(rec_data, record_length, record_samplerate)) {
        
        int32_t mid_y = M5.Display.height() / 2; // 画面の中央

        // 最初の点のy座標を計算しておく(ループの外で1点目を作っておく)
        int32_t next_y = mid_y + (rec_data[0] >> 8);
        if (next_y < 0) next_y = 0;
        if (next_y >= M5.Display.height()) next_y = M5.Display.height() - 1;

        int32_t current_y = next_y; // 今回のスタート点
        int32_t last_current_y = current_y; 

        // 1ピクセルずつ右に進みながら、前のピクセルと線を結ぶ
        for (int32_t x = 1; x < M5.Display.width(); ++x) {
            
            // ① 前回の古い「線」を黒で消す (x-1 から x への線)
            M5.Display.drawLine(x - 1, prev_y[x - 1], x, prev_y[x], TFT_BLACK);

            // ② 次の点のy座標を計算
            next_y = mid_y + (rec_data[x] >> 8);
            if (next_y < 0) next_y = 0;
            if (next_y >= M5.Display.height()) next_y = M5.Display.height() - 1;

            // ③ 新しい「線」を緑色(TFT_GREEN)で描画してみる (オシロスコープ風)
            M5.Display.drawLine(x - 1, current_y, x, next_y, TFT_GREEN);

            // ④ 次のループのために、今回のスタート地点のy座標を記憶
            // (同時に、次回の「消去用」としてprev_yにも保存)
            prev_y[x - 1] = current_y;
            current_y = next_y;
        }
        
        // ループが終わったら、最後の1点分の履歴も保存
        prev_y[M5.Display.width() - 1] = current_y;
    }
}

【Emacs】カレントディレクトリ(フォルダ)をFinderで開く設定

Finderというかファイルマネージャ(UbuntuだとNautilus)で開く設定。

こうする。

(defun current-dir-open()
  (interactive)
  (shell-command "open ."))

押しやすいキーにバインドしておくのもよい。

(global-set-key (kbd "C-1") 'current-dir-open)

参考:

qiita.com