概要
パラメータの総和が一定となる条件の下で、データから、これらのパラメータを学習(最適化)する方法を考える。すなわち
$$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