上周在實驗室里師姐說了這么一個問題,對於線性回歸問題,最小二乘法和梯度下降方法所求得的權重值是一致的,對此我頗有不同觀點。如果說這兩個解決問題的方法的等價性的確可以根據數學公式來證明,但是很明顯的這個說法是否真正的成立其實很有其它的一些考慮因素在里面,以下給出我個人的一些觀點:
1. 首先,在討論最小二乘法和梯度下降對某數據集進行線性擬合的結果是否相同的問題之前,我們應該需要確保該數據集合的確符合線性模型,如果不符合那么得出的結果將會是非常有意思的,
該種情況在之前的博客中已有介紹,下面給出網址:http://www.cnblogs.com/devilmaycry812839668/p/7704729.html
2. 再者, 在討論二者結果是否相同的問題之前如果對梯度下降法做過實際編碼的人員一定知道這么一個東西,那就是步長,即每次對權重進行修正時的權重配比。雖然對於凸優化問題對初始點不敏感,但是步長的設置卻會影響最終收斂時權重的精度,甚至造成權值震盪的想象發生,以下給出具體實驗代碼及結果:
最小二乘法:
#!/usr/bin/env python #encoding:UTF-8 import numpy as np import matplotlib.pyplot as plt np.random.seed(0) N=10 X=np.linspace(-3, 3, N) Z=-5.0+X+np.random.random(N) P=np.ones((N, 1)) P=np.c_[P, X] t=np.linalg.pinv(P) w=np.dot(t, Z) print "擬合后的權重:" print w A=np.dot(P, w)-Z print "擬合后的LOSTFUNCTION值:" print np.dot(A, A)/2
結果:
梯度下降法:
#!/usr/bin/env python #encoding:UTF-8 import numpy as np import matplotlib.pyplot as plt np.random.seed(0) N=10 X=np.linspace(-3, 3, N) Z=-5+X+np.random.random(N) P=np.ones((N, 1)) P=np.c_[P, X] alafa=0.001 def fun(): W=np.random.random(2) for _ in xrange(1000000000): A=(np.dot(P, W)-Z) W0=alafa*( np.sum(A) ) W1=alafa*( np.dot(A, X) ) if abs(W0)+abs(W1)<0.000001: break W[0]=W[0]-W0 W[1]=W[1]-W1 return W list_global=[] for _ in xrange(100): list_global.append( fun() ) list_global.sort(key=lambda x:x[0]) for k in list_global: print k
結果:
[-4.38413472 1.01451241] [-4.38413469 1.01451241] [-4.38413469 1.01451241] [-4.38413468 1.01451241] [-4.38413468 1.01451241] [-4.38413464 1.01451241] [-4.38413463 1.01451241] [-4.38413461 1.01451241] [-4.38413461 1.01451241] [-4.3841346 1.01451241] [-4.38413459 1.01451241] [-4.38413458 1.01451241] [-4.38413457 1.01451241] [-4.38413457 1.01451241] [-4.38413457 1.01451241] [-4.38413455 1.01451241] [-4.38413454 1.01451241] [-4.38413451 1.01451241] [-4.38413446 1.01451241] [-4.38413444 1.01451241] [-4.38413444 1.01451241] ...... ...... ......
由梯度下降法可知,由於初始點的不同最終的優化結果稍有差異,但是考慮精度的情況下可以認為所有結果均為一致,此時是支持學姐的說法的。
若改變步長大小,即
可得結果:
[-4.3842247 1.01451241] [-4.38422468 1.01451241] [-4.38422468 1.01451241] [-4.38422467 1.01451241] [-4.38422465 1.01451241] [-4.38422464 1.01451241] [-4.3842246 1.01451241] [-4.38422459 1.01451241] [-4.38422458 1.01451241] [-4.38422457 1.01451241] [-4.38422455 1.01451241] [-4.38422455 1.01451241] [-4.38422453 1.01451241] [-4.38422452 1.01451241] [-4.38422452 1.01451241] [-4.38422452 1.01451241] [-4.38422451 1.01451241] [-4.3842245 1.01451241] ......... ........ ........
此時,運行結果和上個實驗的運行結果稍有不同,可以發現該種差異源於步長大小的設置上,也就是說步長的大小不同導致了最終結果的精確度不同。
這次,我們再次改變步長大小,此時運行的結果並沒有出來,可以說上面的程序在該步長下是無法運行出結果的,下面做下修改:
#!/usr/bin/env python #encoding:UTF-8 import numpy as np import matplotlib.pyplot as plt np.random.seed(0) N=10 X=np.linspace(-3, 3, N) Z=-5+X+np.random.random(N) P=np.ones((N, 1)) P=np.c_[P, X] alafa=0.1 def fun(): W=np.random.random(2) for _ in xrange(100): A=(np.dot(P, W)-Z) W0=alafa*( np.sum(A) ) W1=alafa*( np.dot(A, X) ) W[0]=W[0]-W0 W[1]=W[1]-W1 print W fun()
運行結果,如下:
[-4.38423372 2.30949239] [-4.38423372 -2.43876754] [ -4.38423372 10.22325895] [ -4.38423372 -23.54214502] [ -4.38423372 66.49893222] [ -4.38423372 -173.61060709] [ -4.38423372 466.68149774] [ -4.38423372 -1240.76411513] [ -4.38423372 3312.42418586] [ -4.38423372e+00 -8.82941128e+03] [ -4.38423372e+00 2.35488166e+04] [ -4.38423372e+00 -6.27931245e+04] [ -4.38423372e+00 1.67452052e+05] [ -4.38423372e+00 -4.46535085e+05] [ -4.38423372e+00 1.19076395e+06] [ -4.38423372e+00 -3.17536680e+06] [ -4.38423372e+00 8.46764853e+06] [ -4.38423371e+00 -2.25803924e+07] [ -4.38423372e+00 6.02143834e+07] [ -4.38423371e+00 -1.60571685e+08] [ -4.38423375e+00 4.28191164e+08] [ -4.38423373e+00 -1.14184310e+09] ....... ....... ....... [ -2.14824842e+17 2.17682829e+33] [ 1.31051609e+17 -5.80487543e+33] [ -7.91285594e+17 1.54796678e+34] [ 1.97572602e+18 -4.12791142e+34] [ -3.55829721e+18 1.10077638e+35] [ 1.11990981e+19 -2.93540367e+35] [ -3.30730877e+19 7.82774313e+35] [ 5.54712838e+19 -2.08739817e+36] [ -4.16765364e+20 5.56639512e+36] [ 2.91589608e+20 -1.48437203e+37] [ 2.91589608e+20 3.95832542e+37] [ 5.95842939e+21 -1.05555344e+38] [ -5.37525017e+21 2.81480918e+38] [ 2.48478953e+22 -7.50615783e+38] [ -6.58215412e+22 2.00164209e+39] [ 4.17748787e+23 -5.33771223e+39] [ -7.91177033e+23 1.42338993e+40] [ 1.14310428e+24 -3.79570648e+40] [ -2.72545834e+24 1.01218839e+41] [ 5.01166690e+24 -2.69916905e+41] [ -2.59368341e+25 7.19778413e+41] [ 3.59601679e+25 -1.91940910e+42]
可見,其權重值是發散的,並不斷震盪。
再次更改步長,
運行結果:
[-2.31385021 1.5972534 ] [-3.55608032 0.31522322] [-4.05297236 1.85365944] [-4.25172917 0.00753598] [-4.3312319 2.22288413] [-4.36303299 -0.43553365] [-4.37575343 2.75456769] [-4.3808416 -1.07355392] [-4.38287687 3.52019201] [-4.38369098 -1.99230311] [-4.38401662 4.62269104] [-4.38414688 -3.31530194] [-4.38419898 6.21028963] [-4.38421982 -5.22042025] [-4.38422816 8.49643161] [-4.38423149 -7.96379062] [ -4.38423283 11.78847605] [ -4.38423336 -11.91424395] [ -4.38423357 16.52902005] [ -4.38423366 -17.60289675] [ -4.38423369 23.35540341] [ -4.38423371 -25.79455679] [ -4.38423371 33.18539545] [ -4.38423372 -37.59054724] [ -4.38423372 47.34058399] [ -4.38423372 -54.57677348] ............ ............ ............ [ -4.38423372e+00 2.61036000e+06] [ -4.38423372e+00 -3.13242977e+06] [ -4.38423372e+00 3.75891795e+06] [ -4.38423372e+00 -4.51069931e+06] [ -4.38423372e+00 5.41284140e+06] [ -4.38423372e+00 -6.49540745e+06] [ -4.38423372e+00 7.79449117e+06] [ -4.38423372e+00 -9.35338718e+06] [ -4.38423372e+00 1.12240668e+07] [ -4.38423372e+00 -1.34688780e+07] [ -4.38423372e+00 1.61626558e+07] [ -4.38423372e+00 -1.93951847e+07] [ -4.38423372e+00 2.32742239e+07] [ -4.38423371e+00 -2.79290665e+07] [ -4.38423372e+00 3.35148820e+07] [ -4.38423371e+00 -4.02178562e+07]
可以,看到該種步長下,常數項權重收斂,X項權重仍然震盪。
由此,可以看出 對於 最小二乘 及 梯度下降 能否得到 相同權重結果 還是蠻有討論的一個問題。
==============================================================
對於,梯度下降 權重震盪的附加一個解釋:
在梯度下降問題中,如上圖所示,W為權重的真實值,W1 為梯度下降過程中對真實值的估計,在此之前所有權重的估計值(即,歷史估計的值,或者說迭代過程中在對真實值進行逼近的過程中)所取得的所有值均在真實值的一側, W2為首次估計值越過真實值到達另一側的權重值, W’ 為W1關於真實值在其另一側的對稱值,如果W2比W’ 更靠近真實值,則下一次的權重估計值 W3 必然比 W1 更逼近真實值。此時,為收斂的。該種情況下說明步長的選擇可以使權重收斂。
如果,W2 比 W’ 要遠離真實值,則W3 必然比 W1 相比要遠離真實值W。此時,權重的估計是發散的。
具體示意圖如下: