元バイオ系

元バイオウェット系がデータサイエンスやらを勉強していくブログ。 基本自分用のまとめ。

K-SVDアルゴリズムを理解したい

辞書学習アルゴリズムであるK-SVDアルゴリズムを理解したい記事です。

また、過去記事

hotoke-x.hatenablog.com

の続きでもあります。

辞書学習の問題設定

許容誤差を \epsilonとして、以下の問題設定で辞書 Aとスパース表現ベクトル \boldsymbol{x}を推定する。 (許容誤差のことを書籍ではモデル誤差と呼んでいるが、誤差が既知な状況はほぼないのでここでは許容誤差と呼ぶことにする。)

$$ \begin{align} \min _{\boldsymbol{A}, \left\{\boldsymbol{x}_{i}\right\}_{i=1}^{M}} \sum_{i=1}^{M}||\boldsymbol{x}_{i}||_{0} \quad \text { subject to } \quad ||\boldsymbol{y}_{i}-\boldsymbol{A} \boldsymbol{x}_{i}||_{2} \leq \epsilon, 1 \leq i \leq M \end{align} $$

また、ペナルティとスパース性を入れ替えて

$$ \begin{align} \min _{\boldsymbol{A}, \left\{\boldsymbol{x}_{i}\right\}_{i=1}^{M}} \sum_{i=1}^{M}||\boldsymbol{y}_{i}-\boldsymbol{Ax}_{i}||_{2}^{2} \quad \text { subject to } \quad||\boldsymbol{x}_{i}||_{0} \leq k_{0}, 1 \leq i \leq M \end{align} $$

という誤差最小化問題を考える。

 \epsilon=0とすると、解の一意性が保証されるらしい(驚き)。

辞書とスパース表現ベクトルを同時に求める問題は行列分解とみることもできる。

K-SVDアルゴリズム

A中の j_0番目以外の列(辞書の列のことをアトムと呼ぶ)を固定し、 j_0番目に対応するアトムとそのアトムにかかる係数(スパース表現ベクトル)を更新する。そこで、誤差計算を以下のように分解する。

$$ \begin{align} ||\mathbf{Y}-\mathbf{A} \mathbf{X}||_{F}^{2} &=\left|\left|\mathbf{Y}-\sum_{j=1}^{m} \mathbf{a}_{j} \mathbf{x}_{j}^{\top}\right|\right|_{F}^{2} \\ &=\left|\left|\left(\mathbf{Y}-\sum_{j \neq j_{0}} \mathbf{a}_{j} \mathbf{x}_{j}^{\top}\right)-\mathbf{a}_{j_{0}} \mathbf{x}_{j_{0}}^{\top} \right|\right|_{F}^{2} \end{align} $$

 \mathbf{x}_j^{\top} \mathbf{X} j番目の行(列じゃないことに注意)とし、更新ステップで \mathbf{a}_{j_0} \mathbf{x}_{j_0}^{\top}の両方を更新する。 j_{0}番目以外は固定しているので、

$$ \begin{align} \mathbf{E}_{j_{0}} = \mathbf{Y}-\sum_{j \neq j_{0}} \mathbf{a}_{j} \mathbf{x}_{j}^{\top} \label{ksvd_error} \end{align} $$

は計算済みとしている。

ここで、\eqref{ksvd_error}を最小化する \mathbf{a}_{j_0} \mathbf{x}_{j_0}^{\top}は、 \mathbf{E}_{j_{0}}の低ランク近似(ランク1近似)とみることができる。

このことは一見するとわかりにくいが、 \mathbf{a}_{j_{0}} \mathbf{x}_{j_{0}}^{\top} \mathbf{Y}と同じサイズになっていることに気がつけば難しくない。仮に \mathbf{Y}_{j_{0}} = \mathbf{Y} - \mathbf{E}_{j_{0}}とすれば、 \mathbf{Y}_{j_{0}}  \mathbf{a}_{j_{0}} \mathbf{x}_{j_{0}}^{\top}で近似しているだけだからである。

これはSVDで求めることができるが、通常 \mathbf{x}_{j_0}^{\top}は密な解が求まってしまう。

そこで、  \mathbf{x}_{j_{0}}^{\top}の非ゼロ要素を用いて計算された \mathbf{E}_{j_{0}}の部分集合を考えることで、非ゼロ要素を固定することができる。

この計算を簡単にするために、制限作用素 \mathbf{P}_{j_{0}} \in \mathbb{R}^{M \times M_{j_{0}}}を定義し、

$$ \begin{align} \mathbf{E}_{j_{0}} \mathbf{P}_{j_{0}} \end{align} $$

として、不要な列を除去する。この制限作用素を用いて、 \mathbf{x}_{j_{0}}の非ゼロ要素だけを取り出したものを

$$ \begin{align} \left(\mathbf{x}_{j_{0}}^{R}\right)^{\mathrm{T}}=\mathbf{x}_{j_{0}}^{\mathrm{T}} \mathbf{P}_{j_{0}} \end{align} $$

と定義する。

この部分行列 \mathbf{E}_{j_{0}} \mathbf{P}_{j_{0}}に対してSVDによるランク1近似を適用すると、アトム \mathbf{a}_{j_{0}}と対応するスパース表現の要素 \mathbf{x}_{j_{0}}^{R}を同時に求めることができる。

すなわち

$$ \begin{align} \mathbf{E}_{j_{0}}^{R} = \mathbf{U} \boldsymbol{\Delta} \mathbf{V}^{\top} \end{align} $$

として、 \mathbf{a}_{j_0} = \mathbf{u}_{1},  \mathbf{x}_{j_{0}}^{R} = \Delta [1, 1] \mathbf{v}_{1}とする。ここで [1, 1]はインデックスを表していることに注意。

最後に以下の式で誤差を評価し、許容誤差未満になるまで反復を繰り返す。

$$ \begin{align} \left|\left| \mathbf{Y}-\mathbf{A}_{(k)} \mathbf{X}_{(k)} \right|\right|_{F}^{2} \le \epsilon \end{align} $$

また、書籍ではSVDではなくブロック座標降下法の考え方を用いた計算方法も紹介されているが、ここでは割愛する。

参考