分類(lèi):版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
目錄(?)[+]

以均方誤差作為目標(biāo)函數(shù)(損失函數(shù)),目的是使其值最小化,用于優(yōu)化上式。

也叫批量梯度下降法Batch Gradient Descent,BSD


原因:


SGD是最速梯度下降法的變種。
使用最速梯度下降法,將進(jìn)行N次迭代,直到目標(biāo)函數(shù)收斂,或者到達(dá)某個(gè)既定的收斂界限。每次迭代都將對(duì)m個(gè)樣本進(jìn)行計(jì)算,計(jì)算量大。
為了簡(jiǎn)便計(jì)算,SGD每次迭代僅對(duì)一個(gè)樣本計(jì)算梯度,直到收斂。偽代碼如下(以下僅為一個(gè)loop,實(shí)際上可以有多個(gè)這樣的loop,直到收斂):

(1)由于SGD每次迭代只使用一個(gè)訓(xùn)練樣本,因此這種方法也可用作online learning。
(2)每次只使用一個(gè)樣本迭代,若遇上噪聲則容易陷入局部最優(yōu)解。
(1)這是介于BSD和SGD之間的一種優(yōu)化算法。每次選取一定量的訓(xùn)練樣本進(jìn)行迭代。
(2)從公式上似乎可以得出以下分析:速度比BSD快,比SGD慢;精度比BSD低,比SGD高。
(1)選擇n個(gè)訓(xùn)練樣本(n<m,m為總訓(xùn)練集樣本數(shù))
(2)在這n個(gè)樣本中進(jìn)行n次迭代,每次使用1個(gè)樣本
(3)對(duì)n次迭代得出的n個(gè)gradient進(jìn)行加權(quán)平均再并求和,作為這一次mini-batch下降梯度
(4)不斷在訓(xùn)練集中重復(fù)以上步驟,直到收斂。
=============================================以線(xiàn)性回歸為例,用梯度下降算法進(jìn)行參數(shù)更新的公式為
每次僅用一個(gè)example來(lái)更新參數(shù)
1. 隨機(jī)重排列整個(gè)訓(xùn)練集(shuffle)
2. 重復(fù)下列過(guò)程多次(數(shù)據(jù)集較大時(shí)可以重復(fù)1~10次)
for i = 1, ..., m {
介于批梯度下降和隨機(jī)梯度下降之間,批梯度處理利用全部m個(gè)example進(jìn)行參數(shù)更新;隨機(jī)梯度下降只用1個(gè)example進(jìn)行參數(shù)更新;而Mini梯度下降使用b(1<b<m)個(gè)example進(jìn)行參數(shù)更新。仍以線(xiàn)性回歸為例,加入我們有m=1000個(gè)example,我們可以用每b=10個(gè)example進(jìn)行參數(shù)更新,例如:
Repeat { for i = 1, 11, 21, ..., 991 {
批梯度處理能夠保證算法收斂到最小值(如果選擇的學(xué)習(xí)速率
隨機(jī)梯度下降并不能保證算法收斂到最小值,最終結(jié)果可能是在最小值附近來(lái)回游走,為了觀(guān)察其收斂特性,可以plot每100(1000)次迭代時(shí)100個(gè)example代價(jià)函數(shù)函數(shù)
之前的算法都是有一個(gè)固定的訓(xùn)練集來(lái)訓(xùn)練模型,當(dāng)模型訓(xùn)練好后對(duì)未來(lái)的example進(jìn)行分類(lèi)、回歸等。在線(xiàn)學(xué)習(xí)則不同,它對(duì)每個(gè)新來(lái)的example進(jìn)行模型參數(shù)更新,因此不需要固定的訓(xùn)練集,參數(shù)更新的方式則是采用隨機(jī)梯度下降。在線(xiàn)學(xué)習(xí)的優(yōu)勢(shì)是模型參數(shù)可以隨用戶(hù)的偏好自適應(yīng)的進(jìn)行調(diào)整,以logistic回歸為例,在線(xiàn)學(xué)習(xí)方式如下:
Repeat forever { 1. 獲取當(dāng)前example (x, y) 2. 使用(x,y)進(jìn)行參數(shù)更新:
這部分內(nèi)容Andrew Ng講得不多,可以認(rèn)為僅僅講了多個(gè)機(jī)器的求和問(wèn)題,比如如何求解1+2+3+...+1000?Map過(guò)程:四個(gè)機(jī)器分別計(jì)算1+2+...+250,251+252+...+500, 501+502...+750,751+752+...+1000,然后Reduce過(guò)程:將四個(gè)機(jī)器求和的結(jié)果sum1,sum2,sum3,sum4匯總到一臺(tái)機(jī)器上,計(jì)算sum1+sum2+sum3+sum4。
問(wèn)題的引入:
考慮一個(gè)典型的有監(jiān)督機(jī)器學(xué)習(xí)問(wèn)題,給定m個(gè)訓(xùn)練樣本S={x(i),y(i)},通過(guò)經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化來(lái)得到一組權(quán)值w,則現(xiàn)在對(duì)于整個(gè)訓(xùn)練集待優(yōu)化目標(biāo)函數(shù)為:

其中
為單個(gè)訓(xùn)練樣本(x(i),y(i))的損失函數(shù),單個(gè)樣本的損失表示如下:

引入L2正則,即在損失函數(shù)中引入
,那么最終的損失為:

注意單個(gè)樣本引入損失為(并不用除以m):

正則化的解釋
這里的正則化項(xiàng)可以防止過(guò)擬合,注意是在整體的損失函數(shù)中引入正則項(xiàng),一般的引入正則化的形式如下:

其中L(w)為整體損失,這里其實(shí)有:

這里的 C即可代表
,比如以下兩種不同的正則方式:

下面給一個(gè)二維的示例圖:我們將模型空間限制在w的一個(gè)L1-ball 中。為了便于可視化,我們考慮兩維的情況,在(w1, w2)平面上可以畫(huà)出目標(biāo)函數(shù)的等高線(xiàn),而約束條件則成為平面上半徑為C的一個(gè) norm ball 。等高線(xiàn)與 norm ball 首次相交的地方就是最優(yōu)解

可以看到,L1-ball 與L2-ball 的不同就在于L1在和每個(gè)坐標(biāo)軸相交的地方都有“角”出現(xiàn),而目標(biāo)函數(shù)的測(cè)地線(xiàn)除非位置擺得非常好,大部分時(shí)候都會(huì)在角的地方相交。注意到在角的位置就會(huì)產(chǎn)生稀疏性,例如圖中的相交點(diǎn)就有w1=0,而更高維的時(shí)候(想象一下三維的L1-ball 是什么樣的?)除了角點(diǎn)以外,還有很多邊的輪廓也是既有很大的概率成為第一次相交的地方,又會(huì)產(chǎn)生稀疏性,相比之下,L2-ball 就沒(méi)有這樣的性質(zhì),因?yàn)闆](méi)有角,所以第一次相交的地方出現(xiàn)在具有稀疏性的位置的概率就變得非常小了。
因此,一句話(huà)總結(jié)就是:L1會(huì)趨向于產(chǎn)生少量的特征,而其他的特征都是0,而L2會(huì)選擇更多的特征,這些特征都會(huì)接近于0。Lasso在特征選擇時(shí)候非常有用,而Ridge就只是一種規(guī)則化而已。
Batch Gradient Descent
有了以上基本的優(yōu)化公式,就可以用Gradient Descent 來(lái)對(duì)公式進(jìn)行求解,假設(shè)w的維度為n,首先來(lái)看標(biāo)準(zhǔn)的Batch Gradient Descent算法:

repeat until convergency{
for j=1;j<n ; j++:
![]()
}
這里的批梯度下降算法是每次迭代都遍歷所有樣本,由所有樣本共同決定最優(yōu)的方向。
stochastic Gradient Descent
隨機(jī)梯度下降就是每次從所有訓(xùn)練樣例中抽取一個(gè)樣本進(jìn)行更新,這樣每次都不用遍歷所有數(shù)據(jù)集,迭代速度會(huì)很快,但是會(huì)增加很多迭代次數(shù),因?yàn)槊看芜x取的方向不一定是最優(yōu)的方向.
repeat until convergency{
random choice j from all m training example:
}
mini-batch Gradient Descent
這是介于以上兩種方法的折中,每次隨機(jī)選取大小為b的mini-batch(b<m), b通常取10,或者(2...100),這樣既節(jié)省了計(jì)算整個(gè)批量的時(shí)間,同時(shí)用mini-batch計(jì)算的方向也會(huì)更加準(zhǔn)確。
repeat until convergency{
for j=1;j<n ; j+=b:
![]()
}
最后看并行化的SGD:

若最后的v達(dá)到收斂條件則結(jié)束執(zhí)行,否則回到第一個(gè)for循環(huán)繼續(xù)執(zhí)行,該方法同樣適用于minibatch gradient descent。
分類(lèi): 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
梯度下降(GD)是最小化風(fēng)險(xiǎn)函數(shù)、損失函數(shù)的一種常用方法,隨機(jī)梯度下降和批量梯度下降是兩種迭代求解思路,下面從公式和實(shí)現(xiàn)的角度對(duì)兩者進(jìn)行分析,如有哪個(gè)方面寫(xiě)的不對(duì),希望網(wǎng)友糾正。
下面的h(x)是要擬合的函數(shù),J(theta)損失函數(shù),theta是參數(shù),要迭代求解的值,theta求解出來(lái)了那最終要擬合的函數(shù)h(theta)就出來(lái)了。其中m是訓(xùn)練集的記錄條數(shù),j是參數(shù)的個(gè)數(shù)。


1、批量梯度下降的求解思路如下:
(1)將J(theta)對(duì)theta求偏導(dǎo),得到每個(gè)theta對(duì)應(yīng)的的梯度

(2)由于是要最小化風(fēng)險(xiǎn)函數(shù),所以按每個(gè)參數(shù)theta的梯度負(fù)方向,來(lái)更新每個(gè)theta

(3)從上面公式可以注意到,它得到的是一個(gè)全局最優(yōu)解,但是每迭代一步,都要用到訓(xùn)練集所有的數(shù)據(jù),如果m很大,那么可想而知這種方法的迭代速度!!所以,這就引入了另外一種方法,隨機(jī)梯度下降。
2、隨機(jī)梯度下降的求解思路如下:
(1)上面的風(fēng)險(xiǎn)函數(shù)可以寫(xiě)成如下這種形式,損失函數(shù)對(duì)應(yīng)的是訓(xùn)練集中每個(gè)樣本的粒度,而上面批量梯度下降對(duì)應(yīng)的是所有的訓(xùn)練樣本:

(2)每個(gè)樣本的損失函數(shù),對(duì)theta求偏導(dǎo)得到對(duì)應(yīng)梯度,來(lái)更新theta
![]()
(3)隨機(jī)梯度下降是通過(guò)每個(gè)樣本來(lái)迭代更新一次,如果樣本量很大的情況(例如幾十萬(wàn)),那么可能只用其中幾萬(wàn)條或者幾千條的樣本,就已經(jīng)將theta迭代到最優(yōu)解了,對(duì)比上面的批量梯度下降,迭代一次需要用到十幾萬(wàn)訓(xùn)練樣本,一次迭代不可能最優(yōu),如果迭代10次的話(huà)就需要遍歷訓(xùn)練樣本10次。但是,SGD伴隨的一個(gè)問(wèn)題是噪音較BGD要多,使得SGD并不是每次迭代都向著整體最優(yōu)化方向。
3、對(duì)于上面的linear regression問(wèn)題,與批量梯度下降對(duì)比,隨機(jī)梯度下降求解的會(huì)是最優(yōu)解嗎?
(1)批量梯度下降---最小化所有訓(xùn)練樣本的損失函數(shù),使得最終求解的是全局的最優(yōu)解,即求解的參數(shù)是使得風(fēng)險(xiǎn)函數(shù)最小。
(2)隨機(jī)梯度下降---最小化每條樣本的損失函數(shù),雖然不是每次迭代得到的損失函數(shù)都向著全局最優(yōu)方向, 但是大的整體的方向是向全局最優(yōu)解的,最終的結(jié)果往往是在全局最優(yōu)解附近。
4、梯度下降用來(lái)求最優(yōu)解,哪些問(wèn)題可以求得全局最優(yōu)?哪些問(wèn)題可能局部最優(yōu)解?
對(duì)于上面的linear regression問(wèn)題,最優(yōu)化問(wèn)題對(duì)theta的分布是unimodal,即從圖形上面看只有一個(gè)peak,所以梯度下降最終求得的是全局最優(yōu)解。然而對(duì)于multimodal的問(wèn)題,因?yàn)榇嬖诙鄠€(gè)peak值,很有可能梯度下降的最終結(jié)果是局部最優(yōu)。
5、隨機(jī)梯度和批量梯度的實(shí)現(xiàn)差別
以前一篇博文中NMF實(shí)現(xiàn)為例,列出兩者的實(shí)現(xiàn)差別(注:其實(shí)對(duì)應(yīng)Python的代碼要直觀(guān)的多,以后要練習(xí)多寫(xiě)python!)
[java] view plain copy// 隨機(jī)梯度下降,更新參數(shù) public void updatePQ_stochastic(double alpha, double beta) { for (int i = 0; i < M; i++) { ArrayList<Feature> Ri = this.dataset.getDataAt(i).getAllFeature(); for (Feature Rij : Ri) { // eij=Rij.weight-PQ for updating P and Q double PQ = 0; for (int k = 0; k < K; k++) { PQ += P[i][k] * Q[k][Rij.dim]; } double eij = Rij.weight - PQ; // update Pik and Qkj for (int k = 0; k < K; k++) { double oldPik = P[i][k]; P[i][k] += alpha * (2 * eij * Q[k][Rij.dim] - beta * P[i][k]); Q[k][Rij.dim] += alpha * (2 * eij * oldPik - beta * Q[k][Rij.dim]); } } } } // 批量梯度下降,更新參數(shù) public void updatePQ_batch(double alpha, double beta) { for (int i = 0; i < M; i++) { ArrayList<Feature> Ri = this.dataset.getDataAt(i).getAllFeature(); for (Feature Rij : Ri) { // Rij.error=Rij.weight-PQ for updating P and Q double PQ = 0; for (int k = 0; k < K; k++) { PQ += P[i][k] * Q[k][Rij.dim]; } Rij.error = Rij.weight - PQ; } } for (int i = 0; i < M; i++) { ArrayList<Feature> Ri = this.dataset.getDataAt(i).getAllFeature(); for (Feature Rij : Ri) { for (int k = 0; k < K; k++) { // 對(duì)參數(shù)更新的累積項(xiàng) double eq_sum = 0; double ep_sum = 0; for (int ki = 0; ki < M; ki++) {// 固定k和j之后,對(duì)所有i項(xiàng)加和 ArrayList<Feature> tmp = this.dataset.getDataAt(i).getAllFeature(); for (Feature Rj : tmp) { if (Rj.dim == Rij.dim) ep_sum += P[ki][k] * Rj.error; } } for (Feature Rj : Ri) {// 固定k和i之后,對(duì)多有j項(xiàng)加和 eq_sum += Rj.error * Q[k][Rj.dim]; } // 對(duì)參數(shù)更新 P[i][k] += alpha * (2 * eq_sum - beta * P[i][k]); Q[k][Rij.dim] += alpha * (2 * ep_sum - beta * Q[k][Rij.dim]); } } } } ================================================================================================新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注