いものやま。

雑多な知識の寄せ集め

半正定値計画問題と計量学習の話。(その1)

最近『異常検知と変化検知』を読んでたら思わぬところで半正定値計画問題が出てきたので、その話をしてみたい。

これは数理最適化 Advent Calendar 2023の3日目の記事です。

はてなブログの数式表示がちょっとおかしいかも。。。

線形計画問題と半正定値計画問題

数理最適化でお馴染みの問題といえば、線形計画問題


\left|
\begin{array}{rl}
\mathrm{min.} & \boldsymbol{c}^\top \boldsymbol{x} \\
\mathrm{sub.\ to} & A \boldsymbol{x} = \boldsymbol{b} \\
& \boldsymbol{x} \ge \boldsymbol{0} \\
\end{array}
\right.

これを拡張したものとして半正定値計画問題がある:


\left|
\begin{array}{rl}
\mathrm{min.} & C \bullet X \\
\mathrm{sub.\ to} & A_i \bullet X = b_i \\
& X \succeq O \\
\end{array}
\right.

ただし、 S_nをn次実対称行列の集合として、 A_i, C, X \in S_nであり、 X \succeq Oは行列 Xが半正定値行列であること、すなわち \forall \boldsymbol{y} \in \mathbb{R}^n, \boldsymbol{y}^\top X \boldsymbol{y} \ge 0であることを意味する。 また、 X \bullet Yは行列 X, Y内積で、 X \bullet Y = \sum_{j=1}^n\sum_{i=1}^n X_{ij} Y_{ij}である。

半正定値計画問題(通称SDP, SemiDefinite Programming)は線形計画問題だけでなく2次錐計画問題などを包含するので重要と言われている。 また、最大カット問題に対する(近似率の保証がある)近似アルゴリズムは、問題をSDPに緩和することで得られてたりと、近似アルゴリズムで重要な役割を果たしていることも知られている。

