OWL-QN演算法: 求解L1正則最佳化

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   io   os   ar   for   

    在機器學習模型中,比如監督學習中,我們設計模型,我們重要的的工作是如何求解這個模型的最優值,通常是如何求救損失函數的最小值。比如logistic regression 中我們求解的是的loss function就是負log 最大似然函數。logistic regression 被廣泛應用與互連網應用中,比如反欺詐,廣告ctr。logistic regression是廣義線性模型,優點是簡單,實現容易,線上能很快響應。當資料不是呈現線性關係的時候,如果我們想應用logistic regression就得擴大特徵空間,比如做非線性變換,特徵組合來達到非線性模型的效果。對於非線性模型比如GDBT, Random Forest,SVM的RBF核,相對就不需要做這些特徵變換,因為模型本身已經已經做了非線性工作。我認為,GBDT, Randomn Forest 這種他的非線性方法一個重要的工作就是做特徵的組合,而SVM的RBF核只是單一特徵變換,做了升維工作,讓資料在更高維空間能被劃分。在lr模型中特徵過多,或者非線性模型中,極容易出現過擬合,為了盡量避免過擬合,同樣的做法就是加正則方法。通常的正則方法為L1和L2。L1相對L2有個好處就是,他不僅可以避免過擬合問題,還可以起到特徵選取的作用。當loss function 加L1的正則的時候,最優解會使很多不重要的特徵收斂到0值,而L2隻會把這些特徵收斂到一個很小的值,但不是0。 我們來看下一個通用的加上L1的損失函數:

f(x) = l(x) + c||x||, 其中l(x) 是原來的可導損失函數。 

現在的問題是如何求解f(x) 的最小值點。從f(x) 上來看,應為加了L1,導致在x=0點不可導,所以以往直接算梯度的方法就不可取了。Microsoft  Research的人員在ICML2007提出了一種基於L-BFGS的OWL_QN演算法來求解因為L1加入帶來的不可導問題,具體參考(Andrew G, Gao J. Scalable training of L 1-regularized log-linear models[C]//Proceedings of the 24th international conference on Machine learning. ACM, 2007: 33-40.)。

下面是文獻中把求解函數進行泰特展開,如下:


從上面看到,主要涉及到的就是一個一階梯度,和一個Hessian矩陣。求解hessian矩陣就是這裡的挑戰。L-BFGS採用有限的空間,犧牲少許精度的方法來求救hession。主要涉及幾個一維的向量,具體演算法可參考wiki上的。

下面是wiki上關於L-BFGS的演算法。


附上這塊的部分實現代碼:

 while (gnorm > gtol) and (k < maxiter):        # find search direction (Nocedal & Wright 2006, p.178, Algorithm 7.4)        q = numpy.array(gfk, dtype=gfk.dtype)        size = len(sList)        aList = [None]*size        if size > 0:            for i in xrange(size-1,-1,-1):                aList[i] = rhoList[i] * numpy.dot(sList[i],q)                q -= aList[i] * yList[i]            # modify to ensure a well-scaled search direction (N&W 2006, eq. 7.20)            q *= (rhoList[-1] * numpy.dot(yList[-1],yList[-1]))**(-1)            for i in xrange(size):                b = rhoList[i] * numpy.dot(yList[i],q)                q += sList[i] * (aList[i] - b)        pk = -q        # fix non-descent components        non_descent = numpy.where(pk*gfk>=0)[0]        pk[non_descent] = 0
</pre><p></p><p> </p><p></p><div><p>OWL- QN <span style="font-family:宋體">演算法是</span><span style="font-family:Times New Roman">L-BFGS</span><span style="font-family:宋體">演算法的一種變種,求解</span><span style="font-family:Times New Roman">L1</span><span style="font-family:宋體">上不可導的問題。</span><span style="font-family:Times New Roman">OWL-QN</span><span style="font-family:宋體">相對</span><span style="font-family:Times New Roman">L-BFGS</span><span style="font-family:宋體">,其實大多都是一樣的,要是按照從代碼上來看,也許就是</span><span style="font-family:Times New Roman">30</span><span style="font-family:宋體">行左右代碼不一樣而已。</span><span style="font-family:Times New Roman">OWL-QL </span><span style="font-family:宋體">相對</span><span style="font-family:Times New Roman">L-BFGS</span><span style="font-family:宋體">不一樣的地方</span><span style="font-family:Times New Roman">:</span></p><p>(<span style="font-family:Times New Roman">1</span><span style="font-family:宋體">)每次選取的下一步最有點</span><span style="font-family:Times New Roman">Xk+1</span><span style="font-family:宋體">的的象限進行了限制,不允許跨象限,比如之前</span><span style="font-family:Times New Roman">Xk< 0 , Xk+1</span><span style="font-family:宋體">是不允許大於</span><span style="font-family:Times New Roman">0</span><span style="font-family:宋體">,這種情況只能把</span><span style="font-family:Times New Roman">Xk+1</span><span style="font-family:宋體">設為</span><span style="font-family:Times New Roman">0</span><span style="font-family:宋體">;</span></p></div><p></p><p>(2)最原始損失函數的梯度了,做了個次梯度修正(加上L1的修正)。</p><p>這兩點,我們從wiki上分先的OWL- QN的python代碼上能看到;</p><p>(1)</p><pre code_snippet_id="469899" snippet_file_name="blog_20140916_8_4170922" name="code" class="python">在def simple_line_search_owlqn(f, old_fval, xk, pk, gfk, k, Cvec):..............while True:        new_x = xk + alpha * pk        crossed_discont = numpy.where(numpy.logical_and(Cvec>0, xk*new_x<0))[0]        new_x[crossed_discont] = 0        new_fval = f(new_x) + numpy.dot(Cvec,numpy.absolute(new_x))        if new_fval <= old_fval + c1 * dirDeriv * alpha:            break        alpha *= backoff        if alpha <= 1e-4:            return None, None, None

(2) 

  gfkp1 = myfprime(xkp1) # raw loss function gradient;        # find penalized subgradients   gfkp1 = subgrad(xkp1,gfkp1,Cvec)# subgrad:def subgrad(x, gf, Cvec):    """Subgradient computation for fmin_owlqn."""    for i in numpy.where(Cvec>0)[0]:        if x[i] < 0:            gf[i] -= Cvec[i]        elif x[i] > 0:            gf[i] += Cvec[i]        else:            if gf[i] < -Cvec[i]:                gf[i] += Cvec[i]            elif gf[i] > Cvec[i]:                gf[i] -= Cvec[i]            else:                gf[i] = 0    return gf

參考文獻:

[1]  Andrew G, Gao J. Scalable training of L 1-regularized log-linear models[C]//Proceedings of the 24th international conference on Machine learning. ACM, 2007: 33-40.

[2] http://en.wikipedia.org/wiki/Limited-memory_BFGS

[3] http://www.umiacs.umd.edu/~msubotin/owlqn.py   . Python implementation by Michael Subotin, intended for use with SciPy

OWL-QN演算法: 求解L1正則最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.