軟閾值迭代算法(ISTA)和快速軟閾值迭代算法(FISTA)


缺月掛疏桐,漏斷人初靜。
誰見幽人獨往來,縹緲孤鴻影。
驚起卻回頭,有恨無人省。
揀盡寒枝不肯棲,寂寞沙洲冷。---- 蘇軾

更多精彩內容請關注微信公衆號 “優化與算法

ISTA算法和FISTA算法是求解線性逆問題的經典方法,隸屬於梯度類算法,也常用於壓縮感知重構算法中,隸屬於梯度類算法,這次將這2中算法原理做簡單分析,並給出matlab仿真實驗,通過實驗結果來驗證算法性能。

1. 引言

對於一個基本的線性逆問題:
y=Ax+w(1){\bf{y} = \bf{Ax} + \bf{w}} \quad \quad \quad \quad\quad \quad\quad \quad(1)

其中AM×N{\bf{A }} \in {^{M \times N}}, yM{\bf{y }} \in {^{M}}且是已知的,w\bf{w}是未知噪聲。
(1)式可用最小二乘法(Least Squares)來求解:
x^LS=argmixnAxy22(2){{\bf{\hat x}}_{LS}} = \mathop {\arg {\mathop{\rm mi}\nolimits} }\limits_{\bf{x}} n\left\| {{\bf{Ax}} - {\bf{y}}} \right\|_2^2 \quad \quad \quad \quad\quad \quad\quad \quad(2)

M=NM=NA\bf{A} 非奇異時,最小二乘法的解等價於A1y\bf{A^{-1}y}

然而,在很多情況下,(A)\bf(A) 是病態的(ill-conditioned),此時,用最小二乘法求解時,系統微小的擾動都會導致結果差別很大,可謂失之毫厘謬以千里,因此最小二乘法不適用於求解病態方程。

**什麼是條件數?**矩陣 A\bf{A} 的條件數是指 A\bf{A} 的最大奇異值與最小奇異值的比值,顯然條件數最小爲1,條件數越小說明矩陣越趨於“良態”,條件數越大,矩陣越趨於奇異,從而趨於“病態”。

爲了求解病態線性系統的逆問題,前蘇聯科學家安德烈·尼古拉耶維奇·吉洪諾夫提出了吉洪諾夫正則化方法(Tikhonov regularization),該方法也稱爲“嶺迴歸”。最小二乘是一種無偏估計方法(保真度很好),如果系統是病態的,則會導致其估計方差很大(對擾動很敏感),吉洪諾夫正則化方法的主要思想是以可容忍的微小偏差來換取估計的良好效果,實現方差和偏差的一個trade-off。吉洪諾夫正則化求解病態問題可以表示爲:
x^T=argmixnAxy22+λx22(3){{\bf{\hat x}}_{T}} = \mathop {\arg {\mathop{\rm mi}\nolimits} }\limits_{\bf{x}} n\left\| {{\bf{Ax}} - {\bf{y}}} \right\|_2^2 + \lambda \left\| {\bf{x}} \right\|_2^2 \quad \quad \quad \quad\quad \quad\quad \quad(3)

其中λ>0\lambda>0 爲正則化參數。問題(3)的解等價於如下嶺迴歸估計器:
x^T=(xTx+λI)1xTy(4){{\bf{\hat x}}_{T}} = {({{\bf{x}}^{\rm T}}{\bf{x}} + \lambda {\bf{I}})^{ - 1}}{{\bf{x}}^{\rm T}}{\bf{y}}\quad \quad \quad \quad\quad \quad\quad \quad(4)


安德烈·尼古拉耶維奇·蒂霍諾夫(俄文:阿爾瓦勒德普列耶娃;1906年10月17日至1993年10月7日)是蘇聯和俄羅斯數學家和地球物理學家,以對拓撲學、泛函分析、數學物理和不適定問題的重要貢獻而聞名。他也是地球物理學中大地電磁法的發明者之一。

嶺迴歸是採用 2{\ell _2} 範數作爲正則項,另一種求解式(1)的方法是採用 1{\ell _1} 範數作爲正則項,這就是經典的LASSO(Least absolute shrinkage and selection operator)問題:
x^=argmixnAxy22+λx1                         (5){\bf{\hat x}} = \mathop {\arg {\mathop{\rm mi}\nolimits} }\limits_{\bf{x}} n\left\| {{\bf{Ax}} - {\bf{y}}} \right\|_2^2 + \lambda {\left\| {\bf{x}} \right\|_1}~~~~~~~~~~~~~~~~~~~~~~~~~(5)

採用 1{\ell _1} 範數正則項相對於 2{\ell _2} 範數正則項有兩個優勢,第一個優勢是 1{\ell _1} 範數正則項能產生稀疏解,第二個優勢是其具有對異常值不敏感的特性,這一點恰好與嶺迴歸相反。

