邏輯回歸
Sigmoid函數(shù):
梯度:
。
梯度上升算法到達(dá)每個(gè)點(diǎn)后都會(huì)重新計(jì)算移動(dòng)的方向宙地,不斷迭代移動(dòng)摔认,直到滿足停止條件,停止條件可以是一個(gè)確定的迭代次數(shù)或是達(dá)到較小的誤差宅粥。在迭代過程中参袱,梯度總是選取最佳的移動(dòng)方向。
利用該算法(梯度下降)進(jìn)行求解優(yōu)化問題:
權(quán)值Weights更新:weights=weights+alphadata.transpose()error 按誤差方向調(diào)整權(quán)重(回歸系數(shù))秽梅。即可以寫成:
增量是關(guān)于誤差的一個(gè)函數(shù)抹蚀。
隨機(jī)梯度上升算法:
梯度上升算法每次更新都需要遍歷整個(gè)數(shù)據(jù)集,如果數(shù)據(jù)量巨大企垦,則耗時(shí)很大环壤,復(fù)雜度高。改進(jìn)方法:一次僅用戶一個(gè)樣本點(diǎn)來更新回歸系數(shù)(隨機(jī)梯度上升)钞诡。由于其在新樣本到來時(shí)對分類器進(jìn)行增量式更新郑现,因而這是一個(gè)在線學(xué)習(xí)算法。
用代碼來看兩者的區(qū)別:
梯度上升:
for i in range(max_step):
h = sigmoid(data_mat * weights)
err = (label_mat - h)
weights = weights + alpha * data_mat.transpose() * err
return weights
用全局的誤差來更新weights
隨機(jī)梯度上升:
for i in range(n):
h = sigmoid(numpy.sum(data[i] * weights))
err = label[i] - h
weights = weights + data[i] * alpha * err
return weights
一個(gè)點(diǎn)只計(jì)算一次荧降,遍歷時(shí)使用當(dāng)前點(diǎn)計(jì)算出的誤差來調(diào)整本次的權(quán)值接箫。
兩者區(qū)別在計(jì)算誤差的方式上。
其實(shí)怎么選取不重要朵诫,根據(jù)實(shí)驗(yàn)可以得到:隨機(jī)選取和遍歷每一個(gè)求得當(dāng)前的誤差列牺,最后在于循環(huán)計(jì)算的次數(shù),當(dāng)次數(shù)趨向于一個(gè)合適的值時(shí)拗窃,誤差穩(wěn)定且較小瞎领,則此時(shí)分類即完成泌辫。
http://blog.csdn.net/qq_20945297/article/details/78552273
如果這不是一個(gè)凸優(yōu)化問題,梯度下降勢必會(huì)遇到局部最芯拍(極小值)的情況
如何應(yīng)對其局部最小的問題:
1震放、 以多組不同參數(shù)值初始化多個(gè)神經(jīng)網(wǎng)絡(luò),按標(biāo)準(zhǔn)方法訓(xùn)練后驼修,取其中誤差最小的解作為最終參數(shù)殿遂;這就是從多個(gè)不同的初始點(diǎn)開始搜索尋優(yōu),這樣陷入不同的局部極小值乙各,從而選取更可能接近全局最小的解墨礁;
2、 使用模擬退火:以一定的概率接受比當(dāng)前解更差的結(jié)果耳峦,每步迭代中恩静,接受次優(yōu)解的概率要隨著時(shí)間推移降低,保證算法能夠收斂蹲坷;
3驶乾、 使用隨機(jī)梯度下降,這樣計(jì)算出的梯度仍可能不為0循签,這樣就可能跳出局部極小值级乐。
我的博客即將搬運(yùn)同步至騰訊云+社區(qū),邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan