1. 程式人生 > >影象處理能量泛函優化——L1範數正則化項,軟閾值公式

影象處理能量泛函優化——L1範數正則化項,軟閾值公式

接上篇更新的L2範數求解的問題,接著講L1範數更新的問題
L1範數正則化項又稱為拉布拉斯先驗。帶有L1正則化項的問題是圖問題,求解相對簡單,具有閉式解。其求解就是著名的軟閾值公式。

問題

  x   = arg

min x ρ 2
x b
2 2
+ λ
x 1
\textbf{ x } = \arg \mathop {\min }\limits_\textbf{x} \frac\rho{2}\left\| {\textbf{x} - \textbf{b}} \right\|_2^2 + {\lambda\left\| \textbf{x} \right\|_1}

其中,   x   \textbf{ x }   b \textbf{ b} 均為向量。

推倒與求解

原問題是對向量進行求解,難以解決。但是如果   x   \textbf{ x }   b \textbf{ b} 都是標量,那麼問題就簡單了。

1. 問題分解

問題分解
在影象處理中,我們通常將向量   x   \textbf{ x }   b \textbf{ b} 的元素都看成獨立的,則原問題的求解可以轉換為對單個元素的求解,抽取原問題中的一個元素進行求解,則問題轉換為

x = arg min x ρ 2 ( x b ) 2 + λ x x = \arg \mathop {\min }\limits_x {\frac{\rho }{2}\left( {x - b} \right)^2} + \lambda \left| x \right|

其中, x x , b b (沒有加粗),表示標量,為向量   x   \textbf{ x }   b \textbf{ b} 中的第i個元素,省略下表i。
2. 分解問題求解

分解的問題就是一個一元二次問題求解最小值,由於影象處理中,存在某些先驗知識,一般 ρ , λ \rho, \lambda 都為非負數。將上述問題重寫為

x = arg min x ρ 2 ( x b ) 2 + λ x s . t . ρ 0 , λ 0 x = \arg \mathop {\min }\limits_x {\frac\rho{2}\left( {x - b} \right)^2} + \lambda \left| x \right|,s.t. \rho \ge 0, \lambda \ge 0

求解這個問題初中知識就夠了。下面簡單的給出結論
x 0 x \ge 0 :

x = { b λ ρ b λ ρ > 0 0 b λ ρ 0 x = \left\{ \begin{array} { c c } { b - \frac { \lambda } { \rho } } & { b - \frac { \lambda } { \rho } > 0 } \\ { 0 } & { b - \frac { \lambda } { \rho } \leq 0 } \end{array} \right.

x 0 x \le 0 :

x = { 0 b + λ ρ > 0 b + λ ρ b + λ ρ 0 x = \left\{ \begin{array} { c c } { 0 } & { b + \frac { \lambda } { \rho } > 0 } \\ { b + \frac { \lambda } { \rho } } & { b + \frac { \lambda } { \rho } \leq 0 } \end{array} \right.

求解還是簡單的,但是使用分段函式的形式寫出來太不美觀,如何寫成一個式子,當初還是難到了我,讀者可以自己想想,我是沒有想出來,師兄教的

x = sign ( b ) max ( b λ ρ , 0 ) x = \operatorname { sign } ( b ) \max \left( | b | - \frac { \lambda } { \rho } , 0 \right)

這樣寫的目的當然不只是為了好看,更是為了編寫程式碼。MATLAB不幾行就搞定了。
3. 原問題求解
分解的每隔問題求解了,其實原問題就解出來了,但是我們通常看到的求解這種問題,可不是一個一個子問題這樣寫出來,下面給出常見的求解形式。

x = s h r i n k λ ρ ( b ) x = shrin{k_{\frac{\lambda }{\rho }}}\left( b \right)

注意這裡的元素依然是標量。 s h r i n k shrink 稱為軟閾值運算元。其含義為
S k ( a ) = { a k a > k 0 a k a + k    a < k S _ { k } ( a ) = \left\{ \begin{array} { c } { a - k \quad a > k } \\ { 0 \quad a \leq k } \\ { a + k \ \ a < - k } \end{array} \right.

軟閾值公式,我們也叫作軟閾值收縮公式,只是因為他求解的過程可以看出收縮的過程。就以上式為例,當a較大的時候,就在 a a 的基礎上減去 k k 。 反之,如果 a a 是負值, a a 越小,就在 a a 的基礎上加上 k k ,一直在像0值附近收縮。簡單的公式還是特別有意思的,這種求解的思路也是特別受用,在很多其他類似的問題上,例如硬閾值、TV正則化項等都可以使用這種思路求解。

MATLAB實現

matlab實現的程式碼特別簡單。

% define the soft threshold function, which is used above.
function y = soft(x,tau)

y = sign(x).*max(abs(x)-tau,0);