式(5)中的問題是一個凸優化問題,通常可以轉化爲二階錐規劃(second order cone programming)問題,從而使用內點法(interior point)等方法求解。然而在大規模問題中,由於數據維度太大,而內點法的算法複雜度爲 O(N3)O({N^3}),導致求解非常耗時。

基於上述原因,很多研究者研究通過簡單的基於梯度的方法來求解(5)式。基於梯度的方法其計算量主要集中在矩陣 A\bf{A} 與向量 y\bf{y} 的乘積上,算法複雜度小,而且算法結構簡單,容易操作。

2. 迭代收縮閾值算法(ISTA)

在衆多基於梯度的算法中,迭代收縮閾值算法(Iterative Shrinkage Thresholding Algorithm)是一種非常受關注的算法,ISTA算法在每一次迭代中通過一個收縮/軟閾值操作來更新 x\bf{x},其具體迭代格式如下:
xk+1=softλt(xk2tAT(Axky))                  (6){{{\bf{x}}_{k + 1}} = {{\mathop{\rm soft}\nolimits} _{\lambda t}}({{\bf{x}}_k} - 2t{{\bf{A}}^{\rm T}}({\bf{A}}{{\bf{x}}_k} - {\bf{y}}))}~~~~~~~~~~~~~~~~~~(6)

其中 softλt(){{\mathop{\rm soft}\nolimits} _{\lambda t}}( \cdot ) 是軟閾值操作函數:
softT(x)=sign(xi)(xiT)                           (7){{\mathop{\rm soft}\nolimits} _T}({{\bf{x}}_{\rm{}}}) = sign({x_i})(\left| {{x_i}} \right| - T)~~~~~~~~~~~~~~~~~~~~~~~~~~~(7)
軟閾值操作函數如下圖所示:
軟閾值操作函數
其中 sign()sign() 是符號函數。

那麼ISTA的迭代格式(6)式是怎麼來的呢?算法中的“收縮閾值”體現在哪裏?這要從梯度下降法(Gradient Descent)說起。

考慮一個連續可導的無約束最小化問題:
min{f(x):xRN}                                   (8)\min \{ f({\bf{x}}):{\bf{x}} \in {R^N}\} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(8)

(8)式可用梯度下降法來求解:
x0RN,     xk=xk1tkf(xk1)                 (9){{\bf{x}}_0} \in {R^N},~~~~~{{\bf{x}}_k} = {{\bf{x}}_{k - 1}} - {t_k}\nabla f({{\bf{x}}_{k - 1}})~~~~~~~~~~~~~~~~~(9)

這裏 tk>0t_k>0 是迭代步長。我們知道,梯度下降法可以表示成 ff 在點 xk1x_{k-1} 處的近端正則化(proximal regularization),其等價形式可以表示爲:
xk=argmixn{f(xk1)+xxk1,f(xk1)+12tkxxk122}   (10){{\bf{x}}_k} = \mathop {\arg {\mathop{\rm mi}\nolimits} }\limits_{\bf{x}} n\left\{ {f({{\bf{x}}_{k - 1}}) + \left\langle {{\bf{x}} - {{\bf{x}}_{k - 1}},\nabla f({{\bf{x}}_{k - 1}})} \right\rangle + {1 \over {2{t_k}}}\left\| {{\bf{x}} - {{\bf{x}}_{k - 1}}} \right\|_2^2} \right\}~~~(10)

(9)-(10)可由李普希茲連續條件 f(xk)f(xk1)2L(f)xkxk12{\left\| {\nabla f({{\bf{x}}_k}) - \nabla f({{\bf{x}}_{k - 1}})} \right\|_2} \le L(f){\left\| {{{\bf{x}}_k} - {{\bf{x}}_{k - 1}}} \right\|_2}ffxk1x_{k-1} 處的2階泰勒展開得到,很簡單,這裏不再贅述。

將(8)式加上 1{\ell _1} 範數正則項,得到:
min{f(x)+λx1:xRN}                   (11)\min \{ f({\bf{x}}) + \lambda {\left\| {\bf{x}} \right\|_1}:{\bf{x}} \in {R^N}\} ~~~~~~~~~~~~~~~~~~~(11)

則(10)式相應變成:
xk=argmixn{f(xk1)+xxk1,f(xk1)+12tkxxk122+λx1}  (12){{\bf{x}}_k} = \mathop {\arg {\mathop{\rm mi}\nolimits} }\limits_{\bf{x}} n\left\{ {f({{\bf{x}}_{k - 1}}) + \left\langle {{\bf{x}} - {{\bf{x}}_{k - 1}},\nabla f({{\bf{x}}_{k - 1}})} \right\rangle + {1 \over {2{t_k}}}\left\| {{\bf{x}} - {{\bf{x}}_{k - 1}}} \right\|_2^2 + \lambda {{\left\| {\bf{x}} \right\|}_1}} \right\}~~(12)

