[本文連接:http://www.cnblogs.com/breezedeus/p/3496819.html,轉載請註明出處]html
從等式約束的最小化問題提及:
上面問題的拉格朗日表達式爲:
也就是前面的最小化問題能夠寫爲:
\(
\min\limits_{x} \max\limits_{y} L(x, y)
\) 。
它對應的對偶問題爲:
\(
\max\limits_{y} \min\limits_{x} L(x, y)
\) 。
下面是用來求解此對偶問題的對偶上升迭代方法:
這個方法在知足一些比較強的假設下能夠證實收斂。 算法
爲了弱化對偶上升方法的強假設性,一些研究者在上世紀60年代提出使用擴展拉格朗日表達式(augmented Lagrangian)代替原來的拉格朗日表達式:
其中\(\rho > 0\)。對應上面的對偶上升方法,獲得下面的乘子法(method of multipliers):
框架
注意,乘子法裏把第二個式子裏的\(\alpha^k\)改爲了擴展拉格朗日表達式中引入的\(\rho\)。這不是一個隨意行爲,而是有理論依據的。利用\(L(x, y)\)能夠導出上面最小化問題對應的原始和對偶可行性條件分別爲(\( \frac{\partial L} {\partial y} = 0\),\( \frac{\partial L} {\partial x} = 0\)):
既然\(x^{k+1}\) 最小化 \( L_{\rho}(x, y^{k})\),有:
上面最後一個等式就是利用了\( y^{k+1} = y^{k} + \rho(A x^{k+1}-b) \)。從上面可知,這種\(y^{k+1}\)的取法使得\( (x^{k+1}, y^{k+1}) \)知足對偶可行條件\( \frac{\partial L} {\partial x} = 0 \)。而原始可行條件在迭代過程當中逐漸成立。 機器學習
乘子法弱化了對偶上升法的收斂條件,但因爲在x-minimization步引入了二次項而致使沒法把x分開進行求解(詳見[1])。而接下來要講的Alternating Direction Method of Multipliers (ADMM)就是指望結合乘子法的弱條件的收斂性以及對偶上升法的可分解求解性。ADMM求解如下形式的最小化問題:
其對應的擴展拉格朗日表達式爲:
ADMM包括如下迭代步驟:
ADMM其實和乘子法很像,只是乘子法裏把\(x\)和\(z\)放一塊求解,而ADMM是分開求解,相似迭代一步的Gauss-Seidel方法。其中(3.4)中的推導相似於乘子法,只是使用了\(z^{k+1}\)最小化\( L_{\rho}(x^{k+1}, z, y^k) \):
其中用到了\(z\)對應的對偶可行性式子:
\(
\frac{\partial L} {\partial z} = \nabla g(z) + B^Ty = 0
\) 分佈式
定義新變量\( u=\frac{1}{\rho}y \),那麼(3.2-3.4)中的迭代能夠變爲如下形式:
在真正求解時一般會使用所謂的over-relaxation方法,也即在\(z\)和\(u\)中使用下面的表達式代替其中的\( Ax^{k+1} \):
\(
\alpha^k A x^{k+1} - (1-\alpha^k)(B z^k - c)
\),
其中\(\alpha^k\)爲relaxation因子。有實驗代表\(\alpha^k \in [1.5, 1.8]\)能夠改進收斂性([2])。 ide
下面讓咱們看看ADMM怎麼被用來求解大型的機器學習模型。所謂的大型,要不就是樣本數太多,或者樣本的維數過高。下面咱們只考慮第一種狀況,關於第二種狀況感興趣的讀者能夠參見最後的參考文獻[1, 2]。樣本數太多沒法一次所有導入內存,常見的處理方式是使用分佈式系統,把樣本分塊,使得每塊樣本能導入到一臺機器的內存中。固然,咱們要的是一個最終模型,它的訓練過程利用了全部的樣本數據。常見的機器學習模型以下:
\(
\text{minimize }_{x} \sum_{j=1}^{J} f_j(x) + g(x)
\),
其中\(x\)爲模型參數,\(f_j(x)\)對應第\(j\)個樣本的損失函數,而\(g(x)\)爲懲罰係數,如\(g(x) = ||x||_1\)。
函數
假設把\(J\)個樣本分紅\(N\)份,每份能夠導入內存。此時咱們把上面的問題重寫爲下面的形式:
除了把目標函數分紅\(N\)塊,還額外加了\(N\)個等式約束,使得利用每塊樣本計算出來的模型參數\(x_i\)都相等。那麼,ADMM中的求解步驟(3.2)-(3.4)變爲:
例如求解L1懲罰的LR模型,其迭代步驟以下(\( u=\frac{1}{\rho}y \),\(g(z)=\lambda ||z||_1\)):
其中\(\bar{x} \doteq \frac1N \sum_{i}^N x_i\),\(\bar{y}\)的定義相似。 學習
在分佈式狀況下,爲了計算方便一般會把\(u\)的更新步驟挪在最前面,這樣\(u\)和\(x\)的更新能夠放在一塊:
測試
ADMM的框架確實很牛逼,把一個大問題分紅可分佈式同時求解的多個小問題。理論上,ADMM的框架能夠解決大部分實際中的大尺度問題。我本身所有實現了一遍這個框架,主要用於求解LR問題,下面說說我碰到的一些問題:
1. 收斂不夠快,每每須要迭代幾十步。總體速度主要依賴於\(x_i\)更新時所使用的優化方法,我的建議使用liblinear裏算法,可是不能直接拿來就用,須要作一些調整。
2. 中止準則和\(\rho\)的選取:中止準則主要考量的是\(x_i\)和\(z\)之間的差別和它們自己的變更狀況,但這些值又受\(\rho\)的取值的影響。它們之間如何權衡並沒有定法。我的建議使用模型在測試集上的效果來肯定是否中止迭代。
3. 不適合MapReduce框架實現:須要保證對數據的分割自始至終都一致;用MPI實現的話相對於其餘算法又未必有什麼優點(如L-BFGS、OwLQN等)。
4. relaxation步驟要謹慎:\(\alpha\)的取值依賴於具體的問題,不少時候的確能夠加快收斂速度,但對有些問題甚至可能帶來不收斂的後果。用的時候不管是用x -> z -> u的更新步驟,仍是用u -> x -> z的更新步驟,在u步使用的x_hat要和在z步使用的相同(使用舊的z),而不是使用z步剛更新的z重算。
5. warm start 和子問題求解逐漸精確的策略能夠下降\(x_i\)更新時的耗時,但也使得算法更加複雜,須要設定的參數也增長了。優化