梯度下降是機(jī)器學(xué)習(xí)中用來(lái)求最小值的算法,它被廣泛應(yīng)用于像邏輯回歸、線性回歸和神經(jīng)網(wǎng)絡(luò)的模型中。
一、全局誤差函數(shù)
要了解為什么使用“梯度下降法”去求最小值,必須先知道機(jī)器學(xué)習(xí)求得模型的方式。比如現(xiàn)在有一份線性數(shù)據(jù)的關(guān)系,假設(shè)他的模型為線性,w為權(quán)值(隨機(jī)),b為偏置,e為假設(shè)的“誤差”:
我們把這個(gè)方程做一下變換,得到關(guān)于真實(shí)值和模型擬合值的誤差
上面只是關(guān)于一個(gè)數(shù)據(jù)的誤差,接下來(lái)對(duì)所有數(shù)據(jù)的誤差進(jìn)行一次加和,然后再平方。得到一個(gè)所有真實(shí)值與擬合值誤差的平方函數(shù),將其定義為“全局性誤差函數(shù)”loss
我們回過(guò)頭去想,機(jī)器學(xué)習(xí)的目的就是擬合出一個(gè)可以準(zhǔn)確描述這組數(shù)據(jù)的模型。按照上面的公式來(lái)看,如果令“Loss=0”,也就是令所有真實(shí)值與擬合值誤差的平方為零,就等于說(shuō)這個(gè)模型是可以準(zhǔn)確描述真實(shí)世界數(shù)據(jù)的。而讓Loss為零時(shí)的w與b,就是描述這個(gè)模型的參數(shù)
至于為什么要進(jìn)行平方處理,是應(yīng)用了最小二乘的思想。我們本來(lái)是想找到一個(gè)合適的模型,對(duì)此構(gòu)建了一個(gè)真實(shí)值與擬合值的“平方差模型”,找到了這個(gè)平方差模型的解,也就等于是找到了我們需要的“擬合模型”
本質(zhì)上,我們是通過(guò)上面的方式,把一個(gè)求模型的問(wèn)題,轉(zhuǎn)換成了一個(gè)函數(shù)求解“最小值”的數(shù)學(xué)問(wèn)題。那么問(wèn)題來(lái)了,如何找到這個(gè)函數(shù)中的最小值,就是“梯度下降”所解決的問(wèn)題。
二、梯度下降法
問(wèn)題變成了求解一個(gè)函數(shù)模型的最小值問(wèn)題,要用到高等數(shù)學(xué)里關(guān)于“導(dǎo)數(shù)”的一系列概念和知識(shí)作為鋪墊。想理解何為梯度,梯度是如何一步一步如何求得這個(gè)函數(shù)的最小值,就必須從他開(kāi)始
2.1梯度的定義
·導(dǎo)數(shù)
導(dǎo)數(shù)反映在下圖,是曲線上的某個(gè)點(diǎn)沿x軸正方向的變化率(即切線)。
·偏導(dǎo)數(shù)
偏導(dǎo)數(shù)本質(zhì)上與導(dǎo)數(shù)一樣,都是當(dāng)自變量變化的時(shí)候,函數(shù)值的變化量與自變量變化值的比值(即某個(gè)點(diǎn)沿x軸正方向的變化率)。不同在于導(dǎo)數(shù)描述的一元函數(shù),而偏導(dǎo)描述的是多元函數(shù)
·方向?qū)?shù)
方向?qū)?shù)與導(dǎo)數(shù)和偏導(dǎo)不同在于,它描述的是一個(gè)多元函數(shù),在任意方向上的變化率。方向?qū)?shù)既有數(shù)值,也有方向(不再僅僅是正方向一個(gè)方向)。
·梯度
那么問(wèn)題來(lái)了,你想不想知道在這個(gè)點(diǎn)的n多個(gè)方向?qū)?shù)中,哪個(gè)是下降的方向變化是最大的,哪個(gè)是上升的方向變化最大的。這就引出了對(duì)“梯度”的定義:
梯度,即函數(shù)在某個(gè)點(diǎn)的一個(gè)向量,它的方向與取得最大方向?qū)?shù)的方向一致,模為該方向?qū)?shù)的最大值。
梯度與方向?qū)?shù)的關(guān)系,可以理解為它是方向?qū)?shù)中兩個(gè)極端的“子集”,因?yàn)榉较驅(qū)?shù)可以說(shuō)有無(wú)數(shù)個(gè)方向,而梯度就是兩個(gè)上升和下降變化率最大的兩個(gè)方向
2.2梯度下降法
(1)核心思想
理解了全局性誤差函數(shù)模型和對(duì)梯度的定義,讓我們來(lái)看看梯度下降是怎么找到函數(shù)最小值的。
梯度下降的核心思想為:當(dāng)你在一個(gè)模型中隨機(jī)選取了一個(gè)點(diǎn)并求得該點(diǎn)的Loss,此時(shí)你的目的是找到讓Loss等于或最接近零的點(diǎn),你為了讓loss減小,就要尋找下一個(gè)能讓這個(gè)loss下降最多的點(diǎn)。但如果對(duì)所有的方向依次試一遍,那工作量實(shí)在是太大了!這時(shí)候就可以引入“梯度”來(lái)解決這個(gè)問(wèn)題
我們已經(jīng)知道梯度是某個(gè)點(diǎn)的“最大方向?qū)?shù)”,如果沿著“梯度負(fù)方向”,也就是沿著這個(gè)點(diǎn)在模型中“下降最多方向”的方向?qū)?shù),就最有可能以最快的速度找個(gè)“最小值”點(diǎn)。
可以借著上面的圖,想象自己在一個(gè)山上的點(diǎn),你想要下山的話,環(huán)顧一下四周,沿著一個(gè)最最陡峭的方向挪一下,又到了一個(gè)點(diǎn),繼續(xù)環(huán)顧四周,找到當(dāng)前最陡峭的方向,繼續(xù)挪......梯度下降就是這樣一個(gè)過(guò)程
(2)局部最優(yōu)
當(dāng)然,即時(shí)是沿著“負(fù)向”梯度方向,也不一定能保證所到達(dá)的點(diǎn)一定是全局最優(yōu)解。目前幾乎所有的實(shí)用算法,都不能像上帝視角一樣保證每次都能找到全局最優(yōu)解。不過(guò)即使是“局部最優(yōu)”,也能解決很大問(wèn)題了。
(3)梯度下降公式
梯度下降算法的公式如下:
公式依次代表為“下次迭代的點(diǎn)”、“目前所在的點(diǎn)”、“學(xué)習(xí)率”和“最大負(fù)向梯度”。按照這個(gè)公式,每次迭代都會(huì)根據(jù)上次的步長(zhǎng)減去學(xué)習(xí)率乘以“梯度”的值,去一步一步更新,這樣能可以每次迭代都朝著最大負(fù)方向去迭代。
(4)學(xué)習(xí)率
讓我們來(lái)看看學(xué)習(xí)率a代表什么。它直接決定著每次更新的挪動(dòng)大小。
如果a太小,那么每次挪動(dòng)的距離只會(huì)一點(diǎn)一點(diǎn)挪動(dòng),這樣就需要很多步才能到達(dá)最低點(diǎn)。
如果a太大,那么梯度下降法可能會(huì)越過(guò)最低點(diǎn),甚至可能“無(wú)法收斂”都不一定哦。因?yàn)槟忝看闻矂?dòng)的距離都很大,這次越過(guò)了一個(gè)最低點(diǎn),下次又越過(guò)了一次最低點(diǎn),直到越過(guò)所有“最低點(diǎn)”,那么你就永遠(yuǎn)都找不到“局部最優(yōu)解”了,也就發(fā)散了
(5)自動(dòng)減小幅度值
梯度下降法還有一個(gè)優(yōu)勢(shì),就是越接近最小值的時(shí)候,梯度下降法會(huì)自動(dòng)調(diào)整更新的幅度,這是因它的公式本身而決定的,以下圖為例,假設(shè)我最開(kāi)始在取值在函數(shù)中的最高點(diǎn)(粉紅色),那么很顯然每次下降之后的點(diǎn),梯度都會(huì)變得越來(lái)越小。
當(dāng)你接近局部最優(yōu)解的時(shí)候,很顯然在局部最低時(shí)導(dǎo)數(shù)等于零,當(dāng)接近局部最優(yōu)解時(shí),導(dǎo)數(shù)值(即公式的最后一部分)會(huì)變得越來(lái)越小,所以梯度下降將自動(dòng)采取較小的幅度。很神奇有木有,你都不用刻意去調(diào)整學(xué)習(xí)率a的值,梯度下降法會(huì)自動(dòng)保證不越過(guò)最低點(diǎn)