Dictionary Learning

字典學習數學原理

這裏我們省去背景介紹,我們直接通過數學公式來更加直觀的瞭解這一技術,並通過一些具體的應用領域來感受字典學習的魅力,那就開始吧!
對於給定樣本數據集YY,我們可以建立一個能夠表示這個數據集的字典 DD,這時數據集每個樣本都能通過字典DD與該樣本對應的稀疏表示XX來恢復,且XX滿足一定的稀疏度,用公式表示如下:
YDXY \approx D^{*} X,st. X0L\|X\|_{0} \leq L
而字典學習就是通過迭代的方式尋找出字典DD與各樣本所對應的稀疏表示XX,如下式所示:
minD,Xixi0,\min _{\mathbf{D}, \mathbf{X}} \sum_{i}\left\|\mathbf{x}_{i}\right\|_{0}, \quad s.t. minD,XYDXF2ϵ\min _{\mathbf{D}, \mathbf{X}}\|\mathbf{Y}-\mathbf{D} \mathbf{X}\|_{F}^{2} \leq \epsilon
式中零範數不容易尋優,可以使用一範數來代替,即使用xi1\left\|\mathbf{x}_{i}\right\|_{1}代替xi0\left\|\mathbf{x}_{i}\right\|_{0},其中E\mathcal{E}爲重構允許的誤差最大值。

K-SVD優化

我們可以使用K-SVD算法來求解該優化問題,這裏有兩個優化變量,一般是先固定一個,優化另一個變量,然後交替運行,直至達到要求爲止。

初始化

我們可以從數據集中隨機選出一些列來組成字典DD的原子,即其列向量,對於稀疏表示XX我們可以初始化爲全零列向量。

更新XX

爲了方便,我們這裏只考慮單個樣本向量y,假設字典中只有4個原子,即D=[α1,α2,α3,α4]D=[\alpha 1, \alpha 2, \alpha 3, \alpha 4],且這裏的字典就是按照我們之前的初始化方法從數據集中隨機選取的四個樣本,現在我們的目標是計算y的編碼x,並使得x儘量稀疏。

  1. 首先我們從α1,α2,α3,α4\alpha 1, \alpha 2, \alpha 3, \alpha 4找出與y最近的向量,也就是分別計算點乘:
    α1y,α2y,α3y,α4y\alpha 1^{\star} y, \alpha 2^{\star} y, \alpha 3^{\star} y, \alpha 4^{\star} y,得到最近的原子α\alpha
  2. 假設α2y\alpha 2^{*} y是最小的,我們就選用α2\alpha 2作爲我們的第一個原子,然後我們的初始編碼向量爲:
    x1=(0,b,0,0)x 1=(0, b, 0,0)
    其中b爲未知量。
  3. 求解未知量b:
    ybα2=0y-b^{\star} \alpha 2=0
    顯然我們可以很容易的求出b。
  4. 計算殘差yy^{\prime}
    y=ybα2y^{\prime}=y-b^{\star} \alpha 2,如果滿足重構誤差閾值E\mathcal{E},則結束,否則進入下一步。
  5. 計算剩餘的字典α1,α3,α4\alpha 1, \alpha 3, \alpha 4與殘差向量y’的最近的向量,也就是計算
    α1y,α3y,α4y\alpha 1^{\star} y^{\prime}, \alpha 3^{\star} y^{\prime}, \alpha 4^{\star} y^{\prime}
    然後求取最小值對應的向量α\alpha,假設α3y\alpha 3^{\star} y^{\prime}爲最大值,那麼就令新的編碼向量爲:
    x2=(0,b,c,0)x 2=(0, b, c, 0)
    其中b、c爲未知數
  6. 求解係數b、c,於是我們可以列出方程:
    ybα2cα3=0y-b^{\star} \alpha 2-c^{\star} \alpha 3=0
    方程中有兩個未知參數b、c,我們可以進行求解最小二乘方程,求得b、c。
  7. 更新殘差向量y’
    y=ybα2cα3y^{\prime}=y-b^{\star} \alpha 2-c^{\star} \alpha 3
    如果y’的模長滿足閾值範圍,那麼就結束,否則就繼續循環,就這樣一直循環下去。

更新字典D