時(12)忽略掉常數項 f(xk1)f(\bf x_{k-1})f(xk1){\nabla f({{\bf{x}}_{k - 1}})} 之後,(12)式可以寫成:
xk=softλtk(xk1tkf(xk1))                    (13){{\bf{x}}_k} = {{\mathop{\rm soft}\nolimits} _{\lambda {t_k}}}({{\bf{x}}_{k - 1}} - {t_k}\nabla f({{\bf{x}}_{k - 1}})) ~~~~~~~~~~~~~~~~~~~~(13)

文獻中已經證明,當迭代步長取 ff 的李普希茲常數的倒數(即 1L(f){1 \over {L(f)}})時,由ISTA算法生成的序列 xk\bf x_k 的收斂速度爲 O(1k)O({1 \over {\rm{k}}}) ,顯然爲次線性收斂速度。

ISTA算法的僞代碼見原文,matlab代碼如下:

function [x_hat,error] = cs_ista(y,A,lambda,epsilon,itermax)
% Iterative Soft Thresholding Algorithm(ISTA)
% Version: 1.0 written by Louis Zhang @2019-12-7
% Reference: Beck, Amir, and Marc Teboulle. "A fast iterative 
% shrinkage-thresholding algorithm for linear inverse problems." 
% SIAM journal on imaging sciences 2.1 (2009): 183-202.

% Inputs:
% y         - measurement vector
% A         - measurement matrix
% lambda    - denoiser parameter in the noisy case
% epsilon   - error threshold
% inter_max - maximum number of amp iterations
%
% Outputs:
% x_hat     - the last estimate
% error     - reconstruction error

if nargin < 5
    itermax = 10000 ;
end
if nargin < 4
    epsilon = 1e-4 ;
end
if nargin < 3
    lambda = 2e-5 ;
end

N = size(A,2) ;
error = [];
x_1 = zeros(N,1) ;

for i = 1:itermax
    g_1 = A'*(y - A*x_1) ;
    alpha = 1 ;
    % obtain step size alpha by line search
    % alpha = (g_1'*g_1)/((A*g_1)'*(A*g_1)) ;
    x_2 = x_1 + alpha * g_1 ;
    x_hat = sign(x_2).*max(abs(x_2)-alpha*lambda,0) ;
    error(i,1) = norm(x_hat - x_1) / norm(x_hat) ;
    error(i,2) = norm(y-A*x_hat) ;
    if error(i,1) < epsilon || error(i,1) < epsilon
        break;
    else
        x_1 = x_hat ;
    end
end

實際過程中,矩陣 A\bf A 通常很大,計算其李普希茲常數非常困難,因此出現了ISTA算法的Backtracking版本,通過不斷收縮迭代步長的策略使其收斂。

3. 快速迭代收縮閾值算法(Fast Iterative Shrinkage Thresholding Algorithm, FISTA)

爲了加速ISTA算法的收斂,文獻中作者採用了著名的梯度加速策略Nesterov加速技術,使得ISTA算法的收斂速度從 O(1k)O({1 \over {\rm{k}}}) 變成 O(1k2)O({1 \over {\rm{k^2}}})。具體的證明過程可參見原文的定理4.1。

FISTA與ISTA算法相比,僅僅多了個Nesterov加速步驟,以極少的額外計算量大幅提高了算法的收斂速度。而且不僅在FISTA算法中,在幾乎所有與梯度有關的算法中,Nesterov加速技術都可以使用。那Nesterov加速技術爲何如此神通廣大呢?

Nesterov加速技術由大神Yurii Nesterov於1983年提出來的,它與目前深度學習中用到的經典的動量方法(Momentum method)很相似,和動量方法的區別在於二者用到了不同點的梯度,動量方法採用的是上一步迭代點的梯度,而Nesterov方法則採用從上一步迭代點處朝前走一步處的梯度。具體對比如下。

動量方法
vt+1=utvtαtg(θt){v_{t + 1}} = {u_t}{v_t} - {\alpha _t}\nabla g({\theta _t})

θt+1=θt+vt+1{\theta _{t + 1}} = {\theta _t} + {v_{t + 1}}

Nesterov方法
vt+1=utvtαtg(θt+utvt){v_{t + 1}} = {u_t}{v_t} - {\alpha _t}\nabla g({\theta _t} + {u_t}{v_t})

θt+1=θt+vt+1{\theta _{t + 1}} = {\theta _t} + {v_{t + 1}}

對比可發現,Nesterov方法和動量方法幾乎一樣,只是梯度處稍有差別。下圖能更直觀看出二者的區別。
上圖爲動量方法,下圖爲Nesterov方法

