球面上の機械学習(パラメータの総和が一定となる条件下で)

Python
Sponsored

概要

パラメータの総和が一定となる条件の下で、データから、これらのパラメータを学習(最適化)する方法を考える。すなわち

$$x_1+x_2+\cdots+x_n=k$$

となる条件のもとで、これらのパラメータをデータに対し最適化することを考える。これは、 \(x_1, x_2, \cdots, x_n\) が確率を表現する場合等に直面する条件である \((k=1)\) 。

ここに

$$x_1>0, x_2>0, \cdots, x_n>0$$

の条件を加えると、 \(r^2=k\) の条件のもとで、これらのパラメータを極座標に変換して最適化を行うことで、自然に達成される。

この記事では、パラメータ \(x_1, x_2, \cdots, x_n\) を極座標 \(r^2=k, \theta_1, \theta_2, \cdots, \theta_{n-1}\) に変換し、これらの角度の最適化を行うことで、もとの最適化を実現する、球面上の機械学習とでもいうべき手法について提案する。

記事の末尾にはpythonによる実装を追加した。

多次元の極座標

\(n\) 次元球上の点 \(y_1, y_2, \cdots, y_n\) は、半径 \(r\) と偏角 \(\theta_1, \theta_2, \cdots, \theta_{n-1}\) を用いて以下のように表せる。

$$y_1=r\sin\theta_1$$

$$y_2=r\cos\theta_1\sin\theta_2$$

$$\cdots$$

$$y_{n-1}=r\cos\theta_1\cos\theta_2\cdots\cos\theta_{n-2}\sin\theta_{n-1}$$

$$y_n=r\cos\theta_1\sin\theta_2\cdots\cos\theta_{n-2}\cos\theta_{n-1}$$

最適化パラメータを極座標に変換

パラメータとの対応関係

ここで、 \(y_1, y_2, \cdots, y_n\) が球面上に存在するという条件は、

$$\sum^{n}_{j=1}y^2_j=r^2$$

と書ける。これを

$$\sum^{n}_{j=1}x_j=k$$

というパラメータの条件と対応させると

$$k=r^2$$

$$x_j=(y_j)^2$$

となる。

微分

各パラメータの偏角による偏微分を考える。

$$x_j=(y_j)^2=r^2\cos^2\theta_1\cos^2\theta_2\cdots\cos^2\theta_{j-1}\sin^2\theta_j$$

より、

$$\frac{\partial x_j}{\partial \theta_j}=r^2\cos^2\theta_1\cos^2\theta_2\cdots\cos^2\theta_{j-1}\cdot 2\sin\theta_j\cos\theta_j$$

$$=x_j\cdot\frac{2\cos\theta_j}{\sin\theta_j}=\frac{2}{\tan\theta_j}\cdot x_j$$

と書ける。

また、 \(i< j\) について

$$x_j=(y_j)^2=r^2\cos^2\theta_1\cdots\cos^2\theta_i\cdots\cos^2\theta_{j-1}\sin^2\theta_j$$

より

$$\frac{\partial x_j}{\partial \theta_i}=r^2\cos^2\theta_1\cdots(-2\sin\theta_i\cos\theta_i)\cdots\cos^2\theta_{j-1}\sin^2\theta_j$$

$$=x_j\cdot\frac{-2\sin\theta_i}{\cos\theta_i}=-2\tan\theta_i\cdot x_j$$

と書ける。

球面上の機械学習アルゴリズム

学習されたパラメータによる予測誤差を \(\mathbf{E}(x_1,\cdots,x_n)\) とおくと、通常のパラメータ学習に際して

$$\frac{\partial\mathbf{E}}{\partial x_1},\cdots,\frac{\partial\mathbf{E}}{\partial x_n}$$

が得られている。連鎖率により、パラメータを極座標に変換した後の偏角の更新に必要な偏微分は

$$\frac{\partial\mathbf{E}}{\partial \theta_i}=\frac{\partial\mathbf{E}}{\partial x_i}\frac{\partial x_i}{\partial \theta_i}+\sum^{n}_{j=i+1}\frac{\partial\mathbf{E}}{\partial x_j}\frac{\partial x_j}{\partial \theta_i}$$

$$=\frac{\partial\mathbf{E}}{\partial x_i}\frac{\partial x_i}{\partial \theta_i}+\sum^{n}_{j=i+1}\frac{\partial\mathbf{E}}{\partial x_j}\frac{\partial x_j}{\partial \theta_i}$$

$$=\frac{2}{\tan\theta_j}\cdot x_j\cdot\frac{\partial\mathbf{E}}{\partial x_i}+\sum^{n}_{j=i+1}-2\tan\theta_i\cdot x_j\cdot\frac{\partial\mathbf{E}}{\partial x_j}$$

と書ける。したがって、以上の勾配(偏微分)に基づいて勾配降下法等により、偏角を最適化することができる。極座標からパラメータの値を求めることは容易にできるので、制約条件に基づいて、パラメータの最適化が完遂できたことになる。

Pythonによる実装

ソースコード

上記の球面上の機械学習を、PythonのClassとして実装した。コード中の例では、

$$y=d_1 x_1+d_2 x_2+d_3 x_3+d_4 x_4+\mathcal{N}(0, 0.05)$$

ただし、

$$x_1+x_2+x_3+x_4=1$$

$$x_1>0,x_2>0,x_3>0,x_4>0$$

となるパラメータ \([x_1,x_2,x_3,x_4]\) を最適化し、真の値 \([0.1,0.2,0.3,0.4]\) を推定した。

出力例

iter: 0, x_pred: [0.11697778 0.21580459 0.29487864 0.372339 ], x_sum: 1.000
iter: 1, x_pred: [0.09395442 0.18622751 0.25668538 0.46313269], x_sum: 1.000
...
iter: 98, x_pred: [0.1018015 0.20235819 0.27492072 0.4209196 ], x_sum: 1.000
iter: 99, x_pred: [0.10220577 0.20336814 0.27554743 0.41887866], x_sum: 1.000

Comments