假設X是已知的,我們逐列更新字典。下面我們僅更新字典的第k列,記dk爲字典D的第k列向量,記xTk\mathbf{x}_{T}^{k}爲稀疏矩陣X的第k行向量,我們有:
YDXF2=Yj=1KdjxTjF2=(YjkdjxTj)dkxTkF2=EkdkxTkF2\begin{aligned}\|\mathbf{Y}-\mathbf{D} \mathbf{X}\|_{F}^{2} &=\left\|\mathbf{Y}-\sum_{j=1}^{K} \mathbf{d}_{j} \mathbf{x}_{T}^{j}\right\|_{F}^{2} \\ &=\left\|\left(\mathbf{Y}-\sum_{j \neq k} \mathbf{d}_{j} \mathbf{x}_{T}^{j}\right)-\mathbf{d}_{k} \mathbf{x}_{T}^{k}\right\|_{F}^{2} \\ &=\left\|\mathbf{E}_{k}-\mathbf{d}_{k} \mathbf{x}_{T}^{k}\right\|_{F}^{2} \end{aligned}
上式中殘差:Ek=YjkdjxTj\mathbf{E}_{k}=\mathbf{Y}-\sum_{j \neq k} \mathbf{d}_{j} \mathbf{x}_{T}^{j}
此時優化問題可描述爲:mindk,xTkEkdkxTkF2\min _{\mathbf{d}_{k}, \mathbf{x}_{T}^{k}}\left\|\mathbf{E}_{k}-\mathbf{d}_{k} \mathbf{x}_{T}^{k}\right\|_{F}^{2}

因此我們需要求出最優的dk,xTk\mathbf{x}_{T}^{k},這是一個最小二乘問題,可以利用最小二乘的方法求解,或者可以利用SVD進行求解,這裏利用SVD的方式求解出兩個優化變量。
但是,在這裏我們需要注意的是,不能直接利用Ek進行求解,否則求得的新的xTk\mathbf{x}_{T}^{k}不稀疏。因此我們需要將Ek中對應的xTk\mathbf{x}_{T}^{k}不爲0的位置提取出來,得到新的Ek\mathbf{E}_{k}^{\prime},這個過程如圖所示,這樣描述更加清晰。
在這裏插入圖片描述
如上圖,假設我們要更新第0列原子,我們將xTk\mathbf{x}_{T}^{k}中爲零的位置找出來,然後把Ek對應的位置刪除,得到Ek\mathbf{E}_{k}^{\prime},此時優化問題可描述爲:
mindk,xTkEkdkxTkF2\min _{\mathbf{d}_{k}, \mathbf{x}_{T}^{k}}\left\|\mathbf{E}_{k}^{\prime}-\mathbf{d}_{k} \mathbf{x}_{T}^{\prime k}\right\|_{F}^{2}

交替更新

通過上述的更新,我們可以得到最優的字典D、以及稀疏表示X。

實際應用

字典學習是很有使用價值的一個技術,能夠被廣泛應用在圖像去噪、恢復、去馬賽克等領域,這裏僅以圖像去噪爲例簡單說明。
如果你的計算資源有限,我們可以用大量的數據,通過字典學習針對這些樣本學到能夠表徵所有這些樣本的字典原子,在測試時,給你一張被污染的圖像,我們可以固定字典,僅更新對該圖像的稀疏表示,即只要找到最優的稀疏表示就能夠恢復出乾淨圖像。自然我們也可以直接在被污染的圖片上通過交替更新字典D與稀疏表示X來恢復出乾淨的圖像。也能夠選擇一種折中的方案,即更新預訓練的字典D。
具體的更新過程如下圖所示:
在這裏插入圖片描述
圖中x表示乾淨圖像,y表示被污染的圖像,α\alpha表示稀疏表示,D爲字典,R表示取出x的一個局部塊。

去噪效果如下圖所示:
在這裏插入圖片描述
在這裏插入圖片描述

參考文獻

字典學習(Dictionary Learning, KSVD)詳解
ML筆記:字典學習2(Dictionary Learning)
Digital image processing: p068- Sparse Modeling Image Processing Examples
趙小胖的腦科學園地
[論文]K-SVD: An Algorithm for Designing Overcomplete Dictionaries for Sparse Representationk-svd字典學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章