在這裏插入圖片描述
尤里·內斯特羅夫是俄羅斯數學家,國際公認的凸優化專家,特別是在高效算法開發和數值優化分析方面。他現在是盧旺大學的教授。

FISTA算法的僞代碼見原文,matlab代碼如下:

function [x_2,error] = cs_fista(y,A,lambda,epsilon,itermax)
% Fast Iterative Soft Thresholding Algorithm(FISTA)
% Version: 1.0 written by yfzhang @2019-12-8
% Reference: Beck, Amir, and Marc Teboulle. "A fast iterative 
% shrinkage-thresholding algorithm for linear inverse problems." 
% SIAM journal on imaging sciences 2.1 (2009): 183-202.

% Inputs:
% y         - measurement vector
% A         - measurement matrix
% lambda    - denoiser parameter in the noisy case
% epsilon   - error threshold
% inter_max - maximum number of amp iterations
%
% Outputs:
% x_hat     - the last estimate
% error     - reconstruction error

if nargin < 5
    itermax = 10000 ;
end
if nargin < 4
    epsilon = 1e-4 ;
end
if nargin < 3
    lambda = 2e-5 ;
end

N = size(A,2);
error = [] ;

x_0 = zeros(N,1);
x_1 = zeros(N,1);
t_0 = 1 ;

for i = 1:itermax
    t_1 = (1+sqrt(1+4*t_0^2))/2 ;
    % g_1 = A'*(y-A*x_1);
    alpha =1;
    % alpha = (g_1'*g_1)/((A*g_1)'*(A*g_1)) ;
    z_2 = x_1 + ((t_0-1)/(t_1))*(x_1 - x_0) ;
    z_2 = z_2+A'*(y-A*z_2);
    x_2 = sign(z_2).*max(abs(z_2)-alpha*lambda,0) ;
    error(i,1) = norm(x_2 - x_1)/norm(x_2) ;
    error(i,2) = norm(y-A*x_2) ;
    if error(i,1) < epsilon || error(i,2) < epsilon
        break;
    else
        x_0 = x_1 ;
        x_1 = x_2 ;
        t_0 = t_1 ;
    end
end

4. 仿真實驗

爲了驗證ISTA算法和FISTA算法的算法性能,此處用一維隨機高斯信號做實驗,測試程序如下:

% One-dimensional random Gaussian signal test script for CS reconstruction
% algorithm
% Version: 1.0 written by yfzhang @2019-12-8
clear
clc
N = 1024 ;
M = 512 ;
K = 10 ;
x = zeros(N,1);
T = 5*randn(K,1);
index_k = randperm(N);
x(index_k(1:K)) = T;

A = randn(M,N);
A=sqrt(1/M)*A;
A = orth(A')';
% sigma = 1e-4 ;
% e = sigma*randn(M,1);
y = A * x ;% + e ;

[x_rec1,error1] = cs_fista(y,A,5e-3,1e-4,5e3) ;
[x_rec2,error2] = cs_ista(y,A,5e-3,1e-4,5e3) ;

figure (1)
plot(error1(:,2),'r-');
hold on
plot(error2(:,2),'b-');

仿真結果圖如下所示:
ISTA算法和FISTA算法重構結構
ISTA和FISTA算法收斂速度對比
從實驗結果可以看出,FIST算法收斂速度比ISTA算法要快很多。

這裏順便貼上原文中實驗圖,是關於圖像去噪的:
在這裏插入圖片描述在這裏插入圖片描述
圖示爲迭代次數與去噪效果的直觀圖,左邊爲FISTA算法,右邊爲ISTA算法,可以明顯發現FISTA算法去噪速度較快。

5. 討論

Iterative Shrinkage Thresholding 實際上不能稱爲一種算法,而是一類算法,ISTA算法和FISTA以及ISTA的改進算法如TWISTA算法等都是採用軟閾值操作,求解的是 1{\ell _1} 範數正則化問題(LASSO),而還有一些算法是採用硬閾值操作的,這類算法稱爲迭代硬閾值類算法(Iterative Hard Thresholding),這類算法求解的問題是 0{\ell _0} 約束的最小化問題,是個非凸優化問題,以後有機會總結一下迭代硬閾值類算法。

參考文獻

[1] Beck, Amir, and Marc Teboulle. “A fast iterative shrinkage-thresholding algorithm for linear inverse problems.” SIAM journal on imaging sciences 2.1 (2009): 183-202.
[2] Yurii E Nesterov., Dokl, akad. nauk Sssr. " A method for solving the convex programming problem with convergence rate O (1/k^ 2)" 1983.

更多精彩內容請關注微信公衆號 “優化與算法

優化與算法訂閱號

發佈了11 篇原創文章 · 獲贊 4 · 訪問量 2047
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章