問題來源
在讀論文的時候,遇到了ADMM(交替方向乘子法)算法,不明所以,於是查了一下,大概是一個凸優化算法,下面大概講一下其原理和過程。
簡介
交替方向乘子法(ADMM)是一種求解具有可分離的凸優化問題的重要方法,由於處理速度快,收斂性能好,ADMM算法在統計學習、機器學習等領域有着廣泛應用。
文獻來源
Boyd S, Parikh N, Chu E, et al. Distributed optimization and statistical learning via the alternating direction method of multipliers[J]. Foundations and Trends® in Machine learning, 2011, 3(1): 1-122.
凸優化問題
首先正常的優化問題為:
這是最簡單的優化問題,其中 x 是優化變量,也就是可以改變的數值,通過調節 x 的大小,使得目標函數 f(x) 的數值達到最小。值得注意的是,x的值並一定是數值,也可能是向量或者矩陣。
像上式那樣,只有函數,對於變量 x沒有要求,其實是最簡單的一類優化問題:無約束優化問題。那么什么是凸優化問題呢,對應凸函數下的帶約束的問題便是凸優化問題,凸函數的一個顯著特征是該函數上的任意兩點的連線都在該函數之上,在二維上最簡單的凸函數即為: $$ y=x^2 $$ 在三維圖像上可以理解為形狀為山谷的函數。
實際上x不可能完全沒有約束條件,否則那樣的話我們直接通過求解函數的導數便可以找到最優解。實際問題往往會對x做一些約束,一共有兩種約束:
- 等式約束: \(subject to Ax=b\)
- 不等式約束:\(subject to Ax <= b\)
其中等式約束時要求x滿足一定的等式,實際上任何復雜的等式約束都可以化簡為上述的形式,進行求解。不等式約束也很容易理解,往往是某些約束的最低值或者最高值。如果同時有最低和最高,可拆成兩個不等式。
基於以上的理解,一個包含等式約束的凸優化問題應該是這樣的:
ADMM算法
解決的問題
ADMM算法解決的是兩個變量下的優化問題,從原來問題的一個變量,變為兩個變量,實際上任意個變量的問題都可以拆解為2變量問題?那么上面的優化公式就變為了:
這也就意味着ADMM算法解決的是一個等式約束的問題,且該問題兩個函數f(x)和g(x)是成線性加法的關系。這意味着兩者實際上是整體優化的兩個part,兩者的資源占用符合一定等式,對整體優化貢獻不同,但是是簡單加在一起的。
事實上分布式中的一致性優化問題(consensus),分享問題(sharing problem)等等都很好寫成這樣的形式,因為每個節點的變量還要跟周圍節點變量產生關聯,但真正用ADMM的原因可能還是因為ADMM又快又好用吧。
使用的方法
與ADMM最為相關的大概就是原始對偶方法中的增廣拉格朗日法(ALM)。拉格朗日函數實際上是解決多個約束條件下的優化問題的,這種方法可以將一個有n個變量與k個約束條件的最優化問題轉換為一個解有n + k個變量的方程組的解的問題。構造拉格朗日函數的方法在一般的高等數學教材里也可以找到。而增廣拉格朗日法是加了懲罰項的拉格朗日法,目的是使得算法收斂的速度更快。
那么對上述的簡單的凸優化問題構造拉格朗日函數,便可以得到:
原來帶約束求解 \(min_x f(x)\) ,現在求解對偶問題 \(\max_{\lambda}\min_{x}L(x,\lambda)\),兩個問題的最優解等價,並且沒有了約束條件。
然后使用對偶上升法,得到:
對偶上升法實際上是將:
拆成了兩步,第一步,先固定\(\lambda\)然后求解
將求解后的x代入到拉格朗日函數當中,用類似於梯度下降的方法,得到\(\lambda\)的更新公式。
有時候為了加快算法收斂速度,會再增加一些懲罰項來加快收斂,於是就有了增廣拉格朗日:
ADMM
ADMM其實也是一直增廣拉格朗日函數,只不過由一個變量變為了兩個變量,那么對應的ADMM就成為了
那么,使用和增廣拉格朗日類似的方法,固定其中兩個變量,去更新第三個變量的值,於是便有:
於是問題就變化為了如何求解\(arg min_x L\),那么就可以很開心地使用梯度下降法了。