K-SVDアルゴリズムを理解したい
辞書学習アルゴリズムであるK-SVDアルゴリズムを理解したい記事です。
また、過去記事
の続きでもあります。
辞書学習の問題設定
許容誤差をとして、以下の問題設定で辞書とスパース表現ベクトルを推定する。 (許容誤差のことを書籍ではモデル誤差と呼んでいるが、誤差が既知な状況はほぼないのでここでは許容誤差と呼ぶことにする。)
$$ \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} $$
という誤差最小化問題を考える。
とすると、解の一意性が保証されるらしい(驚き)。
辞書とスパース表現ベクトルを同時に求める問題は行列分解とみることもできる。
K-SVDアルゴリズム
A中の番目以外の列(辞書の列のことをアトムと呼ぶ)を固定し、番目に対応するアトムとそのアトムにかかる係数(スパース表現ベクトル)を更新する。そこで、誤差計算を以下のように分解する。
$$ \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} $$
はの番目の行(列じゃないことに注意)とし、更新ステップでとの両方を更新する。番目以外は固定しているので、
$$ \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}を最小化するとは、の低ランク近似(ランク1近似)とみることができる。
このことは一見するとわかりにくいが、がと同じサイズになっていることに気がつけば難しくない。仮にとすれば、をで近似しているだけだからである。
これはSVDで求めることができるが、通常は密な解が求まってしまう。
そこで、の非ゼロ要素を用いて計算されたの部分集合を考えることで、非ゼロ要素を固定することができる。
この計算を簡単にするために、制限作用素を定義し、
$$ \begin{align} \mathbf{E}_{j_{0}} \mathbf{P}_{j_{0}} \end{align} $$
として、不要な列を除去する。この制限作用素を用いて、の非ゼロ要素だけを取り出したものを
$$ \begin{align} \left(\mathbf{x}_{j_{0}}^{R}\right)^{\mathrm{T}}=\mathbf{x}_{j_{0}}^{\mathrm{T}} \mathbf{P}_{j_{0}} \end{align} $$
と定義する。
この部分行列に対してSVDによるランク1近似を適用すると、アトムと対応するスパース表現の要素を同時に求めることができる。
すなわち
$$ \begin{align} \mathbf{E}_{j_{0}}^{R} = \mathbf{U} \boldsymbol{\Delta} \mathbf{V}^{\top} \end{align} $$
として、, とする。ここではインデックスを表していることに注意。
最後に以下の式で誤差を評価し、許容誤差未満になるまで反復を繰り返す。
$$ \begin{align} \left|\left| \mathbf{Y}-\mathbf{A}_{(k)} \mathbf{X}_{(k)} \right|\right|_{F}^{2} \le \epsilon \end{align} $$
また、書籍ではSVDではなくブロック座標降下法の考え方を用いた計算方法も紹介されているが、ここでは割愛する。