前言:
FISTA(A fast iterative shrinkage-thresholding algorithm)是一種快速的迭代閾值收縮算法(ISTA)。FISTA和ISTA都是基於梯度下降的思想,在迭代過程中進行了更為聰明(smarter)的選擇,從而達到更快的迭代速度。理論證明:FISTA和ISTA的迭代收斂速度分別為O(1/k2)和O(1/k)。
本篇博文先從解決優化問題的傳統方法“梯度下降”開始,然后引入ISTA,最后再上升為FISTA。文章主要參考資料如下:
[1] A Fast Iterative Shrinkage-Thresholding Algorithm for Linear Inverse Problems。
[2] Proximal Gradient Descent for L1 Regularization
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------我是分割線-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
正文:
考慮以下線性轉換問題:b = Ax + w (1)
例如在圖像模糊問題中,A為模糊模板(由未模糊圖像通過轉換而來),b為模糊圖像,w為噪聲。並且,A和b已知,x為待求的系數。
求解該問題的的傳統方法為最小二乘法,思想很簡單粗暴:使得重構誤差||Ax-b||2最小。即:
對f(x) = ||Ax-b||2求導,可得其導數為:f'(x) = 2AT(Ax-b)。對於該問題,令導數為零即可以取得最小值(函數f(x)為凸函數,其極小值即為最小值)。
1)如果A為非奇異矩陣,即A可逆的話,那么可得該問題的精確解為x=A-1b。
2)如果A為奇異矩陣,即A不可逆,則該問題沒有精確解。退而求其次,我們求一個近似解就好,||Ax-b||2<= ϵ。
![]()
其中,||x||1為懲罰項,用以規范化參數x。該例子使用L1范數作為懲罰項,是希望x盡量稀疏(非零元素個數盡可能少),即b是A的一個稀疏表示。||Ax-b||2<=ϵ則為約束條件,即重構誤差最小。問題(3)也可以描述為:
![]()
式子(4)即為一般稀疏表示的優化問題。希望重構誤差盡可能小,同時參數的個數盡可能少。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------我是分割線-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
考慮更為一般的情況,我們來討論梯度下降法。有無約束的優化問題如下:
![]()
梯度下降法基於這樣的觀察:如果實值函數F(x)在點a處可微且有定義,那么函數F(x)在點a沿着梯度相反的方向 -∇F(a) 下降最快。
基於此,我們假設f(x)連續可微(continuously differentiable)。如果存在一個足夠小的數值t>0使得x2 = x1 - t∇F(a),那么:
F(x2) <= F(x1)
梯度下降法的核心就是通過式子(6)找到序列{xk},使得F(xk) <= F(xk-1)。
![]()
下圖詳細說明了梯度下降的過程:

從上圖可以看出:初始點不同,獲得的最小值也不同。因為梯度下降法求解的是局部最小值,受初值的影響較大。如果函數f(x)為凸函數的話,則局部最小值亦為全局最小值。這時,初始點只對迭代速度有影響。
再回頭看一下式子(6),我們使用步長tk和導數∇F(xk)來控制每一次迭代時x的變化量。再看一下上面那張圖,彩色繽紛那張。對於每一次迭代,我們當然希望F(x)的值降得越快越好,這樣我們就能更快速得獲得函數的最小值。因此,步長tk的選擇很重要。
如果步長tk太小,則找到最小值的迭代次數非常多,即迭代速度非常慢,或者說迭代的收斂速度很慢;而步長太大的話,則會出現overshoot the minimum的現象,即不斷在最小值左右徘徊,跳來跳去的,如下圖所示:

然而,tk最后還是作用在xk-1上,得到xk。因此,更為朴素的思想應該是:序列{xk}的個數盡可能小,即每一次迭代步伐盡可能大,函數值減少得盡可能多。那么就是關於序列{xk}的選擇了,如何更好的選擇每一個點xk,使得函數值更快的趨近其最小值。
ISTA和FISTA求解最小化問題的思想就是基於梯度下降法的,它們的優化在於對{xk}的選擇上。這里我們不講證明,只講思想。想看證明的話,請看參考資料[1]。
下面來講ISTA(Iterative shrinkage-thresholding algorithm),即迭代閾值收縮算法。
先從無約束的優化問題開始,即上面的式子(5):
![]()
這時候,我們還假設了f(x)滿足Lipschitz連續條件,即f(x)的導數有下界,其最小下界稱為Lipschitz常數L(f)。這時,對於任意的L>=L(f),有:
(7)
基於此,在點xk附近可以把函數值近似為:
(8)
在梯度下降的每一步迭代中,將點xk-1處的近似函數取得最小值的點作為下一次迭代的起始點xk,這就是所謂的proximal regularization算法(其中,tk=1/L)。
(9)
上面的方法只適合解決非約束問題。而ISTA要解決的可是帶懲罰項的優化問題,引入范數規范化函數g(x)對參數x進行約束,如下:
(10)
使用更為一般的二次近似模型來求解上述的優化問題,在點y,F(x) := f(x) + g(x)的二次近似函數為:
(11)
該函數的最小值表示為:
(12)
忽略其常數項f(y)和∇F(y),結合式子(11)和(12),PL(y)可以寫成:
(13)
顯然,使用ISTA解決帶約束的優化問題時的基本迭代步驟為:
(14)
固定步長的ISTA的基本迭代步驟如下(步長t = 1/L(f)):

然而,固定步長的ISTA的缺點是:Lipschitz常數L(f)不一定可知或者可計算。例如,L1范數約束的優化問題,其Lipschitz常數依賴於ATA的最大特征值。而對於大規模的問題,非常難計算。因此,使用以下帶回溯(backtracking)的ISTA:

理論證明:ISTA的收斂速度為O(1/k);而FISTA的收斂速度為O(1/k2)。實際應用中,FISTA亦明顯快於ISTA。其證明過程還是看這篇文章:[1]。
FISTA與ISTA的區別在於迭代步驟中近似函數起始點y的選擇。ISTA使用前一次迭代求得的近似函數最小值點xk-1,而FISTA則使用另一種方法來計算y的位置。理論證明,其收斂速度能夠達到O(1/k2)。固定步長的FISTA的基本迭代步驟如下:

當然,考慮到與ISTA同樣的問題:問題規模大的時候,決定步長的Lipschitz常數計算復雜。FISTA與ISTA一樣,亦有其回溯算法。在這個問題上,FISTA與ISTA並沒有區別,上面也說了,FISTA與ISTA的區別僅僅在於每一步迭代時近似函數起始點的選擇。更加簡明的說:FISTA用一種更為聰明的辦法選擇序列{xk},使得其基於梯度下降思想的迭代過程更加快速地趨近問題函數F(x)的最小值。
帶回溯的FISTA算法基本迭代步驟如下:

值得注意的是,在每一步迭代中,計算近似函數的起止點時,FISTA使用前兩次迭代過程的結果xk-1,xk-1,對其進行簡單的線性組合生成下一次迭代的近似函數起始點yk。方法很簡單,但效果卻非常好。當然,這也是有理論支持的。
FISTA算法就介紹到這里啦!如果有什么講的不夠明白的地方,還希望各位看客指點。
