在前面的課程中,我們知道為了實(shí)現(xiàn)非線性分類的任務(wù),需要使用多層神經(jīng)網(wǎng)絡(luò),多層神經(jīng)網(wǎng)絡(luò)的損失函數(shù)不再是凸函數(shù),而是一種比較復(fù)雜的不規(guī)則函數(shù),這類函數(shù)求導(dǎo)數(shù)非常困難,在求解極值問題時(shí)很難通過計(jì)算得到解析解,因此,通常采用梯度下降法得到數(shù)值解。
梯度下降法有著三種不同的形式,分別是批量梯度下降、隨機(jī)梯度下降和小批量梯度下降。
下面,就來詳細(xì)的介紹下這三種方法。為了便于理解,我們以一元線性回歸為例,下圖為一元線性回歸的平方損失函數(shù),
在這三種形式中,批量梯度下降法是最原始的形式。每一次迭代更新權(quán)值時(shí),都使用所有樣本來計(jì)算偏導(dǎo)數(shù)。
對(duì)所有樣本的計(jì)算,可以利用向量運(yùn)算進(jìn)行并行計(jì)算來提升運(yùn)算速度。
對(duì)于小規(guī)模數(shù)據(jù)集,通常采用這種批量梯度下降法進(jìn)行訓(xùn)練,例如,在前面介紹的所有例程中使用的都是這種方法,但是在神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)中,樣本的數(shù)量往往非常大,可能有數(shù)萬個(gè)或者數(shù)百萬個(gè),甚至上億個(gè)樣本,每個(gè)樣本中,屬性的個(gè)數(shù)也可能非常的大,采用批量梯度下降法,在每一步迭代時(shí),都需要用到所有的樣本,計(jì)算量可能會(huì)大的驚人,即使使用向量運(yùn)算,也需要花費(fèi)大量的時(shí)間。
例如,數(shù)據(jù)集中有 20 萬個(gè)樣本,那么每次迭代都需要使用這 20 萬個(gè)樣本進(jìn)行計(jì)算才能對(duì)參數(shù)進(jìn)行一次更新,假設(shè)達(dá)到極小值需要進(jìn)行10次迭代,那么就一共需要200萬次計(jì)算,才能達(dá)到收斂。
其實(shí),在大規(guī)模數(shù)據(jù)集中,通常會(huì)有大量冗余數(shù)據(jù),也沒有必要使用整個(gè)訓(xùn)練集來計(jì)算梯度,因此,批量梯度下降法并不適合大規(guī)模數(shù)據(jù)集。為了實(shí)現(xiàn)更快的計(jì)算,可以使用隨機(jī)梯度下降法。
在這種方法中,每次迭代時(shí)只使用一個(gè)樣本來訓(xùn)練模型,也就是說每次只使用一個(gè)樣本去計(jì)算代價(jià)函數(shù)的梯度并迭代更新模型的參數(shù),使模型的輸出值盡可能逼近這個(gè)樣本真實(shí)的標(biāo)簽值。
當(dāng)訓(xùn)練誤差足夠小時(shí),結(jié)束本次訓(xùn)練,再輸入下一個(gè)新的樣本,顯然使用前面樣本訓(xùn)練出的網(wǎng)絡(luò)參數(shù),不一定能夠使得后面的新樣本誤差最小,所以這個(gè)新樣本需要再重新訓(xùn)練網(wǎng)絡(luò),這個(gè)樣本訓(xùn)練結(jié)束之后,再輸入下一個(gè)樣本,再次訓(xùn)練網(wǎng)絡(luò),直到使用所有樣本訓(xùn)練一遍為止,這個(gè)過程也被稱為一輪。
例如,對(duì)于一個(gè)有20萬個(gè)樣本的數(shù)據(jù)集,訓(xùn)練一輪就是依次使用這 20 萬個(gè)樣本訓(xùn)練一遍網(wǎng)絡(luò)。因?yàn)槊看斡?xùn)練只使用了一個(gè)樣本,因此每次訓(xùn)練速度非???,可以想到在訓(xùn)練一輪之后,整個(gè)網(wǎng)絡(luò)的模型參數(shù)對(duì)最后一個(gè)樣本的誤差達(dá)到了最小。但是對(duì)前面的樣本就不好說了。因?yàn)楹竺鏄颖菊{(diào)整了網(wǎng)絡(luò)參數(shù),又可能會(huì)使得前面樣本的效果變壞。而我們需要網(wǎng)絡(luò)對(duì)所有樣本的誤差和足夠小,因此,往往需要再進(jìn)行下一輪的訓(xùn)練。直到所有樣本的誤差達(dá)到預(yù)期為止。
采用隨機(jī)梯度下降法,雖然每次訓(xùn)練只使用一個(gè)樣本,單次迭代的速度很快,但是通過單個(gè)樣本計(jì)算出的梯度不能夠很好的體現(xiàn)全體樣本的梯度。各個(gè)樣本各自為政,橫沖直撞,不同樣本的訓(xùn)練結(jié)果,往往會(huì)互相抵消,導(dǎo)致參數(shù)更新非常的頻繁,因此,可能會(huì)走很多的彎路,在最優(yōu)點(diǎn)附近晃來晃去,卻無法快速收斂,即使損失函數(shù)是凸函數(shù),也無法做到線性收斂,而且采用這種方法,每次只使用一個(gè)樣本,也不利于實(shí)現(xiàn)并行計(jì)算。
實(shí)際上這種方法很少使用,現(xiàn)在我們所說的隨機(jī)梯度下降通常是指小批量梯度下降算法。
小批量梯度下降算法是前面兩種的折中方案,也稱為小批量隨機(jī)梯度下降算法。
這種算法把梯度稱為若干個(gè)小批量,也叫做小批量。也就是每次迭代只使用其中一個(gè)小批量來訓(xùn)練模型。下圖為小批量梯度下降法的損失函數(shù)的計(jì)算公式:
下圖為小批量梯度下降法的參數(shù)更新迭代公式,
將所有的批次都執(zhí)行一遍,就稱之為一輪。
因?yàn)楦鱾€(gè)批的樣本之間也會(huì)存在訓(xùn)練結(jié)果互相抵消的問題,因此通常也需要經(jīng)過多輪訓(xùn)練才能夠收斂。
使用這種方法的好處是,無論整個(gè)訓(xùn)練集的樣本數(shù)量有多少,每次迭代所使用的訓(xùn)練樣本數(shù)量都是固定的。
例如,某個(gè)訓(xùn)練集中有 2000 個(gè)樣本,分成 10 批,每個(gè)批次中的樣本數(shù)量是200,那么每次訓(xùn)練就使用1個(gè)批中的 200 個(gè)樣本,每一輪需要進(jìn)行 10 次訓(xùn)練,如果訓(xùn)練樣本增加到 200000 個(gè),分成 1000 批,每個(gè)批次中的樣本數(shù)量是200,那么每次訓(xùn)練同樣也是使用1個(gè)批中的 200 個(gè)樣本。
和批量梯度下降法相比,這樣顯然可以大大的加快訓(xùn)練速度,另外,和批量梯度下降法一樣,這種方法也可以實(shí)現(xiàn)并行計(jì)算。因此。在訓(xùn)練大規(guī)模數(shù)據(jù)集時(shí),通常首選小批量梯度下降算法。
小批量梯度下降算法是基于統(tǒng)計(jì)學(xué)中抽樣的思想,無論訓(xùn)練樣本是數(shù)字、圖片還是語音,我們從中隨機(jī)抽取出來一部分樣本,它們的特征可以在一定程度上代表整個(gè)完整數(shù)據(jù)集的特征。就像歸納總結(jié)人的特征,其實(shí)并不需要將世界上所有的人都進(jìn)行一遍調(diào)查,只需要抽取有代表性的一部分樣本,覆蓋所有的人種、年齡、性別等特征,再對(duì)它們進(jìn)行歸納就可以了。
因此從理論上來說,每次所構(gòu)建的小批量樣本都應(yīng)該是獨(dú)立同分布的,能夠代表整個(gè)樣本集的特征。但是,在實(shí)際實(shí)現(xiàn)時(shí),是很難做到這一點(diǎn)的,每次隨機(jī)抽取的小批量樣本的特征和整體樣本的特征存在差別。
例如,有 1000 個(gè)小球,分別標(biāo)記1 — 1000 的數(shù)字,
同樣采用小批量樣本計(jì)算出的梯度和使用全體樣本計(jì)算出的標(biāo)準(zhǔn)梯度之間存在偏差,因此,不能保證每次迭代都是向著損失值下降最快的方向前進(jìn),也可能會(huì)繞遠(yuǎn),但是總體來說,還是會(huì)向著最優(yōu)的方向前進(jìn)。另一方面,小批量中這種梯度偏差就好像是給樣本中增加了噪聲,會(huì)在一定程度上提高模型的泛化能力。
假設(shè)下圖為某種二元損失函數(shù)及其對(duì)應(yīng)的曲面圖,
梯度下降法就是從某個(gè)隨機(jī)點(diǎn)出發(fā),逐步到達(dá)全局最小值點(diǎn),或者某個(gè)局部極小值點(diǎn)。
在 xoy 平面上,做出這個(gè)函數(shù)的等高線,
下面就來借助于等高線來更加直觀的看一下這幾種梯度下降法的迭代過程。
假設(shè)這個(gè)函數(shù)的損失函數(shù)是一個(gè)凸函數(shù),這些藍(lán)色的封閉曲線是等高線,下圖紅色的點(diǎn)為全局最小值點(diǎn),
而使用小批量梯度下降算法,雖然也不是每一次都向著最小值點(diǎn)的方向前進(jìn),但是也不會(huì)繞著太遠(yuǎn)。所需要的迭代次數(shù)也遠(yuǎn)遠(yuǎn)小于隨機(jī)梯度下降法。
聯(lián)系客服