一方で、この「 Xが半正定値である」という制約がどんなときに使えるのかが、自分にはいまいちよく分かってなかったり。 いやまぁ勉強不足なだけではあるんだけど(^^;

そんなわけでSDPに定式化できる例を知って自分でも使えるようになりたいと思ってたんだけど、それが『異常検知と変化検知』を読んでたら出てきたので、ちょっと驚いた。

k-近傍法と計量学習

さて、異常検知をやりたいとして、正常データと異常データがどちらも得られているのだとしたら、一番シンプルに考えられるのは、異常かどうか判断したいデータの周りに正常データと異常データのどちらが多いかをみることが考えられる。 このアイディアを整理したのがk-近傍法。

このk-近傍法ではデータ間の距離が重要になるわけだけど、普通のユークリッド距離がいいとは限らない。 たとえば正常なデータが潰れた楕円みたいな分布になっていたとしたら、長い方向よりも短い方向の軸の方が距離の重みが大きくなっていた方がよさそうと考えられる。

そこで適当な半正定値行列 Aを使ってデータ \boldsymbol{x}, \boldsymbol{y}間の距離の2乗 d_A^2(\boldsymbol{x}, \boldsymbol{y})を次のように定義してみる:


d_A^2(\boldsymbol{x}, \boldsymbol{y}) = (\boldsymbol{x} - \boldsymbol{y})^\top A (\boldsymbol{x} - \boldsymbol{y})

ここで Aを半正定値行列と制限しているのは、距離の2乗なので \forall \boldsymbol{x}, \forall \boldsymbol{y}, d_A^2(\boldsymbol{x}, \boldsymbol{y}) \ge 0となってほしいから。 そして、 Aとして単位行列 Iを持ってくれば普通のユークリッド距離となるので、これは通常の距離の拡張となっている。

この Aをデータを使っていい感じに求めるのが計量学習(metric learning)で、リーマン幾何学だとこの Aを計量テンソル(metric tensor)やリーマン計量(Riemannian metric)と呼ぶらしい。

半正定値計画問題へ

じゃあ、この Aをどうすべきかといえば、同じグループに入るデータ間の距離はできるだけ近く、そして異なるグループに入るデータ間の距離はできるだけ遠くなるようにするといい。

ここではデータのグループを C_1, C_2の2つとして、同じグループに入るデータ間の距離の2乗の合計は次のように書ける:

\displaystyle
\sum_{\boldsymbol{x}\in C_1}
\sum_{\boldsymbol{y}\in C_1}
d_A^2(\boldsymbol{x}, \boldsymbol{y})
+
\sum_{\boldsymbol{x}\in C_2}
\sum_{\boldsymbol{y}\in C_2}
d_A^2(\boldsymbol{x}, \boldsymbol{y})

これはできるだけ小さくしたい。

そして、異なるグループに入るデータ間の距離はできるだけ遠くしたいというのは、あるデータ \boldsymbol{x} \in C_1について、同じグループに入るデータ \boldsymbol{y} \in C_1と違うグループに入るデータ \boldsymbol{z} \in C_2を選んできたときに、


d_A^2(\boldsymbol{x}, \boldsymbol{z}) > d_A^2(\boldsymbol{x}, \boldsymbol{y})

となっていてほしいといえる。 で、不等号には等号が含まれていてほしいので、一般性を失うことなくこれを


d_A^2(\boldsymbol{x}, \boldsymbol{z}) \ge d_A^2(\boldsymbol{x}, \boldsymbol{y}) + 1

と表現することにして( Aで空間が伸び縮みするのでマージンは一律1としていい)、問題はこれを違反する度合いなので、違反度合い v_A


v_A(\boldsymbol{x}, \boldsymbol{y}, \boldsymbol{z}) = \begin{cases}
 d_A^2(\boldsymbol{x}, \boldsymbol{y}) + 1 - d_A^2(\boldsymbol{x}, \boldsymbol{z}) & (\mathrm{if\ } d_A^2(\boldsymbol{x}, \boldsymbol{z}) < d_A^2(\boldsymbol{x}, \boldsymbol{y}) + 1) \\
0 & (\mathrm{otherwise}) \\
\end{cases}

と定義して、違反度合いの合計は次のように書ける:

\displaystyle
\sum_{\boldsymbol{x}\in C_1}
\sum_{\boldsymbol{y}\in C_1}
\sum_{\boldsymbol{z}\in C_2}
v_A(\boldsymbol{x}, \boldsymbol{y}, \boldsymbol{z})
+
\sum_{\boldsymbol{x}\in C_2}
\sum_{\boldsymbol{y}\in C_2}
\sum_{\boldsymbol{z}\in C_1}
v_A(\boldsymbol{x}, \boldsymbol{y}, \boldsymbol{z})

この違反度合いの合計もできるだけ小さくしたい。

したがって、この問題は次のような最小化問題に定式化できる:

\displaystyle
\left|
\begin{array}{rl}
\mathrm{min.} &
\sum_{\boldsymbol{x}\in C_1}
\sum_{\boldsymbol{y}\in C_1}
d_A^2(\boldsymbol{x}, \boldsymbol{y})
+
\sum_{\boldsymbol{x}\in C_2}
\sum_{\boldsymbol{y}\in C_2}
d_A^2(\boldsymbol{x}, \boldsymbol{y}) \\
&+
\sum_{\boldsymbol{x}\in C_1}
\sum_{\boldsymbol{y}\in C_1}
\sum_{\boldsymbol{z}\in C_2}
v_A(\boldsymbol{x}, \boldsymbol{y}, \boldsymbol{z})
+
\sum_{\boldsymbol{x}\in C_2}
\sum_{\boldsymbol{y}\in C_2}
\sum_{\boldsymbol{z}\in C_1}
v_A(\boldsymbol{x}, \boldsymbol{y}, \boldsymbol{z})
\\
\mathrm{sub.\ to} & A \succeq O \\
\end{array}
\right.

目的関数が複雑だけど、これは整理すればSDPになってることが分かる。


本ではこの問題を勾配法で解いていくんだけど、SDPに定式化できているなら普通のソルバーを使って解くこともできたりする。 次はそれを試してみたい。

今日はここまで!